Commit 00c3c793 by ruyun.zhang@suvalue.com

Merge branch 'feature/每月汇报表' into develop

parents 9a3b2573 4d1f04c4
...@@ -385,6 +385,7 @@ public ApiResponse Pigeonhole([CustomizeValidator(RuleSet = "Delete"), FromBody] ...@@ -385,6 +385,7 @@ public ApiResponse Pigeonhole([CustomizeValidator(RuleSet = "Delete"), FromBody]
if (null == allot) if (null == allot)
throw new PerformanceException("当前绩效记录不存在或没有上传数据文件"); throw new PerformanceException("当前绩效记录不存在或没有上传数据文件");
_allotService.Pigeonhole(allot); _allotService.Pigeonhole(allot);
_taskService.Add(Background.JobType.每日汇报表汇总, allot.ID.ToString());
return new ApiResponse(ResponseType.OK); return new ApiResponse(ResponseType.OK);
} }
...@@ -458,6 +459,9 @@ public ApiResponse Issued([FromBody] AllotRequest request) ...@@ -458,6 +459,9 @@ public ApiResponse Issued([FromBody] AllotRequest request)
{ {
_allotService.UpdateAllotStates(allot.ID, (int)AllotStates.绩效下发, EnumHelper.GetDescription(AllotStates.绩效下发)); _allotService.UpdateAllotStates(allot.ID, (int)AllotStates.绩效下发, EnumHelper.GetDescription(AllotStates.绩效下发));
costTransferService.RejectedApplicat(allot.ID); costTransferService.RejectedApplicat(allot.ID);
_taskService.Add(Background.JobType.每日汇报表汇总, allot.ID.ToString());
return new ApiResponse(ResponseType.OK, "下发成功"); return new ApiResponse(ResponseType.OK, "下发成功");
} }
else else
......
using Microsoft.AspNetCore.Mvc;
using Performance.DtoModels;
using Performance.EntityModels;
using Performance.Services;
using System.Collections.Generic;
using System.Linq;
namespace Performance.Api.Controllers
{
/// <summary>
/// 每月报表
/// </summary>
[Route("api/statistics")]
public class StatisticsController : Controller
{
private readonly StatisticsService _service;
public StatisticsController(StatisticsService service)
{
_service = service;
}
/// <summary>
/// 查询报表信息
/// </summary>
/// <param name="statisticsId"></param>
/// <param name="hospitalID"></param>
/// <returns></returns>
[HttpPost("info")]
public ApiResponse<StatisticsInfoDto> GetInfo(int hospitalID, int statisticsId)
{
// report_statistics
// report_statistics_selection
return new ApiResponse<StatisticsInfoDto>(ResponseType.OK, _service.GetInfo(hospitalID,statisticsId));
}
/// <summary>
/// 查询报表查询记录
/// </summary>
/// <param name="statisticsId"></param>
/// <param name="hospitalID"></param>
/// <returns></returns>
[HttpPost("selection/record")]
public ApiResponse<List<report_statistics_selection_record>> GetSelectionRecord(int hospitalID,int statisticsId)
{
return new ApiResponse<List<report_statistics_selection_record>>(ResponseType.OK, _service.GetSelectionRecord(hospitalID, statisticsId));
}
/// <summary>
/// 保存报表查询记录
/// </summary>
/// <returns></returns>
[HttpPost("selection/record/save")]
public ApiResponse SaveSelectionRecord([FromBody] report_statistics_selection_record record)
{
return _service.SaveSelectionRecord(record);
}
/// <summary>
/// 删除报表查询记录
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("selection/record/delete")]
public ApiResponse DeleteSelectionRecord(int id)
{
if(_service.DeleteSelectionRecord(id))
return new ApiResponse(ResponseType.OK, "删除成功");
else
return new ApiResponse(ResponseType.Fail, "删除失败");
}
/// <summary>
/// 查询报表结果
/// </summary>
/// <returns></returns>
[HttpPost("search")]
public ApiResponse<StatisticsQueryResultDto> Search([FromBody] StatisticsQuery query)
{
// 数额必须返回
// Columns
// 占比 判断层级结构表中是否存在公式 存在则返回
// 权重 判断层级结构表中是否存在公式 存在则返回
// 增降幅 判断是否是对比查询 存在则返回
// Data
// 判断层级结构表中是否存在数据
// 1.使用层级表中的SQL查询数据出来
// 层级固定插入 项目 列中(今天或明天再确定下来)
// 数额固定插入 数额 列中
// 带公式信息列,则把表中的公式放入即可
// 剩余的判断则和列头相同的判断规则,插入空白数据
// 2.否则 使用主表SQL查询数据出来
// 横向转换结构(今天或明天再确定下来)
// 占位符 分两种
// 1.具有具体名称的占位符 如 @UnitType 直接替换为具体参数
// 2.前端传入参数,但没有具体占位的 则拼接后替换 @wh 如 @UnitType 直接替换为具体参数
/*
SELECT SUM(VALUE) FROM report_statistics_store WHERE Category IN ('中成药费','西药费') AND UnitType IN @UnitType AND @wh
参数
{
"HospitalID":"12",
"UnitType":"医生组",
"AccoungtingUnti":"呼吸内科"
}
where = "";
// 先循环 参数
判断是否存在 存在则替换 不存在 则 拼接到变量
1. HospitalID >> 拼接 where = "HospitalID = 12"
2. UnitType >> 替换 where = "HospitalID = 12"
3. AccoungtingUnti >> 拼接 where = "HospitalID = 12 AND AccoungtingUnti IN ('呼吸内科') "
替换@wh = where
SELECT SUM(VALUE) FROM report_statistics_store WHERE Category IN ('中成药费','西药费') AND UnitType IN ('医生组') AND HospitalID = 12 AND AccoungtingUnti IN ('呼吸内科')
*/
// 取出对应SQL(多条)
// 循环执行
// { "数额" , "SQL"。 } >> { "数额" , "23" }
return new ApiResponse<StatisticsQueryResultDto>(ResponseType.OK, _service.Search(query));
}
}
}
\ No newline at end of file
...@@ -93,6 +93,9 @@ public void Execute() ...@@ -93,6 +93,9 @@ public void Execute()
case (int)Background.JobType.自定义抽取: case (int)Background.JobType.自定义抽取:
Execute_Allot_CustomExtract(service, task); Execute_Allot_CustomExtract(service, task);
break; break;
case (int)Background.JobType.每日汇报表汇总:
Execute_Allot_Statistics(service, task);
break;
default: default:
service.Update(task.ID, Background.Status.无效); service.Update(task.ID, Background.Status.无效);
break; break;
...@@ -102,6 +105,33 @@ public void Execute() ...@@ -102,6 +105,33 @@ public void Execute()
} }
/// <summary> /// <summary>
/// 每日汇报表汇总
/// </summary>
/// <param name="service"></param>
/// <param name="task"></param>
private void Execute_Allot_Statistics(TaskService service, bg_task task)
{
using (var scope = _serviceScopeFactory.CreateScope())
{
var allotService = scope.ServiceProvider.GetService<AllotService>();
try
{
if (int.TryParse(task.Argument, out int allotId))
{
service.Update(task.ID, Background.Status.执行中);
Stopwatch stopwatch = Stopwatch.StartNew();
allotService.GenerateReportStatistics(allotId);
stopwatch.Stop();
service.Update(task.ID, Background.Status.完成, seconds: stopwatch.Elapsed.TotalSeconds);
}
}
catch (Exception ex)
{
service.Update(task.ID, Background.Status.失败, ex.ToString());
}
}
}
/// <summary>
/// 生成测算表 /// 生成测算表
/// </summary> /// </summary>
/// <param name="service"></param> /// <param name="service"></param>
...@@ -134,8 +164,23 @@ private void Execute_Allot_Generate(TaskService service, bg_task task) ...@@ -134,8 +164,23 @@ private void Execute_Allot_Generate(TaskService service, bg_task task)
{ {
service.Update(task.ID, Background.Status.失败, ex.ToString()); service.Update(task.ID, Background.Status.失败, ex.ToString());
} }
try
{
allotService.GenerateReport(allot); allotService.GenerateReport(allot);
} }
catch (Exception)
{
}
try
{
allotService.GenerateReportStatistics(allotId);
}
catch (Exception)
{
}
}
} }
} }
......
...@@ -2343,6 +2343,46 @@ ...@@ -2343,6 +2343,46 @@
<param name="request"></param> <param name="request"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:Performance.Api.Controllers.StatisticsController">
<summary>
每月报表
</summary>
</member>
<member name="M:Performance.Api.Controllers.StatisticsController.GetInfo(System.Int32,System.Int32)">
<summary>
查询报表信息
</summary>
<param name="statisticsId"></param>
<param name="hospitalID"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.StatisticsController.GetSelectionRecord(System.Int32,System.Int32)">
<summary>
查询报表查询记录
</summary>
<param name="statisticsId"></param>
<param name="hospitalID"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.StatisticsController.SaveSelectionRecord(Performance.EntityModels.report_statistics_selection_record)">
<summary>
保存报表查询记录
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.StatisticsController.DeleteSelectionRecord(System.Int32)">
<summary>
删除报表查询记录
</summary>
<param name="id"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.StatisticsController.Search(Performance.DtoModels.StatisticsQuery)">
<summary>
查询报表结果
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.TemplateController.DownFile(System.Int32)"> <member name="M:Performance.Api.Controllers.TemplateController.DownFile(System.Int32)">
<summary> <summary>
从WebAPI下载模板 1、医院绩效模板 2、医院二次分配绩效模板 3、医院绩效模板(无执行科室) 从WebAPI下载模板 1、医院绩效模板 2、医院二次分配绩效模板 3、医院绩效模板(无执行科室)
...@@ -2410,6 +2450,13 @@ ...@@ -2410,6 +2450,13 @@
<param name="query"></param> <param name="query"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Performance.Api.BackgroundJob.Execute_Allot_Statistics(Performance.Services.TaskService,Performance.EntityModels.bg_task)">
<summary>
每日汇报表汇总
</summary>
<param name="service"></param>
<param name="task"></param>
</member>
<member name="M:Performance.Api.BackgroundJob.Execute_Allot_Generate(Performance.Services.TaskService,Performance.EntityModels.bg_task)"> <member name="M:Performance.Api.BackgroundJob.Execute_Allot_Generate(Performance.Services.TaskService,Performance.EntityModels.bg_task)">
<summary> <summary>
生成测算表 生成测算表
......
...@@ -1736,6 +1736,71 @@ ...@@ -1736,6 +1736,71 @@
Not In Not In
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.StatisticsInfoDto.Name">
<summary>
每月汇总表名称
</summary>
</member>
<member name="P:Performance.DtoModels.StatisticsInfoDto.IsComparison">
<summary>
报表对比 0 不允许对比 1 允许对比
</summary>
</member>
<member name="P:Performance.DtoModels.StatisticsSelectionDto.Title">
<summary>
条件标题
</summary>
</member>
<member name="P:Performance.DtoModels.StatisticsSelectionDto.Sort">
<summary>
排序
</summary>
</member>
<member name="P:Performance.DtoModels.StatisticsSelectionDto.InputName">
<summary>
控件名称
</summary>
</member>
<member name="P:Performance.DtoModels.StatisticsSelectionDto.InputType">
<summary>
控件类型(1:input框、2:radio单选、3:checkbox多选、4:select单选、5:select多选、6:自动补全单选、7:自动补全多选、10:日期区间)
</summary>
</member>
<member name="P:Performance.DtoModels.StatisticsSelectionDto.Required">
<summary>
是否必填(1表示必填0表示非必填)
</summary>
</member>
<member name="P:Performance.DtoModels.StatisticsSelectionDto.Options">
<summary>
数据集合
</summary>
</member>
<member name="P:Performance.DtoModels.StatisticsQuery.IsComparison">
<summary>
结果返回用途 首次查询 0 用于比对 1 用于对比
</summary>
</member>
<member name="P:Performance.DtoModels.StatisticsQueryResultDto.IsComparison">
<summary>
结果返回用途 首次查询 0 用于比对 1 用于对比
</summary>
</member>
<member name="P:Performance.DtoModels.StatisticsColumn.ColumnName">
<summary>
显示名
</summary>
</member>
<member name="P:Performance.DtoModels.StatisticsColumn.OrgColumnName">
<summary>
原始名,对应到数据列
</summary>
</member>
<member name="P:Performance.DtoModels.StatisticsColumn.Fixed">
<summary>
固定
</summary>
</member>
<member name="P:Performance.DtoModels.ReportTable.PersonnelName"> <member name="P:Performance.DtoModels.ReportTable.PersonnelName">
<summary> <summary>
人员信息 人员信息
......
...@@ -292,7 +292,7 @@ ...@@ -292,7 +292,7 @@
<member name="P:Performance.EntityModels.PerformanceDbContext.report_performance_person_tags"> <member name="P:Performance.EntityModels.PerformanceDbContext.report_performance_person_tags">
<summary> </summary> <summary> </summary>
</member> </member>
<member name="P:Performance.EntityModels.PerformanceDbContext.report_performance_tags"> <member name="P:Performance.EntityModels.PerformanceDbContext.report_statistics">
<summary> </summary> <summary> </summary>
</member> </member>
<member name="P:Performance.EntityModels.PerformanceDbContext.res_account"> <member name="P:Performance.EntityModels.PerformanceDbContext.res_account">
...@@ -7385,6 +7385,206 @@ ...@@ -7385,6 +7385,206 @@
创建时间 创建时间
</summary> </summary>
</member> </member>
<member name="T:Performance.EntityModels.report_statistics">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics.Name">
<summary>
每月汇总表名称
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics.IsComparison">
<summary>
报表对比 0 不允许对比 1 允许对比
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics.TotalScript">
<summary>
汇总数值SQL
</summary>
</member>
<member name="T:Performance.EntityModels.report_statistics_selection">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection.Title">
<summary>
条件标题
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection.Sort">
<summary>
排序
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection.Content">
<summary>
条件SQL语句
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection.Type">
<summary>
条件类型(1固定条件,2需要通过语句获取)
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection.InputName">
<summary>
控件名称
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection.InputType">
<summary>
控件类型(1:input框、2:radio单选、3:checkbox多选、4:select单选、5:select多选、6:自动补全单选、7:自动补全多选、10:日期区间)
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection.Required">
<summary>
是否必填(1表示必填0表示非必填)
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection.LoadType">
<summary>
条件加载方式 1 立即加载 2 联动加载 3 自动补全
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection.DefaultType">
<summary>
默认值类型(1 固定文本 2 动态结果第一项)
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection.DefaultValue">
<summary>
默认值文本
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection.State">
<summary>
条件状态 1 正常 2 可用但不显示 3 不显示不可用 4 不可用但显示
</summary>
</member>
<member name="T:Performance.EntityModels.report_statistics_selection_record">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection_record.CreateDate">
<summary>
创建时间
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection_record.UpdateDate">
<summary>
最后修改时间
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection_record.Name">
<summary>
自定义名称
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_selection_record.Content">
<summary>
条件内容
</summary>
</member>
<member name="T:Performance.EntityModels.report_statistics_store">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_store.HospitalId">
<summary>
医院ID
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_store.AllotID">
<summary>
绩效ID
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_store.Year">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_store.Month">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_store.YearMonth">
<summary>
年月
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_store.UnitType">
<summary>
核算组别
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_store.AccountingUnit">
<summary>
核算单元
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_store.Source">
<summary>
来源
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_store.Category">
<summary>
类别
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_store.Value">
<summary>
数值
</summary>
</member>
<member name="T:Performance.EntityModels.report_statistics_tree">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_tree.StatisticsID">
<summary>
每月汇总表ID
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_tree.ParentID">
<summary>
统计层级父级ID
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_tree.Name">
<summary>
统计层级名称
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_tree.TotalScript">
<summary>
汇总数值SQL
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_tree.TotalFormula">
<summary>
汇总数值公式
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_tree.ProportionFormula">
<summary>
占比公式
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics_tree.WeightFormula">
<summary>
权重公式
</summary>
</member>
<member name="T:Performance.EntityModels.rep_group"> <member name="T:Performance.EntityModels.rep_group">
<summary> <summary>
......
...@@ -91,6 +91,7 @@ public enum JobType ...@@ -91,6 +91,7 @@ public enum JobType
提取数据 = 2, 提取数据 = 2,
报表 = 3, 报表 = 3,
自定义抽取 = 4, 自定义抽取 = 4,
每日汇报表汇总 = 5,
} }
public enum Status public enum Status
{ {
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Performance.DtoModels
{
public class StatisticsInfoDto
{
public int StatisticsID { get; set; }
public int HospitalId { get; set; }
/// <summary>
/// 每月汇总表名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 报表对比 0 不允许对比 1 允许对比
/// </summary>
public int IsComparison { get; set; }
public List<StatisticsSelectionDto> Selections { get; set; }
}
public class StatisticsSelectionDto
{
public int SelectionID { get; set; }
public int? StatisticsID { get; set; }
/// <summary>
/// 条件标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 排序
/// </summary>
public decimal? Sort { get; set; }
/// <summary>
/// 控件名称
/// </summary>
public string InputName { get; set; }
/// <summary>
/// 控件类型(1:input框、2:radio单选、3:checkbox多选、4:select单选、5:select多选、6:自动补全单选、7:自动补全多选、10:日期区间)
/// </summary>
public string InputType { get; set; }
/// <summary>
/// 是否必填(1表示必填0表示非必填)
/// </summary>
public int? Required { get; set; }
/// <summary>
/// 数据集合
/// </summary>
public List<TitleValue> Options { get; set; }
}
public class StatisticsQuery
{
public int HospitalID { get; set; }
public int StatisticsID { get; set; }
/// <summary>
/// 结果返回用途 首次查询 0 用于比对 1 用于对比
/// </summary>
public int? IsComparison { get; set; }
public List<SelectionValues> Values { get; set; }
}
public class StatisticsQueryResultDto
{
/// <summary>
/// 结果返回用途 首次查询 0 用于比对 1 用于对比
/// </summary>
public int? IsComparison { get; set; }
public List<StatisticsColumn> Columns { get; set; }
public List<Dictionary<string, object>> Datas { get; set; }
}
public class StatisticsColumn
{
public StatisticsColumn()
{
ColumnName = "";
OrgColumnName = "";
Fixed = "";
ChildColumns = new List<StatisticsColumn>();
}
/// <summary>
/// 显示名
/// </summary>
public string ColumnName { get; set; }
/// <summary>
/// 原始名,对应到数据列
/// </summary>
public string OrgColumnName { get; set; }
/// <summary>
/// 固定
/// </summary>
public string Fixed { get; set; }
public List<StatisticsColumn> ChildColumns { get; set; }
}
}
...@@ -208,7 +208,11 @@ public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options) ...@@ -208,7 +208,11 @@ public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options)
/// <summary> </summary> /// <summary> </summary>
public virtual DbSet<report_performance_person_tags> report_performance_person_tags { get; set; } public virtual DbSet<report_performance_person_tags> report_performance_person_tags { get; set; }
/// <summary> </summary> /// <summary> </summary>
public virtual DbSet<report_performance_tags> report_performance_tags { get; set; } public virtual DbSet<report_statistics> report_statistics { get; set; }
public virtual DbSet<report_statistics_selection> report_statistics_selection { get; set; }
public virtual DbSet<report_statistics_selection_record> report_statistics_selection_record { get; set; }
public virtual DbSet<report_statistics_store> report_statistics_store { get; set; }
public virtual DbSet<report_statistics_tree> report_statistics_tree { get; set; }
/// <summary> 科室核算结果 </summary> /// <summary> 科室核算结果 </summary>
public virtual DbSet<res_account> res_account { get; set; } public virtual DbSet<res_account> res_account { get; set; }
///// <summary> 医生科室核算结果 </summary> ///// <summary> 医生科室核算结果 </summary>
......
//-----------------------------------------------------------------------
// <copyright file=" report_performance_tags.cs">
// * FileName: .cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
///
/// </summary>
[Table("report_statistics")]
public class report_statistics
{
[Key]
public int ID { get; set; }
public int? HospitalId { get; set; }
/// <summary>
/// 每月汇总表名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 报表对比 0 不允许对比 1 允许对比
/// </summary>
public int? IsComparison { get; set; }
/// <summary>
/// 汇总数值SQL
/// </summary>
public string TotalScript { get; set; }
///// <summary>
///// 占比SQL
///// </summary>
//public string ProportionScript { get; set; }
///// <summary>
///// 权重SQL
///// </summary>
//public string WeightScript { get; set; }
}
}
\ No newline at end of file
//-----------------------------------------------------------------------
// <copyright file=" report_statistics_selection.cs">
// * FileName: .cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
///
/// </summary>
[Table("report_statistics_selection")]
public class report_statistics_selection
{
[Key]
public int ID { get; set; }
public int? StatisticsID { get; set; }
/// <summary>
/// 条件标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 排序
/// </summary>
public decimal? Sort { get; set; }
/// <summary>
/// 条件SQL语句
/// </summary>
public string Content { get; set; }
/// <summary>
/// 条件类型(1固定条件,2需要通过语句获取)
/// </summary>
public int Type { get; set; }
/// <summary>
/// 控件名称
/// </summary>
public string InputName { get; set; }
/// <summary>
/// 控件类型(1:input框、2:radio单选、3:checkbox多选、4:select单选、5:select多选、6:自动补全单选、7:自动补全多选、10:日期区间)
/// </summary>
public string InputType { get; set; }
/// <summary>
/// 是否必填(1表示必填0表示非必填)
/// </summary>
public int? Required { get; set; }
/// <summary>
/// 条件加载方式 1 立即加载 2 联动加载 3 自动补全
/// </summary>
public int LoadType { get; set; }
/// <summary>
/// 默认值类型(1 固定文本 2 动态结果第一项)
/// </summary>
public int? DefaultType { get; set; }
/// <summary>
/// 默认值文本
/// </summary>
public string DefaultValue { get; set; }
/// <summary>
/// 条件状态 1 正常 2 可用但不显示 3 不显示不可用 4 不可用但显示
/// </summary>
public int? State { get; set; }
}
}
\ No newline at end of file
//-----------------------------------------------------------------------
// <copyright file=" report_statistics_selection_record.cs">
// * FileName: .cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
///
/// </summary>
[Table("report_statistics_selection_record")]
public class report_statistics_selection_record
{
[Key]
public int ID { get; set; }
public int? HospitalId { get; set; }
public int? StatisticsID { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? CreateDate { get; set; }
/// <summary>
/// 最后修改时间
/// </summary>
public DateTime? UpdateDate { get; set; }
/// <summary>
/// 自定义名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 条件内容
/// </summary>
public string Content { get; set; }
}
}
\ No newline at end of file
//-----------------------------------------------------------------------
// <copyright file=" report_statistics_store.cs">
// * FileName: .cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
///
/// </summary>
[Table("report_statistics_store")]
public class report_statistics_store
{
[Key]
public int ID { get; set; }
/// <summary>
/// 医院ID
/// </summary>
public int? HospitalId { get; set; }
/// <summary>
/// 绩效ID
/// </summary>
public int? AllotID { get; set; }
/// <summary>
/// 年
/// </summary>
public int? Year { get; set; }
/// <summary>
/// 月
/// </summary>
public int? Month { get; set; }
/// <summary>
/// 年月
/// </summary>
public string YearMonth { get; set; }
/// <summary>
/// 核算组别
/// </summary>
public string UnitType { get; set; }
/// <summary>
/// 核算单元
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
/// 来源
/// </summary>
public string Source { get; set; }
/// <summary>
/// 类别
/// </summary>
public string Category { get; set; }
/// <summary>
/// 数值
/// </summary>
public decimal? Value { get; set; }
}
}
\ No newline at end of file
//-----------------------------------------------------------------------
// <copyright file=" report_statistics_tree.cs">
// * FileName: .cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
///
/// </summary>
[Table("report_statistics_tree")]
public class report_statistics_tree
{
[Key]
public int ID { get; set; }
/// <summary>
/// 每月汇总表ID
/// </summary>
public int? StatisticsID { get; set; }
/// <summary>
/// 统计层级父级ID
/// </summary>
public int? ParentID { get; set; }
/// <summary>
/// 统计层级名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 汇总数值SQL
/// </summary>
public string TotalScript { get; set; }
/// <summary>
/// 汇总数值公式
/// </summary>
public string TotalFormula { get; set; }
/// <summary>
/// 占比公式
/// </summary>
public string ProportionFormula { get; set; }
/// <summary>
/// 权重公式
/// </summary>
public string WeightFormula { get; set; }
}
}
\ No newline at end of file
using Performance.EntityModels;
namespace Performance.Repository
{
public partial class PerforReportStatisticsRepository : PerforRepository<report_statistics>
{
public PerforReportStatisticsRepository(PerformanceDbContext context) : base(context)
{
}
}
}
using Performance.EntityModels;
namespace Performance.Repository
{
public partial class PerforReportStatisticsSelectionRecordRepository : PerforRepository<report_statistics_selection_record>
{
public PerforReportStatisticsSelectionRecordRepository(PerformanceDbContext context) : base(context)
{
}
}
}
using Performance.EntityModels;
namespace Performance.Repository
{
public partial class PerforReportStatisticsSelectionRepository : PerforRepository<report_statistics_selection>
{
public PerforReportStatisticsSelectionRepository(PerformanceDbContext context) : base(context)
{
}
}
}
using Performance.EntityModels;
namespace Performance.Repository
{
public partial class PerforReportStatisticsStoreRepository : PerforRepository<report_statistics_store>
{
public PerforReportStatisticsStoreRepository(PerformanceDbContext context) : base(context)
{
}
}
}
using Performance.EntityModels;
namespace Performance.Repository
{
public partial class PerforReportStatisticsTreeRepository : PerforRepository<report_statistics_tree>
{
public PerforReportStatisticsTreeRepository(PerformanceDbContext context) : base(context)
{
}
}
}
...@@ -494,6 +494,21 @@ public void GenerateReport(per_allot allot) ...@@ -494,6 +494,21 @@ public void GenerateReport(per_allot allot)
} }
/// <summary> /// <summary>
/// 绩效生成报表
/// </summary>
/// <param name="allot"></param>
public void GenerateReportStatistics(int allotId)
{
try
{
reportService.ExecProc("call proc_report_statistics(@allotId);", new { allotId });
}
catch (Exception ex)
{
_logger.LogError($"每月汇报表生成失败。 allotid: {allotId}。" + ex.Message);
}
}
/// <summary>
/// 验证科室核算单元、工号 /// 验证科室核算单元、工号
/// </summary> /// </summary>
/// <param name="allot"></param> /// <param name="allot"></param>
...@@ -587,19 +602,6 @@ public void Pigeonhole(per_allot allot) ...@@ -587,19 +602,6 @@ public void Pigeonhole(per_allot allot)
allot.PigeonholeDate = DateTime.Now; allot.PigeonholeDate = DateTime.Now;
allot.Remark = "归档"; allot.Remark = "归档";
_allotRepository.Update(allot); _allotRepository.Update(allot);
//if (_allotRepository.Update(allot))
//{
// var again = _againallotRepository.GetEntities(t => t.AllotID == allot.ID);
// if (again != null && again.Count > 0)
// {
// foreach (var item in again)
// {
// item.Remark = $"原状态:{item.States},归档更改状态";
// item.States = 5;
// _againallotRepository.Update(item);
// }
// }
//}
} }
/// <summary> /// <summary>
......
using Dapper;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using MySql.Data.MySqlClient;
using Performance.DtoModels;
using Performance.DtoModels.AppSettings;
using Performance.EntityModels;
using Performance.Infrastructure;
using Performance.Repository;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text.RegularExpressions;
namespace Performance.Services
{
public class StatisticsService : IAutoInjection
{
private readonly ILogger<StatisticsService> _logger;
private readonly IOptions<AppConnection> _options;
private readonly PerforReportStatisticsRepository _reportStatisticsRepository;
private readonly PerforReportStatisticsSelectionRepository _reportStatisticsSelectionRepository;
private readonly PerforReportStatisticsSelectionRecordRepository _reportStatisticsSelectionRecordRepository;
private readonly PerforReportStatisticsStoreRepository _reportStatisticsStoreRepository;
private readonly PerforReportStatisticsTreeRepository _reportStatisticsTreeRepository;
public StatisticsService(
ILogger<StatisticsService> logger,
IOptions<AppConnection> options,
PerforReportStatisticsRepository ReportStatisticsRepository,
PerforReportStatisticsSelectionRepository ReportStatisticsSelectionRepository,
PerforReportStatisticsSelectionRecordRepository ReportStatisticsSelectionRecordRepository,
PerforReportStatisticsStoreRepository ReportStatisticsStoreRepository,
PerforReportStatisticsTreeRepository ReportStatisticsTreeRepository
)
{
_logger = logger;
_options = options;
_reportStatisticsRepository = ReportStatisticsRepository;
_reportStatisticsSelectionRepository = ReportStatisticsSelectionRepository;
_reportStatisticsSelectionRecordRepository = ReportStatisticsSelectionRecordRepository;
_reportStatisticsStoreRepository = ReportStatisticsStoreRepository;
_reportStatisticsTreeRepository = ReportStatisticsTreeRepository;
}
private (string sql, DynamicParameters param) GetSqlQuery(string sql, Dictionary<string, object> pairs)
{
List<string> plist = new List<string>();
foreach (var item in pairs)
{
var json = JsonHelper.Serialize(item.Value);
if (!Regex.IsMatch(sql, $"@{item.Key}", RegexOptions.IgnoreCase | RegexOptions.Multiline) && !string.IsNullOrEmpty(json) && json != "[]")
{
var key = item.Key.StartsWith("@") ? item.Key.Substring(1, item.Key.Length - 1) : item.Key;
if (item.Value.GetType().GetInterfaces().Any(iface => iface.IsGenericType && iface.GetGenericTypeDefinition() == typeof(ICollection<>)))
{
plist.Add($"{key} IN @{key}");
}
else
plist.Add($"{key} = @{key}");
}
}
string @wh = string.Join(" AND ", plist.ToArray());
// 多种占位方式
string[] ws = new string[] { "@wh", "@w", "{w}", "{wh}" };
foreach (var item in ws)
{
if (Regex.IsMatch(sql, item, RegexOptions.IgnoreCase | RegexOptions.Multiline))
sql = Regex.Replace(sql, item, @wh, RegexOptions.IgnoreCase | RegexOptions.Multiline);
}
DynamicParameters param = new DynamicParameters();
foreach (var item in pairs)
{
var key = item.Key.StartsWith("@") ? item.Key : $"@{item.Key}";
param.Add(key, item.Value);
}
return (sql, param);
}
public StatisticsInfoDto GetInfo(int hospitalID, int statisticsId)
{
var reportStatistics = _reportStatisticsRepository.GetEntity(t => t.ID == statisticsId && t.HospitalId == hospitalID);
if (reportStatistics == null)
return new StatisticsInfoDto();
var reportStatisticsSelection = _reportStatisticsSelectionRepository.GetEntities(t => t.StatisticsID == reportStatistics.ID);
if (reportStatisticsSelection.Count == 0)
return new StatisticsInfoDto();
var result = new StatisticsInfoDto()
{
StatisticsID = statisticsId,
HospitalId = (int)reportStatistics.HospitalId,
Name = reportStatistics.Name,
IsComparison = (int)reportStatistics.IsComparison,
Selections = new List<StatisticsSelectionDto> { }
};
Dictionary<string, object> pairs = new Dictionary<string, object>
{
{ "@hospitalId", hospitalID },
};
foreach (var item in reportStatisticsSelection)
{
var (sql, param) = GetSqlQuery(item.Content, pairs);
var reportStatisticsStore = _reportStatisticsStoreRepository.DapperQuery<TitleValue>(sql, param).ToList();
reportStatisticsStore.ForEach(t => t.State = (int)item.State);
StatisticsSelectionDto statisticsSelectionDto = new StatisticsSelectionDto()
{
SelectionID = item.ID,
StatisticsID = item.StatisticsID,
InputName = item.InputName,
InputType = item.InputType,
Required = item.Required,
Sort = item.Sort,
Title = item.Title,
Options = reportStatisticsStore
};
result.Selections.Add(statisticsSelectionDto);
}
result.Selections = result.Selections.OrderBy(t => t.Sort).ToList();
return result;
}
public List<report_statistics_selection_record> GetSelectionRecord(int hospitalID, int statisticsId)
{
var result = _reportStatisticsSelectionRecordRepository.GetEntities(t => t.HospitalId == hospitalID && t.StatisticsID == statisticsId).OrderByDescending(t => t.UpdateDate).OrderByDescending(t=>t.CreateDate).ToList();
return result;
}
public ApiResponse SaveSelectionRecord(report_statistics_selection_record record)
{
record.Content = JsonHelper.Serialize(record.Content);
var result = _reportStatisticsSelectionRecordRepository.GetEntity(t => t.ID == record.ID);
bool ok;
if (result != null)
{
result.UpdateDate = DateTime.Now;
ok = _reportStatisticsSelectionRecordRepository.Update(record);
}
else
{
record.CreateDate = DateTime.Now;
ok = _reportStatisticsSelectionRecordRepository.Add(record);
}
if (ok) return new ApiResponse(ResponseType.OK);
else return new ApiResponse(ResponseType.Fail);
}
public bool DeleteSelectionRecord(int id)
{
var result = _reportStatisticsSelectionRecordRepository.GetEntity(t => t.ID == id);
return _reportStatisticsSelectionRecordRepository.Remove(result);
}
public StatisticsQueryResultDto Search(StatisticsQuery query)
{
var reportStatistics = _reportStatisticsRepository.GetEntity(t => t.ID == query.StatisticsID && t.HospitalId == query.HospitalID);
if (reportStatistics == null)
return new StatisticsQueryResultDto();
Dictionary<string, object> pairs = new Dictionary<string, object> { };
var reportStatisticsTree = _reportStatisticsTreeRepository.GetEntities(t => t.StatisticsID == query.StatisticsID);
var isTree = (reportStatisticsTree != null && reportStatisticsTree.Count > 0);
/*
* 报表分三种
* 1.绩效情况六--各科室医护绩效对比 这是特殊的,直接查询视图,对列头特殊处理
* 2.没有层级 通过1条SQL查询全部数据展示
* 3.配置层级 通过层级查询固定SQL
*/
if (query.StatisticsID == 7)
return StatisticsQuery7(query, reportStatistics);
else if (!isTree)
return StatisticsQuery(query, reportStatistics);
else
return StatisticsTreeQuery(query, reportStatisticsTree);
}
/// <summary>
/// 绩效情况六--各科室医护绩效对比 这是特殊的,直接查询视图,对列头特殊处理
/// </summary>
/// <param name="query"></param>
/// <param name="statistics"></param>
/// <returns></returns>
private StatisticsQueryResultDto StatisticsQuery7(StatisticsQuery query, report_statistics statistics)
{
Dictionary<string, object> pairs = new Dictionary<string, object>
{
{ "HospitalID", query.HospitalID },
};
foreach (var item in query.Values)
{
pairs.Add(item.Title, item.Values);
}
var table = new List<Dictionary<string, object>>();
using (IDbConnection connection = new MySqlConnection(_options.Value.PerformanceConnectionString))
{
if (!string.IsNullOrEmpty(statistics.TotalScript))
{
var (sql, param) = GetSqlQuery(statistics.TotalScript, pairs);
var data = connection.Query(sql, param);
table = JsonHelper.Deserialize<List<Dictionary<string, object>>>(JsonHelper.Serialize(data));
}
}
var columns = new List<StatisticsColumn>();
if (table != null && table.Count > 0)
{
foreach (var item in table.First().Keys)
{
/*
* 对列头特殊处理
* 按"_"拆分,并合并父子列头
*/
if (!item.Contains("_"))
{
columns.Add(new StatisticsColumn { ColumnName = item, OrgColumnName = item, Fixed = "left" });
}
else
{
var cols = item.SplitRemoveEmpty("_");
var col = columns.FirstOrDefault(w => w.ColumnName == cols.First());
if (col == null)
{
col = new StatisticsColumn { ColumnName = cols.First(), OrgColumnName = item, };
columns.Add(col);
}
if (!col.ChildColumns.Any(w => w.ColumnName == cols.Last()))
col.ChildColumns.Add(new StatisticsColumn { ColumnName = cols.Last(), OrgColumnName = item, });
}
}
}
return new StatisticsQueryResultDto
{
IsComparison = query.IsComparison,
Columns = columns,
Datas = table,
};
}
/// <summary>
/// 没有层级 通过1条SQL查询全部数据展示
/// </summary>
/// <param name="query"></param>
/// <param name="statistics"></param>
/// <returns></returns>
private StatisticsQueryResultDto StatisticsQuery(StatisticsQuery query, report_statistics statistics)
{
Dictionary<string, object> pairs = new Dictionary<string, object>
{
{ "HospitalID", query.HospitalID },
};
foreach (var item in query.Values)
{
pairs.Add(item.Title, item.Values);
}
var table = new List<Dictionary<string, object>>();
using (IDbConnection connection = new MySqlConnection(_options.Value.PerformanceConnectionString))
{
if (!string.IsNullOrEmpty(statistics.TotalScript))
{
var (sql, param) = GetSqlQuery(statistics.TotalScript, pairs);
var data = connection.Query(sql, param);
table = JsonHelper.Deserialize<List<Dictionary<string, object>>>(JsonHelper.Serialize(data));
}
}
var columns = new List<StatisticsColumn>();
string[] cols = new string[] { "数值", "金额", "占比", "权重" };
if (table != null && table.Count > 0)
{
foreach (var item in table.First().Keys)
{
columns.Add(new StatisticsColumn { ColumnName = item, OrgColumnName = item, Fixed = cols.Contains(item) ? "" : "left" });
}
}
return new StatisticsQueryResultDto
{
IsComparison = query.IsComparison,
Columns = columns,
Datas = table,
};
}
/// <summary>
/// 配置层级 通过层级查询固定SQL
/// </summary>
/// <param name="query"></param>
/// <param name="reportStatisticsTree"></param>
/// <returns></returns>
private StatisticsQueryResultDto StatisticsTreeQuery(StatisticsQuery query, List<report_statistics_tree> reportStatisticsTree)
{
var columns = new List<StatisticsColumn>();
columns.Add(new StatisticsColumn { ColumnName = "项目", OrgColumnName = "项目", Fixed = "left", });
if (reportStatisticsTree.Any(w => !string.IsNullOrEmpty(w.TotalScript) || !string.IsNullOrEmpty(w.TotalFormula)))
{
columns.Add(new StatisticsColumn { ColumnName = "数值", OrgColumnName = "数值", });
columns.Add(new StatisticsColumn { ColumnName = "数值公式", OrgColumnName = "数值公式", });
}
if (reportStatisticsTree.Any(w => !string.IsNullOrEmpty(w.ProportionFormula)))
{
columns.Add(new StatisticsColumn { ColumnName = "占比", OrgColumnName = "占比", });
columns.Add(new StatisticsColumn { ColumnName = "占比公式", OrgColumnName = "占比公式", });
}
if (reportStatisticsTree.Any(w => !string.IsNullOrEmpty(w.WeightFormula)))
{
columns.Add(new StatisticsColumn { ColumnName = "权重", OrgColumnName = "权重", });
columns.Add(new StatisticsColumn { ColumnName = "权重公式", OrgColumnName = "权重公式", });
}
Dictionary<string, object> pairs = new Dictionary<string, object>
{
{ "HospitalID", query.HospitalID },
};
foreach (var item in query.Values)
{
pairs.Add(item.Title, item.Values);
}
var table = new List<Dictionary<string, object>>();
// 层级有几层,则数据就有几层
foreach (var item in reportStatisticsTree)
{
var row = new Dictionary<string, object>();
row.Add("ID", item.ID);
row.Add("ParentID", item.ParentID);
row.Add("项目", item.Name);
if (reportStatisticsTree.Any(w => !string.IsNullOrEmpty(w.TotalScript) || !string.IsNullOrEmpty(w.TotalFormula)))
{
row.Add("数值", "");
row.Add("数值公式", item.TotalFormula ?? "");
}
if (reportStatisticsTree.Any(w => !string.IsNullOrEmpty(w.ProportionFormula)))
{
row.Add("占比", "");
row.Add("占比公式", item.ProportionFormula ?? "");
}
if (reportStatisticsTree.Any(w => !string.IsNullOrEmpty(w.WeightFormula)))
{
row.Add("权重", "");
row.Add("权重公式", item.WeightFormula ?? "");
}
using (IDbConnection connection = new MySqlConnection(_options.Value.PerformanceConnectionString))
{
if (!string.IsNullOrEmpty(item.TotalScript))
{
// 通过层级查询固定SQL
var (sql, param) = GetSqlQuery(item.TotalScript, pairs);
var data = connection.QueryFirstOrDefault<decimal?>(sql, param);
if (row.ContainsKey("数值"))
row["数值"] = data?.ToString() ?? "";
else
row.Add("数值", data?.ToString() ?? "");
}
}
table.Add(row);
}
// 平级转层级
var statisticsTree = StatisticsTree(table, 0);
return new StatisticsQueryResultDto
{
IsComparison = query.IsComparison,
Columns = columns,
Datas = statisticsTree,
};
}
private List<Dictionary<string, object>> StatisticsTree(List<Dictionary<string, object>> oldTree,int parentID)
{
if (oldTree.Any(w => (int)w["ParentID"] == parentID))
{
List<Dictionary<string, object>> newTree = new List<Dictionary<string, object>>();
foreach (var item in oldTree.Where(t => (int)t["ParentID"] == parentID))
{
item.Add("Children", StatisticsTree(oldTree, (int)item["ID"]));
newTree.Add(item);
}
return newTree;
}
else return null;
}
}
}
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