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)
[HttpPost]
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);
}
......
......@@ -29,17 +29,19 @@ public class AllotController : Controller
private IHostingEnvironment _evn;
private ILogger<AllotController> _logger;
private ClaimService _claim;
private readonly LogManageService logManageService;
public AllotController(AllotService allotService,
HospitalService hospitalService, ConfigService configService,
ILogger<AllotController> logger, IHostingEnvironment evn,
ClaimService claim)
ClaimService claim, LogManageService logManageService)
{
_allotService = allotService;
_hospitalService = hospitalService;
_logger = logger;
_evn = evn;
_claim = claim;
this.logManageService = logManageService;
_configService = configService;
}
......@@ -159,12 +161,13 @@ public ApiResponse Generate([CustomizeValidator(RuleSet = "Delete"), FromBody]Al
if (allot.States == (int)AllotStates.Wait)
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));
if (_evn.IsEnvironment("Localhost"))
_allotService.Generate(allot, email);
else
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);
////BackgroundJob.Enqueue(() => _allotService.Generate(allot, email));
return new ApiResponse(ResponseType.OK);
......
......@@ -119,12 +119,20 @@ public ApiResponse<List<DeptResponse>> GetOther([FromBody]ComputerRequest reques
[HttpPost]
public ApiResponse<DeptDataDetails> DeptDetail([FromBody]DeptDetailRequest request)
{
var allot = _allotService.GetAllot(request.AllotId);
if (null == allot)
throw new PerformanceException("当前绩效记录不存在");
//var allot = _allotService.GetAllot(request.AllotId);
//if (null == allot)
// throw new PerformanceException("当前绩效记录不存在");
//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);
}
......
......@@ -9,6 +9,9 @@
namespace Performance.Api.Controllers
{
/// <summary>
/// 报表
/// </summary>
[Route("api/[controller]")]
public class ReportController : Controller
{
......@@ -130,5 +133,31 @@ public ApiResponse AvgRatio([CustomizeValidator(RuleSet = "Query"), FromBody]Rep
var list = reportService.AvgRatio(request.HospitalId);
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
using FluentValidation.AspNetCore;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Performance.DtoModels;
using Performance.EntityModels;
using Performance.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Performance.Api.Controllers
{
/// <summary>
/// 二次绩效
/// </summary>
[ApiController]
public class SecondAllotController : ControllerBase
{
private readonly ClaimService claimService;
private readonly SecondAllotService secondAllotService;
public SecondAllotController(ClaimService claimService,
SecondAllotService secondAllotService)
{
this.claimService = claimService;
this.secondAllotService = secondAllotService;
}
#region 二次绩效列表、录入数据展示,保存数据
/// <summary>
/// 二次绩效列表(没有需要初始化)
/// </summary>
/// <returns></returns>
[Route("api/second/list")]
[HttpPost]
public ApiResponse List()
{
var userId = claimService.GetUserId();
var result = secondAllotService.GetSecondList(userId);
return new ApiResponse(ResponseType.OK, result);
}
/// <summary>
/// 二次绩效项目内容保存
/// </summary>
/// <returns></returns>
[Route("api/second/savevalue/{secondid}")]
[HttpPost]
public ApiResponse SaveValue(int secondid, [FromBody]List<ag_fixatitem> request)
{
if (secondid != 0 && (request == null || request.Count == 0))
secondAllotService.DelValue(secondid, request);
var allotCount = request.Where(t => t.AllotId > 0).Select(t => t.AllotId).Distinct().Count();
if (allotCount != 1 || request.Any(t => t.AllotId == 0))
throw new PerformanceException("一次绩效ID错误");
var secondCount = request.Where(t => t.SecondId > 0).Select(t => t.SecondId).Distinct().Count();
if (secondCount != 1 || request.Any(t => t.SecondId == 0))
throw new PerformanceException("二次绩效ID错误");
var typeCount = request.Where(t => t.Type > 0).Select(t => t.Type).Distinct().Count();
if (request.Any(t => t.Type == 0)) //typeCount != 1 ||
throw new PerformanceException("二次绩效项位置错误");
var unitTypeCount = request.Where(t => !string.IsNullOrEmpty(t.UnitType)).Select(t => t.UnitType).Distinct().Count();
if (unitTypeCount != 1 || request.Any(t => string.IsNullOrEmpty(t.UnitType)))
throw new PerformanceException("科室类型错误");
var repetition = request.GroupBy(t => new { t.RowNumber, t.ItemName }).Where(t => t.Count() > 1);
if (repetition.Any())
throw new PerformanceException(string.Join(";", repetition.Select(t => $"行{t.Key.RowNumber}项‘{t.Key.ItemName}’重复录入")));
var result = secondAllotService.SaveValue(request);
return new ApiResponse(ResponseType.OK);
}
/// <summary>
/// 提交二次绩效分配结果
/// </summary>
/// <returns></returns>
[Route("api/second/savecompute")]
[HttpPost]
public ApiResponse SaveCompute([FromBody]List<ag_compute> request)
{
var allotCount = request.Where(t => t.AllotId > 0).Select(t => t.AllotId).Distinct().Count();
if (allotCount != 1 || request.Any(t => t.AllotId == 0))
throw new PerformanceException("一次绩效ID错误");
var secondCount = request.Where(t => t.SecondId > 0).Select(t => t.SecondId).Distinct().Count();
if (secondCount != 1 || request.Any(t => t.SecondId == 0))
throw new PerformanceException("二次绩效ID错误");
var departmentCount = request.Where(t => !string.IsNullOrEmpty(t.Department)).Select(t => t.Department).Distinct().Count();
if (departmentCount != 1 || request.Any(t => string.IsNullOrEmpty(t.Department)))
throw new PerformanceException("科室名称错误");
var personNameCount = request.Where(t => !string.IsNullOrEmpty(t.PersonName)).Select(t => t.PersonName).Distinct().Count();
if (personNameCount != 1 || request.Any(t => string.IsNullOrEmpty(t.PersonName)))
throw new PerformanceException("人员名称错误");
var result = secondAllotService.SaveCompute(request);
return new ApiResponse(ResponseType.OK);
}
/// <summary>
/// 二次绩效录入页面配置信息
/// </summary>
/// <returns></returns>
[Route("api/second/detail")]
[HttpPost]
public ApiResponse SecondDetail([CustomizeValidator(RuleSet = "Refresh"), FromBody]UseTempRequest request)
{
var result = secondAllotService.GetSecondDetail(request);
return new ApiResponse(ResponseType.OK, result);
}
#endregion
#region 模板使用
/// <summary>
/// 选择二次绩效模板
/// </summary>
/// <returns></returns>
[HttpGet("api/temp/list/{hospitalid}")]
public ApiResponse<List<SecondTempResponse>> Temp(int hospitalid)
{
var result = secondAllotService.GetTemp(hospitalid);
return new ApiResponse<List<SecondTempResponse>>(ResponseType.OK, result);
}
/// <summary>
/// 保存已选择二次绩效模板
/// </summary>
/// <returns></returns>
[Route("api/temp/usetemp")]
[HttpPost]
public ApiResponse UseTemp([CustomizeValidator(RuleSet = "Use"), FromBody]UseTempRequest request)
{
var result = secondAllotService.UseTemp(request);
return result ? new ApiResponse(ResponseType.OK, "选择成功") : new ApiResponse(ResponseType.Fail, "选择失败");
}
/// <summary>
/// 刷新已选择模板
/// </summary>
/// <returns></returns>
[Route("api/second/refreshtemp")]
[HttpPost]
public ApiResponse RefreshTemp([CustomizeValidator(RuleSet = "Refresh"), FromBody]UseTempRequest request)
{
secondAllotService.RefreshTemp(request);
return new ApiResponse(ResponseType.OK);
}
#endregion
#region 二次绩效工作量配置
/// <summary>
/// 二次绩效工作量列表
/// </summary>
/// <returns></returns>
[Route("api/second/workload/list")]
[HttpPost]
public ApiResponse WorkloadList([CustomizeValidator(RuleSet = "Query"), FromBody]WorkloadRequest request)
{
var result = secondAllotService.GetWorkloadList(request);
return new ApiResponse(ResponseType.OK, result);
}
/// <summary>
/// 二次绩效工作量新增
/// </summary>
/// <returns></returns>
[Route("api/second/workload/add")]
[HttpPost]
public ApiResponse WorkloadAdd([CustomizeValidator(RuleSet = "Add"), FromBody]WorkloadRequest request)
{
var result = secondAllotService.WorkloadAdd(request);
return new ApiResponse(result ? ResponseType.OK : ResponseType.Fail);
}
/// <summary>
/// 二次绩效工作量修改
/// </summary>
/// <returns></returns>
[Route("api/second/workload/update")]
[HttpPost]
public ApiResponse WorkloadUpdate([CustomizeValidator(RuleSet = "Update"), FromBody]WorkloadRequest request)
{
var result = secondAllotService.WorkloadUpdate(request);
return new ApiResponse(result ? ResponseType.OK : ResponseType.Fail);
}
/// <summary>
/// 二次绩效工作量删除
/// </summary>
/// <returns></returns>
[Route("api/second/workload/delete")]
[HttpPost]
public ApiResponse WorkloadDelete([CustomizeValidator(RuleSet = "Delete"), FromBody]WorkloadRequest request)
{
var result = secondAllotService.WorkloadDelete(request.Id);
return new ApiResponse(result ? ResponseType.OK : ResponseType.Fail);
}
#endregion
#region 二次绩效审核
/// <summary>
/// 提交审核
/// </summary>
/// <param name="secondid">二次绩效Id</param>
/// <returns></returns>
[HttpPost]
[Route("/api/second/audit/submit/{secondid}")]
public ApiResponse SubmitAudit(int secondid)
{
var second = secondAllotService.GetSecondallot(secondid);
if (second == null)
return new ApiResponse(ResponseType.ParameterError, "二次绩效Id无效");
if (second.Status == 3)
return new ApiResponse(ResponseType.Fail, "该绩效已\"审核通过\",无需再次提交");
var userid = claimService.GetUserId();
var result = secondAllotService.AuditSubmit(second);
return result ? new ApiResponse(ResponseType.OK, "提交成功") : new ApiResponse(ResponseType.Fail, "提交失败");
}
/// <summary>
/// 二次绩效审核列表
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("/api/second/audit/list")]
public ApiResponse<List<ag_secondallot>> AuditList()
{
var userid = claimService.GetUserId();
var list = secondAllotService.AuditList(userid);
return new ApiResponse<List<ag_secondallot>>(ResponseType.OK, "审核列表", list);
}
/// <summary>
/// 二次绩效审核结果;驳回、成功
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("/api/second/audit/result")]
public ApiResponse AuditResult([FromBody] SecondAuditRequest request)
{
var userid = claimService.GetUserId();
var result = secondAllotService.ConfirmAudit(userid, request);
return result ? new ApiResponse(ResponseType.OK, "操作成功") : new ApiResponse(ResponseType.Fail, "操作失败");
}
#endregion
}
}
\ No newline at end of file
......@@ -167,7 +167,7 @@ public void ConfigureServices(IServiceCollection services)
#region swagger
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[]
{
......
......@@ -659,6 +659,11 @@
</summary>
<returns></returns>
</member>
<member name="T:Performance.Api.Controllers.ReportController">
<summary>
报表
</summary>
</member>
<member name="M:Performance.Api.Controllers.ReportController.Survey(Performance.DtoModels.ReportRequest)">
<summary>
首页数据概况
......@@ -715,6 +720,110 @@
<param name="request"></param>
<returns></returns>
</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)">
<summary>
sheet 列表
......
......@@ -1038,6 +1038,11 @@
</summary>
</member>
<member name="P:Performance.DtoModels.CofAgainRequest.Department">
<summary>
科室
</summary>
</member>
<member name="P:Performance.DtoModels.CofAgainRequest.Type">
<summary>
1 职称绩效 2 工作量绩效 3 满勤天数
......@@ -1083,6 +1088,11 @@
绩效id
</summary>
</member>
<member name="P:Performance.DtoModels.DeptDetailRequest.SecondId">
<summary>
二次绩效id
</summary>
</member>
<member name="P:Performance.DtoModels.DeptDetailRequest.Type">
<summary>
绩效类型(1 医生组、 2 护理组)
......@@ -1439,6 +1449,30 @@
职位类别 1 普通类别 2 基础绩效来源
</summary>
</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">
<summary>
登录请求
......@@ -1504,11 +1538,49 @@
用户科室
</summary>
</member>
<member name="P:Performance.DtoModels.UseTempRequest.IsArchive">
<summary> 是否归档 </summary>
</member>
<member name="P:Performance.DtoModels.WorkItemRequest.Item">
<summary>
工作量绩效项
</summary>
</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">
<summary>
最大工龄范围(小于)
......@@ -2055,6 +2127,22 @@
菜单状态 1 启用 2禁用
</summary>
</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">
<summary>
sheetID
......
......@@ -7,15 +7,39 @@
<member name="P:Performance.EntityModels.PerformanceDbContext.ag_againsituation">
<summary> 二次分配概览 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.ag_compute">
<summary> 二次绩效结果表 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.ag_data">
<summary> 二次分配不固定数据 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.ag_employee">
<summary> 二次分配人员名单 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.ag_fixatitem">
<summary> 二次绩效固定项 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.ag_header">
<summary> 二次分配不固定列头数据 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.ag_itemvalue">
<summary> 科室二次绩效录入内容 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.ag_secondallot">
<summary> 二次绩效列表 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.ag_temp">
<summary> 二次绩效模板 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.ag_tempitem">
<summary> 二次绩效模板项 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.ag_usetemp">
<summary> </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.ag_workload">
<summary> 二次绩效工作量绩效 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.as_assess">
<summary> 考核类别 </summary>
</member>
......@@ -235,6 +259,41 @@
科室系数人均
</summary>
</member>
<member name="T:Performance.EntityModels.ag_compute">
<summary>
二次绩效结果表
</summary>
</member>
<member name="P:Performance.EntityModels.ag_compute.Id">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_compute.AllotId">
<summary>
绩效ID
</summary>
</member>
<member name="P:Performance.EntityModels.ag_compute.SecondId">
<summary>
二次绩效ID
</summary>
</member>
<member name="P:Performance.EntityModels.ag_compute.Department">
<summary>
科室
</summary>
</member>
<member name="P:Performance.EntityModels.ag_compute.PersonName">
<summary>
人员名称
</summary>
</member>
<member name="P:Performance.EntityModels.ag_compute.RealGiveFee">
<summary>
实发金额
</summary>
</member>
<member name="T:Performance.EntityModels.ag_data">
<summary>
二次分配不固定数据
......@@ -395,6 +454,66 @@
实发绩效(需计算)
</summary>
</member>
<member name="T:Performance.EntityModels.ag_fixatitem">
<summary>
二次绩效固定项
</summary>
</member>
<member name="P:Performance.EntityModels.ag_fixatitem.ID">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_fixatitem.AllotId">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_fixatitem.SecondId">
<summary>
二次绩效ID
</summary>
</member>
<member name="P:Performance.EntityModels.ag_fixatitem.UnitType">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_fixatitem.RowNumber">
<summary>
行号
</summary>
</member>
<member name="P:Performance.EntityModels.ag_fixatitem.ItemName">
<summary>
项目名
</summary>
</member>
<member name="P:Performance.EntityModels.ag_fixatitem.ItemValue">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_fixatitem.FactorValue">
<summary>
系数
</summary>
</member>
<member name="P:Performance.EntityModels.ag_fixatitem.Sort">
<summary>
排序
</summary>
</member>
<member name="P:Performance.EntityModels.ag_fixatitem.Type">
<summary>
字段类型 1 顶部概况 2 表格固定 3 工作量
</summary>
</member>
<member name="P:Performance.EntityModels.ag_fixatitem.SourceType">
<summary>
1 自动带出 2 计算得出
</summary>
</member>
<member name="T:Performance.EntityModels.ag_header">
<summary>
二次分配不固定列头数据
......@@ -460,6 +579,241 @@
1 汇总 2原始数据
</summary>
</member>
<member name="T:Performance.EntityModels.ag_itemvalue">
<summary>
科室二次绩效录入内容
</summary>
</member>
<member name="P:Performance.EntityModels.ag_itemvalue.Id">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_itemvalue.AllotId">
<summary>
绩效Id
</summary>
</member>
<member name="P:Performance.EntityModels.ag_itemvalue.SecondId">
<summary>
二次绩效ID
</summary>
</member>
<member name="P:Performance.EntityModels.ag_itemvalue.SourceType">
<summary>
绩效项来源 1 模板 2 工作量
</summary>
</member>
<member name="P:Performance.EntityModels.ag_itemvalue.Value">
<summary>
</summary>
</member>
<member name="T:Performance.EntityModels.ag_secondallot">
<summary>
二次绩效列表
</summary>
</member>
<member name="P:Performance.EntityModels.ag_secondallot.Id">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_secondallot.AllotId">
<summary>
绩效ID
</summary>
</member>
<member name="P:Performance.EntityModels.ag_secondallot.UnitType">
<summary>
科室类型
</summary>
</member>
<member name="P:Performance.EntityModels.ag_secondallot.Year">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_secondallot.Month">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_secondallot.Department">
<summary>
科室
</summary>
</member>
<member name="P:Performance.EntityModels.ag_secondallot.RealGiveFee">
<summary>
科室实发金额
</summary>
</member>
<member name="P:Performance.EntityModels.ag_secondallot.Status">
<summary>
状态 1 未提交 2 等待审核 3 审核通过 4 驳回
</summary>
</member>
<member name="P:Performance.EntityModels.ag_secondallot.SubmitTime">
<summary>
提交时间
</summary>
</member>
<member name="P:Performance.EntityModels.ag_secondallot.AuditTime">
<summary>
审核时间
</summary>
</member>
<member name="P:Performance.EntityModels.ag_secondallot.AuditUser">
<summary>
审核人
</summary>
</member>
<member name="P:Performance.EntityModels.ag_secondallot.Remark">
<summary>
备注
</summary>
</member>
<member name="T:Performance.EntityModels.ag_temp">
<summary>
二次绩效模板
</summary>
</member>
<member name="P:Performance.EntityModels.ag_temp.Id">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_temp.TempName">
<summary>
模板名称
</summary>
</member>
<member name="P:Performance.EntityModels.ag_temp.UnitType">
<summary>
类型
</summary>
</member>
<member name="T:Performance.EntityModels.ag_tempitem">
<summary>
二次绩效模板项
</summary>
</member>
<member name="P:Performance.EntityModels.ag_tempitem.Id">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_tempitem.TempId">
<summary>
模板ID
</summary>
</member>
<member name="P:Performance.EntityModels.ag_tempitem.FiledId">
<summary>
字段ID
</summary>
</member>
<member name="P:Performance.EntityModels.ag_tempitem.FiledName">
<summary>
字段名称
</summary>
</member>
<member name="P:Performance.EntityModels.ag_tempitem.Sort">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_tempitem.Type">
<summary>
字段类型 1 顶部概况 2 表格固定
</summary>
</member>
<member name="P:Performance.EntityModels.ag_tempitem.SourceType">
<summary>
1 自动带出 2 计算得出
</summary>
</member>
<member name="P:Performance.EntityModels.ag_tempitem.IsBring">
<summary>
1 带出历史数据 2不带出
</summary>
</member>
<member name="T:Performance.EntityModels.ag_usetemp">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_usetemp.Id">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_usetemp.HospitalId">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_usetemp.Department">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_usetemp.UnitType">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_usetemp.UseTempId">
<summary>
</summary>
</member>
<member name="T:Performance.EntityModels.ag_workload">
<summary>
二次绩效工作量绩效
</summary>
</member>
<member name="P:Performance.EntityModels.ag_workload.Id">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_workload.HospitalId">
<summary>
医院ID
</summary>
</member>
<member name="P:Performance.EntityModels.ag_workload.Department">
<summary>
科室
</summary>
</member>
<member name="P:Performance.EntityModels.ag_workload.UnitType">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ag_workload.ItemId">
<summary>
工作量考核项ID
</summary>
</member>
<member name="P:Performance.EntityModels.ag_workload.ItemName">
<summary>
工作量名称
</summary>
</member>
<member name="P:Performance.EntityModels.ag_workload.FactorValue">
<summary>
工作量系数
</summary>
</member>
<member name="P:Performance.EntityModels.ag_workload.Sort">
<summary>
</summary>
</member>
<member name="T:Performance.EntityModels.as_assess">
<summary>
考核类别
......@@ -605,6 +959,11 @@
</summary>
</member>
<member name="P:Performance.EntityModels.cof_again.Department">
<summary>
科室
</summary>
</member>
<member name="P:Performance.EntityModels.cof_again.Type">
<summary>
1 职称绩效 2 工作量绩效 3 满勤天数
......@@ -2710,6 +3069,11 @@
菜单状态 1 启用 2禁用
</summary>
</member>
<member name="P:Performance.EntityModels.sys_role.ParentRoles">
<summary>
父级角色
</summary>
</member>
<member name="T:Performance.EntityModels.sys_role_menu">
<summary>
角色菜单关联表
......
......@@ -178,6 +178,21 @@ public AutoMapperConfigs()
CreateMap<res_compute, ComputeResponse>();
CreateMap<EmployeeRequest, im_employee>();
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
public int AllotID { get; set; }
/// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
/// 1 职称绩效 2 工作量绩效 3 满勤天数
/// </summary>
public int Type { get; set; }
......
......@@ -16,6 +16,11 @@ public class DeptDetailRequest
public int AllotId { get; set; }
/// <summary>
/// 二次绩效id
/// </summary>
public int SecondId { get; set; }
/// <summary>
/// 绩效类型(1 医生组、 2 护理组)
/// </summary>
public int Type { get; set; }
......@@ -29,9 +34,9 @@ public class DetailRequestValidator : AbstractValidator<DeptDetailRequest>
{
public DetailRequestValidator()
{
RuleFor(x => x.AllotId).NotNull().GreaterThan(0);
RuleFor(x => x.Type).NotNull().InclusiveBetween(1, 5);
RuleFor(x => x.AccountID).NotNull().GreaterThan(0);
//RuleFor(x => x.AllotId).NotNull().GreaterThan(0);
//RuleFor(x => x.Type).NotNull().InclusiveBetween(1, 5);
//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
{
public int HospitalId { get; set; }
/// <summary> 是否为首页 </summary>
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>
{
......@@ -19,6 +32,19 @@ public ReportRequestValidator()
{
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)
/// <summary> 二次分配概览 </summary>
public virtual DbSet<ag_againsituation> ag_againsituation { get; set; }
/// <summary> 二次绩效结果表 </summary>
public virtual DbSet<ag_compute> ag_compute { get; set; }
/// <summary> 二次分配不固定数据 </summary>
public virtual DbSet<ag_data> ag_data { get; set; }
/// <summary> 二次分配人员名单 </summary>
public virtual DbSet<ag_employee> ag_employee { get; set; }
/// <summary> 二次绩效固定项 </summary>
public virtual DbSet<ag_fixatitem> ag_fixatitem { get; set; }
/// <summary> 二次分配不固定列头数据 </summary>
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>
public virtual DbSet<as_assess> as_assess { get; set; }
/// <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
public Nullable<int> AllotID { get; set; }
/// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
/// 1 职称绩效 2 工作量绩效 3 满勤天数
/// </summary>
public Nullable<int> Type { get; set; }
......
......@@ -35,5 +35,10 @@ public class sys_role
/// 菜单状态 1 启用 2禁用
/// </summary>
public int States { get; set; }
/// <summary>
/// 父级角色
/// </summary>
public string ParentRoles { get; set; }
}
}
......@@ -118,9 +118,11 @@ public void Index([FromBody]AllotRequest request)
public void ExtractData([CustomizeValidator, FromBody]ExtractRequest request)
{
LogHelper.Information("请求参数:" + JsonHelper.Serialize(request), "提取绩效数据");
logger.LogInformation("请求参数:" + JsonHelper.Serialize(request));
string filePath = newExtractService.ExtractData(request.AllotId, request.Email, request.HospitalId);
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 }), "保存提取文件");
int i = 1;
while (i <= 5)
......
{
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "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": {
"LogLevel": {
"Default": "Warning"
}
},
"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_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=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],当天有效!",
//邮件指定接收人
//短信模板
"SmsTemplate": "溯直健康提醒您,您的验证码为:[code],当天有效!",
//邮件指定接收人
"Receiver": [ "chengxiang.li@suvalue.com", "486035085@qq.com" ],
"AbsolutePath": "E:\\wwwroot\\testjx.suvalue.com",
"HttpPath": "http://testjx.suvalue.com:81"
"AbsolutePath": "E:\\wwwroot\\xindu.suvalue.com",
"HttpPath": "https://xindu.suvalue.com"
},
"WebapiUrl": {
"ImportFirst": "",
"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)
{
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)
allot.Remark = remark;
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 });
}
}
}
using Performance.EntityModels;
using Performance.DtoModels;
using Performance.EntityModels;
using System;
using System.Collections.Generic;
using System.Linq;
......@@ -19,8 +20,8 @@ public List<PerReport> GetAvgPerfor(int hospitalid)
{
string sql = @"select concat(allot.year,'-',lpad(allot.month,2,'0')) x, positionname y,round(avgvalue,2) value
from res_baiscnorm bc left join per_allot allot on bc.allotid = allot.id where allot.hospitalid = @hospitalid
order by str_to_date(concat(allot.month, '/', allot.year),'%m/%Y')";
from res_baiscnorm bc left join per_allot allot on bc.allotid = allot.id where allot.hospitalid = @hospitalid
order by str_to_date(concat(allot.month, '/', allot.year),'%m/%Y')";
return DapperQuery(sql, new { hospitalid }).ToList();
}
......@@ -32,9 +33,9 @@ public List<PerReport> GetAvgPerfor(int hospitalid)
public List<PerReport> AvgRatio(int hospitalid)
{
string sql = @"select concat(allot.year,'-',lpad(allot.month,2,'0')) x, bc.PositionName y,round(bc.AvgValue / rbn.AvgValue,2) value
from res_baiscnorm bc left join res_baiscnorm rbn on bc.allotid = rbn.allotid and rbn.positionname = '临床科室主任人均绩效'
left join per_allot allot on bc.allotid = allot.id where allot.hospitalid = @hospitalid
order by str_to_date(concat(allot.month, '/', allot.year),'%m/%Y');";
from res_baiscnorm bc left join res_baiscnorm rbn on bc.allotid = rbn.allotid and rbn.positionname = '临床科室主任人均绩效'
left join per_allot allot on bc.allotid = allot.id where allot.hospitalid = @hospitalid
order by str_to_date(concat(allot.month, '/', allot.year),'%m/%Y');";
return DapperQuery(sql, new { hospitalid }).ToList();
}
......@@ -85,5 +86,290 @@ public List<PerReport> Income(int hospitalId, List<string> date)
in @date and hospitalid = @hospitalId group by year,month,accountingunit order by y asc,value desc;";
return DapperQuery(sql, new { hospitalId, date }).ToList();
}
#region 首页报表
/// <summary>
/// 医院收入结构占比
/// </summary>
/// <returns></returns>
public List<PerReport> InHosIncome(int hospitalId, string currentDate)
{
string sql = $"select '{currentDate}' x,'住院收入占比' y,round(t.InHos/(t.InHos+t.Outpatient) * 100, 2) value from (select year,month,sum(case SourceType when '住院' then CellValue else 0 end) InHos,sum(case SourceType when '门诊' then CellValue else 0 end) Outpatient from report_original_income where hospitalid = @hospitalId and concat(year,'-',lpad(month,2,'0')) = '{currentDate}' group by year,month)t" +
$" union " +
$"select '{currentDate}' x,'门诊收入占比' y,round(t.Outpatient/(t.InHos+t.Outpatient) * 100, 2) value from (select year,month,sum(case SourceType when '住院' then CellValue else 0 end) InHos,sum(case SourceType when '门诊' then CellValue else 0 end) Outpatient from report_original_income where hospitalid = @hospitalId and concat(year,'-',lpad(month,2,'0')) = '{currentDate}' group by year,month)t;";
return DapperQuery(sql, new { hospitalId }).ToList();
}
/// <summary>
/// 绩效发放金额
/// </summary>
/// <param name="currentDate"></param>
/// <param name="yoyDate"></param>
/// <param name="chainDate"></param>
/// <returns></returns>
public List<PerReport> PerforPayment(int hospitalId, string currentDate, string yoyDate, string chainDate)
{
string sql = $"select '{currentDate}' x,t1.y,ifnull(t2.RealGiveFee, 0.0000) value from (select '{currentDate}' x,'当月发放金额' y union select '{yoyDate}' x,'同期发放金额' y union select '{chainDate}' x,'环比发放金额' y)t1 left join report_allot_summary t2 on t1.x = concat(t2.year,'-',lpad(t2.month,2,'0')) and t2.HospitalId = @hospitalId order by y;";
return DapperQuery(sql, new { hospitalId }).ToList();
}
/// <summary>
/// 绩效发放金额占全院收入占比
/// </summary>
/// <param name="currentDate"></param>
/// <param name="yoyDate"></param>
/// <param name="chainDate"></param>
/// <returns></returns>
public List<PerReport> IndexPerforRatio(int hospitalId, string currentDate, string yoyDate, string chainDate)
{
string sql = $"select '{currentDate}' x,t1.y, round(ifnull(t2.RealGiveFee, 0.0000)/t3.income*100, 2)value from(select '{currentDate}' x,'当月发放占比' y union select '{yoyDate}' x,'同期发放占比' y union select '{chainDate}' x,'环比发放占比' y)t1 left join report_allot_summary t2 on t1.x = concat(t2.year,'-', lpad(t2.month,2,'0')) and t2.HospitalId = @hospitalId left join (select year, month, sum(CellValue) income from report_original_income where HospitalId = @hospitalId group by year, month)t3 on t1.x = concat(t3.year,'-', lpad(t3.month,2,'0')) order by y;";
return DapperQuery(sql, new { hospitalId }).ToList();
}
/// <summary>
/// 首页药占比(本月、环比、同期)
/// </summary>
/// <param name="hospitalId">医院Id</param>
/// <param name="currentDate">本月日期</param>
/// <param name="yoyDate">同比日期</param>
/// <param name="chainDate">环比日期</param>
/// <returns></returns>
public List<PerReport> IndexDrugRatio(int hospitalId, string currentDate, string yoyDate, string chainDate)
{
string sql = $"select '{currentDate}' x,t1.y,round(t2.CellValue/t3.`value`*100, 2) value from (select '{currentDate}' x,'当月药占比' y union select '{yoyDate}' x,'同期药占比' y union select '{chainDate}' x,'环比药占比' y)t1 left join (select concat(year,'-',lpad(month,2,'0')) date,sum(CellValue) CellValue from report_original_income t1 inner join cof_drugtype t2 on t1.TypeName = t2.Charge and t1.AllotID = t2.AllotId and t2.ChargeType = '药品' where HospitalID = @hospitalId group by year,month) t2 on t1.x = t2.date left join (select concat(year,'-',lpad(month,2,'0')) date,sum(CellValue) value from report_original_income where hospitalid = @hospitalId group by year,month)t3 on t1.x = t3.date order by y;";
return DapperQuery(sql, new { hospitalId }).ToList();
}
/// <summary>
/// 首页材料占比(本月、环比、同期)
/// </summary>
/// <param name="hospitalId">医院Id</param>
/// <param name="currentDate">本月日期</param>
/// <param name="yoyDate">同比日期</param>
/// <param name="chainDate">环比日期</param>
/// <returns></returns>
public List<PerReport> IndexMaterialRatio(int hospitalId, string currentDate, string yoyDate, string chainDate)
{
string sql = $"select '{currentDate}' x,t1.y,round(t2.CellValue/t3.`value`*100, 2) value from (select '{currentDate}' x,'当月材料占比' y union select '{yoyDate}' x,'同期材料占比' y union select '{chainDate}' x,'环比材料占比' y)t1 left join (select concat(year,'-',lpad(month,2,'0')) date,sum(CellValue) CellValue from report_original_income t1 inner join cof_drugtype t2 on t1.TypeName = t2.Charge and t1.AllotID = t2.AllotId and t2.ChargeType = '耗材' where HospitalID = @hospitalId group by year,month) t2 on t1.x = t2.date left join (select concat(year,'-',lpad(month,2,'0')) date,sum(CellValue) value from report_original_income where hospitalid = @hospitalId group by year,month)t3 on t1.x = t3.date order by y;";
return DapperQuery(sql, new { hospitalId }).ToList();
}
/// <summary>
/// 首页结构占比
/// </summary>
/// <returns></returns>
public List<PerReport> IndexStructRatio(int hospitalId, string currentDate)
{
string sql = $"select TypeName y,t1.y x,round(CellValue/t2.`value`*100,2) value from (select '{currentDate}' y,TypeName,sum(CellValue) CellValue from report_original_income where HospitalID = @hospitalId and concat(year,'-',lpad(month,2,'0')) = '{currentDate}' group by TypeName) t1 inner join (select '{currentDate}' y,sum(CellValue) value from report_original_income where hospitalid = @hospitalId and concat(year,'-',lpad(month,2,'0')) = '{currentDate}')t2 on t1.y = t2.y order by value desc;";
return DapperQuery(sql, new { hospitalId }).ToList();
}
#endregion
#region 菜单报表
/// <summary>
/// 业务总收入
/// </summary>
/// <returns></returns>
public List<PerReport> GeneralIncome(ReportRequest request)
{
string where = "";
if (!string.IsNullOrEmpty(request.Year))
{
where += $" and year in ({request.Year}) ";
}
if (!string.IsNullOrEmpty(request.Month))
{
where += $" and month in ({request.Month}) ";
}
string sql = $"select concat(year,'年') x,'业务总收入(年)' y,sum(CellValue) value from report_original_income where hospitalid = @hospitalId {where} group by year order by x;";
if (request.OnlyYear != 1)
sql = $"select concat(month,'月') x,concat(year,'年') y,sum(CellValue) value from report_original_income where hospitalid = @hospitalId {where} group by year,month order by x;";
return DapperQuery(sql, new { hospitalId = request.HospitalId }).ToList();
}
/// <summary>
/// 门诊、住院业务收入占比
/// </summary>
/// <returns></returns>
public List<PerReport> InHosIncome(ReportRequest request)
{
string where = "";
if (!string.IsNullOrEmpty(request.Year))
{
where += $" and year in ({request.Year}) ";
}
if (!string.IsNullOrEmpty(request.Month))
{
where += $" and month in ({request.Month}) ";
}
string sql = $"select * from (select '住院' y,concat(year,'年') x,round(t.InHos/(t.InHos + t.Outpatient) * 100, 2) value from (select year,sum(case SourceType when '住院' then CellValue else 0 end) InHos,sum(case SourceType when '门诊' then CellValue else 0 end) Outpatient from report_original_income where hospitalid = @hospitalId {where} group by year)t" +
$" union " +
$"select '门诊' y,concat(year,'年') x,round(t.Outpatient/(t.InHos + t.Outpatient) * 100, 2) value from (select year,sum(case SourceType when '住院' then CellValue else 0 end) InHos,sum(case SourceType when '门诊' then CellValue else 0 end) Outpatient from report_original_income where hospitalid = @hospitalId {where} group by year)t)t order by t.x;";
if (request.OnlyYear != 1)
sql = $"select * from (select '住院' y,concat(month,'月') x,round(t.InHos/(t.InHos+t.Outpatient) * 100, 2) value from (select year,month,sum(case SourceType when '住院' then CellValue else 0 end) InHos,sum(case SourceType when '门诊' then CellValue else 0 end) Outpatient from report_original_income where hospitalid = @hospitalId {where} group by month)t" +
$" union " +
$"select '门诊' y,concat(month,'月') x,round(t.Outpatient/(t.InHos+t.Outpatient) * 100, 2) value from (select year,month,sum(case SourceType when '住院' then CellValue else 0 end) InHos,sum(case SourceType when '门诊' then CellValue else 0 end) Outpatient from report_original_income where hospitalid = @hospitalId {where} group by month)t)t order by t.x;";
return DapperQuery(sql, new { hospitalId = request.HospitalId }).ToList();
}
/// <summary>
/// 业务收入结构占比
/// </summary>
/// <returns></returns>
public List<PerReport> StructRatio(ReportRequest request)
{
string where = "";
if (!string.IsNullOrEmpty(request.Year))
{
where += $" and year in ({request.Year}) ";
}
if (!string.IsNullOrEmpty(request.Month))
{
where += $" and month in ({request.Month}) ";
}
string sql = $"select TypeName y,concat(t1.y,'年') x,round(CellValue/t2.`value`*100,2) value from (select year y,TypeName,sum(CellValue) CellValue from report_original_income where HospitalID = @hospitalId {where} group by year,TypeName) t1 inner join (select year y,sum(CellValue) value from report_original_income where hospitalid = @hospitalId {where} group by year)t2 on t1.y = t2.y order by x asc,value desc;";
if (request.OnlyYear != 1)
sql = $"select TypeName y,concat(t1.y,'月') x,round(CellValue/t2.`value`*100,2) value from (select month y,TypeName,sum(CellValue) CellValue from report_original_income where HospitalID = @hospitalId {where} group by month,TypeName) t1 inner join (select month y,sum(CellValue) value from report_original_income where hospitalid = @hospitalId {where} group by month)t2 on t1.y = t2.y order by x asc,value desc;";
return DapperQuery(sql, new { hospitalId = request.HospitalId }).ToList();
}
/// <summary>
/// 药占比
/// </summary>
/// <param name="hospitalId"></param>
/// <param name="request.OnlyYear"></param>
/// <returns></returns>
public List<PerReport> DrugRatio(ReportRequest request)
{
string where = "";
if (!string.IsNullOrEmpty(request.Year))
{
where += $" and year in ({request.Year}) ";
}
if (!string.IsNullOrEmpty(request.Month))
{
where += $" and month in ({request.Month}) ";
}
string sql = $"select '药占比(年)' y,concat(t1.y,'年') x,round(CellValue/t2.`value`*100,2) value from (select year y,sum(CellValue) CellValue from report_original_income t1 inner join cof_drugtype t2 on t1.TypeName = t2.Charge and t1.AllotID = t2.AllotId and t2.ChargeType = '药品' where HospitalID = @hospitalId {where} group by year) t1 inner join (select year y,sum(CellValue) value from report_original_income where hospitalid = @hospitalId {where} group by year)t2 on t1.y = t2.y order by x asc;";
if (request.OnlyYear != 1)
sql = $"select concat(t1.year,'年') y,concat(t1.month,'月') x,round(CellValue/t2.`value`*100,2) value from (select month,year,sum(CellValue) CellValue from report_original_income t1 inner join cof_drugtype t2 on t1.TypeName = t2.Charge and t1.AllotID = t2.AllotId and t2.ChargeType = '药品' where HospitalID = @hospitalId {where} group by month,year) t1 inner join (select month,year,sum(CellValue) value from report_original_income where hospitalid = @hospitalId {where} group by month,year)t2 on t1.`month`=t2.`month` and t1.year = t2.year order by x asc;";
return DapperQuery(sql, new { hospitalId = request.HospitalId }).ToList();
}
/// <summary>
/// 材料占比
/// </summary>
/// <param name="hospitalId"></param>
/// <param name="request.OnlyYear"></param>
/// <returns></returns>
public List<PerReport> MaterialRatio(ReportRequest request)
{
string where = "";
if (!string.IsNullOrEmpty(request.Year))
{
where += $" and year in ({request.Year}) ";
}
if (!string.IsNullOrEmpty(request.Month))
{
where += $" and month in ({request.Month}) ";
}
string sql = $"select '材料占比(年)' y,concat(t1.y,'年') x,round(CellValue/t2.`value`*100,2) value from (select year y,sum(CellValue) CellValue from report_original_income t1 inner join cof_drugtype t2 on t1.TypeName = t2.Charge and t1.AllotID = t2.AllotId and t2.ChargeType = '耗材' where HospitalID = @hospitalId {where} group by year) t1 inner join (select year y,sum(CellValue) value from report_original_income where hospitalid = @hospitalId {where} group by year)t2 on t1.y = t2.y order by x asc;";
if (request.OnlyYear != 1)
sql = $"select concat(t1.year,'年') y,concat(t1.month,'月') x,round(CellValue/t2.`value`*100,2) value from (select month,year,sum(CellValue) CellValue from report_original_income t1 inner join cof_drugtype t2 on t1.TypeName = t2.Charge and t1.AllotID = t2.AllotId and t2.ChargeType = '耗材' where HospitalID = @hospitalId {where} group by month,year) t1 inner join (select month,year,sum(CellValue) value from report_original_income where hospitalid = @hospitalId {where} group by month,year)t2 on t1.`month`=t2.`month` and t1.year = t2.year order by x asc;";
return DapperQuery(sql, new { hospitalId = request.HospitalId }).ToList();
}
/// <summary>
/// 绩效发放金额占全院收入占比
/// </summary>
/// <param name="hospitalId"></param>
/// <param name="request.OnlyYear"></param>
/// <returns></returns>
public List<PerReport> PerforRatio(ReportRequest request)
{
string where = "";
if (!string.IsNullOrEmpty(request.Year))
{
where += $" and year in ({request.Year}) ";
}
if (!string.IsNullOrEmpty(request.Month))
{
where += $" and month in ({request.Month}) ";
}
string sql = $"select concat(t2.x,'年') x,'绩效发放金额占全院收入占比(年)' y,round(t1.RealGiveFee/t2.income * 100, 2) value from (select `year`,sum(realgivefee) realgivefee from report_allot_summary where HospitalID = @hospitalId {where} group by year) t1 inner join (select year x,sum(CellValue) income from report_original_income where HospitalId = @hospitalId {where} group by year)t2 on t1.`Year` = t2.x order by x asc;";
if (request.OnlyYear != 1)
sql = $"select concat(t2.month,'月') x,concat(t2.year,'年') y,round(t1.RealGiveFee/t2.income * 100, 2) value from (select `year`,`month`,sum(realgivefee) realgivefee from report_allot_summary where HospitalID = @hospitalId {where} group by year,month) t1 inner join (select `year`,`month`,sum(CellValue) income from report_original_income where HospitalId = @hospitalId {where} group by year,month)t2 on t1.month = t2.month and t1.year = t2.year order by x asc;";
return DapperQuery(sql, new { hospitalId = request.HospitalId }).ToList();
}
/// <summary>
/// 绩效群体收入
/// </summary>
/// <param name="hospitalId"></param>
/// <param name="request.OnlyYear"></param>
/// <returns></returns>
public List<PerReport> PerforGroup(ReportRequest request)
{
string where = "";
if (!string.IsNullOrEmpty(request.Year))
{
where += $" and year in ({request.Year}) ";
}
if (!string.IsNullOrEmpty(request.Month))
{
where += $" and month in ({request.Month}) ";
}
string sql = $"select PositionName y,concat(year,'年') x,round(sum(avgvalue), 2) value from (select t1.PositionName,year,AvgValue from res_baiscnorm t1 inner join per_allot t2 on t1.AllotID = t2.Id and t2.HospitalId = @hospitalId {where} and locate('保底', t1.PositionName) = 0)t group by PositionName,year order by x asc,value desc;";
if (request.OnlyYear != 1)
sql = $"select PositionName y,concat(month,'月') x,round(sum(avgvalue), 2) value from (select t1.PositionName,month,AvgValue from res_baiscnorm t1 inner join per_allot t2 on t1.AllotID = t2.Id and t2.HospitalId = @hospitalId {where} and locate('保底', t1.PositionName) = 0)t group by PositionName,month order by x asc,value desc;";
return DapperQuery(sql, new { hospitalId = request.HospitalId }).ToList();
}
/// <summary>
/// 医生核算单元人均绩效
/// </summary>
/// <param name="hospitalId"></param>
/// <param name="request.OnlyYear"></param>
/// <returns></returns>
public List<PerReport> DoctorAvg(ReportRequest request)
{
string where = "";
if (!string.IsNullOrEmpty(request.Year))
{
where += $" and t2.year in ({request.Year}) ";
}
if (!string.IsNullOrEmpty(request.Month))
{
where += $" and t2.month in ({request.Month}) ";
}
string sql = $"select concat(`Year`,'年') x,AccountingUnit y,round(sum(avg),2) value from (select t1.AccountingUnit,t1.Avg,t2.`Year`,t2.`Month`,t2.ID from res_account t1 inner join per_allot t2 on t1.AllotID = t2.ID and t2.HospitalId = @hospitalId and t1.UnitType != 2 where 1=1 {where})t group by year,AccountingUnit order by x asc,value desc;";
if (request.OnlyYear != 1)
sql = $"select concat(`Month`,'月') x,AccountingUnit y,round(sum(avg),2) value from (select t1.AccountingUnit,t1.Avg,t2.`Year`,t2.`Month`,t2.ID from res_account t1 inner join per_allot t2 on t1.AllotID = t2.ID and t2.HospitalId = @hospitalId and t1.UnitType != 2 where 1=1 {where})t group by month,AccountingUnit order by x asc,value desc;";
return DapperQuery(sql, new { hospitalId = request.HospitalId }).ToList();
}
/// <summary>
/// 护理核算单元人均绩效
/// </summary>
/// <param name="hospitalId"></param>
/// <param name="request.OnlyYear"></param>
/// <returns></returns>
public List<PerReport> NurseAvg(ReportRequest request)
{
string where = "";
if (!string.IsNullOrEmpty(request.Year))
{
where += $" and t2.year in ({request.Year}) ";
}
if (!string.IsNullOrEmpty(request.Month))
{
where += $" and t2.month in ({request.Month}) ";
}
string sql = $"select concat(`Year`,'年') x,AccountingUnit y,round(sum(avg),2) value from (select t1.AccountingUnit,t1.Avg,t2.`Year`,t2.`Month`,t2.ID from res_account t1 inner join per_allot t2 on t1.AllotID = t2.ID and t2.HospitalId = @hospitalId and t1.UnitType = 2 where 1=1 {where})t group by year,AccountingUnit order by x asc,value desc;";
if (request.OnlyYear != 1)
sql = $"select concat(`Month`,'月') x,AccountingUnit y,round(sum(avg),2) value from (select t1.AccountingUnit,t1.Avg,t2.`Year`,t2.`Month`,t2.ID from res_account t1 inner join per_allot t2 on t1.AllotID = t2.ID and t2.HospitalId = @hospitalId and t1.UnitType = 2 where 1=1 {where})t group by month,AccountingUnit order by x asc,value desc;";
return DapperQuery(sql, new { hospitalId = request.HospitalId }).ToList();
}
#endregion
}
}
//-----------------------------------------------------------------------
// <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
//剔除不同科室相同核算单元
var groupData = perData.Where(t => t.UnitType == info.UnitType.ToString())
.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
{
......
......@@ -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 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)
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
/// <returns></returns>
private string GetCustomMinimumName(string department, string unitType)
{
return $"{EnumHelper.GetDescription(MinimumType.自定义保底)}({unitType}{department})";
return $"{EnumHelper.GetDescription(MinimumType.自定义保底)}({unitType}-{department})";
}
/// <summary>
......
......@@ -140,7 +140,7 @@ public void SpecialUnitCompute(PerExcel excel, per_allot allot, List<res_baiscno
// 新都医院在特殊科室计算时,如果取核算基数计算时带入人数计算
decimal? headcount = null;
if (typeList.Any(o => o.Description == t.QuantitativeIndicators))
headcount = accountDataList.Sum(p => p.Number);
headcount = group.Number;
if (!headcount.HasValue || headcount == 0)
headcount = 1;
return t.Quantity * t.QuantitativeIndicatorsValue * headcount;
......
......@@ -38,6 +38,7 @@ public class AllotService : IAutoInjection
//private readonly IHubContext<AllotLogHub> hubContext;
private readonly LogManageService logManageService;
private readonly ReportService reportService;
public AllotService(PerforPerallotRepository allotRepository,
BaiscNormService baiscNormService,
......@@ -55,7 +56,8 @@ public class AllotService : IAutoInjection
PerforHospitalRepository perforHospitalRepository,
PerforResbaiscnormRepository perforResbaiscnormRepository,
//IHubContext<AllotLogHub> hubContext
LogManageService logManageService)
LogManageService logManageService,
ReportService reportService)
{
_allotRepository = allotRepository;
_againallotRepository = againallotRepository;
......@@ -75,6 +77,7 @@ public class AllotService : IAutoInjection
this.perforResbaiscnormRepository = perforResbaiscnormRepository;
//this.hubContext = hubContext;
this.logManageService = logManageService;
this.reportService = reportService;
}
#region 基础功能
......@@ -294,7 +297,13 @@ public void Generate(per_allot allot, string mail)
perforResbaiscnormRepository.AddRange(baiscnormList.ToArray());
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);
//logdbug.Add(allot.ID, "绩效开始执行", "绩效生成成功");
logManageService.WriteMsg("绩效生成结束", "绩效生成成功", 5, allot.ID, "ReceiveMessage", true);
......@@ -353,16 +362,20 @@ public void Pigeonhole(per_allot allot)
{
allot.States = 8;
allot.Remark = "归档";
if (_allotRepository.Update(allot))
{
var again = _againallotRepository.GetEntities(t => t.AllotID == allot.ID);
foreach (var item in again)
{
item.Remark = $"原状态:{item.States},归档更改状态";
item.States = 5;
_againallotRepository.Update(item);
}
}
_allotRepository.Update(allot);
//if (_allotRepository.Update(allot))
//{
// var again = _againallotRepository.GetEntities(t => t.AllotID == allot.ID);
// if (again != null && again.Count > 0)
// {
// foreach (var item in again)
// {
// item.Remark = $"原状态:{item.States},归档更改状态";
// item.States = 5;
// _againallotRepository.Update(item);
// }
// }
//}
}
/// <summary>
......
......@@ -24,6 +24,7 @@ public class ComputeService : IAutoInjection
private readonly PerforAgemployeeRepository _perforAgemployeeRepository;
private readonly PerforResbaiscnormRepository perforResbaiscnormRepository;
private readonly PerforCofincomeRepository _perforCofincomeRepository;
private readonly PerforAgsecondallotRepository _perforAgsecondallotRepository;
public ComputeService(PerforResaccountRepository perforResaccountRepository,
//PerforResaccountnurseRepository perforResAccountnurseRepository,
......@@ -35,7 +36,8 @@ public class ComputeService : IAutoInjection
PerforUserRepository perforUserRepository,
PerforAgemployeeRepository perforAgemployeeRepository,
PerforResbaiscnormRepository perforResbaiscnormRepository,
PerforCofincomeRepository perforCofincomeRepository)
PerforCofincomeRepository perforCofincomeRepository,
PerforAgsecondallotRepository perforAgsecondallotRepository)
{
this.perforResaccountRepository = perforResaccountRepository;
//this._perforResAccountnurseRepository = perforResAccountnurseRepository;
......@@ -48,6 +50,7 @@ public class ComputeService : IAutoInjection
this._perforAgemployeeRepository = perforAgemployeeRepository;
this.perforResbaiscnormRepository = perforResbaiscnormRepository;
this._perforCofincomeRepository = perforCofincomeRepository;
this._perforAgsecondallotRepository = perforAgsecondallotRepository;
}
/// <summary>
......@@ -306,20 +309,21 @@ public List<res_baiscnorm> GetBaiscnorm(int allotId)
/// <param name="accountId"></param>
/// <param name="type"></param>
/// <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 doctor = perforResaccountRepository.GetEntity(t => t.UnitType == type && t.AllotID == allotId && t.ID == accountId);
string typeValue = EnumHelper.GetItems<UnitType>().FirstOrDefault(t => t.Value == type).Name.ToString();
var doctor = perforResaccountRepository.GetEntity(t => t.ID == accountId);
string typeValue = EnumHelper.GetItems<UnitType>().FirstOrDefault(t => t.Value == doctor.UnitType).Name.ToString();
DeptDataDetails deptDetails = new DeptDataDetails
{
Pandect = Mapper.Map<PerDataAccountBaisc>(doctor),
Detail = new List<DetailDtos>()
};
int type = doctor.UnitType.Value;
if (type == (int)UnitType.专家组 || type == (int)UnitType.其他组)
type = 1;
var basicData = _perforImDataRepository.GetEntities(t => t.AllotID == allotId && t.UnitType == type && t.AccountingUnit == doctor.AccountingUnit);
var persheet = _perforPerSheetRepository.GetEntities(t => t.AllotID == allotId);
var basicData = _perforImDataRepository.GetEntities(t => t.AllotID == doctor.AllotID && t.UnitType == type && t.AccountingUnit == doctor.AccountingUnit);
var persheet = _perforPerSheetRepository.GetEntities(t => t.AllotID == doctor.AllotID);
//科室经济
var sheetEconomic = persheet.FirstOrDefault(t => t.SheetType == (int)SheetType.ComputeEconomic);
......@@ -353,5 +357,18 @@ public DeptDataDetails DeptDetail(int allotId, int accountId, int type)
}
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)
if (data == null || data.Count == 0)
{
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());
}
}
......@@ -537,6 +537,7 @@ public cof_again AgainUpdate(CofAgainRequest request)
throw new PerformanceException($"ID不存在 :{request.ID}");
again.Type = request.Type;
again.Department = request.Department;
again.TypeName = request.TypeName;
again.Value = request.Value;
......@@ -592,7 +593,12 @@ public List<TitleValue> WorkHeader(int allotId)
if (sheets == null)
return new List<TitleValue>();
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)
var exist = request.Source.Where(t => t.GId.HasValue && t.GId != 0).Select(t => t.GId);
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;
else
delItem.Add(t.Id);
......
......@@ -233,19 +233,19 @@ private void WriteOtherIncome(ISheet sheet, int hospitalId, IPerSheetDataRead sh
//写入列头信息
foreach (var item in itemList)
{
var headcell = head.GetCell(cellStartIndex);
var headcell = head.GetCell(cellStartIndex) ?? head.CreateCell(cellStartIndex);
headcell.SetCellValue(item.ItemName);
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.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.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.CellStyle = CellStyle.CreateCellStyle(workbook, StyleType.系数, CellFormat.百分比);
cellStartIndex++;
......
......@@ -159,8 +159,9 @@ public List<ComputeResult> Compute(List<ComputeEmployee> empolyeeList, List<im_a
{
//if (!accountbasic.ManagerNumber.HasValue || accountbasic.ManagerNumber.Value == 0)
// continue;
if (!accountbasic.DoctorDirectorNumber.HasValue || accountbasic.DoctorDirectorNumber.Value == 0)
if ((!accountbasic.DoctorDirectorNumber.HasValue && "皮肤科" != accountbasic.DoctorAccountingUnit) || (accountbasic.DoctorDirectorNumber.Value == 0 && "皮肤科" != accountbasic.DoctorAccountingUnit))
continue;
//原不存在科主任则跳过科主任绩效计算20190920新都
//是否共用核算单元
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
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 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);
......@@ -210,9 +235,9 @@ public List<ComputeResult> Compute(List<ComputeEmployee> empolyeeList, List<im_a
OtherPerfor = empolyee.OtherPerfor,
Number = number,
PerforTotal = perforTotal,
Avg = avg,
Efficiency = avg * (accountbasic.DoctorEffic ?? 1),
PerforTotal = realGiveFee,
Avg = realAvg,
Efficiency = realAvg * (accountbasic.DoctorEffic ?? 1),
Scale = perforTotal * (accountbasic.DoctorScale ?? 1),
Adjust = empolyee.Adjust,
Remark = isShare ? "特殊科室主任,共用核算单元" : ""
......@@ -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.BaiscNormPerforTotal = avg + compute.ShouldGiveFee;
compute.BaiscNormPerforTotal = compute.RealGiveFee;
computeList.Add(compute);
}
......
......@@ -63,7 +63,7 @@ public dynamic Survey(int hospitalId)
var allot = allotList.OrderByDescending(t => t.Year).ThenByDescending(t => t.Month).FirstOrDefault();
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)
{
foreach (var basic in basicList)
......@@ -71,17 +71,6 @@ public dynamic Survey(int hospitalId)
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
{
year = allot.Year,
......@@ -123,7 +112,7 @@ public List<PerReport> DoctorAvg(int hospitalId, int isIndex)
}
/// <summary>
/// 科室医生人均绩效(含科主任
/// 科室护理人均绩效(含护士长
/// </summary>
/// <returns></returns>
public List<PerReport> NurseAvg(int hospitalId, int isIndex)
......@@ -234,5 +223,101 @@ public List<PerReport> Income(int hospitalId, int isIndex)
}
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;
}
}
}
using AutoMapper;
using Microsoft.Extensions.Options;
using Performance.DtoModels;
using Performance.DtoModels.AppSettings;
using Performance.EntityModels;
using Performance.Repository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
namespace Performance.Services
{
public class SecondAllotService : IAutoInjection
{
private readonly Application application;
private readonly PerforUserRepository perforUserRepository;
private readonly PerforUserhospitalRepository perforUserhospitalRepository;
private readonly PerforPerallotRepository perforPerallotRepository;
private readonly PerforAgsecondallotRepository perforAgsecondallotRepository;
private readonly PerforResaccountRepository perforResaccountRepository;
private readonly PerforUserroleRepository userroleRepository;
private readonly PerforAgworkloadRepository perforAgworkloadRepository;
private readonly PerforAgtempRepository perforAgtempRepository;
private readonly PerforAgtempitemRepository perforAgtempitemRepository;
private readonly PerforAgfixatitemRepository perforAgfixatitemRepository;
private readonly PerforAgusetempRepository perforAgusetempRepository;
private readonly PerforAgcomputeRepository perforAgcomputeRepository;
private readonly PerforCofagainRepository perforCofagainRepository;
public SecondAllotService(IOptions<Application> application,
PerforUserRepository perforUserRepository,
PerforUserhospitalRepository perforUserhospitalRepository,
PerforPerallotRepository perforPerallotRepository,
PerforAgsecondallotRepository perforAgsecondallotRepository,
PerforResaccountRepository perforResaccountRepository,
PerforUserroleRepository userroleRepository,
PerforAgworkloadRepository perforAgworkloadRepository,
PerforAgtempRepository perforAgtempRepository,
PerforAgtempitemRepository perforAgtempitemRepository,
PerforAgfixatitemRepository perforAgfixatitemRepository,
PerforAgusetempRepository perforAgusetempRepository,
PerforAgcomputeRepository perforAgcomputeRepository,
PerforCofagainRepository perforCofagainRepository)
{
this.application = application.Value;
this.perforUserRepository = perforUserRepository;
this.perforUserhospitalRepository = perforUserhospitalRepository;
this.perforPerallotRepository = perforPerallotRepository;
this.perforAgsecondallotRepository = perforAgsecondallotRepository;
this.perforResaccountRepository = perforResaccountRepository;
this.userroleRepository = userroleRepository;
this.perforAgworkloadRepository = perforAgworkloadRepository;
this.perforAgtempRepository = perforAgtempRepository;
this.perforAgtempitemRepository = perforAgtempitemRepository;
this.perforAgfixatitemRepository = perforAgfixatitemRepository;
this.perforAgusetempRepository = perforAgusetempRepository;
this.perforAgcomputeRepository = perforAgcomputeRepository;
this.perforCofagainRepository = perforCofagainRepository;
}
#region 二次绩效列表与数据保存
/// <summary>
/// 获取二次绩效列表
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public List<SecondListResponse> GetSecondList(int userId)
{
var user = perforUserRepository.GetEntity(t => t.ID == userId);
if (user == null)
throw new NotImplementedException("人员ID无效");
var role = userroleRepository.GetEntity(t => t.UserID == userId);
var hospital = perforUserhospitalRepository.GetEntity(t => t.UserID == userId);
if (hospital == null)
throw new NotImplementedException("人员未选择医院");
var allotList = perforPerallotRepository.GetEntities(t => t.HospitalId == hospital.HospitalID && new List<int> { 6, 8 }.Contains(t.States));
if (allotList == null || allotList.Count == 0)
throw new NotImplementedException("该医院未生成绩效");
var allotListId = allotList.Select(t => t.ID).ToList();
var secondList = perforAgsecondallotRepository.GetEntities(t => allotListId.Contains(t.AllotId.Value) && t.Department == user.Department);
//各科室绩效分配结果
var accountList = perforResaccountRepository.GetEntities(t => allotListId.Contains(t.AllotID.Value) && t.Department == user.Department);
//取得未生成二次绩效的绩效id
var exceptListId = secondList == null ? allotListId : allotListId.Except(secondList.Select(t => t.AllotId.Value));
#region 初始化二次绩效
List<ag_secondallot> newSecond = new List<ag_secondallot>();
foreach (var item in exceptListId)
{
var allot = allotList.FirstOrDefault(t => t.ID == item);
if (allot == null) continue;
res_account account = null;
if (role.RoleID == application.DirectorRole)
account = accountList.FirstOrDefault(t => t.AllotID == item && (t.UnitType == (int)UnitType.医生组 || t.UnitType == (int)UnitType.医技组));
else if (role.RoleID == application.NurseRole)
account = accountList.FirstOrDefault(t => t.AllotID == item && t.UnitType == (int)UnitType.护理组);
if (account == null) continue;
var second = new ag_secondallot
{
AllotId = item,
Year = allot.Year,
Month = allot.Month,
Department = user.Department,
UnitType = ((UnitType)account.UnitType).ToString(),
RealGiveFee = account.RealGiveFee
};
newSecond.Add(second);
}
#endregion
if (newSecond.Count > 0)
{
perforAgsecondallotRepository.AddRange(newSecond.ToArray());
if (secondList == null)
secondList = newSecond;
else
secondList.AddRange(newSecond);
}
var list = Mapper.Map<List<SecondListResponse>>(secondList);
list?.ForEach(t => t.IsArchive = allotList.FirstOrDefault(a => a.ID == t.AllotId).States == 8 ? 1 : 0);
return list;
}
/// <summary>
/// 二次绩效详情
/// </summary>
/// <returns></returns>
public SecondResponse GetSecondDetail(UseTempRequest request)
{
var usetemp = perforAgusetempRepository.GetEntity(t => t.HospitalId == request.HospitalId && t.Department == request.Department && t.UnitType == request.UnitType);
if (usetemp == null)
throw new PerformanceException("当前科室暂未配置绩效模板");
//获取固定模板列 + 工作量列
var headItems = GetHeadItems(usetemp.UseTempId.Value, usetemp.HospitalId.Value, usetemp.Department, usetemp.UnitType);
var result = new SecondResponse { HeadItems = headItems, BodyItems = new List<BodyItem>() };
//获取已录入数据
var fixatList = perforAgfixatitemRepository.GetEntities(t => t.SecondId == request.SecondId && t.RowNumber.HasValue);
if (request.IsArchive == 1) //归档
{
#region 已归档数据,根据数据获取
if (fixatList == null || fixatList.Where(t => t.RowNumber != -1).Count() == 0)
throw new PerformanceException("绩效归档时,尚未添加数据。");
else
{
var existHead = fixatList.Select(t => new { FiledName = t.ItemName, Sort = t.Sort.Value, SourceType = t.SourceType.Value, Type = t.Type.Value, FactorValue = t.FactorValue.Value }).Distinct().ToList();
headItems = existHead.Select(t => new HeadItem
{
FiledId = headItems.FirstOrDefault(h => h.FiledName == t.FiledName && h.Type == t.Type)?.FiledId ?? "无FiledId",
FiledName = t.FiledName,
Sort = t.Sort,
SourceType = t.SourceType,
Type = t.Type,
FactorValue = t.FactorValue
}).Where(t => t.FiledId != "无FiledId").ToList();
result.HeadItems = headItems;
}
#endregion
}
//未归档
if (fixatList != null && fixatList.Where(t => t.RowNumber != -1).Count() > 0)
{
var rows = fixatList.Select(t => t.RowNumber.Value).Distinct();
foreach (var row in rows)
{
var header = row == -1 ? headItems.Where(t => t.Type == 1).ToList() : headItems.Where(t => t.Type != 1).ToList();
result.BodyItems.AddRange(GetBodyItems(header, 2, fixatitems: fixatList, row: row));
}
}
else if (fixatList == null || (fixatList != null && fixatList.Where(t => t.RowNumber != -1).Count() == 0))
{
#region 补充历史绩效需要带出的数据
var bringhead = headItems.Where(t => t.IsBring == 1).ToList();
if (bringhead != null && bringhead.Count > 0)
{
var allotList = perforPerallotRepository.GetEntities(t => t.HospitalId == request.HospitalId);
var secondIdList = perforAgsecondallotRepository.GetEntities(t => allotList.Select(a => a.ID).Contains(t.AllotId.Value)).OrderBy(t => t.Year).ThenBy(t => t.Month).Select(t => t.Id).ToList();
var index = secondIdList.IndexOf(request.SecondId);
if (index != 0)
fixatList = perforAgfixatitemRepository.GetEntities(t => t.SecondId == secondIdList.ElementAt(index - 1) && t.RowNumber.HasValue);
fixatList = fixatList?.Where(t => bringhead.Select(h => h.FiledName).Contains(t.ItemName)).ToList();
if (fixatList != null && fixatList.Count > 0)
{
var rows = fixatList.Select(t => t.RowNumber.Value).Distinct();
foreach (var row in rows)
{
var header = row == -1 ? bringhead.Where(t => t.Type == 1).ToList() : bringhead.Where(t => t.Type != 1).ToList();
result.BodyItems.AddRange(GetBodyItems(header, 2, fixatitems: fixatList, row: row));
}
}
}
#endregion
}
if (fixatList == null || (fixatList != null && fixatList.Where(t => t.RowNumber == -1).Count() == 0))
{
var second = perforAgsecondallotRepository.GetEntity(t => t.Id == request.SecondId);
var config = perforCofagainRepository.GetEntities(t => t.AllotID == second.AllotId && t.Department == request.Department) ?? new List<cof_again>();
#region 补充顶部数据
config.Add(new cof_again { TypeName = "绩效合计(考核后)", Value = second.RealGiveFee });
result.BodyItems.AddRange(GetBodyItems(headItems.Where(t => t.Type == 1).ToList(), 1, configs: config));
result.BodyItems.FirstOrDefault(t => t.FiledName == "发放月份").Value = $"{second.Year}{second.Month}月";
#endregion
}
return new SecondResponse
{
HeadItems = result.HeadItems.OrderBy(t => t.Type).ThenBy(t => t.Sort).ThenBy(t => t.FiledName).ToList(),
BodyItems = result.BodyItems.OrderBy(t => t.RowNumber).ThenBy(t => t.Type).ThenBy(t => t.Sort).ToList(),
};
}
/// <summary>
/// 二次绩效项录入保存
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public bool SaveValue(List<ag_fixatitem> request)
{
var secondId = request.First().SecondId;
var second = perforAgsecondallotRepository.GetEntity(t => t.Id == secondId);
if (second == null)
throw new PerformanceException("二次绩效ID不存在");
var fixatitems = perforAgfixatitemRepository.GetEntities(t => t.SecondId == secondId);
foreach (var item in request)
{
if (fixatitems != null && fixatitems.Any(t => t.SecondId == secondId && t.RowNumber == item.RowNumber && t.ItemName == item.ItemName))
{
var cellItem = fixatitems.First(t => t.SecondId == secondId && t.RowNumber == item.RowNumber && t.ItemName == item.ItemName);
cellItem.ItemValue = item.ItemValue;
cellItem.Sort = item.Sort;
cellItem.SourceType = item.SourceType;
cellItem.Type = item.Type;
cellItem.UnitType = item.UnitType;
perforAgfixatitemRepository.Update(cellItem);
}
else
{
perforAgfixatitemRepository.Add(item);
}
}
return DelValue(second.Id, request);
}
/// <summary>
/// 删除未保存的历史数据
/// </summary>
/// <param name="secondId"></param>
/// <param name="fixatitems"></param>
/// <returns></returns>
public bool DelValue(int secondId, List<ag_fixatitem> fixatitems)
{
if (secondId == 0)
throw new PerformanceException("二次绩效Id无效");
var fixatlist = perforAgfixatitemRepository.GetEntities(t => t.SecondId == secondId);
if (fixatitems == null || fixatitems.Count == 0)
{
return perforAgfixatitemRepository.RemoveRange(fixatlist.ToArray());
}
var saveRows = fixatitems.Select(t => t.RowNumber).Distinct();
var delRows = fixatlist.Select(t => t.RowNumber).Distinct().Except(saveRows);
if (delRows != null && delRows.Count() > 0)
return perforAgfixatitemRepository.RemoveRange(fixatlist.Where(t => delRows.Contains(t.RowNumber)).ToArray());
return true;
}
/// <summary>
/// 二次绩效分配结果保存
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public bool SaveCompute(List<ag_compute> request)
{
var secondId = request.First().SecondId;
var second = perforAgsecondallotRepository.GetEntity(t => t.Id == secondId);
if (second == null)
throw new PerformanceException("二次绩效ID不存在");
if (second.Status == 2)
throw new PerformanceException("二次绩效已提交,无法重复提交");
var compute = perforAgcomputeRepository.GetEntities(t => t.SecondId == secondId);
foreach (var item in request)
{
if (compute != null && compute.Any(t => t.SecondId == secondId && t.Department == item.Department && t.PersonName == item.PersonName))
{
var cellItem = compute.First(t => t.SecondId == secondId && t.Department == item.Department && t.PersonName == item.PersonName);
cellItem.RealGiveFee = item.RealGiveFee;
perforAgcomputeRepository.Update(cellItem);
}
else
{
perforAgcomputeRepository.Add(item);
}
}
return true;
}
#endregion
#region 模板
/// <summary>
/// 获取模板列表
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public List<SecondTempResponse> GetTemp(int hospitalid)
{
var temps = perforAgtempRepository.GetEntities();
if (temps != null && temps.Any())
{
var useTemp = perforAgusetempRepository.GetEntity(t => t.HospitalId == hospitalid);
var secondTemps = Mapper.Map<List<SecondTempResponse>>(temps);
if (useTemp != null)
secondTemps.ForEach(t => t.IsSelected = t.Id == useTemp.UseTempId);
return secondTemps;
}
return new List<SecondTempResponse>();
}
/// <summary>
/// 使用模板
/// </summary>
/// <param name="tempId"></param>
/// <returns></returns>
public bool UseTemp(UseTempRequest request)
{
var result = false;
var entity = perforAgusetempRepository.GetEntity(t => t.HospitalId == request.HospitalId
&& t.Department == request.Department && t.UnitType == request.UnitType);
if (entity == null)
{
entity = Mapper.Map<ag_usetemp>(request);
result = perforAgusetempRepository.Add(entity);
}
else
{
entity.UseTempId = request.TempId;
result = perforAgusetempRepository.Update(entity);
if (result)
{
//获取固定模板列 + 工作量列
var headItems = GetHeadItems(request.TempId, request.HospitalId, request.Department, request.UnitType);
List<ag_fixatitem> list = new List<ag_fixatitem>();
var addList = new List<ag_fixatitem>();
var allotList = perforPerallotRepository.GetEntities(t => t.HospitalId == request.HospitalId);
var secondList = Mapper.Map<List<SecondListResponse>>(perforAgsecondallotRepository.GetEntities(t => allotList.Select(a => a.ID).Contains(t.AllotId.Value)));
secondList?.ForEach(t => t.IsArchive = allotList.FirstOrDefault(a => a.ID == t.AllotId).States == 8 ? 1 : 0);
var secondId = secondList.Where(s => s.IsArchive == 0)?.Select(s => s.Id); //获取未归档的二次绩效
if (secondId == null || secondId.Count() <= 0)
return result;
var fixatList = perforAgfixatitemRepository.GetEntities(t => secondId.Contains(t.SecondId.Value));
#region 获取需要添加的数据 无需操作的数据
foreach (var second in secondList)
{
foreach (var head in headItems)
{
if (second.IsArchive == 0)
{
var exist = fixatList?.Where(t => t.ItemName == head.FiledName && t.Type == head.Type && t.SecondId == second.Id);
if (exist != null && exist.Count() > 0)
list.AddRange(exist);
else
{
var configs = perforCofagainRepository.GetEntities(t => t.AllotID == second.AllotId && t.Department == request.Department) ?? new List<cof_again>();
addList.Add(new ag_fixatitem
{
ItemName = head.FiledName,
RowNumber = -1,
Type = head.Type,
SourceType = head.SourceType,
Sort = head.Sort,
FactorValue = head.FactorValue,
UnitType = second.UnitType,
AllotId = second.AllotId,
SecondId = second.Id,
ItemValue = head.FiledName == "绩效合计(考核后)" ? second.RealGiveFee?.ToString()
: head.FiledName == "发放月份" ? $"{second.Year}{second.Month}月"
: configs.FirstOrDefault(t => t.TypeName == head.FiledName)?.Value.ToString()
});
}
}
}
}
#endregion
if (list != null && list.Count > 0)
{
var delList = fixatList.Except(list);
perforAgfixatitemRepository.RemoveRange(delList.ToArray());
if (addList != null && addList.Count > 0)
perforAgfixatitemRepository.AddRange(addList.ToArray());
}
}
}
return result;
}
/// <summary>
/// 应用模板
/// </summary>
/// <returns></returns>
public void RefreshTemp(UseTempRequest request)
{
var usetemp = perforAgusetempRepository.GetEntity(t => t.HospitalId == request.HospitalId && t.Department == request.Department && t.UnitType == request.UnitType);
if (usetemp == null)
throw new PerformanceException("参数usetempId 无效");
//获取工作量列头
var workItem = perforAgworkloadRepository.GetEntities(t => t.HospitalId == usetemp.HospitalId && t.Department == usetemp.Department && t.UnitType == usetemp.UnitType);
//获取固定模板列头
var tempItem = perforAgtempitemRepository.GetEntities(t => t.TempId == usetemp.UseTempId);
var tempHeader = workItem == null ? tempItem.Select(t => t.FiledName) : tempItem.Select(t => t.FiledName).Union(workItem?.Select(t => t.ItemName));
//获取数据
var fixatList = perforAgfixatitemRepository.GetEntities(t => t.SecondId == request.SecondId);
if (fixatList == null || fixatList.Count == 0)
throw new PerformanceException("未录入数据");
//更新系数、排序
fixatList.ForEach(t =>
{
t.Sort = workItem?.FirstOrDefault(w => w.ItemName == t.ItemName)?.Sort;
t.FactorValue = workItem?.FirstOrDefault(w => w.ItemName == t.ItemName)?.FactorValue;
});
perforAgfixatitemRepository.UpdateRange(fixatList.ToArray());
//删除 列 不存在的数据
var header = fixatList.Select(t => t.ItemName).Distinct();
var delItems = header.Except(tempHeader);
if (delItems != null && delItems.Count() > 0)
perforAgfixatitemRepository.RemoveRange(fixatList.Where(t => delItems.Contains(t.ItemName)).ToArray());
//添加 新增列 的数据
var addItems = new List<ag_fixatitem>();
fixatList.Select(t => t.RowNumber).Distinct().ToList().ForEach(t =>
{
addItems.AddRange(tempHeader.Except(header)?.Select(s => new ag_fixatitem
{
ItemName = s,
RowNumber = t,
AllotId = fixatList.First().AllotId,
SecondId = fixatList.First().SecondId,
UnitType = fixatList.First().UnitType,
Sort = tempItem?.FirstOrDefault(w => w.FiledName == s)?.Sort ?? workItem?.FirstOrDefault(w => w.ItemName == s)?.Sort,
FactorValue = workItem?.FirstOrDefault(w => w.ItemName == s)?.FactorValue,
Type = tempItem?.FirstOrDefault(w => w.FiledName == s)?.Type ?? 3,
SourceType = tempItem?.FirstOrDefault(w => w.FiledName == s)?.SourceType ?? 1,
}));
});
if (addItems != null && addItems.Count() > 0)
perforAgfixatitemRepository.AddRange(addItems.ToArray());
}
#endregion
#region 工作量绩效配置
/// <summary>
/// 获取工作量列表
/// </summary>
/// <param name="secondId"></param>
/// <returns></returns>
public List<ag_workload> GetWorkloadList(WorkloadRequest request)
{
return perforAgworkloadRepository.GetEntities(t => t.HospitalId == request.HospitalId && t.Department == request.Department && t.UnitType == request.UnitType);
}
/// <summary>
/// 新增工作量绩效配置
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public bool WorkloadAdd(WorkloadRequest request)
{
var workloadList = perforAgworkloadRepository.GetEntities(t => t.HospitalId == request.HospitalId && t.Department == request.Department && t.UnitType == request.UnitType);
if (workloadList != null && workloadList.Any(t => t.ItemName == request.ItemName))
throw new PerformanceException("项目名称重复");
ag_workload workload = new ag_workload
{
HospitalId = request.HospitalId,
Department = request.Department,
UnitType = request.UnitType,
FactorValue = request.FactorValue ?? 1,
ItemName = request.ItemName,
Sort = request.Sort ?? 1,
};
var result = perforAgworkloadRepository.Add(workload);
if (result)
{
workload.ItemId = $"Feild{workload.Id}";
perforAgworkloadRepository.Update(workload);
}
return result;
}
/// <summary>
/// 修改工作量绩效配置
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public bool WorkloadUpdate(WorkloadRequest request)
{
var workloadList = perforAgworkloadRepository.GetEntities(t => t.HospitalId == request.HospitalId && t.Department == request.Department && t.UnitType == request.UnitType);
if (workloadList != null && workloadList.Any(t => t.Id != request.Id && t.ItemName == request.ItemName))
throw new PerformanceException("项目名称重复");
var workload = workloadList.FirstOrDefault(t => t.Id == request.Id);
workload.HospitalId = request.HospitalId;
workload.Department = request.Department;
workload.UnitType = request.UnitType;
workload.FactorValue = request.FactorValue;
workload.ItemName = request.ItemName;
workload.Sort = request.Sort;
workload.ItemId = $"Feild{workload.Id}";
return perforAgworkloadRepository.Update(workload);
}
/// <summary>
/// 删除工作量绩效配置
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool WorkloadDelete(int id)
{
var workload = perforAgworkloadRepository.GetEntity(t => t.Id == id);
return perforAgworkloadRepository.Remove(workload);
}
#endregion
#region 二次绩效考核
/// <summary>
/// 二次绩效考核列表
/// </summary>
/// <param name="userId">用户ID</param>
/// <returns></returns>
public List<ag_secondallot> AuditList(int userId)
{
var hospital = perforUserhospitalRepository.GetEntities(t => t.UserID == userId);
var allotList = perforPerallotRepository.GetEntities(t => hospital.Select(h => h.HospitalID).Contains(t.HospitalId));
if (allotList != null && allotList.Count > 0)
{
var allotIds = allotList.Select(t => t.ID);
return perforAgsecondallotRepository.GetEntities(t => allotIds.Contains(t.AllotId.Value) && t.Status == 2);
}
return null;
}
/// <summary>
/// 提交审核
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="secondId">二次绩效ID</param>
/// <returns></returns>
public bool AuditSubmit(ag_secondallot second)
{
second.Status = 2;
second.SubmitTime = DateTime.Now;
second.Remark = "已提交审核,等待审核中";
return perforAgsecondallotRepository.Update(second);
}
/// <summary>
/// 审核
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="secondId">二次绩效ID</param>
/// <param name="ispass">1、审核通过 2、驳回</param>
/// <returns></returns>
public bool ConfirmAudit(int userId, SecondAuditRequest request)
{
var second = perforAgsecondallotRepository.GetEntity(t => t.Id == request.SecondId);
if (second.Status != 2)
throw new PerformanceException("该绩效未提交至审核,请确认");
second.Status = request.IsPass == 1 ? 3 : 4;
second.AuditUser = userId;
second.AuditTime = DateTime.Now;
second.Remark = request.Remark;
if (string.IsNullOrEmpty(second.Remark))
{
second.Remark = request.IsPass == 1 ? "审核通过" : "驳回";
}
return perforAgsecondallotRepository.Update(second);
}
#endregion
#region common
/// <summary>
/// 获取二次绩效
/// </summary>
/// <param name="secondId">二次绩效Id</param>
/// <returns></returns>
public ag_secondallot GetSecondallot(int secondId)
{
return perforAgsecondallotRepository.GetEntity(t => t.Id == secondId);
}
/// <summary>
/// 获取 列
/// </summary>
/// <param name="tempId">模板Id</param>
/// <param name="hospitalId">医院Id</param>
/// <param name="department">科室</param>
/// <param name="unitType">核算单元类型</param>
/// <returns></returns>
public List<HeadItem> GetHeadItems(int tempId, int hospitalId, string department, string unitType)
{
var tempItem = perforAgtempitemRepository.GetEntities(t => t.TempId == tempId);
var headItems = Mapper.Map<List<HeadItem>>(tempItem) ?? new List<HeadItem>();
//获取工作量列头
var workItem = perforAgworkloadRepository.GetEntities(t => t.HospitalId == hospitalId && t.Department == department && t.UnitType == unitType);
if (workItem != null && workItem.Count > 0)
{
var workDtos = Mapper.Map<List<HeadItem>>(workItem);
workDtos.ForEach(t => { t.Type = 3; });
headItems.AddRange(workDtos);
}
return headItems;
}
/// <summary>
/// 获取 展示数据
/// </summary>
/// <param name="headItems">列</param>
/// <param name="source">数据来源 1. 二次绩效配置 2. 保存数据 </param>
/// <param name="configs">二次绩效配置</param>
/// <param name="fixatitems">保存数据</param>
/// <param name="row">行号</param>
/// <returns></returns>
public List<BodyItem> GetBodyItems(List<HeadItem> headItems, int source, List<cof_again> configs = null, List<ag_fixatitem> fixatitems = null, int? row = null)
{
var bodyItems = new List<BodyItem>();
foreach (var item in headItems)
{
var bodyItem = new BodyItem
{
RowNumber = source == 1 ? -1 : row.Value,
FiledId = item.FiledId,
FiledName = item.FiledName,
FactorValue = item.FactorValue,
SourceType = item.SourceType,
Type = item.Type,
Sort = item.Sort,
Value = source == 1 ? configs.FirstOrDefault(t => t.TypeName == item.FiledName)?.Value.ToString()
: fixatitems.FirstOrDefault(t => t.RowNumber == row && t.ItemName == item.FiledName)?.ItemValue
};
bodyItems.Add(bodyItem);
}
return bodyItems;
}
#endregion
}
}
......@@ -4,6 +4,7 @@
using Performance.DtoModels;
using Performance.DtoModels.AppSettings;
using Performance.EntityModels;
using Performance.Infrastructure;
using Performance.Repository;
using System;
using System.Collections.Generic;
......@@ -303,10 +304,20 @@ public UserResponse UpdatePwd(PasswordRequest request, int userId)
/// 角色列表
/// </summary>
/// <returns></returns>
public List<sys_role> RoleList()
public List<sys_role> RoleList(int userId)
{
var role = _roleRepository.GetEntities(t => t.States == 1);
return role;
var user = _userroleRepository.GetEntity(t => t.UserID == userId);
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>
......@@ -325,5 +336,25 @@ public List<TitleValue> Department(int hospitalID)
}
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