Commit 56a8db93 by lcx

Merge branch 'feature/运营分析' into develop

# Conflicts:
#	performance/Performance.Repository/PerforReportRepository .cs
parents 67e9a4a3 84b4df0f
...@@ -218,5 +218,21 @@ public ApiResponse MenuReport([CustomizeValidator(RuleSet = "Menu"), FromBody] R ...@@ -218,5 +218,21 @@ public ApiResponse MenuReport([CustomizeValidator(RuleSet = "Menu"), FromBody] R
var list = reportService.MenuReport(request); var list = reportService.MenuReport(request);
return new ApiResponse(ResponseType.OK, "", list); return new ApiResponse(ResponseType.OK, "", list);
} }
/// <summary>
/// 菜单报表
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("operation")]
[HttpPost]
public ApiResponse Operation([ FromBody] ReportRequest request)
{
if(request == null)
return new ApiResponse(ResponseType.Fail, "参数错误!");
var list = reportService.Operation(request);
return new ApiResponse(ResponseType.OK, "", list);
}
} }
} }
\ No newline at end of file
...@@ -1455,6 +1455,13 @@ ...@@ -1455,6 +1455,13 @@
<param name="request"></param> <param name="request"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Performance.Api.Controllers.ReportController.Operation(Performance.DtoModels.ReportRequest)">
<summary>
菜单报表
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.ReportGlobalController.GetAllReportGlobal(System.Int32)"> <member name="M:Performance.Api.Controllers.ReportGlobalController.GetAllReportGlobal(System.Int32)">
<summary> <summary>
获取报表配置信息 获取报表配置信息
......
...@@ -2394,6 +2394,9 @@ ...@@ -2394,6 +2394,9 @@
<member name="P:Performance.DtoModels.ReportRequest.Month"> <member name="P:Performance.DtoModels.ReportRequest.Month">
<summary></summary> <summary></summary>
</member> </member>
<member name="P:Performance.DtoModels.ReportRequest.AccountingUnit">
<summary> 科室 </summary>
</member>
<member name="P:Performance.DtoModels.SecondAuditRequest.SecondId"> <member name="P:Performance.DtoModels.SecondAuditRequest.SecondId">
<summary> 二次绩效Id </summary> <summary> 二次绩效Id </summary>
</member> </member>
......
...@@ -7312,6 +7312,101 @@ ...@@ -7312,6 +7312,101 @@
医技组系数 医技组系数
</summary> </summary>
</member> </member>
<member name="T:Performance.EntityModels.view_operation_report_result">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.HospitalId">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.Year">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.AccountingUnit">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.SourceType">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.Category">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.ItemName">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.January">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.February">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.March">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.April">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.May">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.June">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.July">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.August">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.September">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.October">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.November">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_operation_report_result.December">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.HisData.HisDepartment"> <member name="P:Performance.EntityModels.HisData.HisDepartment">
<summary> <summary>
His科室 His科室
......
...@@ -23,6 +23,9 @@ public class ReportRequest ...@@ -23,6 +23,9 @@ public class ReportRequest
/// <summary> 月 </summary> /// <summary> 月 </summary>
public string Month { get; set; } public string Month { get; set; }
/// <summary> 科室 </summary>
public string[] AccountingUnit { get; set; }
} }
public class ReportRequestValidator : AbstractValidator<ReportRequest> public class ReportRequestValidator : AbstractValidator<ReportRequest>
{ {
......
//-----------------------------------------------------------------------
// <copyright file=" view_operation_report_result.cs">
// * FileName: .cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
///
/// </summary>
[Table("view_operation_report_result")]
public class view_operation_report_result
{
/// <summary>
///
/// </summary>
public int HospitalId { get; set; }
/// <summary>
///
/// </summary>
public int Year { get; set; }
/// <summary>
///
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
///
/// </summary>
public string SourceType { get; set; }
/// <summary>
///
/// </summary>
public string Category { get; set; }
/// <summary>
///
/// </summary>
public string ItemName { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> January { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> February { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> March { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> April { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> May { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> June { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> July { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> August { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> September { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> October { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> November { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> December { get; set; }
}
}
using Performance.DtoModels; using Performance.DtoModels;
using Performance.EntityModels; using Performance.EntityModels;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
......
...@@ -6,8 +6,6 @@ ...@@ -6,8 +6,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Linq.Expressions;
using System.Text;
namespace Performance.Services namespace Performance.Services
{ {
...@@ -402,5 +400,185 @@ public void ExecProc(string execsql, object param) ...@@ -402,5 +400,185 @@ public void ExecProc(string execsql, object param)
logger.LogError($"执行存储过程时发生异常,sql:{execsql};参数:{JsonHelper.Serialize(param)};异常:{ex.Message};"); logger.LogError($"执行存储过程时发生异常,sql:{execsql};参数:{JsonHelper.Serialize(param)};异常:{ex.Message};");
} }
} }
public SheetExportResponse Operation(ReportRequest request)
{
SheetExportResponse sheet = new SheetExportResponse();
#region data
IEnumerable<int> years = new int[] { };
if (string.IsNullOrEmpty(request.Year))
{
string getYearsSql = "select max(`year`) `year` from view_operation_report_result where hospitalid = @hospitalid;";
years = perforReportRepository.DapperQuery<int?>(getYearsSql, new { hospitalid = request.HospitalId })?.Select(t => t ?? 0);
}
else
{
years = Array.ConvertAll(request.Year.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries), t => ConvertHelper.To<int>(t));
}
if (years == null || !years.Any()) return sheet;
string sql = $"select * from view_operation_report_result where hospitalid = @hospitalid and year in @year";
if (request.AccountingUnit != null && request.AccountingUnit.Any())
{
sql += " and accountingunit in @accountingunit";
}
var data = perforReportRepository.DapperQuery<view_operation_report_result>(sql, new { hospitalId = request.HospitalId, year = years, accountingunit = request.AccountingUnit })?.ToList();
#endregion
years = data.Select(t => t.Year).Distinct().OrderByDescending(t => t);
int index = 0;
#region header
var cells = new List<Cell>
{
new Cell{ CellType = "header", CellValue = "经济指标", PointCell = 0, MergeRow = 1, MergeCell = 3 },
};
for (int i = 1; i < 13; i++)
{
cells.Add(new Cell { CellType = "header", CellValue = $"{i}月", PointCell = i + 2, MergeRow = 1, MergeCell = 1 });
}
//foreach (var year in years)
//{
// for (int i = 1; i < 13; i++)
// {
// cells.Add(new Cell { CellType = "header", CellValue = $"{i}月", PointCell = i + 2, MergeRow = 1, MergeCell = 1 });
// }
//}
sheet.Header = new List<Row>
{
new Row(0){ Data = cells }
};
#endregion
if (data == null || !data.Any())
return sheet;
var group = data.GroupBy(t => new { t.SourceType, t.Category, t.ItemName });
data = data.GroupBy(t => new { t.Year, t.SourceType, t.Category, t.ItemName }).Select(t => new view_operation_report_result
{
Year = t.Key.Year,
SourceType = t.Key.SourceType,
Category = t.Key.Category,
ItemName = t.Key.ItemName,
January = t.Sum(g => g.January ?? 0),
February = t.Sum(g => g.February ?? 0),
March = t.Sum(g => g.March ?? 0),
April = t.Sum(g => g.April ?? 0),
May = t.Sum(g => g.May ?? 0),
June = t.Sum(g => g.June ?? 0),
July = t.Sum(g => g.July ?? 0),
August = t.Sum(g => g.August ?? 0),
September = t.Sum(g => g.September ?? 0),
October = t.Sum(g => g.October ?? 0),
November = t.Sum(g => g.November ?? 0),
December = t.Sum(g => g.December ?? 0)
}).ToList();
var sourcetypes = data.Select(t => t.SourceType).Distinct();
#region body
Dictionary<int, Func<view_operation_report_result, object>> dict = new Dictionary<int, Func<view_operation_report_result, object>>
{
{ 1, t => t.January },
{ 2, t => t.February },
{ 3, t => t.March },
{ 4, t => t.April },
{ 5, t => t.May },
{ 6, t => t.June },
{ 7, t => t.July },
{ 8, t => t.August },
{ 9, t => t.September },
{ 10, t => t.October },
{ 11, t => t.November },
{ 12, t => t.December },
};
int rownumber = 0;
int maxPointIndex = 0;
List<Row> rows = new List<Row>();
foreach (var sourcetype in sourcetypes.OrderBy(t => t))
{
int inittype = 0; // 0加载sourcetype、category; 1加载category; 2不加载sourcetype、category
var sourcetypeData = data.Where(t => t.SourceType == sourcetype);
if (sourcetypeData == null || !sourcetypeData.Any()) continue;
foreach (var category in sourcetypeData.Select(t => t.Category).Distinct().OrderBy(t => t))
{
var categoryData = sourcetypeData.Where(t => t.Category == category);
if (categoryData == null || !categoryData.Any()) continue;
foreach (var itemname in categoryData.Select(t => t.ItemName).Distinct().OrderBy(t => t))
{
var itemnameData = categoryData.Where(t => t.ItemName == itemname);
if (itemnameData == null || !itemnameData.Any()) continue;
var rowcells = new List<Cell>();
if (inittype == 0)
{
rowcells = new List<Cell>
{
new Cell { CellType = "body", CellValue = sourcetype, PointCell = 0, MergeRow = sourcetypeData.Count(), MergeCell = 1 },
new Cell { CellType = "body", CellValue = category, PointCell = 1, MergeRow = categoryData.Count(), MergeCell = 1 },
};
}
else if (inittype == 1)
{
rowcells.Add(new Cell { CellType = "body", CellValue = category, PointCell = 0, MergeRow = categoryData.Count(), MergeCell = 1 });
}
int itemnameIndex = inittype == 0 ? 2 : inittype == 1 ? 1 : 0;
rowcells.Add(new Cell { CellType = "body", CellValue = itemname, PointCell = itemnameIndex, MergeRow = itemnameData.Count(), MergeCell = 1 });
index = 0;
foreach (var year in years)
{
var thisdata = itemnameData.FirstOrDefault(t => t.Year == year);
int point = itemnameIndex + 1 + index * 12;
for (int i = 1; i < 13; i++)
{
rowcells.Add(new Cell
{
CellType = "body",
CellValue = thisdata != null ? dict[i].Invoke(thisdata) : null,
PointCell = point,
MergeRow = 1,
MergeCell = 1
});
point++;
}
index++;
}
if (inittype == 0) maxPointIndex = rowcells.Max(t => t.PointCell);
inittype = 2;
rows.Add(new Row(rownumber) { Data = rowcells });
rownumber++;
}
inittype = 1;
}
}
sheet.Row = rows;
#endregion
return sheet;
}
} }
} }
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