Commit c9ea0b6b by ruyun.zhang@suvalue.com

Merge branch 'release/大量更新'

parents db1680c9 f441fd10
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Performance.DtoModels.AppSettings;
using Performance.Infrastructure;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Performance.Api.Configurations
{
public static class AppSettingConfig
{
public static void AddAppSettingConfiguration(this IServiceCollection services, IConfiguration configuration)
{
if (services == null) throw new ArgumentNullException(nameof(services));
services
.Configure<AppConnection>(configuration.GetSection("AppConnection"))
.Configure<Application>(configuration.GetSection("Application"))
.Configure<HuyiSmsConfig>(configuration.GetSection("HuyiSmsConfig"))
.Configure<EmailOptions>(configuration.GetSection("EmailOptions"))
.Configure<RateLimitingConfig>(configuration.GetSection("RateLimitingConfig"))
.Configure<WebapiUrl>(configuration.GetSection("WebapiUrl"));
}
}
}
using AutoMapper;
using Microsoft.Extensions.DependencyInjection;
using Performance.DtoModels.AutoMapper;
using System;
namespace Performance.Api.Configurations
{
public static class AutoMapperConfig
{
public static void AddAutoMapperConfiguration(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
Mapper.Initialize(cfg => cfg.AddProfile<AutoMapperConfigs>());
services.AddAutoMapper();
}
}
}
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Performance.DtoModels.AppSettings;
using Performance.EntityModels;
using System;
namespace Performance.Api.Configurations
{
public static class DatabaseConfig
{
public static void AddDatabaseConfiguration(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
var connection = services.BuildServiceProvider().GetService<IOptions<AppConnection>>();
services.AddDbContext<PerformanceDbContext>(options =>
{
options.UseMySQL(connection.Value.PerformanceConnectionString);
});
}
}
}
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Performance.Infrastructure;
using Performance.Services;
using Performance.Services.Queues;
using System;
namespace Performance.Api.Configurations
{
public static class DependencyInjectionConfig
{
public static void AddDependencyInjectionConfiguration(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
#region custom util
//huyi短信发送注入
services.AddScoped<HuyiSmsNotify>();
//用户身份信息服务
services.AddScoped<ClaimService>();
#endregion custom util
#region email
//阿里邮箱配置
var emailOption = services.BuildServiceProvider().GetService<IOptions<EmailOptions>>();
//邮件发送
services.AddEmailUtil(options =>
{
options.Account = emailOption.Value.Account;
options.Password = emailOption.Value.Password;
options.SmtpServer = emailOption.Value.SmtpServer;
});
#endregion email
#region redis
//var csredis = new CSRedis.CSRedisClient(connection.Value.RedisConnectionString);
//RedisHelper.Initialization(csredis);
#endregion redis
services.AddHostedService<QueuedHostedService>();
services.AddSingleton<IBackgroundTaskQueue, BackgroundTaskQueue>();
services.AddSingleton<IHubNotificationQueue, HubNotificationQueue>();
services
.AddPerformanceService()
.AddPerformanceRepoitory();
}
}
#region hangfire 权限
public class HangfireAuthorizationFilter : Hangfire.Dashboard.IDashboardAuthorizationFilter
{
//这里需要配置权限规则
public bool Authorize(Hangfire.Dashboard.DashboardContext context)
{
return true;
}
}
#endregion hangfire 权限
}
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.Swagger;
using System;
using System.Collections.Generic;
using System.IO;
namespace Performance.Api.Configurations
{
public static class SwaggerConfig
{
public static void AddSwaggerConfiguration(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Version = "v1.0", Title = "绩效API接口" });
//var xmlPath = new string[]
//{
// Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "Performance.Api.xml"),
// Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "Performance.DtoModels.xml"),
// Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "Performance.EntityModels.xml"),
//};
//foreach (var item in xmlPath)
//{
// c.IncludeXmlComments(item, true);
//}
var xmlPathsss = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "Performance.Api.xml");
c.IncludeXmlComments(xmlPathsss, true);
// Token绑定到ConfigureServices
var security = new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference{ Type = ReferenceType.SecurityScheme, Id = "Bearer" }
},
new List<string>()
}
};
c.AddSecurityRequirement(security);
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT授权(数据将在请求头中进行传输) 直接在下框中输入Bearer {token}(注意两者之间是一个空格)",
Name = "Authorization",
In = ParameterLocation.Header
});
});
}
public static void UseSwaggerSetup(this IApplicationBuilder app, IConfiguration configuration)
{
if (app == null) throw new ArgumentNullException(nameof(app));
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint(configuration["Application:SwaggerEndpoint"], "v1.0");
c.RoutePrefix = string.Empty;
});
}
}
}
...@@ -315,7 +315,7 @@ public ApiResponse SelfInfos([FromBody] UserRequest request) ...@@ -315,7 +315,7 @@ public ApiResponse SelfInfos([FromBody] UserRequest request)
if (request.Role <= 0) if (request.Role <= 0)
user.IsAgainAdmin = user.Role != null ? roleArray.Contains(user.Role.First().Type ?? 0) : false; user.IsAgainAdmin = user.Role != null ? roleArray.Contains(user.Role.First().Type ?? 0) : false;
else else
user.IsAgainAdmin = user.Role != null ? roleArray.Contains(user.Role.First(t=>t.RoleID==request.Role).Type ?? 0) : false; user.IsAgainAdmin = user.Role != null ? roleArray.Contains(user.Role.First(t => t.RoleID == request.Role).Type ?? 0) : false;
return new ApiResponse(ResponseType.OK, user); return new ApiResponse(ResponseType.OK, user);
} }
...@@ -371,16 +371,34 @@ public ApiResponse DeleteUser([CustomizeValidator(RuleSet = "Delete"), FromBody] ...@@ -371,16 +371,34 @@ public ApiResponse DeleteUser([CustomizeValidator(RuleSet = "Delete"), FromBody]
#endregion #endregion
/// <summary> /// <summary>
/// 批量新增用户表头
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("GetBatchUserStructrue")]
[HttpPost]
public ApiResponse GetBatchUserStructrue()
{
var result = _userService.GetUserHandsFlat();
return new ApiResponse(ResponseType.OK, result);
}
/// <summary>
/// 批量新增用户 /// 批量新增用户
/// </summary> /// </summary>
/// <param name="request"></param> /// <param name="request"></param>
/// <returns></returns> /// <returns></returns>
[Route("BatchSaveUser")] [Route("BatchSaveUser")]
[HttpPost] [HttpPost]
public ApiResponse BatchSaveUser() public ApiResponse BatchSaveUser([CustomizeValidator(RuleSet = "Insert"), FromBody] UserCollectData data)
{ {
var result = _userService.SaveUserHandsFlat(data);
if (result == "")
return new ApiResponse(ResponseType.OK); return new ApiResponse(ResponseType.OK);
else
return new ApiResponse(ResponseType.Error, result);
} }
} }
} }
\ No newline at end of file
using FluentValidation.AspNetCore; using FluentValidation.AspNetCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Internal; using Microsoft.AspNetCore.Http.Internal;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Performance.DtoModels; using Performance.DtoModels;
...@@ -16,6 +18,7 @@ ...@@ -16,6 +18,7 @@
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Web;
// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
...@@ -88,7 +91,7 @@ public ApiResponse Success([FromBody] AllotRequest request) ...@@ -88,7 +91,7 @@ public ApiResponse Success([FromBody] AllotRequest request)
/// <returns></returns> /// <returns></returns>
[Route("insert")] [Route("insert")]
[HttpPost] [HttpPost]
public ApiResponse Insert([CustomizeValidator(RuleSet = "Insert"), FromBody] AllotRequest request) public ApiResponse Insert([FromBody] AllotRequest request)
{ {
var userId = _claim.GetUserId(); var userId = _claim.GetUserId();
var result = _allotService.InsertAllot(request, userId); var result = _allotService.InsertAllot(request, userId);
...@@ -298,7 +301,20 @@ public ApiResponse GenerateReport([CustomizeValidator(RuleSet = "Delete"), FromB ...@@ -298,7 +301,20 @@ public ApiResponse GenerateReport([CustomizeValidator(RuleSet = "Delete"), FromB
await Task.Delay(TimeSpan.FromSeconds(5), token); await Task.Delay(TimeSpan.FromSeconds(5), token);
} }
}); });
return new ApiResponse(ResponseType.OK); return new ApiResponse(ResponseType.OK, "统计报表数据任务开始");
}
/// <summary>
/// 验证科室核算单元、工号
/// </summary>
/// <param name="allotId"></param>
/// <returns></returns>
[Route("accounting/verify/{allotId}")]
[HttpPost]
public ApiResponse AccountingVerify([FromRoute] int allotId)
{
_allotService.AccoungtingVerify(allotId);
return new ApiResponse(ResponseType.OK, "核算单元及组别数据验证结束,请刷新页面。");
} }
/* /*
...@@ -500,5 +516,37 @@ public ApiResponse Reserved([FromBody] ReservedRequest request) ...@@ -500,5 +516,37 @@ public ApiResponse Reserved([FromBody] ReservedRequest request)
return new ApiResponse(ResponseType.OK, result); return new ApiResponse(ResponseType.OK, result);
} }
/// <summary>
/// 下载当前测算表
/// </summary>
/// <param name="allotid"></param>
/// <returns></returns>
[Route("current/download/{allotid}")]
[HttpGet]
[AllowAnonymous]
public IActionResult DownloadCurrentCalculationTable(int allotid)
{
var allot = _allotService.GetAllot(allotid);
if (null == allot)
throw new PerformanceException("当前测算表不存在");
if (string.IsNullOrEmpty(allot.Path))
throw new PerformanceException("尚未提交测算表");
if (!FileHelper.IsExistFile(allot.Path))
throw new PerformanceException("测算表文件路径无效");
var memoryStream = new MemoryStream();
using (var stream = new FileStream(allot.Path, FileMode.Open))
{
stream.CopyToAsync(memoryStream).Wait();
}
memoryStream.Seek(0, SeekOrigin.Begin);
var provider = new FileExtensionContentTypeProvider();
FileInfo fileInfo = new FileInfo(allot.Path);
var memi = provider.Mappings[".xlsx"];
return File(memoryStream, memi, Path.GetFileName(fileInfo.Name));
}
} }
} }
...@@ -305,6 +305,7 @@ public ApiResponse AllComputeByPM([FromBody] ComputerRequest request) ...@@ -305,6 +305,7 @@ public ApiResponse AllComputeByPM([FromBody] ComputerRequest request)
AdjustLaterOtherFee = t.Sum(s => s.AdjustLaterOtherFee), AdjustLaterOtherFee = t.Sum(s => s.AdjustLaterOtherFee),
ShouldGiveFee = t.Sum(s => s.ShouldGiveFee), ShouldGiveFee = t.Sum(s => s.ShouldGiveFee),
OthePerfor = t.Sum(s => s.OthePerfor), OthePerfor = t.Sum(s => s.OthePerfor),
HideOtherPerfor = t.Sum(s => s.HideOtherPerfor),
NightWorkPerfor = t.Sum(s => s.NightWorkPerfor), NightWorkPerfor = t.Sum(s => s.NightWorkPerfor),
RealGiveFee = t.Sum(s => s.RealGiveFee), RealGiveFee = t.Sum(s => s.RealGiveFee),
ReservedRatio = t.Sum(s => s.ReservedRatio), ReservedRatio = t.Sum(s => s.ReservedRatio),
...@@ -395,23 +396,5 @@ public ApiResponse<res_baiscnorm> EditHospitalAvg([FromBody] ComputerAvgRequest ...@@ -395,23 +396,5 @@ public ApiResponse<res_baiscnorm> EditHospitalAvg([FromBody] ComputerAvgRequest
} }
#endregion #endregion
#region 其他绩效统计
/// <summary>
/// 其他医院绩效统计
/// </summary>
/// <param name="allotId"></param>
/// <returns></returns>
[Route("OtherPerStats/{allotId}")]
[HttpPost]
public ApiResponse OtherPerStats(int allotId)
{
var employee = _employeeService.GetAprList(allotId, _claim.GetUserId());
var relust = _computeService.GetOtherPerStats(employee);
return new ApiResponse(ResponseType.OK, relust);
}
#endregion
} }
} }
\ No newline at end of file
...@@ -533,19 +533,24 @@ public ApiResponse DepttypeDelete([CustomizeValidator(RuleSet = "Delete"), FromB ...@@ -533,19 +533,24 @@ public ApiResponse DepttypeDelete([CustomizeValidator(RuleSet = "Delete"), FromB
[HttpPost] [HttpPost]
public ApiResponse GetAccountingList([FromBody] AccoungingRequest request) public ApiResponse GetAccountingList([FromBody] AccoungingRequest request)
{ {
if (request.AllotId == 0 || !new int[] { 1, 2, 3 }.Contains(request.Type)) var enumItems = EnumHelper.GetItems<AccountTypeEnum>();
if ((request.AllotId == 0 && request.HospitalId == 0) || !enumItems.Select(t => t.Value).Contains(request.Type))
return new ApiResponse(ResponseType.ParameterError); return new ApiResponse(ResponseType.ParameterError);
var list = _configService.GetAccountingList(request) ?? new List<cof_accounting>(); var result = _configService.GetAccountingList(request);
switch (request.Type) switch (request.Type)
{ {
case 1: case (int)AccountTypeEnum.List: //返回accounting列表
default: //返回accounting列表 default:
return new ApiResponse(ResponseType.OK, "ok", list); return new ApiResponse(ResponseType.OK, AccountTypeEnum.List.ToString(), result);
case 3: //返回核算单元类型
return new ApiResponse(ResponseType.OK, "ok", list.Select(t => new TitleValue { Title = t.UnitType, Value = t.UnitType }).ToDistinct()); case (int)AccountTypeEnum.UnitType: //返回核算单元类型
case 2: //返回核算单元 var unittypes = result.Select(t => new TitleValue { Title = t.UnitType, Value = t.UnitType }).ToDistinct();
return new ApiResponse(ResponseType.OK, "ok", list.Select(t => new TitleValue { Title = t.AccountingUnit, Value = t.AccountingUnit }).ToDistinct()); return new ApiResponse(ResponseType.OK, AccountTypeEnum.UnitType.ToString(), unittypes);
case (int)AccountTypeEnum.AccountingUnit: //返回核算单元
var accountingunits = result.Select(t => new TitleValue { Title = t.AccountingUnit, Value = t.AccountingUnit }).ToDistinct();
return new ApiResponse(ResponseType.OK, AccountTypeEnum.AccountingUnit.ToString(), accountingunits);
} }
} }
...@@ -595,18 +600,37 @@ public ApiResponse AccountingDelete([FromRoute] int accountingId) ...@@ -595,18 +600,37 @@ public ApiResponse AccountingDelete([FromRoute] int accountingId)
return new ApiResponse(ResponseType.OK); return new ApiResponse(ResponseType.OK);
} }
/// <summary>
/// 核算单元及组别批量表头
/// </summary>
/// <param name="allotId"></param>
/// <returns></returns>
[Route("BatchAccountingStructrue/{allotId}")]
[HttpPost]
public ApiResponse BatchAccountingStructrue([FromRoute] int allotId)
{
var request = _configService.GetBatchAccountingStructrue(allotId);
return new ApiResponse(ResponseType.OK, request);
}
/// <summary> /// <summary>
/// 核算单元及组别数据验证 /// 核算单元及组别批量添加
/// </summary> /// </summary>
/// <param name="allotId"></param> /// <param name="allotId"></param>
/// <returns></returns> /// <returns></returns>
[Route("accountingverify/{allotId}")] [Route("BatchSaveAccounting/{allotId}")]
[HttpPost] [HttpPost]
public ApiResponse AccountingVerify([FromRoute] int allotId) public ApiResponse BatchSaveAccounting(int allotId, [FromBody] SaveCollectData request)
{ {
_configService.AccoungtingVerify(allotId); var result = _configService.BatchSaveAccounting(allotId, request);
if (result)
return new ApiResponse(ResponseType.OK); return new ApiResponse(ResponseType.OK);
else
return new ApiResponse(ResponseType.Error, "请选择正确的核算组别");
} }
#endregion #endregion
/// <summary> /// <summary>
......
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using FluentValidation.AspNetCore; using FluentValidation.AspNetCore;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.StaticFiles;
using Performance.DtoModels; using Performance.DtoModels;
using Performance.EntityModels; using Performance.EntityModels;
using Performance.Infrastructure;
using Performance.Infrastructure.Models;
using Performance.Services; using Performance.Services;
namespace Performance.Api.Controllers namespace Performance.Api.Controllers
...@@ -27,13 +31,22 @@ public PersonController(PersonService personService, ClaimService claimService) ...@@ -27,13 +31,22 @@ public PersonController(PersonService personService, ClaimService claimService)
/// 获取所有员工记录 /// 获取所有员工记录
/// </summary> /// </summary>
/// <param name="allotId"></param> /// <param name="allotId"></param>
/// <param name="request"></param>
/// <returns></returns> /// <returns></returns>
[Route("person/list/{allotId}")] [Route("person/list/{allotId}")]
[HttpPost] [HttpPost]
public ApiResponse GetPersons(int allotId) public ApiResponse GetPersons([FromRoute] int allotId, [FromBody] PersonParamsRequest request)
{ {
var list = personService.GetPersons(allotId, claimService.GetUserId()); var list = personService.GetPersons(allotId, claimService.GetUserId(), request)
return new ApiResponse(ResponseType.OK, list); ?? new PageList<per_employee>(new List<per_employee>(), 0, request.PageNumber, request.PageSize);
return new ApiResponse(ResponseType.OK, new
{
list.CurrentPage,
list.TotalPages,
list.PageSize,
list.TotalCount,
list
});
} }
/// <summary> /// <summary>
...@@ -80,6 +93,30 @@ public ApiResponse DeletePerson(int employeeId) ...@@ -80,6 +93,30 @@ public ApiResponse DeletePerson(int employeeId)
} }
/// <summary> /// <summary>
/// 下载当前测算表
/// </summary>
/// <returns></returns>
[Route("person/list/download/{allotId}")]
[HttpPost]
public IActionResult DownloadCurrentCalculationTable([FromRoute] int allotId)
{
var filepath = personService.GetPersonDictFile(allotId, claimService.GetUserId());
if (!FileHelper.IsExistFile(filepath))
throw new PerformanceException("获取人员字典失败");
var memoryStream = new MemoryStream();
using (var stream = new FileStream(filepath, FileMode.Open))
{
stream.CopyToAsync(memoryStream).Wait();
}
memoryStream.Seek(0, SeekOrigin.Begin);
var provider = new FileExtensionContentTypeProvider();
FileInfo fileInfo = new FileInfo(filepath);
var memi = provider.Mappings[".xlsx"];
return File(memoryStream, memi, Path.GetFileName(fileInfo.Name));
}
/// <summary>
/// 获取所有科室记录 /// 获取所有科室记录
/// </summary> /// </summary>
/// <param name="hospitalId"></param> /// <param name="hospitalId"></param>
...@@ -181,5 +218,56 @@ public ApiResponse DeptIncomeDetail([CustomizeValidator(RuleSet = "Select"), Fro ...@@ -181,5 +218,56 @@ public ApiResponse DeptIncomeDetail([CustomizeValidator(RuleSet = "Select"), Fro
var data = personService.DeptIncomeDetail(request, claimService.GetUserId()); var data = personService.DeptIncomeDetail(request, claimService.GetUserId());
return new ApiResponse(ResponseType.OK, data); return new ApiResponse(ResponseType.OK, data);
} }
/// <summary>
/// 批量人员字典表头
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("person/GetBatchPersonStructrue/{hospitalId}")]
public ApiResponse GetBatchPersonStructrue(int hospitalId)
{
var result = personService.GetBatchPersonStructrue(hospitalId);
return new ApiResponse(ResponseType.OK, result);
}
/// <summary>
/// 批量添加人员信息
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("person/{allotId}/BathSavePerson/{hospitalId}")]
public ApiResponse BathSavePerson(int allotId, int hospitalId, SaveCollectData request)
{
var result = personService.BathSavePerson(allotId, hospitalId, request);
if (result)
return new ApiResponse(ResponseType.OK);
else
return new ApiResponse(ResponseType.Error, "出勤天数或预留比例格式错误");
}
/// <summary>
/// 批量科室字典表头
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("dept/GetDeptStructrue/{hospitalId}")]
public ApiResponse GetDeptStructrue(int hospitalId)
{
var result = personService.GetDepartmentHands(hospitalId);
return new ApiResponse(ResponseType.OK, result);
}
/// <summary>
/// 批量添加科室信息
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("dept/SaveDeptHands/{hospitalId}")]
public ApiResponse SaveDeptHands(int hospitalId, SaveCollectData request)
{
personService.SaveDeptDicHands(hospitalId, request);
return new ApiResponse(ResponseType.OK);
}
} }
} }
...@@ -81,7 +81,8 @@ public ApiResponse SaveValue(int secondid, [FromBody] List<ag_fixatitem> request ...@@ -81,7 +81,8 @@ public ApiResponse SaveValue(int secondid, [FromBody] List<ag_fixatitem> request
if (unitTypeCount != 1 || request.Any(t => string.IsNullOrEmpty(t.UnitType))) if (unitTypeCount != 1 || request.Any(t => string.IsNullOrEmpty(t.UnitType)))
throw new PerformanceException("科室类型错误"); throw new PerformanceException("科室类型错误");
var repetition = request.GroupBy(t => new { t.RowNumber, t.ItemName /*, WorkType = t.WorkType ?? 0*/ }).Where(t => t.Count() > 1); var repetition = request.Where(t => !string.IsNullOrWhiteSpace(t.ItemName))
.GroupBy(t => new { t.RowNumber, t.ItemName /*, WorkType = t.WorkType ?? 0*/ }).Where(t => t.Count() > 1);
if (repetition.Any()) if (repetition.Any())
throw new PerformanceException(string.Join(";", repetition.Select(t => $"行{t.Key.RowNumber}项‘{t.Key.ItemName}’重复录入"))); throw new PerformanceException(string.Join(";", repetition.Select(t => $"行{t.Key.RowNumber}项‘{t.Key.ItemName}’重复录入")));
......
...@@ -221,9 +221,10 @@ public ApiResponse NewExtractData([CustomizeValidator, FromBody] ExtractRequest ...@@ -221,9 +221,10 @@ public ApiResponse NewExtractData([CustomizeValidator, FromBody] ExtractRequest
//检验科室、费用类型是否需要补充 //检验科室、费用类型是否需要补充
allot.IsExtracting = allot.IsExtracting ?? 0; allot.IsExtracting = allot.IsExtracting ?? 0;
if (allot.IsExtracting == 1) if (allot.IsExtracting == 1 && allot.ExtractTime.HasValue && DateTime.Now.AddHours(-3) < allot.ExtractTime)
return new ApiResponse(ResponseType.OK, "正在提取数据,请稍等!", new { IsExtracting = true }); return new ApiResponse(ResponseType.OK, "正在提取数据,请稍等!", new { IsExtracting = true });
allot.IsExtracting = 1; allot.IsExtracting = 1;
allot.ExtractTime = DateTime.Now;
allotService.Update(allot); allotService.Update(allot);
string email = claim.GetUserClaim(JwtClaimTypes.Mail); string email = claim.GetUserClaim(JwtClaimTypes.Mail);
......
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore.Internal;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Performance.DtoModels;
using Performance.DtoModels.AppSettings;
using Performance.Infrastructure;
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
namespace Performance.Api
{
public class RequestRateLimitingMiddleware
{
private readonly int Limit = 1;
private readonly ILogger logger;
private readonly RequestDelegate next;
private readonly IMemoryCache requestStore;
private readonly IHttpContextAccessor httpContextAccessor;
private readonly RateLimitingConfig options;
public RequestRateLimitingMiddleware(
ILogger<RequestRateLimitingMiddleware> logger,
RequestDelegate next,
IMemoryCache requestStore,
IHttpContextAccessor httpContextAccessor,
IOptions<RateLimitingConfig> options)
{
this.logger = logger;
this.next = next;
this.requestStore = requestStore;
this.httpContextAccessor = httpContextAccessor;
this.options = options.Value;
if (options != null)
Limit = options.Value.Limit;
}
public async Task Invoke(HttpContext context)
{
if (!context.Response.HasStarted && options != null && options.Endpoints != null && options.Endpoints.Any(t => context.Request.Path.ToString().StartsWith(t)))
{
var ip = httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();
var headers = context.Request.Headers;
if (headers.ContainsKey("X-Forwarded-For"))
{
ip = IPAddress.Parse(headers["X-Forwarded-For"].ToString().Split(',', StringSplitOptions.RemoveEmptyEntries)[0]).ToString();
}
var requestKey = $"{ip}-{context.Request.Method}-{context.Request.Path}";
// logger.LogInformation($"请求地址:{requestKey}");
var cacheOptions = new MemoryCacheEntryOptions()
{
AbsoluteExpiration = DateTime.Now.AddSeconds(options.Period)
};
if (requestStore.TryGetValue(requestKey, out int hitCount))
{
if (hitCount < Limit)
{
await ProcessRequest(context, requestKey, hitCount, cacheOptions);
}
else
{
// X-RateLimit-RetryAfter:超出限制后能够再次正常访问的时间。
context.Response.Headers["X-RateLimit-RetryAfter"] = cacheOptions.AbsoluteExpiration?.ToString();
context.Response.StatusCode = StatusCodes.Status200OK;
context.Response.ContentType = "application/json; charset=utf-8";
var response = new ApiResponse
{
State = ResponseType.TooManyRequests,
Message = "访问过于频繁,请稍后重试"
};
await context.Response.WriteAsync(JsonHelper.Serialize(response));
}
}
else
{
await ProcessRequest(context, requestKey, hitCount, cacheOptions);
}
}
else
{
await next(context);
}
}
private async Task ProcessRequest(HttpContext context, string requestKey, int hitCount, MemoryCacheEntryOptions cacheOptions)
{
hitCount++;
requestStore.Set(requestKey, hitCount, cacheOptions);
// X-RateLimit-Limit:同一个时间段所允许的请求的最大数目
context.Response.Headers["X-RateLimit-Limit"] = Limit.ToString();
// X-RateLimit-Remaining:在当前时间段内剩余的请求的数量。
context.Response.Headers["X-RateLimit-Remaining"] = (Limit - hitCount).ToString();
await next(context);
}
}
}
using GraphQL; using GraphQL;
using GraphQL.Types; using GraphQL.Types;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Performance.Api namespace Performance.Api
{ {
......
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
<PackageReference Include="NLog" Version="4.5.11" /> <PackageReference Include="NLog" Version="4.5.11" />
<PackageReference Include="NLog.Extensions.Logging" Version="1.4.0" /> <PackageReference Include="NLog.Extensions.Logging" Version="1.4.0" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.8.0" /> <PackageReference Include="NLog.Web.AspNetCore" Version="4.8.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="4.0.1" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.1.4" />
<PackageReference Include="Microsoft.AspNet.SignalR" Version="2.4.1" /> <PackageReference Include="Microsoft.AspNet.SignalR" Version="2.4.1" />
</ItemGroup> </ItemGroup>
......
using System; using Microsoft.AspNetCore;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using NLog.Web; using NLog.Web;
using System;
namespace Performance.Api namespace Performance.Api
{ {
...@@ -23,6 +19,7 @@ public static void Main(string[] args) ...@@ -23,6 +19,7 @@ public static void Main(string[] args)
catch (Exception ex) catch (Exception ex)
{ {
logger.Error(ex, "Stopped program because of exception"); logger.Error(ex, "Stopped program because of exception");
throw;
} }
finally finally
{ {
...@@ -37,14 +34,16 @@ public static void Main(string[] args) ...@@ -37,14 +34,16 @@ public static void Main(string[] args)
var env = context.HostingEnvironment; var env = context.HostingEnvironment;
config.AddJsonFile("appsettings.json", true, true); config.AddJsonFile("appsettings.json", true, true);
config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true); config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true);
config.AddJsonFile($"RateLimitConfig.json", true, true);
}) })
.UseUrls("http://*:5001") .UseUrls("http://*:5001")
.UseStartup<Startup>()
.ConfigureLogging(logging => .ConfigureLogging(logging =>
{ {
logging.ClearProviders(); logging.ClearProviders();
logging.AddConsole();
logging.SetMinimumLevel(LogLevel.Trace); logging.SetMinimumLevel(LogLevel.Trace);
}) })
.UseNLog() .UseNLog();
.UseStartup<Startup>();
} }
} }
...@@ -36,5 +36,10 @@ ...@@ -36,5 +36,10 @@
"ImportFile": "http://localhost:5001/api/", "ImportFile": "http://localhost:5001/api/",
// 抽取uri // 抽取uri
"HttpPost": "http://localhost:50997/api/" "HttpPost": "http://localhost:50997/api/"
},
"RateLimitingConfig": {
"Endpoints": [ "/api/second/savevalue", "/api/second/savedata", "/api/second/other/save" ],
"Period": "1", // 单位为秒
"Limit": 1
} }
} }
...@@ -74,6 +74,21 @@ ...@@ -74,6 +74,21 @@
相对 相对
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.AppSettings.RateLimitingConfig.Endpoints">
<summary>
路径
</summary>
</member>
<member name="P:Performance.DtoModels.AppSettings.RateLimitingConfig.Period">
<summary>
周期,单位为秒
</summary>
</member>
<member name="P:Performance.DtoModels.AppSettings.RateLimitingConfig.Limit">
<summary>
请求次数
</summary>
</member>
<member name="P:Performance.DtoModels.AppSettings.WebapiUrl.ImportFile"> <member name="P:Performance.DtoModels.AppSettings.WebapiUrl.ImportFile">
<summary> <summary>
上传文件地址 上传文件地址
...@@ -1829,9 +1844,14 @@ ...@@ -1829,9 +1844,14 @@
绩效Id 绩效Id
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.AccoungingRequest.HospitalId">
<summary>
绩效Id
</summary>
</member>
<member name="P:Performance.DtoModels.AccoungingRequest.Type"> <member name="P:Performance.DtoModels.AccoungingRequest.Type">
<summary> <summary>
1 返回accounting列表 2 返回核算单元 3 返回核算单元类型 1 返回accounting列表 2 返回核算单元类型 3 返回核算单元
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.AccoungingRequest.UnitType"> <member name="P:Performance.DtoModels.AccoungingRequest.UnitType">
...@@ -2880,6 +2900,11 @@ ...@@ -2880,6 +2900,11 @@
医院其他绩效 医院其他绩效
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.ComputeResponse.HideOtherPerfor">
<summary>
不公示其他绩效
</summary>
</member>
<member name="P:Performance.DtoModels.ComputeResponse.NightWorkPerfor"> <member name="P:Performance.DtoModels.ComputeResponse.NightWorkPerfor">
<summary> <summary>
夜班费 夜班费
...@@ -3166,7 +3191,12 @@ ...@@ -3166,7 +3191,12 @@
</member> </member>
<member name="P:Performance.DtoModels.DeptResponse.AprPerforAmount"> <member name="P:Performance.DtoModels.DeptResponse.AprPerforAmount">
<summary> <summary>
其他绩效 医院其他绩效
</summary>
</member>
<member name="P:Performance.DtoModels.DeptResponse.HideAprOtherPerforAmount">
<summary>
不公示其他绩效
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.DirectorResponse.TypeName"> <member name="P:Performance.DtoModels.DirectorResponse.TypeName">
......
...@@ -220,6 +220,9 @@ ...@@ -220,6 +220,9 @@
<member name="P:Performance.EntityModels.PerformanceDbContext.per_apr_amount"> <member name="P:Performance.EntityModels.PerformanceDbContext.per_apr_amount">
<summary> </summary> <summary> </summary>
</member> </member>
<member name="P:Performance.EntityModels.PerformanceDbContext.per_apr_amount_hide">
<summary> </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.per_budget_amount"> <member name="P:Performance.EntityModels.PerformanceDbContext.per_budget_amount">
<summary> 预算管理金额 </summary> <summary> 预算管理金额 </summary>
</member> </member>
...@@ -2331,6 +2334,11 @@ ...@@ -2331,6 +2334,11 @@
只读 0、否 1、是 只读 0、否 1、是
</summary> </summary>
</member> </member>
<member name="P:Performance.EntityModels.ex_module.CheckScriptId">
<summary>
</summary>
</member>
<member name="T:Performance.EntityModels.ex_result"> <member name="T:Performance.EntityModels.ex_result">
<summary> <summary>
...@@ -4306,6 +4314,11 @@ ...@@ -4306,6 +4314,11 @@
是否在抽取数据0 否、1 是、2 抽取成功、3 抽取失败 是否在抽取数据0 否、1 是、2 抽取成功、3 抽取失败
</summary> </summary>
</member> </member>
<member name="P:Performance.EntityModels.per_allot.ExtractTime">
<summary>
数据抽取起始时间
</summary>
</member>
<member name="P:Performance.EntityModels.per_allot.Generate"> <member name="P:Performance.EntityModels.per_allot.Generate">
<summary> <summary>
1、人事科提交重新生成 2、生成成功 3、原始数据修改 1、人事科提交重新生成 2、生成成功 3、原始数据修改
...@@ -4361,11 +4374,6 @@ ...@@ -4361,11 +4374,6 @@
录入科室 录入科室
</summary> </summary>
</member> </member>
<member name="P:Performance.EntityModels.per_apr_amount.AccountingUnit">
<summary>
核算单元
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount.Status"> <member name="P:Performance.EntityModels.per_apr_amount.Status">
<summary> <summary>
状态 1 未提交 2 等待审核 3 审核通过 4 驳回 状态 1 未提交 2 等待审核 3 审核通过 4 驳回
...@@ -4396,6 +4404,96 @@ ...@@ -4396,6 +4404,96 @@
备注 备注
</summary> </summary>
</member> </member>
<member name="P:Performance.EntityModels.per_apr_amount.IsVerify">
<summary>
0 未通过验证 1 通过验证
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount.VerifyMessage">
<summary>
验证失败描述
</summary>
</member>
<member name="T:Performance.EntityModels.per_apr_amount_hide">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.Id">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.AllotId">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.PersonnelNumber">
<summary>
人员工号
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.DoctorName">
<summary>
医生姓名
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.PerforType">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.Amount">
<summary>
金额
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.TypeInDepartment">
<summary>
录入科室
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.Status">
<summary>
状态 1 未提交 2 等待审核 3 审核通过 4 驳回
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.AuditTime">
<summary>
审核时间
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.AuditUser">
<summary>
审核人
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.CreateDate">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.CreateUser">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.Remark">
<summary>
备注
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.IsVerify">
<summary>
0 未通过验证 1 通过验证
</summary>
</member>
<member name="P:Performance.EntityModels.per_apr_amount_hide.VerifyMessage">
<summary>
验证失败描述
</summary>
</member>
<member name="T:Performance.EntityModels.per_budget_amount"> <member name="T:Performance.EntityModels.per_budget_amount">
<summary> <summary>
预算管理金额 预算管理金额
...@@ -4856,6 +4954,16 @@ ...@@ -4856,6 +4954,16 @@
</summary> </summary>
</member> </member>
<member name="P:Performance.EntityModels.per_dept_dic.IsVerify">
<summary>
0 未通过验证 1 通过验证
</summary>
</member>
<member name="P:Performance.EntityModels.per_dept_dic.VerifyMessage">
<summary>
验证失败描述
</summary>
</member>
<member name="T:Performance.EntityModels.per_employee"> <member name="T:Performance.EntityModels.per_employee">
<summary> <summary>
绩效人员表 绩效人员表
...@@ -4981,6 +5089,16 @@ ...@@ -4981,6 +5089,16 @@
</summary> </summary>
</member> </member>
<member name="P:Performance.EntityModels.per_employee.IsVerify">
<summary>
0 未通过验证 1 通过验证
</summary>
</member>
<member name="P:Performance.EntityModels.per_employee.VerifyMessage">
<summary>
验证失败描述
</summary>
</member>
<member name="T:Performance.EntityModels.per_first"> <member name="T:Performance.EntityModels.per_first">
<summary> <summary>
首次上传文件地址(当医院存在标准库时,首次上传用户提交固定格式的excel,开发人员配置SQL脚本) 首次上传文件地址(当医院存在标准库时,首次上传用户提交固定格式的excel,开发人员配置SQL脚本)
...@@ -7306,5 +7424,40 @@ ...@@ -7306,5 +7424,40 @@
费用 费用
</summary> </summary>
</member> </member>
<member name="P:Performance.EntityModels.view_per_apr_amount.UnitType">
<summary>
核算单元组别
</summary>
</member>
<member name="P:Performance.EntityModels.view_per_apr_amount.AccountingUnit">
<summary>
核算单元
</summary>
</member>
<member name="P:Performance.EntityModels.view_per_total_amount.UnitType">
<summary>
核算单元组别
</summary>
</member>
<member name="P:Performance.EntityModels.view_per_total_amount.AccountingUnit">
<summary>
核算单元
</summary>
</member>
<member name="P:Performance.EntityModels.view_per_total_amount.PersonnelNumber">
<summary>
工号
</summary>
</member>
<member name="P:Performance.EntityModels.view_per_total_amount.Amount">
<summary>
医院其他绩效
</summary>
</member>
<member name="P:Performance.EntityModels.view_per_total_amount.Use">
<summary>
是否被使用 默认false
</summary>
</member>
</members> </members>
</doc> </doc>
namespace Performance.DtoModels.AppSettings
{
public class RateLimitingConfig
{
/// <summary>
/// 路径
/// </summary>
public string[] Endpoints { get; set; }
/// <summary>
/// 周期,单位为秒
/// </summary>
public double Period { get; set; }
/// <summary>
/// 请求次数
/// </summary>
public int Limit { get; set; }
}
}
...@@ -8,7 +8,12 @@ public class AccoungingRequest ...@@ -8,7 +8,12 @@ public class AccoungingRequest
public int AllotId { get; set; } public int AllotId { get; set; }
/// <summary> /// <summary>
/// 1 返回accounting列表 2 返回核算单元 3 返回核算单元类型 /// 绩效Id
/// </summary>
public int HospitalId { get; set; }
/// <summary>
/// 1 返回accounting列表 2 返回核算单元类型 3 返回核算单元
/// </summary> /// </summary>
public int Type { get; set; } public int Type { get; set; }
...@@ -17,4 +22,13 @@ public class AccoungingRequest ...@@ -17,4 +22,13 @@ public class AccoungingRequest
/// </summary> /// </summary>
public string UnitType { get; set; } public string UnitType { get; set; }
} }
public enum AccountTypeEnum
{
List = 1,
UnitType = 2,
AccountingUnit = 3
}
} }
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class AllotIdRequest
{
public int AllotId { get; set; }
}
public class IdRequest
{
public int Id { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class PerEmployeeRquest
{
public string AccountingUnit { get; set; }
public string Department { get; set; }
public string DoctorName { get; set; }
public string PersonnelNumber { get; set; }
public string JobCategory { get; set; }
public string Duty { get; set; }
public string JobTitle { get; set; }
public string UnitType { get; set; }
public int? AttendanceDay { get; set; }
public decimal? ReservedRatio { get; set; }
public string Remark { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class PersonParamsRequest
{
public const int MaxPageSize = 50;
public int PageNumber { get; set; } = 1;
private int _pageSize = 10;
public int PageSize
{
get { return _pageSize; }
set
{
_pageSize = value > MaxPageSize ? MaxPageSize : value;
}
}
public string SearchQuery { get; set; }
}
}
...@@ -65,6 +65,11 @@ public ComputeResponse(string source, string accountingUnit, string employeeName ...@@ -65,6 +65,11 @@ public ComputeResponse(string source, string accountingUnit, string employeeName
public Nullable<decimal> OthePerfor { get; set; } public Nullable<decimal> OthePerfor { get; set; }
/// <summary> /// <summary>
/// 不公示其他绩效
/// </summary>
public Nullable<decimal> HideOtherPerfor { get; set; }
/// <summary>
/// 夜班费 /// 夜班费
/// </summary> /// </summary>
public Nullable<decimal> NightWorkPerfor { get; set; } public Nullable<decimal> NightWorkPerfor { get; set; }
......
...@@ -90,6 +90,9 @@ public class DetailModule ...@@ -90,6 +90,9 @@ public class DetailModule
/// <summary> 结算值 </summary> /// <summary> 结算值 </summary>
public decimal? ItemValue { get; set; } public decimal? ItemValue { get; set; }
public decimal? OtherPerfor { get; set; }
public decimal? Attendance { get; set; }
public decimal? PostCoefficient { get; set; }
} }
public class DetailModuleExtend : DetailModule public class DetailModuleExtend : DetailModule
......
...@@ -174,8 +174,12 @@ public class DeptResponse ...@@ -174,8 +174,12 @@ public class DeptResponse
public Nullable<decimal> AssessLaterManagementFee { get; set; } public Nullable<decimal> AssessLaterManagementFee { get; set; }
/// <summary> /// <summary>
/// 其他绩效 /// 医院其他绩效
/// </summary> /// </summary>
public Nullable<decimal> AprPerforAmount { get; set; } public Nullable<decimal> AprPerforAmount { get; set; }
/// <summary>
/// 不公示其他绩效
/// </summary>
public Nullable<decimal> HideAprOtherPerforAmount { get; set; }
} }
} }
...@@ -18,11 +18,30 @@ public class DeptdicResponse ...@@ -18,11 +18,30 @@ public class DeptdicResponse
public Deptdic LogisticsAccounting { get; set; } public Deptdic LogisticsAccounting { get; set; }
public Deptdic SpecialAccounting { get; set; } public Deptdic SpecialAccounting { get; set; }
public DateTime? CreateTime { get; set; } public DateTime? CreateTime { get; set; }
public int IsVerify { get; set; }
} }
public class Deptdic public class Deptdic
{ {
public int Id { get; set; } public int Id { get; set; }
public string AccountingUnit { get; set; } public string AccountingUnit { get; set; }
public int IsVerify { get; set; }
public string VerifyMessage { get; set; }
}
public class DeptdicHands
{
public int HospitalId { get; set; }
public string HISDeptName { get; set; }
public string Department { get; set; }
public string OutDoctorAccounting { get; set; }
public string OutNurseAccounting { get; set; }
public string OutTechnicAccounting { get; set; }
public string InpatDoctorAccounting { get; set; }
public string InpatNurseAccounting { get; set; }
public string InpatTechnicAccounting { get; set; }
public string LogisticsAccounting { get; set; }
public string SpecialAccounting { get; set; }
public DateTime? CreateTime { get; set; }
} }
} }
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class UserHandsResponse
{
public string RealName { get; set; }
public string Login { get; set; }
public string Password { get; set; }
public string Mobile { get; set; }
public string Mail { get; set; }
public string Department { get; set; }
public string RoleName { get; set; }
public string HosName { get; set; }
}
}
...@@ -13,5 +13,6 @@ public enum ResponseType ...@@ -13,5 +13,6 @@ public enum ResponseType
NotFound = 5, NotFound = 5,
ParameterError = 6, ParameterError = 6,
Disable = 7, Disable = 7,
TooManyRequests = 8,
} }
} }
using System; using FluentValidation;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
...@@ -11,4 +12,14 @@ public class SaveCollectData ...@@ -11,4 +12,14 @@ public class SaveCollectData
public string[] ColHeaders { get; set; } public string[] ColHeaders { get; set; }
public string[][] Data { get; set; } public string[][] Data { get; set; }
} }
public class UserCollectData
{
public int HospitalId { get; set; }
public int? CreateUser { get; set; }
public string[] ColHeaders { get; set; }
public string[][] Data { get; set; }
}
} }
...@@ -158,6 +158,8 @@ public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options) ...@@ -158,6 +158,8 @@ public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options)
public virtual DbSet<per_allot> per_allot { get; set; } public virtual DbSet<per_allot> per_allot { get; set; }
/// <summary> </summary> /// <summary> </summary>
public virtual DbSet<per_apr_amount> per_apr_amount { get; set; } public virtual DbSet<per_apr_amount> per_apr_amount { get; set; }
/// <summary> </summary>
public virtual DbSet<per_apr_amount_hide> per_apr_amount_hide { get; set; }
/// <summary> 预算管理金额 </summary> /// <summary> 预算管理金额 </summary>
public virtual DbSet<per_budget_amount> per_budget_amount { get; set; } public virtual DbSet<per_budget_amount> per_budget_amount { get; set; }
/// <summary> 预算管理占比 </summary> /// <summary> 预算管理占比 </summary>
......
...@@ -55,5 +55,10 @@ public class ex_module ...@@ -55,5 +55,10 @@ public class ex_module
/// 只读 0、否 1、是 /// 只读 0、否 1、是
/// </summary> /// </summary>
public Nullable<int> ReadOnly { get; set; } public Nullable<int> ReadOnly { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> CheckScriptId { get; set; }
} }
} }
...@@ -82,6 +82,11 @@ public class per_allot ...@@ -82,6 +82,11 @@ public class per_allot
public Nullable<int> IsExtracting { get; set; } public Nullable<int> IsExtracting { get; set; }
/// <summary> /// <summary>
/// 数据抽取起始时间
/// </summary>
public Nullable<DateTime> ExtractTime { get; set; }
/// <summary>
/// 1、人事科提交重新生成 2、生成成功 3、原始数据修改 /// 1、人事科提交重新生成 2、生成成功 3、原始数据修改
/// </summary> /// </summary>
public int Generate { get; set; } public int Generate { get; set; }
......
...@@ -51,10 +51,10 @@ public class per_apr_amount ...@@ -51,10 +51,10 @@ public class per_apr_amount
/// </summary> /// </summary>
public string TypeInDepartment { get; set; } public string TypeInDepartment { get; set; }
/// <summary> ///// <summary>
/// 核算单元 ///// 核算单元
/// </summary> ///// </summary>
public string AccountingUnit { get; set; } //public string AccountingUnit { get; set; }
/// <summary> /// <summary>
/// 状态 1 未提交 2 等待审核 3 审核通过 4 驳回 /// 状态 1 未提交 2 等待审核 3 审核通过 4 驳回
...@@ -85,5 +85,15 @@ public class per_apr_amount ...@@ -85,5 +85,15 @@ public class per_apr_amount
/// 备注 /// 备注
/// </summary> /// </summary>
public string Remark { get; set; } public string Remark { get; set; }
/// <summary>
/// 0 未通过验证 1 通过验证
/// </summary>
public int? IsVerify { get; set; }
/// <summary>
/// 验证失败描述
/// </summary>
public string VerifyMessage { get; set; }
} }
} }
//-----------------------------------------------------------------------
// <copyright file=" per_apr_amount_hide.cs">
// * FileName: .cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
///
/// </summary>
[Table("per_apr_amount_hide")]
public class per_apr_amount_hide
{
/// <summary>
///
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
///
/// </summary>
public int AllotId { get; set; }
/// <summary>
/// 人员工号
/// </summary>
public string PersonnelNumber { get; set; }
/// <summary>
/// 医生姓名
/// </summary>
public string DoctorName { get; set; }
/// <summary>
///
/// </summary>
public string PerforType { get; set; }
/// <summary>
/// 金额
/// </summary>
public Nullable<decimal> Amount { get; set; }
/// <summary>
/// 录入科室
/// </summary>
public string TypeInDepartment { get; set; }
/// <summary>
/// 状态 1 未提交 2 等待审核 3 审核通过 4 驳回
/// </summary>
public Nullable<int> Status { get; set; }
/// <summary>
/// 审核时间
/// </summary>
public Nullable<DateTime> AuditTime { get; set; }
/// <summary>
/// 审核人
/// </summary>
public Nullable<int> AuditUser { get; set; }
/// <summary>
///
/// </summary>
public Nullable<DateTime> CreateDate { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> CreateUser { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 0 未通过验证 1 通过验证
/// </summary>
public int? IsVerify { get; set; }
/// <summary>
/// 验证失败描述
/// </summary>
public string VerifyMessage { get; set; }
}
}
...@@ -60,5 +60,15 @@ public class per_dept_dic ...@@ -60,5 +60,15 @@ public class per_dept_dic
/// ///
/// </summary> /// </summary>
public Nullable<int> CreateUser { get; set; } public Nullable<int> CreateUser { get; set; }
/// <summary>
/// 0 未通过验证 1 通过验证
/// </summary>
public int? IsVerify { get; set; }
/// <summary>
/// 验证失败描述
/// </summary>
public string VerifyMessage { get; set; }
} }
} }
...@@ -135,5 +135,15 @@ public class per_employee ...@@ -135,5 +135,15 @@ public class per_employee
/// ///
/// </summary> /// </summary>
public Nullable<int> CreateUser { get; set; } public Nullable<int> CreateUser { get; set; }
/// <summary>
/// 0 未通过验证 1 通过验证
/// </summary>
public int? IsVerify { get; set; }
/// <summary>
/// 验证失败描述
/// </summary>
public string VerifyMessage { get; set; }
} }
} }
namespace Performance.EntityModels
{
public class view_per_apr_amount : per_apr_amount
{
/// <summary>
/// 核算单元组别
/// </summary>
public string UnitType { get; set; }
/// <summary>
/// 核算单元
/// </summary>
public string AccountingUnit { get; set; }
}
public class view_per_total_amount
{
public view_per_total_amount() { }
public view_per_total_amount(string unitType, string accountingUnit, string personnelNumber, decimal amount, bool use = false)
{
UnitType = unitType;
AccountingUnit = accountingUnit;
PersonnelNumber = personnelNumber;
Amount = amount;
Use = use;
}
/// <summary>
/// 核算单元组别
/// </summary>
public string UnitType { get; set; }
/// <summary>
/// 核算单元
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
/// 工号
/// </summary>
public string PersonnelNumber { get; set; }
/// <summary>
/// 医院其他绩效
/// </summary>
public decimal Amount { get; set; }
/// <summary>
/// 是否被使用 默认false
/// </summary>
public bool Use { get; set; }
}
}
using System; using Newtonsoft.Json;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
namespace Performance.Infrastructure.Models namespace Performance.Infrastructure.Models
{ {
......
...@@ -219,11 +219,5 @@ union all ...@@ -219,11 +219,5 @@ union all
return flag; return flag;
} }
} }
public int VerifyAccountingAndUnittype(int allotId)
{
return Execute("call proc_verify_accoungingunit_unittype(@allotId);", new { allotId });
}
} }
} }
//-----------------------------------------------------------------------
// <copyright file=" per_apr_amount.cs">
// * FileName: per_apr_amount.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// per_apr_amount Repository
/// </summary>
public partial class PerforPerapramountRepository : PerforRepository<per_apr_amount>
{
public List<view_per_apr_amount> GetFullAmount(Expression<Func<per_apr_amount, bool>> predicate)
{
var amounts = GetEntities(predicate);
if (amounts == null || !amounts.Any())
return new List<view_per_apr_amount>();
var ids = amounts.Select(w => w.AllotId).Distinct().ToList();
var employees = this.context.Set<per_employee>()
.Where(w => w.AllotId.HasValue && ids.Contains(w.AllotId.Value))
.Select(w => new
{
UnitType = w.UnitType,
AccountingUnit = w.AccountingUnit,
AllotId = w.AllotId,
PersonnelNumber = w.PersonnelNumber,
});
var res = from outer in amounts
join inner in employees
on new { outer.AllotId, outer.PersonnelNumber } equals new { AllotId = inner.AllotId ?? 0, inner.PersonnelNumber } into temp
from tt in temp.DefaultIfEmpty()
select new view_per_apr_amount
{
Id = outer.Id,
AllotId = outer.AllotId,
PersonnelNumber = outer.PersonnelNumber,
DoctorName = outer.DoctorName,
PerforType = outer.PerforType,
Amount = outer.Amount,
AccountingUnit = tt?.AccountingUnit ?? "",
UnitType = tt?.UnitType ?? "",
TypeInDepartment = outer.TypeInDepartment,
Status = outer.Status,
AuditTime = outer.AuditTime,
AuditUser = outer.AuditUser,
CreateDate = outer.CreateDate,
CreateUser = outer.CreateUser,
Remark = outer.Remark,
IsVerify = outer.IsVerify,
VerifyMessage = outer.VerifyMessage,
};
return res.ToList() ?? new List<view_per_apr_amount>();
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" per_apr_amount.cs">
// * FileName: per_apr_amount.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// per_apr_amount Repository
/// </summary>
public partial class PerforPerapramounthideRepository : PerforRepository<per_apr_amount_hide>
{
public List<view_per_apr_amount> GetFullAmount(Expression<Func<per_apr_amount_hide, bool>> predicate)
{
var amounts = GetEntities(predicate);
if (amounts == null || !amounts.Any())
return new List<view_per_apr_amount>();
var ids = amounts.Select(w => w.AllotId).Distinct().ToList();
var employees = this.context.Set<per_employee>()
.Where(w => w.AllotId.HasValue && ids.Contains(w.AllotId.Value))
.Select(w => new
{
UnitType = w.UnitType,
AccountingUnit = w.AccountingUnit,
AllotId = w.AllotId,
PersonnelNumber = w.PersonnelNumber,
});
var res = from outer in amounts
join inner in employees
on new { outer.AllotId, outer.PersonnelNumber } equals new { AllotId = inner.AllotId ?? 0, inner.PersonnelNumber } into temp
from tt in temp.DefaultIfEmpty()
select new view_per_apr_amount
{
Id = outer.Id,
AllotId = outer.AllotId,
PersonnelNumber = outer.PersonnelNumber,
DoctorName = outer.DoctorName,
PerforType = outer.PerforType,
Amount = outer.Amount,
AccountingUnit = tt?.AccountingUnit ?? "",
UnitType = tt?.UnitType ?? "",
TypeInDepartment = outer.TypeInDepartment,
Status = outer.Status,
AuditTime = outer.AuditTime,
AuditUser = outer.AuditUser,
CreateDate = outer.CreateDate,
CreateUser = outer.CreateUser,
Remark = outer.Remark,
IsVerify = outer.IsVerify,
VerifyMessage = outer.VerifyMessage,
};
return res.ToList() ?? new List<view_per_apr_amount>();
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" per_employee.cs">
// * FileName: per_employee.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.Linq;
using System.Linq.Expressions;
using Performance.EntityModels;
using Performance.Infrastructure.Models;
namespace Performance.Repository
{
/// <summary>
/// per_employee Repository
/// </summary>
public partial class PerforPeremployeeRepository : PerforRepository<per_employee>
{
public new PageList<per_employee> GetEntitiesForPaging(int pageNumber, int pageSize, Expression<Func<per_employee, bool>> exp)
{
IQueryable<per_employee> queryableAuthors = context.Set<per_employee>().Where(exp).OrderBy(w => w.IsVerify).ThenBy(t => t.Id);
return PageList<per_employee>.Create(queryableAuthors, pageNumber, pageSize);
}
}
}
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
// </copyright> // </copyright>
//----------------------------------------------------------------------- //-----------------------------------------------------------------------
using System; using System;
using System.Collections.Generic;
using System.Linq;
using Performance.EntityModels; using Performance.EntityModels;
namespace Performance.Repository namespace Performance.Repository
......
//-----------------------------------------------------------------------
// <copyright file=" per_apr_amount.cs">
// * FileName: per_apr_amount.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// per_apr_amount Repository
/// </summary>
public partial class PerforPerapramounthideRepository : PerforRepository<per_apr_amount_hide>
{
public PerforPerapramounthideRepository(PerformanceDbContext context) : base(context)
{
}
}
}
...@@ -440,6 +440,8 @@ public void Generate(per_allot allot) ...@@ -440,6 +440,8 @@ public void Generate(per_allot allot)
UpdateAllotStates(allot.ID, (int)AllotStates.GenerateAccomplish, EnumHelper.GetDescription(AllotStates.GenerateAccomplish), generate); UpdateAllotStates(allot.ID, (int)AllotStates.GenerateAccomplish, EnumHelper.GetDescription(AllotStates.GenerateAccomplish), generate);
perforCofdirectorRepository.SupplementaryData(allot.ID); perforCofdirectorRepository.SupplementaryData(allot.ID);
// 验证科室核算单元、工号
AccoungtingVerify(allot.ID);
//logManageService.WriteMsg("正在生成报表数据", "正在生成报表数据", 1, allot.ID, "ReceiveMessage", true); //logManageService.WriteMsg("正在生成报表数据", "正在生成报表数据", 1, allot.ID, "ReceiveMessage", true);
//var res = reportService.ImportData(allot); //var res = reportService.ImportData(allot);
...@@ -474,6 +476,15 @@ public void GenerateReport(per_allot allot) ...@@ -474,6 +476,15 @@ public void GenerateReport(per_allot allot)
} }
/// <summary> /// <summary>
/// 验证科室核算单元、工号
/// </summary>
/// <param name="allot"></param>
public void AccoungtingVerify(int allotId)
{
reportService.ExecProc("call proc_verify_accoungingunit_unittype(@allotId);", new { allotId });
}
/// <summary>
/// 重新计算院领导绩效 /// 重新计算院领导绩效
/// </summary> /// </summary>
/// <param name="allotId"></param> /// <param name="allotId"></param>
......
using Performance.Repository; //using Performance.Repository;
using System; //using System;
using System.Collections.Generic; //using System.Collections.Generic;
using System.Linq; //using System.Linq;
using System.Text; //using System.Text;
namespace Performance.Services //namespace Performance.Services
{ //{
public class AprAmountService : IAutoInjection // public class AprAmountService : IAutoInjection
{ // {
private readonly PerforPeremployeeRepository _peremployeeRepository; // private readonly PerforPeremployeeRepository _peremployeeRepository;
private readonly PerforPerapramountRepository _perapramountRepository; // private readonly PerforPerapramountRepository _perapramountRepository;
public AprAmountService( // public AprAmountService(
PerforPeremployeeRepository peremployeeRepository, // PerforPeremployeeRepository peremployeeRepository,
PerforPerapramountRepository perapramountRepository) // PerforPerapramountRepository perapramountRepository)
{ // {
_peremployeeRepository = peremployeeRepository; // _peremployeeRepository = peremployeeRepository;
_perapramountRepository = perapramountRepository; // _perapramountRepository = perapramountRepository;
} // }
/// <summary> // /// <summary>
/// 获取医院其他绩效 默认审核通过 status = 3 // /// 获取医院其他绩效 默认审核通过 status = 3
/// 科室及核算组别使用人员字典 // /// 科室及核算组别使用人员字典
/// </summary> // /// </summary>
/// <param name="allotId"></param> // /// <param name="allotId"></param>
/// <param name="status"></param> // /// <param name="status"></param>
/// <returns></returns> // /// <returns></returns>
public List<AprAmount> GetAprAmount(int allotId, int status = 3) // public List<AprAmount> GetAprAmount(int allotId, int status = 3)
{ // {
var perapramounts = _perapramountRepository.GetEntities(t => t.AllotId == allotId && t.Status == status); // var perapramounts = _perapramountRepository.GetEntities(t => t.AllotId == allotId && t.Status == status);
var employees = _peremployeeRepository.GetEntities(t => t.AllotId == allotId); // var employees = _peremployeeRepository.GetEntities(t => t.AllotId == allotId);
var result = perapramounts.Join(employees, amt => amt.PersonnelNumber, epy => epy.PersonnelNumber, // var result = perapramounts.Join(employees, amt => amt.PersonnelNumber, epy => epy.PersonnelNumber,
(amt, epy) => new AprAmount // (amt, epy) => new AprAmount
{ // {
AccountingUnit = epy.AccountingUnit, // AccountingUnit = epy.AccountingUnit,
UnitType = epy.UnitType, // UnitType = epy.UnitType,
PersonnelNumber = amt.PersonnelNumber, // PersonnelNumber = amt.PersonnelNumber,
DoctorName = amt.DoctorName, // DoctorName = amt.DoctorName,
PerforType = amt.PerforType, // PerforType = amt.PerforType,
Amount = amt.Amount // Amount = amt.Amount
}); // });
return result?.ToList() ?? new List<AprAmount>(); // return result?.ToList() ?? new List<AprAmount>();
} // }
} // }
public class AprAmount // public class AprAmount
{ // {
/// <summary> // /// <summary>
/// 核算单元 // /// 核算单元
/// </summary> // /// </summary>
public string UnitType { get; set; } // public string UnitType { get; set; }
/// <summary> // /// <summary>
/// 人员工号 // /// 人员工号
/// </summary> // /// </summary>
public string PersonnelNumber { get; set; } // public string PersonnelNumber { get; set; }
/// <summary> // /// <summary>
/// 医生姓名 // /// 医生姓名
/// </summary> // /// </summary>
public string DoctorName { get; set; } // public string DoctorName { get; set; }
/// <summary> // /// <summary>
/// // ///
/// </summary> // /// </summary>
public string PerforType { get; set; } // public string PerforType { get; set; }
/// <summary> // /// <summary>
/// 金额 // /// 金额
/// </summary> // /// </summary>
public Nullable<decimal> Amount { get; set; } // public Nullable<decimal> Amount { get; set; }
/// <summary> // /// <summary>
/// 核算单元 // /// 核算单元
/// </summary> // /// </summary>
public string AccountingUnit { get; set; } // public string AccountingUnit { get; set; }
} // }
} //}
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
using System.Text; using System.Text;
using Performance.EntityModels.Entity; using Performance.EntityModels.Entity;
using Performance.Repository.Repository; using Performance.Repository.Repository;
using System.Linq.Expressions;
namespace Performance.Services namespace Performance.Services
{ {
...@@ -643,15 +644,19 @@ public bool AgainDelete(CofAgainRequest request) ...@@ -643,15 +644,19 @@ public bool AgainDelete(CofAgainRequest request)
/// <returns></returns> /// <returns></returns>
public List<cof_accounting> GetAccountingList(AccoungingRequest request) public List<cof_accounting> GetAccountingList(AccoungingRequest request)
{ {
switch (request.Type) Expression<Func<cof_accounting, bool>> exp = t => t.AllotId == request.AllotId;
if (request.AllotId == 0)
{ {
case 1: //返回accounting列表 var allots = perforPerAllotRepository.GetEntities(t => t.HospitalId == request.HospitalId);
case 3: //返回核算单元类型 if (allots == null || !allots.Any())
default: throw new PerformanceException("请先配置科室信息");
return cofaccountingRepository.GetEntities(t => t.AllotId == request.AllotId); exp = t => allots.Select(a => a.ID).Contains(t.AllotId);
case 2: //返回核算单元
return cofaccountingRepository.GetEntities(t => t.AllotId == request.AllotId && t.UnitType == request.UnitType);
} }
if (request.Type == (int)AccountTypeEnum.AccountingUnit && !string.IsNullOrEmpty(request.UnitType))
exp = exp.And(t => t.UnitType == request.UnitType);
return cofaccountingRepository.GetEntities(exp) ?? new List<cof_accounting>();
} }
/// <summary> /// <summary>
...@@ -706,16 +711,62 @@ public bool AccountingDelete(int accountingId) ...@@ -706,16 +711,62 @@ public bool AccountingDelete(int accountingId)
return cofaccountingRepository.Remove(entity); return cofaccountingRepository.Remove(entity);
} }
public HandsonTable GetBatchAccountingStructrue(int AllotId)
{
var result = new HandsonTable((int)SheetType.Unidentifiable, Accounting.Select(t => t.Value).ToArray(), Accounting.Select(t => new collect_permission
{
HeadName = t.Value,
Visible = 1
}).ToList());
/// <summary> if (result.Columns != null && result.Columns.Any())
/// 删除数据 {
/// </summary> foreach (var column in result.Columns)
/// <param name="accountingId"></param> {
/// <returns></returns>
public void AccoungtingVerify(int allotId) if (column.Data == "核算组别")
{ {
_directorRepository.VerifyAccountingAndUnittype(allotId); column.Type = "autocomplete";
column.Source = EnumHelper.GetItems<UnitType>().Select(w => w.Description.Replace("行政后勤", "行政工勤")).ToArray();
column.Strict = true;
}
} }
}
return result;
}
public bool BatchSaveAccounting(int allotId, SaveCollectData request)
{
var dicData = CreateDataRow(0, allotId, request, Accounting);
var getAccounts = cofaccountingRepository.GetEntities(t => t.AllotId == allotId);
var unitType = EnumHelper.GetItems<UnitType>().Select(w => w.Description.Replace("行政后勤", "行政工勤")).ToArray();
List<cof_accounting> accounts = new List<cof_accounting>();
foreach (var item in dicData)
{
var json = JsonHelper.Serialize(item);
var data = JsonHelper.Deserialize<cof_accounting>(json);
if (!unitType.Contains(data?.UnitType) && !string.IsNullOrEmpty(data?.UnitType)) return false;
if (getAccounts != null)
if (getAccounts.Any(t => t.AccountingUnit == data?.AccountingUnit && t.UnitType == data?.UnitType)) continue;
var any = accounts.Any(t => t.AccountingUnit == data?.AccountingUnit && t.UnitType == data?.UnitType);
if (!string.IsNullOrEmpty(data.AccountingUnit) && !string.IsNullOrEmpty(data.UnitType) && !any)
{
accounts.Add(data);
}
}
if (accounts.Any())
cofaccountingRepository.AddRange(accounts.ToArray());
return true;
}
public static Dictionary<string, string> Accounting { get; } = new Dictionary<string, string>
{
{nameof(cof_accounting.AccountingUnit), "核算单元"},
{nameof(cof_accounting.UnitType), "核算组别"},
};
#endregion #endregion
...@@ -908,37 +959,37 @@ public List<TitleValue> WorkHeader(int allotId) ...@@ -908,37 +959,37 @@ public List<TitleValue> WorkHeader(int allotId)
return null; return null;
} }
/// <summary> ///// <summary>
/// 人员绩效额外金额 ///// 人员绩效额外金额
/// </summary> ///// </summary>
private void CopyAprData(int prevAllotId, int allotId) //private void CopyAprData(int prevAllotId, int allotId)
{ //{
if (prevAllotId == 0) return; // if (prevAllotId == 0) return;
var list = perapramountRepository.GetEntities(t => new List<int> { prevAllotId, allotId }.Contains(t.AllotId)); // var list = perapramountRepository.GetEntities(t => new List<int> { prevAllotId, allotId }.Contains(t.AllotId));
if (list == null || !list.Any(t => t.AllotId == prevAllotId)) return; // if (list == null || !list.Any(t => t.AllotId == prevAllotId)) return;
if (list.Any(t => t.AllotId == allotId)) // if (list.Any(t => t.AllotId == allotId))
{ // {
var prevData = list.Where(t => t.AllotId == prevAllotId); // var prevData = list.Where(t => t.AllotId == prevAllotId);
var existData = list.Where(t => t.AllotId == allotId); // var existData = list.Where(t => t.AllotId == allotId);
if (existData != null && existData.Any()) // if (existData != null && existData.Any())
list = prevData.Where(t => !existData.Select(w => w.PersonnelNumber).Contains(t.PersonnelNumber)).ToList(); // list = prevData.Where(t => !existData.Select(w => w.PersonnelNumber).Contains(t.PersonnelNumber)).ToList();
} // }
if (list.Any()) // if (list.Any())
{ // {
var data = list.Select(t => new per_apr_amount // var data = list.Select(t => new per_apr_amount
{ // {
Status = 2, // Status = 2,
AllotId = allotId, // AllotId = allotId,
PersonnelNumber = t.PersonnelNumber, // PersonnelNumber = t.PersonnelNumber,
DoctorName = t.DoctorName, // DoctorName = t.DoctorName,
PerforType = t.PerforType, // PerforType = t.PerforType,
Amount = t.Amount, // Amount = t.Amount,
CreateDate = DateTime.Now // CreateDate = DateTime.Now
}); // });
perapramountRepository.AddRange(data.ToArray()); // perapramountRepository.AddRange(data.ToArray());
} // }
} //}
#region HRP人员科室 #region HRP人员科室
......
...@@ -31,6 +31,8 @@ public class ExConfigService : IAutoInjection ...@@ -31,6 +31,8 @@ public class ExConfigService : IAutoInjection
private readonly PerforModdicRepository moddicRepository; private readonly PerforModdicRepository moddicRepository;
private readonly QueryService queryService; private readonly QueryService queryService;
private readonly ILogger logger; private readonly ILogger logger;
private readonly PerforCofdrugtypeRepository cofdrugtypeRepository;
private readonly PerforPerdeptdicRepository perdeptdicRepository;
public ExConfigService(PerforExtypeRepository extypeRepository, public ExConfigService(PerforExtypeRepository extypeRepository,
PerforExscriptRepository exscriptRepository, PerforExscriptRepository exscriptRepository,
...@@ -45,7 +47,9 @@ public class ExConfigService : IAutoInjection ...@@ -45,7 +47,9 @@ public class ExConfigService : IAutoInjection
PerforExtractRepository extractRepository, PerforExtractRepository extractRepository,
PerforModdicRepository moddicRepository, PerforModdicRepository moddicRepository,
QueryService queryService, QueryService queryService,
ILogger<ExConfigService> logger ILogger<ExConfigService> logger,
PerforCofdrugtypeRepository cofdrugtypeRepository,
PerforPerdeptdicRepository perdeptdicRepository
) )
{ {
this.extypeRepository = extypeRepository; this.extypeRepository = extypeRepository;
...@@ -62,6 +66,8 @@ ILogger<ExConfigService> logger ...@@ -62,6 +66,8 @@ ILogger<ExConfigService> logger
this.moddicRepository = moddicRepository; this.moddicRepository = moddicRepository;
this.queryService = queryService; this.queryService = queryService;
this.logger = logger; this.logger = logger;
this.cofdrugtypeRepository = cofdrugtypeRepository;
this.perdeptdicRepository = perdeptdicRepository;
} }
#region Modules #region Modules
...@@ -689,6 +695,8 @@ public string Judge(int allotId, int hospitalId, int useTemplate, ref bool isSin ...@@ -689,6 +695,8 @@ public string Judge(int allotId, int hospitalId, int useTemplate, ref bool isSin
public Dictionary<string, object> CheckHasNewDepartmentOrCategory(int allotId) public Dictionary<string, object> CheckHasNewDepartmentOrCategory(int allotId)
{ {
#region 改正
/*
var allot = perallotRepository.GetEntity(t => t.ID == allotId); var allot = perallotRepository.GetEntity(t => t.ID == allotId);
var allotList = perallotRepository.GetEntities(t => t.HospitalId == allot.HospitalId && new int[] { (int)AllotStates.GenerateSucceed, (int)AllotStates.Archive }.Contains(t.States)); var allotList = perallotRepository.GetEntities(t => t.HospitalId == allot.HospitalId && new int[] { (int)AllotStates.GenerateSucceed, (int)AllotStates.Archive }.Contains(t.States));
...@@ -736,6 +744,97 @@ public string Judge(int allotId, int hospitalId, int useTemplate, ref bool isSin ...@@ -736,6 +744,97 @@ public string Judge(int allotId, int hospitalId, int useTemplate, ref bool isSin
paramtemers.Add(dic.Remark, stringBuilder.ToString()); paramtemers.Add(dic.Remark, stringBuilder.ToString());
} }
return paramtemers; */
#endregion
var allot = perallotRepository.GetEntity(t => t.ID == allotId);
var drugTypes = cofdrugtypeRepository.GetEntities(t => t.AllotID == allot.ID && t.HospitalId == allot.HospitalId);
var deptDic = perdeptdicRepository.GetEntities(t => t.HospitalId == allot.HospitalId);
var moduleSheet = exmoduleRepository.GetEntities(t => t.HospitalId == allot.HospitalId && t.SheetType == (int)SheetType.Income);
if (moduleSheet == null || !moduleSheet.Any()) return null;
var moduleScript = moduleSheet.Select(t => t.CheckScriptId);
var scripts = exscriptRepository.GetEntities(t => moduleScript.Contains(t.Id));
if (scripts == null || !scripts.Any()) return null;
var scriptConfig = scripts.Select(t => t.ConfigId);
var hosConfig = hospitalconfigRepository.GetEntities(t => scriptConfig.Contains(t.Id));
if (hosConfig == null) return null;
Dictionary<string, object> paramtemers = new Dictionary<string, object>();
StringBuilder stringBuilder = new StringBuilder();
List<string> deparmants = new List<string>();
List<string> drugs = new List<string>();
List<per_dept_dic> deptList = new List<per_dept_dic>();
List<cof_drugtype> drugTypeList = new List<cof_drugtype>();
string defaultSource = "住院", defauleUnittype = UnitType.医生组.ToString();
foreach (var scr in scripts)
{
var conf = hosConfig.FirstOrDefault(t => t.Id == scr.ConfigId);
if (conf == null)
continue;
var data = queryService.QueryData(conf, allot, scr.ExecScript);
if (data == null || !data.Any()) continue;
foreach (var module in moduleSheet.Where(t => t.CheckScriptId == scr.Id))
{
var noExistedDepartment = data.Select(t => t.Department).Distinct().ToList();
var source = module.ModuleName.Contains(defaultSource) ? "住院" : "门诊";
if (deptDic != null && deptDic.Any(t => t.Source == source))
{
var deptDics = deptDic.Where(t => t.Source == source).Select(t => t.HISDeptName);
noExistedDepartment = data.Select(t => t.Department).Except(deptDics).Distinct().ToList();
}
if (noExistedDepartment != null && noExistedDepartment.Any()) // 系统科室、标准科室唯一,门诊、住院核算单元可能不一致,因此数据可重复
{
var dept = noExistedDepartment.Select(t => new per_dept_dic
{
HISDeptName = t,
UnitType = defauleUnittype,
Source = source,
HospitalId = allot.HospitalId,
IsVerify = 0,
VerifyMessage = "抽取前科室校验后补增科室",
CreateUser = 1
}).ToList();
deparmants.AddRange(noExistedDepartment.Where(t => !deparmants.Contains(t)));
deptList.AddRange(dept);
}
}
var typeNames = drugTypes.Select(t => t.Charge).Distinct();
var noExistedTypename = data.Select(t => t.Category).Distinct().Except(typeNames);
if (noExistedTypename != null && noExistedTypename.Any(t => !drugs.Contains(t)))
{
var drugType = noExistedTypename.Where(t => !drugs.Contains(t)).Select(t => new cof_drugtype
{
HospitalId = allot.HospitalId,
AllotID = allot.ID,
Charge = t
}).ToList();
drugs.AddRange(noExistedTypename.Where(t => !drugs.Contains(t)));
drugTypeList.AddRange(drugType);
}
}
if (deparmants != null && deparmants.Any())
{
var distinctedDept = deptList.ToDistinct().ToList();
distinctedDept.ForEach(t => t.CreateTime = DateTime.Now); //在去重前添加时间,可能造成时间不一致,无法去重
perdeptdicRepository.AddRange(distinctedDept.ToArray());
stringBuilder.AppendLine($"新增科室:{string.Join(",", deparmants.Distinct())}");
}
if (drugs != null && drugs.Any())
{
cofdrugtypeRepository.AddRange(drugTypeList.ToDistinct().ToArray());
stringBuilder.AppendLine($"新增费用类型:{string.Join(",", drugs.Distinct())}");
}
paramtemers.Add("新增科室或费用类型", stringBuilder.ToString());
return paramtemers; return paramtemers;
} }
......
...@@ -481,7 +481,7 @@ private void SupplementOtherPerfor(ag_secondallot secondAllot, List<BodyItem> bo ...@@ -481,7 +481,7 @@ private void SupplementOtherPerfor(ag_secondallot secondAllot, List<BodyItem> bo
{ {
if (bodyItems == null || !bodyItems.Any(w => w.RowNumber > -1)) return; if (bodyItems == null || !bodyItems.Any(w => w.RowNumber > -1)) return;
var perapramounts = perapramountRepository.GetEntities(t => t.AllotId == secondAllot.AllotId && t.Status == 3); var perapramounts = perapramountRepository.GetFullAmount(t => t.AllotId == secondAllot.AllotId && t.Status == 3);
if (perapramounts == null || !perapramounts.Any()) return; if (perapramounts == null || !perapramounts.Any()) return;
var rowNumberList = bodyItems.Where(w => w.RowNumber > -1).Select(w => w.RowNumber).Distinct().OrderBy(t => t).ToList(); var rowNumberList = bodyItems.Where(w => w.RowNumber > -1).Select(w => w.RowNumber).Distinct().OrderBy(t => t).ToList();
...@@ -808,7 +808,7 @@ public List<ag_othersource> GetOtherTempDetails(int userId, int secondId, int is ...@@ -808,7 +808,7 @@ public List<ag_othersource> GetOtherTempDetails(int userId, int secondId, int is
private void SupplementSecondDetail(ag_secondallot second, List<per_employee> employees, List<ag_othersource> result, bool isTitlePerformance = true) private void SupplementSecondDetail(ag_secondallot second, List<per_employee> employees, List<ag_othersource> result, bool isTitlePerformance = true)
{ {
// 补充医院其他绩效 及 预留比例 // 补充医院其他绩效 及 预留比例
var perapramounts = perapramountRepository.GetEntities(t => t.AllotId == second.AllotId && t.Status == 3); var perapramounts = perapramountRepository.GetFullAmount(t => t.AllotId == second.AllotId && t.Status == 3);
var distPerformance = rescomputeRepository.GetEntities(t => t.AllotID == second.AllotId); var distPerformance = rescomputeRepository.GetEntities(t => t.AllotID == second.AllotId);
foreach (var item in result) foreach (var item in result)
......
...@@ -55,6 +55,8 @@ public SecondAllotResponse GetSecondSavedData(int userId, int secondId, int empl ...@@ -55,6 +55,8 @@ public SecondAllotResponse GetSecondSavedData(int userId, int secondId, int empl
Workload_Ratio_Default = 0.8m, Workload_Ratio_Default = 0.8m,
DaysFullAttendance = DateTime.DaysInMonth(allot.Year, allot.Month) DaysFullAttendance = DateTime.DaysInMonth(allot.Year, allot.Month)
}; };
head.TotalDistPerformance = second.RealGiveFee;
head.PaymentOfTheMonth = $"{allot.Year}{allot.Month.ToString().PadLeft(2, '0')}月";
JObject jObject = JObject.Parse(JsonConvert.SerializeObject(head)); JObject jObject = JObject.Parse(JsonConvert.SerializeObject(head));
var headDynamic = agworktypesourceRepository.GetEntities(t => t.SecondId == secondId); var headDynamic = agworktypesourceRepository.GetEntities(t => t.SecondId == secondId);
if (headDynamic != null && headDynamic.Any()) if (headDynamic != null && headDynamic.Any())
...@@ -185,7 +187,7 @@ private void SupplementOtherPerfor(ag_secondallot secondAllot, List<ag_bodysourc ...@@ -185,7 +187,7 @@ private void SupplementOtherPerfor(ag_secondallot secondAllot, List<ag_bodysourc
{ {
if (bodyItems == null || !bodyItems.Any(w => w.RowNumber > -1)) return; if (bodyItems == null || !bodyItems.Any(w => w.RowNumber > -1)) return;
var perapramounts = perapramountRepository.GetEntities(t => t.AllotId == secondAllot.AllotId && t.Status == 3); var perapramounts = perapramountRepository.GetFullAmount(t => t.AllotId == secondAllot.AllotId && t.Status == 3);
if (perapramounts == null || !perapramounts.Any()) return; if (perapramounts == null || !perapramounts.Any()) return;
foreach (var rowitem in bodyItems) foreach (var rowitem in bodyItems)
......
...@@ -1521,7 +1521,8 @@ private List<ag_secondallot> SecondList(per_allot allot, List<res_account> accou ...@@ -1521,7 +1521,8 @@ private List<ag_secondallot> SecondList(per_allot allot, List<res_account> accou
}; };
}); });
var enums = EnumHelper.GetItems<UnitType>(); var enums = EnumHelper.GetItems<UnitType>();
return result.OrderBy(t => t.Status == 4 ? 2 : t.Status) return result.Where(w => w.RealGiveFee != 0)
.OrderBy(t => t.Status == 4 ? 2 : t.Status)
.ThenBy(t => enums.FirstOrDefault(f => f.Name == t.UnitType)?.Value) .ThenBy(t => enums.FirstOrDefault(f => f.Name == t.UnitType)?.Value)
.ThenBy(t => t.Department) .ThenBy(t => t.Department)
.ToList(); .ToList();
...@@ -1574,14 +1575,14 @@ public bool AuditSubmit(ag_secondallot second, int userId) ...@@ -1574,14 +1575,14 @@ public bool AuditSubmit(ag_secondallot second, int userId)
if (temp == null) if (temp == null)
throw new PerformanceException("选择模板不可用,请确定模板及数据是否存在!"); throw new PerformanceException("选择模板不可用,请确定模板及数据是否存在!");
//bool method(decimal? submitDataAmount, decimal? realGiveFee) bool VerifySubmissioAmount(decimal? submitDataAmount, decimal? realGiveFee)
//{ {
// if (!submitDataAmount.HasValue || !realGiveFee.HasValue) if (!submitDataAmount.HasValue || !realGiveFee.HasValue)
// return false; return false;
// decimal floatValue = 0.5m; decimal floatValue = 0.1m;
// return submitDataAmount >= (realGiveFee - floatValue) && submitDataAmount <= (realGiveFee + floatValue); return submitDataAmount >= (realGiveFee - floatValue) && submitDataAmount <= (realGiveFee + floatValue);
//} }
if (temp.UseTempId == 6) if (temp.UseTempId == 6)
{ {
...@@ -1589,9 +1590,9 @@ public bool AuditSubmit(ag_secondallot second, int userId) ...@@ -1589,9 +1590,9 @@ public bool AuditSubmit(ag_secondallot second, int userId)
if (data == null || !data.Any()) if (data == null || !data.Any())
throw new PerformanceException("提交时未检测到数据!"); throw new PerformanceException("提交时未检测到数据!");
//var total = data.Sum(t => t.RealAmount); var total = data.Sum(t => (t.DistPerformance ?? 0) + (t.NightWorkPerformance ?? 0)); // 其他模板 = 可分配绩效 + 夜班绩效
//if (!method(total, second.RealGiveFee)) if (!VerifySubmissioAmount(total, second.RealGiveFee))
// throw new PerformanceException("总金额与考核后金额不一致!"); throw new PerformanceException($"总金额与考核后金额不一致!可分配金额:{second.RealGiveFee},提交金额:{total}");
} }
else if (new int[] { 7, 8 }.Contains(temp.UseTempId.Value)) else if (new int[] { 7, 8 }.Contains(temp.UseTempId.Value))
{ {
...@@ -1599,16 +1600,20 @@ public bool AuditSubmit(ag_secondallot second, int userId) ...@@ -1599,16 +1600,20 @@ public bool AuditSubmit(ag_secondallot second, int userId)
if (data == null || !data.Any()) if (data == null || !data.Any())
throw new PerformanceException("提交时未检测到数据!"); throw new PerformanceException("提交时未检测到数据!");
//var total = data.Where(t => t.ItemName == "实发绩效工资金额" && t.RowNumber > -1).GroupBy(t => t.RowNumber) var total = data.Where(t => new string[] { "可分配绩效", "夜班工作量绩效" }.Contains(t.ItemName) && t.RowNumber > -1).GroupBy(t => t.RowNumber)
// .Sum(t => ConvertHelper.To<decimal>(t.OrderByDescending(o => o.ID).FirstOrDefault().ItemValue)); .Sum(t => t.Sum(item => ConvertHelper.To<decimal>(item.ItemValue)));
//if (!method(total, second.RealGiveFee)) if (!VerifySubmissioAmount(total, second.RealGiveFee))
// throw new PerformanceException("总金额与考核后金额不一致!"); throw new PerformanceException($"总金额与考核后金额不一致!可分配金额:{second.RealGiveFee},提交金额:{total}");
} }
else if (new int[] { 9, 10 }.Contains(temp.UseTempId.Value)) else if (new int[] { 9, 10 }.Contains(temp.UseTempId.Value))
{ {
var data = agbodysourceRepository.GetEntities(t => t.SecondId == second.Id); var data = agbodysourceRepository.GetEntities(t => t.SecondId == second.Id);
if (data == null || !data.Any()) if (data == null || !data.Any())
throw new PerformanceException("提交时未检测到数据!"); throw new PerformanceException("提交时未检测到数据!");
var total = data.Sum(t => (t.DistPerformance ?? 0) + (t.NightWorkPerformance ?? 0));
if (!VerifySubmissioAmount(total, second.RealGiveFee))
throw new PerformanceException($"总金额与考核后金额不一致!可分配金额:{second.RealGiveFee},提交金额:{total}");
} }
second.UseTempId = temp.UseTempId; second.UseTempId = temp.UseTempId;
second.Status = 2; second.Status = 2;
...@@ -2147,7 +2152,7 @@ public List<SecPrintResponse> Print(int secondId) ...@@ -2147,7 +2152,7 @@ public List<SecPrintResponse> Print(int secondId)
} }
// 补充医院其他绩效 及 预留比例 // 补充医院其他绩效 及 预留比例
var perapramounts = perapramountRepository.GetEntities(t => t.AllotId == second.AllotId && t.Status == 3); var perapramounts = perapramountRepository.GetFullAmount(t => t.AllotId == second.AllotId && t.Status == 3);
var employees = personService.GetPerEmployee(second.AllotId.Value); var employees = personService.GetPerEmployee(second.AllotId.Value);
// 补充字典中该科室不存在,但有其它绩效的人员信息 // 补充字典中该科室不存在,但有其它绩效的人员信息
...@@ -2324,26 +2329,26 @@ private List<SecondPerforResponse> GetAllotPerformance(int allotId, List<res_com ...@@ -2324,26 +2329,26 @@ private List<SecondPerforResponse> GetAllotPerformance(int allotId, List<res_com
}).ToList(); }).ToList();
} }
public List<SecondPerforResponse> AddAprAmount(int allotId, List<SecondPerforResponse> computes) //public List<SecondPerforResponse> AddAprAmount(int allotId, List<SecondPerforResponse> computes)
{ //{
if (computes == null || !computes.Any()) // if (computes == null || !computes.Any())
return computes; // return computes;
var list = perapramountRepository.GetEntities(t => t.AllotId == allotId && t.Status == 3); // var list = perapramountRepository.GetEntities(t => t.AllotId == allotId && t.Status == 3);
if (list == null || !list.Any()) // if (list == null || !list.Any())
return computes; // return computes;
foreach (var item in computes.GroupBy(w => new { w.AccountingUnit, w.JobNumber })) // foreach (var item in computes.GroupBy(w => new { w.AccountingUnit, w.JobNumber }))
{ // {
// 补充过一次就不在补充了 // // 补充过一次就不在补充了
var emp = computes.Where(w => w.AccountingUnit == item.Key.AccountingUnit && w.JobNumber == item.Key.JobNumber) // var emp = computes.Where(w => w.AccountingUnit == item.Key.AccountingUnit && w.JobNumber == item.Key.JobNumber)
.OrderByDescending(w => w.Source).FirstOrDefault(); // .OrderByDescending(w => w.Source).FirstOrDefault();
var apramount = list.Where(t => t.AccountingUnit == emp.AccountingUnit // var apramount = list.Where(t => t.AccountingUnit == emp.AccountingUnit
&& !string.IsNullOrEmpty(t.PersonnelNumber) && emp.JobNumber?.Trim() == t.PersonnelNumber?.Trim()); // && !string.IsNullOrEmpty(t.PersonnelNumber) && emp.JobNumber?.Trim() == t.PersonnelNumber?.Trim());
emp.OthePerfor = apramount?.Sum(w => w.Amount) ?? 0; // emp.OthePerfor = apramount?.Sum(w => w.Amount) ?? 0;
} // }
return computes; // return computes;
} //}
} }
} }
...@@ -30,6 +30,7 @@ public class UserService : IAutoInjection ...@@ -30,6 +30,7 @@ public class UserService : IAutoInjection
private PerforResaccountRepository _resaccountRepository; private PerforResaccountRepository _resaccountRepository;
private PerforPerallotRepository _perallotRepository; private PerforPerallotRepository _perallotRepository;
private PerforPerdeptdicRepository _perdeptdicRepository; private PerforPerdeptdicRepository _perdeptdicRepository;
private readonly PerforCofaccountingRepository perforCofaccountingRepository;
public UserService(IOptions<Application> application, public UserService(IOptions<Application> application,
PerforSmsRepository smsRepository, PerforSmsRepository smsRepository,
...@@ -44,7 +45,8 @@ public class UserService : IAutoInjection ...@@ -44,7 +45,8 @@ public class UserService : IAutoInjection
PerforImspecialunitRepository imspecialunitRepository, PerforImspecialunitRepository imspecialunitRepository,
PerforResaccountRepository resaccountRepository, PerforResaccountRepository resaccountRepository,
PerforPerallotRepository perallotRepository, PerforPerallotRepository perallotRepository,
PerforPerdeptdicRepository perdeptdicRepository) PerforPerdeptdicRepository perdeptdicRepository,
PerforCofaccountingRepository perforCofaccountingRepository)
{ {
this.application = application.Value; this.application = application.Value;
this._userRepository = userRepository; this._userRepository = userRepository;
...@@ -60,6 +62,7 @@ public class UserService : IAutoInjection ...@@ -60,6 +62,7 @@ public class UserService : IAutoInjection
this._resaccountRepository = resaccountRepository; this._resaccountRepository = resaccountRepository;
this._perallotRepository = perallotRepository; this._perallotRepository = perallotRepository;
this._perdeptdicRepository = perdeptdicRepository; this._perdeptdicRepository = perdeptdicRepository;
this.perforCofaccountingRepository = perforCofaccountingRepository;
} }
/// <summary> /// <summary>
...@@ -695,5 +698,175 @@ public ApiResponse DeleteUser(int iD) ...@@ -695,5 +698,175 @@ public ApiResponse DeleteUser(int iD)
} }
#endregion #endregion
public HandsonTable GetUserHandsFlat()
{
var result = new HandsonTable((int)SheetType.Unidentifiable, Users.Select(t => t.Value).ToArray(), Users.Select(t => new collect_permission
{
HeadName = t.Value,
Visible = 1
}).ToList());
if (result.Columns != null && result.Columns.Any())
{
foreach (var column in result.Columns)
{
if (column.Data == "角色")
{
column.Type = "autocomplete";
column.Source = _roleRepository.GetEntities().Select(t => t.RoleName).ToArray();
column.Strict = true;
}
else if (column.Data == "分配医院")
{
column.Type = "autocomplete";
column.Source = _hospitalRepository.GetEntities().Select(t => t.HosName).ToArray();
column.Strict = true;
}
}
}
return result;
}
public string SaveUserHandsFlat(UserCollectData request)
{
try
{
var dicData = CreateDataRow(request, Users);
var getUsers = _userRepository.GetEntities();
var roles = _roleRepository.GetEntities();
var hospitals = _hospitalRepository.GetEntities();
//hack:后续修改为accounting中的数据
var accounts = perforCofaccountingRepository.GetEntities();
//var allot = _perallotRepository.GetEntities(t => t.HospitalId == request.HospitalId);
//var res = accounts?.Join(allot, t => t.AllotId, w => w.ID, (t, w) => new cof_accounting { AccountingUnit = t.AccountingUnit }).Distinct();
List<sys_user> users = new List<sys_user>();
List<sys_user_role> userRoles = new List<sys_user_role>();
List<sys_user_hospital> userHoss = new List<sys_user_hospital>();
var roleArr = new[] { "护士长", "科主任", "特殊科室", "行政科室" };
var allDataList = dicData.Select(item => JsonHelper.Deserialize<UserHandsResponse>(JsonHelper.Serialize(item)));
var names = allDataList?.Select(w => w?.HosName).Distinct();
Dictionary<string, List<string>> res = new Dictionary<string, List<string>>();
foreach (var item in names)
{
if (item == null) return "必填项为空";
var HospitalId = hospitals.FirstOrDefault(w => w.HosName == item)?.ID;
var allot = _perallotRepository.GetEntities(t => t.HospitalId == HospitalId);
var accountingUnits = accounts?.Join(allot, t => t.AllotId, w => w.ID, (t, w) => t.AccountingUnit).Distinct().ToList();
res.Add(item, accountingUnits);
}
foreach (var data in allDataList)
{
if (string.IsNullOrEmpty(data.Login) || string.IsNullOrEmpty(data.RealName) || string.IsNullOrEmpty(data.RoleName) || string.IsNullOrEmpty(data.HosName)) return "必填项为空";
if (roleArr.Contains(data.RoleName) && res == null) return "科室字典为空";
if (users.Any(c => c.Login == data?.Login) && !string.IsNullOrEmpty(data.Login)
|| getUsers.Any(c => c.Login == data?.Login)) return "登录名重复";
if (roleArr.Contains(data.RoleName) && res[data.HosName] != null && !res[data.HosName].Any(t => t == data.Department))
return "核算单元填写错误";
var user = new sys_user
{
RealName = data.RealName,
CreateDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd hh:mm:dd")),
CreateUser = request.CreateUser,
Department = data?.Department ?? "",
IsDelete = 1,
Login = data.Login,
Password = data?.Password ?? "123456",
States = 1,
Mobile = data?.Mobile ?? "",
Mail = data?.Mail ?? ""
};
users.Add(user);
//var userRole = new sys_user_role
//{
// RoleID = (int)roles.FirstOrDefault(t => t.RoleName == data.RoleName)?.Type,
//};
//userRoles.Add(userRole);
//var userHos = new sys_user_hospital
//{
// HospitalID = hospitals.FirstOrDefault(t => t.HosName == data.HosName)?.ID
//};
//userHoss.Add(userHos);
}
_userRepository.AddRange(users.ToArray());
//var roleJoin = userRoles.Join(users, t => new { }, w => new { }, (t, w) => new sys_user_role { RoleID = t.RoleID, UserID = w.ID });
//var hosJoin = userHoss.Join(users, t => new { }, w => new { }, (t, w) => new sys_user_hospital { HospitalID = t.HospitalID, UserID = w.ID });
var joinData = users.Join(allDataList, outer => new { outer.Login, outer.RealName, Department = outer.Department ?? "" }, inner => new { inner.Login, inner.RealName, Department = inner.Department ?? "" }, (outer, inner) => new { outer, inner });
var roleJoin = joinData.Select(t => new sys_user_role
{
UserID = t.outer.ID,
RoleID = (int)roles.FirstOrDefault(r => r.RoleName == t.inner.RoleName)?.Type
});
_userroleRepository.AddRange(roleJoin.ToArray());
var hosJoin = joinData.Select(t => new sys_user_hospital
{
UserID = t.outer.ID,
HospitalID = hospitals.FirstOrDefault(h => h.HosName == t.inner.HosName)?.ID
});
_userhospitalRepository.AddRange(hosJoin.ToArray());
return "";
}
catch (Exception e)
{
throw e;
}
}
public static Dictionary<string, string> Users { get; } = new Dictionary<string, string>
{
{nameof(sys_user.RealName), "姓名"},
{nameof(sys_user.Login), "登录名"},
{nameof(sys_user.Password), "密码"},
{nameof(sys_user.Mobile), "手机号码"},
{nameof(sys_user.Mail), "邮箱"},
{nameof(sys_role.RoleName), "角色"},
{nameof(sys_hospital.HosName), "分配医院"},
{nameof(sys_user.Department), "核算单元"},
};
private List<Dictionary<string, string>> CreateDataRow(UserCollectData request, Dictionary<string, string> config)
{
List<Dictionary<string, string>> allData = new List<Dictionary<string, string>>();
for (int r = 0; r < request.Data.Length; r++)
{
// 创建固定数据列
Dictionary<string, string> baseData = CreateBaseData(request, config, r);
allData.Add(baseData);
}
return allData;
}
private Dictionary<string, string> CreateBaseData(UserCollectData request, Dictionary<string, string> config, int rownumber)
{
Dictionary<string, string> result = new Dictionary<string, string>();
for (int c = 0; c < request.ColHeaders.Length; c++)
{
var header = request.ColHeaders[c];
var first = config.FirstOrDefault(w => w.Value == header);
if (!default(KeyValuePair<string, string>).Equals(first)
&& !result.ContainsKey(header)
&& request.Data[rownumber].Length > c)
{
result.Add(first.Key, request.Data[rownumber][c]);
}
}
return result;
}
} }
} }
\ No newline at end of file
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