导出历史数据报表

parent b07e1b8e
......@@ -44,6 +44,19 @@ public class AccountController : Controller
/// <summary>
/// 登录
/// </summary>
/// <remarks>
/// Sample request:
///
/// POST /Todo
/// {
/// "logintype": 2,
/// "account": "admin",
/// "password": "1111",
/// "appname": "string",
/// "device": "web"
/// }
///
/// </remarks>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
......
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Internal;
using Microsoft.AspNetCore.Mvc;
using Performance.DtoModels;
using Performance.Infrastructure;
using Performance.Services;
namespace Performance.Api.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class HistoryController : ControllerBase
{
private readonly HistoryService historyService;
private readonly ClaimService claim;
private readonly IHostingEnvironment evn;
public HistoryController(
HistoryService historyService,
ClaimService claim,
IHostingEnvironment evn)
{
this.historyService = historyService;
this.claim = claim;
this.evn = evn;
}
/// <summary>
/// 上传历史绩效数据
/// </summary>
/// <param name="form"></param>
/// <returns></returns>
[Route("import")]
[HttpPost]
public ApiResponse Import([FromForm] IFormCollection form)
{
var hospitalid = form.ToDictionary().GetValue("hospitalid", 0);
if (hospitalid <= 0)
return new ApiResponse(ResponseType.Fail, "参数错误", "hospitalid无效");
var file = ((FormFileCollection)form.Files).FirstOrDefault();
if (file == null)
return new ApiResponse(ResponseType.Fail, "参数错误", "文件无效");
var name = $"History_{FileHelper.GetFileNameNoExtension(file.FileName)}{DateTime.Now:yyyyMMddHHmmssfff}";
var ext = FileHelper.GetExtension(file.FileName);
var dpath = Path.Combine(evn.ContentRootPath, "Files", hospitalid.ToString());
FileHelper.CreateDirectory(dpath);
var path = Path.Combine(dpath, $"{name}{ext}");
using (var stream = file.OpenReadStream())
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
if (!FileHelper.CreateFile(path, bytes))
return new ApiResponse(ResponseType.Fail, $"{file.FileName}上传失败");
}
historyService.ImportHistoryData(hospitalid, path);
return new ApiResponse(ResponseType.OK);
}
}
}
......@@ -14,7 +14,7 @@
},
"Application": {
//登录过期时间
"ExpirationMinutes": "120",
"ExpirationMinutes": "1200",
//验证码过期
"SmsCodeMinutes": "5",
//护士长二次绩效管理员
......
......@@ -5,11 +5,24 @@
</assembly>
<members>
<member name="M:Performance.Api.Controllers.AccountController.Login(Performance.DtoModels.LoginRequest)">
<summary>
登录
</summary>
<param name="request"></param>
<returns></returns>
<summary>
登录
</summary>
<remarks>
Sample request:
POST /Todo
{
"logintype": 2,
"account": "admin",
"password": "1111",
"appname": "string",
"device": "web"
}
</remarks>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.AccountController.Refresh">
<summary>
......@@ -824,6 +837,13 @@
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.HistoryController.Import(Microsoft.AspNetCore.Http.IFormCollection)">
<summary>
上传历史绩效数据
</summary>
<param name="form"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.HospitalController.GetHospitalList">
<summary>
获取当前登录用户管辖医院列表
......
......@@ -153,6 +153,41 @@
工作量
</summary>
</member>
<member name="P:Performance.DtoModels.HistoryData.Year">
<summary>
</summary>
</member>
<member name="P:Performance.DtoModels.HistoryData.Month">
<summary>
</summary>
</member>
<member name="P:Performance.DtoModels.HistoryData.HospitalID">
<summary>
医院ID
</summary>
</member>
<member name="P:Performance.DtoModels.HistoryData.SourceType">
<summary>
</summary>
</member>
<member name="P:Performance.DtoModels.HistoryData.AccountingUnit">
<summary>
科室核算单元
</summary>
</member>
<member name="P:Performance.DtoModels.HistoryData.Department">
<summary>
科室
</summary>
</member>
<member name="P:Performance.DtoModels.HistoryData.ResultData">
<summary>
结果值
</summary>
</member>
<member name="P:Performance.DtoModels.PerAgainData.RowNumber">
<summary>
行号
......
......@@ -3657,6 +3657,156 @@
数据来源 1 excel 导入 2 计算
</summary>
</member>
<member name="T:Performance.EntityModels.report_original_persontime">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_persontime.Id">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_persontime.AllotID">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_persontime.Year">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_persontime.Month">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_persontime.HospitalID">
<summary>
医院ID
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_persontime.SourceType">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_persontime.AccountingUnit">
<summary>
科室核算单元
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_persontime.Department">
<summary>
科室
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_persontime.PersonTime">
<summary>
人次
</summary>
</member>
<member name="T:Performance.EntityModels.report_original_stays">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_stays.Id">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_stays.AllotID">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_stays.Year">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_stays.Month">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_stays.HospitalID">
<summary>
医院ID
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_stays.SourceType">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_stays.AccountingUnit">
<summary>
科室核算单元
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_stays.Department">
<summary>
科室
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_stays.Stays">
<summary>
住院时长
</summary>
</member>
<member name="T:Performance.EntityModels.report_original_surgery">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_surgery.Id">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_surgery.AllotID">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_surgery.Year">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_surgery.Month">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_surgery.HospitalID">
<summary>
医院ID
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_surgery.SourceType">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_surgery.AccountingUnit">
<summary>
科室核算单元
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_surgery.Department">
<summary>
科室
</summary>
</member>
<member name="P:Performance.EntityModels.report_original_surgery.PersonTime">
<summary>
人次
</summary>
</member>
<member name="T:Performance.EntityModels.report_original_workload">
<summary>
......
......@@ -229,6 +229,16 @@ public AutoMapperConfigs()
CreateMap<res_compute, SecondPerforResponse>()
.ReverseMap();
CreateMap<HistoryData, report_original_persontime>()
.ForMember(dest => dest.PersonTime, opt => opt.MapFrom(src => src.ResultData))
.ReverseMap();
CreateMap<HistoryData, report_original_stays>()
.ForMember(dest => dest.Stays, opt => opt.MapFrom(src => src.ResultData))
.ReverseMap();
CreateMap<HistoryData, report_original_surgery>()
.ForMember(dest => dest.PersonTime, opt => opt.MapFrom(src => src.ResultData))
.ReverseMap();
}
public void xx()
......
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class HistoryData
{
/// <summary>
/// 年
/// </summary>
public int Year { get; set; }
/// <summary>
/// 月
/// </summary>
public int Month { get; set; }
/// <summary>
/// 医院ID
/// </summary>
public int HospitalID { get; set; }
/// <summary>
///
/// </summary>
public string SourceType { get; set; }
/// <summary>
/// 科室核算单元
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
/// 结果值
/// </summary>
public Nullable<decimal> ResultData { get; set; }
public string SheetName { get; set; }
}
}
......@@ -146,7 +146,10 @@ public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options)
public virtual DbSet<rep_report> rep_report { get; set; }
/// <summary> 条件表 </summary>
public virtual DbSet<rep_selection> rep_selection { get; set; }
/// <summary> 科室核算结果 </summary>
public virtual DbSet<report_original_surgery> report_original_surgery { get; set; }
public virtual DbSet<report_original_stays> report_original_stays { get; set; }
public virtual DbSet<report_original_persontime> report_original_persontime { get; set; }
/// <summary> 科室核算结果 </summary>
public virtual DbSet<res_account> res_account { get; set; }
/// <summary> 医生科室核算结果 </summary>
public virtual DbSet<res_accountdoctor> res_accountdoctor { get; set; }
......
//-----------------------------------------------------------------------
// <copyright file=" report_original_workload.cs">
// * FileName: .cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
///
/// </summary>
[Table("report_original_persontime")]
public class report_original_persontime
{
/// <summary>
///
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> AllotID { get; set; }
/// <summary>
/// 年
/// </summary>
public int Year { get; set; }
/// <summary>
/// 月
/// </summary>
public int Month { get; set; }
/// <summary>
/// 医院ID
/// </summary>
public int HospitalID { get; set; }
/// <summary>
///
/// </summary>
public string SourceType { get; set; }
/// <summary>
/// 科室核算单元
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
/// 人次
/// </summary>
public Nullable<int> PersonTime { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" report_original_workload.cs">
// * FileName: .cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
///
/// </summary>
[Table("report_original_stays")]
public class report_original_stays
{
/// <summary>
///
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> AllotID { get; set; }
/// <summary>
/// 年
/// </summary>
public int Year { get; set; }
/// <summary>
/// 月
/// </summary>
public int Month { get; set; }
/// <summary>
/// 医院ID
/// </summary>
public int HospitalID { get; set; }
/// <summary>
///
/// </summary>
public string SourceType { get; set; }
/// <summary>
/// 科室核算单元
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
/// 住院时长
/// </summary>
public Nullable<decimal> Stays { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" report_original_workload.cs">
// * FileName: .cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
///
/// </summary>
[Table("report_original_surgery")]
public class report_original_surgery
{
/// <summary>
///
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> AllotID { get; set; }
/// <summary>
/// 年
/// </summary>
public int Year { get; set; }
/// <summary>
/// 月
/// </summary>
public int Month { get; set; }
/// <summary>
/// 医院ID
/// </summary>
public int HospitalID { get; set; }
/// <summary>
///
/// </summary>
public string SourceType { get; set; }
/// <summary>
/// 科室核算单元
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
/// 人次
/// </summary>
public Nullable<int> PersonTime { get; set; }
}
}
......@@ -7,7 +7,7 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
namespace Performance.EntityModels
{
/// <summary>
///
......
......@@ -84,6 +84,14 @@ public bool RemoveRange(params TEntity[] entities)
context.Set<TEntity>().RemoveRange(entities);
return context.SaveChanges() > 0;
}
public bool RemoveRange(Expression<Func<TEntity, bool>> exp)
{
var query = CompileQuery(exp);
var entities = query == null || query.Count() == 0 ? null : query.ToList();
if (entities != null)
context.Set<TEntity>().RemoveRange(entities);
return context.SaveChanges() > 0;
}
public bool Update(TEntity entity)
{
......
//-----------------------------------------------------------------------
// <copyright file=" ag_header.cs">
// * FileName: ag_header.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// report_original_persontime Repository
/// </summary>
public partial class PerforReportoriginalpersontimeRepository : PerforRepository<report_original_persontime>
{
public PerforReportoriginalpersontimeRepository(PerformanceDbContext context) : base(context)
{
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_header.cs">
// * FileName: ag_header.cs
// </copyright>
//-----------------------------------------------------------------------
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// report_original_stays Repository
/// </summary>
public partial class PerforReportoriginalstaysRepository : PerforRepository<report_original_stays>
{
public PerforReportoriginalstaysRepository(PerformanceDbContext context) : base(context)
{
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_header.cs">
// * FileName: ag_header.cs
// </copyright>
//-----------------------------------------------------------------------
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// report_original_surgery Repository
/// </summary>
public partial class PerforReportoriginalsurgeryRepository : PerforRepository<report_original_surgery>
{
public PerforReportoriginalsurgeryRepository(PerformanceDbContext context) : base(context)
{
}
}
}
using Microsoft.Extensions.Logging;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using Performance.DtoModels;
using Performance.EntityModels;
using Performance.Infrastructure;
using Performance.Repository;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace Performance.Services
{
public class HistoryService : IAutoInjection
{
private readonly ILogger<EmployeeService> logger;
private readonly PerforReportoriginalsurgeryRepository reportoriginalsurgeryRepository;
private readonly PerforReportoriginalstaysRepository reportoriginalstaysRepository;
private readonly PerforReportoriginalpersontimeRepository reportoriginalpersontimeRepository;
public HistoryService(
ILogger<EmployeeService> logger,
PerforReportoriginalsurgeryRepository reportoriginalsurgeryRepository,
PerforReportoriginalstaysRepository reportoriginalstaysRepository,
PerforReportoriginalpersontimeRepository reportoriginalpersontimeRepository)
{
this.logger = logger;
this.reportoriginalsurgeryRepository = reportoriginalsurgeryRepository;
this.reportoriginalstaysRepository = reportoriginalstaysRepository;
this.reportoriginalpersontimeRepository = reportoriginalpersontimeRepository;
}
public void ImportHistoryData(int hospitalid, string path)
{
try
{
var entities = ReadExcelData(hospitalid, path);
var @data1 = entities.Where(w => w.SheetName == "工作量");
if (@data1.Any())
{
var years = @data1.Select(s => s.Year).Distinct().ToList();
var months = @data1.Select(s => s.Month).Distinct().ToList();
reportoriginalpersontimeRepository.RemoveRange(w => w.HospitalID == hospitalid && years.Contains(w.Year) && months.Contains(w.Month));
var @data = AutoMapper.Mapper.Map<List<report_original_persontime>>(@data1);
reportoriginalpersontimeRepository.AddRange(@data.ToArray());
}
var @data2 = entities.Where(w => w.SheetName == "手术量");
if (@data2.Any())
{
var years = @data2.Select(s => s.Year).Distinct().ToList();
var months = @data2.Select(s => s.Month).Distinct().ToList();
reportoriginalsurgeryRepository.RemoveRange(w => w.HospitalID == hospitalid && years.Contains(w.Year) && months.Contains(w.Month));
var @data = AutoMapper.Mapper.Map<List<report_original_surgery>>(@data2);
reportoriginalsurgeryRepository.AddRange(@data.ToArray());
}
var @data3 = entities.Where(w => w.SheetName == "住院天数");
if (@data3.Any())
{
var years = @data3.Select(s => s.Year).Distinct().ToList();
var months = @data3.Select(s => s.Month).Distinct().ToList();
reportoriginalstaysRepository.RemoveRange(w => w.HospitalID == hospitalid && years.Contains(w.Year) && months.Contains(w.Month));
var @data = AutoMapper.Mapper.Map<List<report_original_stays>>(@data3);
reportoriginalstaysRepository.AddRange(@data.ToArray());
}
}
catch (Exception ex)
{
logger.LogError(ex.ToString());
}
}
private List<HistoryData> ReadExcelData(int hospitalid, string path)
{
var entities = new List<HistoryData>();
var config = new[]
{
new { sheetName = "工作量", columnNames = new string[] { "年份", "月份", "来源", "核算单元", "科室", "数量" } },
new { sheetName = "手术量", columnNames = new string[] { "年份", "月份", "来源", "核算单元", "科室", "数量" } },
new { sheetName = "住院天数", columnNames = new string[] { "年份", "月份", "来源", "核算单元", "科室", "数量" } },
};
IWorkbook workbook = null;
var version = FileHelper.GetExtension(path) == ".xlsx" ? ExcelVersion.xlsx : ExcelVersion.xls;
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
{
workbook = (version == ExcelVersion.xlsx)
? (IWorkbook)(new XSSFWorkbook(fs))
: (IWorkbook)(new HSSFWorkbook(fs));
}
if (workbook == null) return entities;
foreach (var cfg in config)
{
var sheet = workbook.GetSheet(cfg.sheetName);
if (sheet == null) continue;
var firstRow = sheet.GetRow(0);
List<(string, int)> excelheader = new List<(string, int)>();
for (int cellindex = 0; cellindex < firstRow.LastCellNum + 1; cellindex++)
{
var cell = firstRow.GetCell(cellindex);
if (cell == null) continue;
if (!string.IsNullOrEmpty(cell.ToString()))
excelheader.Add((cell.ToString(), cellindex));
}
if (excelheader == null || !excelheader.Any())
throw new PerformanceException("上传excel内容错误");
Dictionary<string, int> dict = new Dictionary<string, int>();
cfg.columnNames.ToList().ForEach(w => dict.Add(w, -1));
List<string> errorHeaders = new List<string>();
foreach (var key in dict.Keys.ToList())
{
if (!excelheader.Select(t => t.Item1).Contains(key)) errorHeaders.Add(key);
else dict[key] = excelheader.First(t => t.Item1 == key).Item2;
}
if (errorHeaders != null && errorHeaders.Any())
throw new PerformanceException($"excel缺少列{string.Join(", ", errorHeaders)}");
for (int rowindex = 1; rowindex < sheet.LastRowNum + 1; rowindex++)
{
var row = sheet.GetRow(rowindex);
if (row == null) continue;
var entity = new HistoryData
{
SheetName = cfg.sheetName,
HospitalID = hospitalid,
Year = ConvertHelper.To<int>(row.GetCell(dict["年份"]).GetValue()),
Month = ConvertHelper.To<int>(row.GetCell(dict["月份"]).GetValue()),
SourceType = row.GetCell(dict["来源"]).GetValue(),
AccountingUnit = row.GetCell(dict["核算单元"]).GetValue(),
Department = row.GetCell(dict["科室"]).GetValue(),
ResultData = ConvertHelper.To<decimal>(row.GetCell(dict["数量"]).GetValue()),
};
entities.Add(entity);
}
}
return entities;
}
}
}
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