Commit 8a1844e5 by 1391696987

每月绩效汇报表

parent ede57428
...@@ -24,87 +24,28 @@ public StatisticsController(StatisticsService service) ...@@ -24,87 +24,28 @@ public StatisticsController(StatisticsService service)
/// 查询报表信息 /// 查询报表信息
/// </summary> /// </summary>
/// <param name="statisticsId"></param> /// <param name="statisticsId"></param>
/// <param name="hospitalID"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost("info")] [HttpPost("info")]
public ApiResponse<StatisticsInfoDto> GetInfo([FromQuery] int statisticsId) public ApiResponse<StatisticsInfoDto> GetInfo(int hospitalID, int statisticsId)
{ {
// 结果示例代码
var x = new StatisticsInfoDto
{
StatisticsID = statisticsId,
HospitalId = 12,
Name = "绩效总览",
IsComparison = 1,
Selections = new List<StatisticsSelectionDto>
{
new StatisticsSelectionDto
{
SelectionID = 1,
StatisticsID = statisticsId,
InputName = "YearMonth",
InputType = "checkbox",
Required = 0,
Sort = 1,
Title = "年月",
Options = new List<TitleValue>
{
new TitleValue("2022年01月","2022年01月"),
new TitleValue("2022年02月","2022年02月"),
new TitleValue("2022年03月","2022年03月"),
new TitleValue("2022年04月","2022年04月"),
}
},
new StatisticsSelectionDto
{
SelectionID = 2,
StatisticsID = statisticsId,
InputName = "UnitType",
InputType = "checkbox",
Required = 0,
Sort = 2,
Title = "核算组别",
Options = new List<TitleValue>
{
new TitleValue("医生组","医生组"),
new TitleValue("医技组","医技组"),
new TitleValue("护理组","护理组"),
new TitleValue("特殊核算组","特殊核算组"),
}
},
new StatisticsSelectionDto
{
SelectionID = 3,
StatisticsID = statisticsId,
InputName = "AccountingUnit",
InputType = "checkbox",
Required = 0,
Sort = 3,
Title = "核算单元",
Options = new List<TitleValue>
{
new TitleValue("内一科","内一科"),
new TitleValue("骨科","骨科"),
new TitleValue("外科","外科"),
new TitleValue("呼吸内科","呼吸内科"),
}
},
}
};
return new ApiResponse<StatisticsInfoDto>(ResponseType.OK, x); // report_statistics
// report_statistics_selection
return new ApiResponse<StatisticsInfoDto>(ResponseType.OK, _service.GetInfo(hospitalID,statisticsId));
} }
/// <summary> /// <summary>
/// 查询报表查询记录 /// 查询报表查询记录
/// </summary> /// </summary>
/// <param name="statisticsId"></param> /// <param name="statisticsId"></param>
/// <param name="hospitalID"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost("selection/record")] [HttpPost("selection/record")]
public ApiResponse<List<report_statistics_selection_record>> GetSelectionRecord([FromQuery] int statisticsId) public ApiResponse<List<report_statistics_selection_record>> GetSelectionRecord(int hospitalID,int statisticsId)
{ {
var x = new List<report_statistics_selection_record> { }; return new ApiResponse<List<report_statistics_selection_record>>(ResponseType.OK, _service.GetSelectionRecord(hospitalID, statisticsId));
x = x.OrderByDescending(w => w.UpdateDate).ToList();
return new ApiResponse<List<report_statistics_selection_record>>(ResponseType.OK, x);
} }
/// <summary> /// <summary>
...@@ -115,7 +56,7 @@ public ApiResponse<List<report_statistics_selection_record>> GetSelectionRecord( ...@@ -115,7 +56,7 @@ public ApiResponse<List<report_statistics_selection_record>> GetSelectionRecord(
public ApiResponse SaveSelectionRecord([FromBody] report_statistics_selection_record record) public ApiResponse SaveSelectionRecord([FromBody] report_statistics_selection_record record)
{ {
return new ApiResponse(ResponseType.OK); return _service.SaveSelectionRecord(record);
} }
/// <summary> /// <summary>
...@@ -125,110 +66,61 @@ public ApiResponse SaveSelectionRecord([FromBody] report_statistics_selection_re ...@@ -125,110 +66,61 @@ public ApiResponse SaveSelectionRecord([FromBody] report_statistics_selection_re
[HttpPost("search")] [HttpPost("search")]
public ApiResponse<StatisticsQueryResultDto> Search([FromBody] StatisticsQuery query) public ApiResponse<StatisticsQueryResultDto> Search([FromBody] StatisticsQuery query)
{ {
StatisticsQueryResultDto dto = new StatisticsQueryResultDto // 数额必须返回
{ // Columns
IsComparison = query.IsComparison, // 占比 判断层级结构表中是否存在公式 存在则返回
Columns = new List<StatisticsColumn> // 权重 判断层级结构表中是否存在公式 存在则返回
{ // 增降幅 判断是否是对比查询 存在则返回
new StatisticsColumn
{
ColumnName = "项目", // Data
Fixed = "left", // 判断层级结构表中是否存在数据
}, // 1.使用层级表中的SQL查询数据出来
new StatisticsColumn // 层级固定插入 项目 列中(今天或明天再确定下来)
{ // 数额固定插入 数额 列中
ColumnName = "2022年02月", // 带公式信息列,则把表中的公式放入即可
Fixed = "", // 剩余的判断则和列头相同的判断规则,插入空白数据
ChildColumns = new List<StatisticsColumn>() // 2.否则 使用主表SQL查询数据出来
{ // 横向转换结构(今天或明天再确定下来)
new StatisticsColumn { ColumnName = "金额", Fixed = "", },
new StatisticsColumn { ColumnName = "占比", Fixed = "", }, // 占位符 分两种
} // 1.具有具体名称的占位符 如 @UnitType 直接替换为具体参数
}, // 2.前端传入参数,但没有具体占位的 则拼接后替换 @wh 如 @UnitType 直接替换为具体参数
},
Datas = new List<Dictionary<string, string>> /*
{
new Dictionary<string, string> SELECT SUM(VALUE) FROM report_statistics_store WHERE Category IN ('中成药费','西药费') AND UnitType IN @UnitType AND @wh
{
{ "项目", "全院业务收入"}, 参数
{ "金额", ""},
{ "金额公式", "= 门诊收入 + 住院收入"},
{ "占比", ""},
{ "占比公式", ""},
},
new Dictionary<string, string>
{
{ "项目", "门诊收入"},
{ "金额", "333"},
{ "金额公式", ""},
{ "占比", ""},
{ "占比公式", "= 门诊收入 / 全院业务收入"},
},
new Dictionary<string, string>
{
{ "项目", "住院收入"},
{ "金额", "333"},
{ "金额公式", ""},
{ "占比", ""},
{ "占比公式", "= 住院收入 / 全院业务收入"},
},
new Dictionary<string, string>
{
{ "项目", "全院支出项目"},
{ "金额", ""},
{ "金额公式", "= 药品收入 + 其他核算成本"},
{ "占比", ""},
{ "占比公式", ""},
},
new Dictionary<string, string>
{
{ "项目", "药品收入"},
{ "药品收入公式", ""},
{ "金额", "333"},
{ "金额公式", ""},
{ "占比", ""},
{ "占比公式", "= 药品收入 / 全院支出项目"},
},
new Dictionary<string, string>
{
{ "项目", "其他核算成本"},
{ "其他核算成本公式", ""},
{ "金额", "333"},
{ "金额公式", ""},
{ "占比", ""},
{ "占比公式", "= 其他核算成本 / 全院支出项目"},
},
new Dictionary<string, string>
{
{ "项目", "有效结余"},
{ "有效结余公式", ""},
{ "金额", "333"},
{ "金额公式", "= 全院业务收入 - 全院支出项目"},
{ "占比", ""},
{ "占比公式", "= 有效结余 / 全院业务收入"},
},
new Dictionary<string, string>
{
{ "项目", "绩效发放总额"},
{ "绩效发放总额公式", ""},
{ "金额", "333"},
{ "金额公式", ""},
{ "占比", ""},
{ "占比公式", "= 绩效发放总额 / 全院业务收入"},
},
new Dictionary<string, string>
{ {
{ "项目", "剩余结余"}, "HospitalID":"12",
{ "剩余结余公式", ""}, "UnitType":"医生组",
{ "金额", "333"}, "AccoungtingUnti":"呼吸内科"
{ "金额公式", "= 有效结余 - 绩效发放总额"},
{ "占比", ""},
{ "占比公式", "= 有效结余 / 全院业务收入"},
},
} }
};
return new ApiResponse<StatisticsQueryResultDto>(ResponseType.OK, dto); 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
...@@ -2331,18 +2331,20 @@ ...@@ -2331,18 +2331,20 @@
每月报表 每月报表
</summary> </summary>
</member> </member>
<member name="M:Performance.Api.Controllers.StatisticsController.GetInfo(System.Int32)"> <member name="M:Performance.Api.Controllers.StatisticsController.GetInfo(System.Int32,System.Int32)">
<summary> <summary>
查询报表信息 查询报表信息
</summary> </summary>
<param name="statisticsId"></param> <param name="statisticsId"></param>
<param name="hospitalID"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Performance.Api.Controllers.StatisticsController.GetSelectionRecord(System.Int32)"> <member name="M:Performance.Api.Controllers.StatisticsController.GetSelectionRecord(System.Int32,System.Int32)">
<summary> <summary>
查询报表查询记录 查询报表查询记录
</summary> </summary>
<param name="statisticsId"></param> <param name="statisticsId"></param>
<param name="hospitalID"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Performance.Api.Controllers.StatisticsController.SaveSelectionRecord(Performance.EntityModels.report_statistics_selection_record)"> <member name="M:Performance.Api.Controllers.StatisticsController.SaveSelectionRecord(Performance.EntityModels.report_statistics_selection_record)">
......
...@@ -63,6 +63,7 @@ public class StatisticsSelectionDto ...@@ -63,6 +63,7 @@ public class StatisticsSelectionDto
public class StatisticsQuery public class StatisticsQuery
{ {
public int HospitalID { get; set; }
public int StatisticsID { get; set; } public int StatisticsID { get; set; }
/// <summary> /// <summary>
/// 结果返回用途 首次查询 0 用于比对 1 用于对比 /// 结果返回用途 首次查询 0 用于比对 1 用于对比
......
namespace Performance.Services 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;
namespace Performance.Services
{ {
public class StatisticsService : IAutoInjection 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
)
{
this.logger = logger;
this.options = options;
this.ReportStatisticsRepository = ReportStatisticsRepository;
this.ReportStatisticsSelectionRepository = ReportStatisticsSelectionRepository;
this.ReportStatisticsSelectionRecordRepository = ReportStatisticsSelectionRecordRepository;
this.ReportStatisticsStoreRepository = ReportStatisticsStoreRepository;
this.ReportStatisticsTreeRepository = ReportStatisticsTreeRepository;
}
public StatisticsInfoDto GetInfo(int hospitalID, int statisticsId)
{
//var json = JsonHelper.Serialize(ReportStatisticsStore);
//var dic = JsonHelper.Deserialize<Dictionary<string, string>>(json);
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> { }
};
foreach (var item in ReportStatisticsSelection)
{
string sql = $"SELECT {item.InputName} Title,{item.InputName} Value FROM report_statistics_store Where HospitalID = {hospitalID} GROUP BY {item.InputName} ORDER BY {item.InputName}";
var ReportStatisticsStore = ReportStatisticsStoreRepository.DapperQuery<TitleValue>(sql, null).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);
}
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).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 StatisticsQueryResultDto Search(StatisticsQuery query)
{
var ReportStatistics = ReportStatisticsRepository.GetEntity(t => t.ID == query.StatisticsID && t.HospitalId == query.HospitalID);
if (ReportStatistics == null)
return new StatisticsQueryResultDto();
var ReportStatisticsTree = ReportStatisticsTreeRepository.GetEntities(t => t.StatisticsID == query.StatisticsID);
StatisticsQueryResultDto dto = new StatisticsQueryResultDto
{
IsComparison = ReportStatistics.IsComparison,
Columns = new List<StatisticsColumn>
{
new StatisticsColumn
{
ColumnName = "项目",
Fixed = "left",
},
},
Datas = new List<Dictionary<string, string>>() { }
};
using (IDbConnection connection = new MySqlConnection(options.Value.PerformanceConnectionString))
{
if (ReportStatisticsTree != null && ReportStatisticsTree.Count() > 0)
{
foreach (var item in ReportStatisticsTree)
{
List<string> where = new List<string>();
foreach (var queryValues in query.Values)
{
StatisticsColumn statisticsColumn = new StatisticsColumn
{
ColumnName = string.Join("/", queryValues.Values),
Fixed = "",
ChildColumns = new List<StatisticsColumn>()
{
new StatisticsColumn { ColumnName = "数额", Fixed = "", },
}
};
if (!dto.Columns.Select(t => t.ColumnName).Contains(statisticsColumn.ColumnName))
dto.Columns.Add(statisticsColumn);
where.Add($"{queryValues.Title} in ('{string.Join("','", queryValues.Values)}')");
}
string sql = item.TotalScript?.Replace("@wh", string.Join(" and ", where));
var data = new Dictionary<string, string>
{
{ "项目", item.Name},
{ "数额", sql==null?"":connection.Query<string>(sql).FirstOrDefault()},
{ "汇总公式", item.TotalFormula},
{ "占比公式", item.ProportionFormula},
{ "权重公式", item.WeightFormula},
};
dto.Datas.Add(data);
}
var ProportionFormula = ReportStatisticsTree.Any(t => !string.IsNullOrEmpty(t.ProportionFormula));
var WeightFormula = ReportStatisticsTree.Any(t => !string.IsNullOrEmpty(t.WeightFormula));
dto.Columns.ForEach(t =>
{
if (t.ColumnName != "项目")
{
if (ProportionFormula)
t.ChildColumns.Add(new StatisticsColumn() { ColumnName = "占比", Fixed = "" });
if (WeightFormula)
t.ChildColumns.Add(new StatisticsColumn() { ColumnName = "权重", Fixed = "" });
if (ReportStatistics.IsComparison == 1 && query.IsComparison == 1)
t.ChildColumns.Add(new StatisticsColumn() { ColumnName = "增降幅", Fixed = "" });
}
});
dto.Datas.ForEach(t =>
{
if (ProportionFormula)
t.Add("占比", "");
if (WeightFormula)
t.Add("权重", "");
if (ReportStatistics.IsComparison == 1 && query.IsComparison == 1)
t.Add("增降幅", "");
});
}
else
{
List<string> where = new List<string>();
foreach (var queryValues in query.Values)
{
StatisticsColumn statisticsColumn = new StatisticsColumn
{
ColumnName = string.Join("/", queryValues.Values),
Fixed = "",
ChildColumns = new List<StatisticsColumn>()
{
new StatisticsColumn { ColumnName = "数额", Fixed = "", },
}
};
if (!dto.Columns.Select(t => t.ColumnName).Contains(statisticsColumn.ColumnName))
dto.Columns.Add(statisticsColumn);
where.Add($"{queryValues.Title} in ('{string.Join("','", queryValues.Values)}')");
}
dto.Columns.ForEach(t =>
{
if (t.ColumnName != "项目")
{
if (!string.IsNullOrEmpty(ReportStatistics.ProportionScript))
t.ChildColumns.Add(new StatisticsColumn() { ColumnName = "占比", Fixed = "" });
if (!string.IsNullOrEmpty(ReportStatistics.WeightScript))
t.ChildColumns.Add(new StatisticsColumn() { ColumnName = "权重", Fixed = "" });
if (ReportStatistics.IsComparison == 1 && query.IsComparison == 1)
t.ChildColumns.Add(new StatisticsColumn() { ColumnName = "增降幅", Fixed = "" });
}
});
var data = new Dictionary<string, string>
{
{ "项目", ReportStatistics.Name },
{ "汇总公式", ""},
{ "占比公式", ""},
{ "权重公式", ""},
};
if (!string.IsNullOrEmpty(ReportStatistics.TotalScript))
{
var json = connection.Query(ReportStatistics.TotalScript?.Replace("@wh", string.Join(" and ", where))).FirstOrDefault();
var dic = JsonHelper.Deserialize(json);
data.Add("数额", dic["数额"].ToString());
}
if (!string.IsNullOrEmpty(ReportStatistics.ProportionScript))
{
var json = connection.Query(ReportStatistics.ProportionScript?.Replace("@wh", string.Join(" and ", where))).FirstOrDefault();
var dic = JsonHelper.Deserialize(json);
data.Add("占比", dic["占比"].ToString());
}
if (!string.IsNullOrEmpty(ReportStatistics.WeightScript))
{
var json = connection.Query(ReportStatistics.WeightScript?.Replace("@wh", string.Join(" and ", where))).FirstOrDefault();
var dic = JsonHelper.Deserialize(json);
data.Add("权重", dic["权重"].ToString());
}
if (ReportStatistics.IsComparison == 1 && query.IsComparison == 1)
data.Add("增降幅", "");
dto.Datas.Add(data);
}
}
return dto;
}
} }
} }
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