报表查询方法修改

parent 8a1844e5
......@@ -1786,6 +1786,21 @@
结果返回用途 首次查询 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">
<summary>
人员信息
......
......@@ -7405,16 +7405,6 @@
汇总数值SQL
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics.ProportionScript">
<summary>
占比SQL
</summary>
</member>
<member name="P:Performance.EntityModels.report_statistics.WeightScript">
<summary>
权重SQL
</summary>
</member>
<member name="T:Performance.EntityModels.report_statistics_selection">
<summary>
......
......@@ -58,7 +58,7 @@ public class StatisticsSelectionDto
public List<TitleValue> Options { get; set; }
}
public class StatisticsQuery
......@@ -86,10 +86,22 @@ 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; }
}
......
......@@ -35,14 +35,14 @@ public class report_statistics
/// </summary>
public string TotalScript { get; set; }
/// <summary>
/// 占比SQL
/// </summary>
public string ProportionScript { get; set; }
///// <summary>
///// 占比SQL
///// </summary>
//public string ProportionScript { get; set; }
/// <summary>
/// 权重SQL
/// </summary>
public string WeightScript { get; set; }
///// <summary>
///// 权重SQL
///// </summary>
//public string WeightScript { get; set; }
}
}
\ No newline at end of file
......@@ -11,66 +11,98 @@
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;
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,
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;
_logger = logger;
_options = options;
_reportStatisticsRepository = ReportStatisticsRepository;
_reportStatisticsSelectionRepository = ReportStatisticsSelectionRepository;
_reportStatisticsSelectionRecordRepository = ReportStatisticsSelectionRecordRepository;
_reportStatisticsStoreRepository = ReportStatisticsStoreRepository;
_reportStatisticsTreeRepository = ReportStatisticsTreeRepository;
}
public StatisticsInfoDto GetInfo(int hospitalID, int statisticsId)
private (string sql, DynamicParameters param) GetSqlQuery(string sql, Dictionary<string, object> pairs)
{
//var json = JsonHelper.Serialize(ReportStatisticsStore);
//var dic = JsonHelper.Deserialize<Dictionary<string, string>>(json);
List<string> plist = new List<string>();
foreach (var item in pairs)
{
if (!Regex.IsMatch(sql, $"@{item.Key}", RegexOptions.IgnoreCase | RegexOptions.Multiline))
{
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);
}
var ReportStatistics = ReportStatisticsRepository.GetEntity(t => t.ID == statisticsId && t.HospitalId == hospitalID);
if (ReportStatistics == null)
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)
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,
HospitalId = (int)reportStatistics.HospitalId,
Name = reportStatistics.Name,
IsComparison = (int)reportStatistics.IsComparison,
Selections = new List<StatisticsSelectionDto> { }
};
foreach (var item in ReportStatisticsSelection)
Dictionary<string, object> pairs = new Dictionary<string, object>
{
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();
{ "@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);
reportStatisticsStore.ForEach(t => t.State = (int)item.State);
StatisticsSelectionDto statisticsSelectionDto = new StatisticsSelectionDto()
{
......@@ -81,7 +113,7 @@ public StatisticsInfoDto GetInfo(int hospitalID, int statisticsId)
Required = item.Required,
Sort = item.Sort,
Title = item.Title,
Options = ReportStatisticsStore
Options = reportStatisticsStore
};
result.Selections.Add(statisticsSelectionDto);
}
......@@ -90,7 +122,7 @@ public StatisticsInfoDto GetInfo(int hospitalID, int statisticsId)
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();
var result = _reportStatisticsSelectionRecordRepository.GetEntities(t => t.HospitalId == hospitalID && t.StatisticsID == statisticsId).OrderByDescending(t => t.UpdateDate).ToList();
return result;
}
......@@ -98,178 +130,233 @@ public ApiResponse SaveSelectionRecord(report_statistics_selection_record record
{
record.Content = JsonHelper.Serialize(record.Content);
var result = ReportStatisticsSelectionRecordRepository.GetEntity(t => t.ID == record.ID);
var result = _reportStatisticsSelectionRecordRepository.GetEntity(t => t.ID == record.ID);
bool ok;
if (result != null)
{
result.UpdateDate = DateTime.Now;
ok = ReportStatisticsSelectionRecordRepository.Update(record);
ok = _reportStatisticsSelectionRecordRepository.Update(record);
}
else
{
record.CreateDate = DateTime.Now;
ok = ReportStatisticsSelectionRecordRepository.Add(record);
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)
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);
Dictionary<string, object> pairs = new Dictionary<string, object> { };
var reportStatisticsTree = _reportStatisticsTreeRepository.GetEntities(t => t.StatisticsID == query.StatisticsID);
var isTree = (reportStatisticsTree != null && reportStatisticsTree.Count > 0);
StatisticsQueryResultDto dto = new StatisticsQueryResultDto
/*
* 报表分三种
* 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>
{
IsComparison = ReportStatistics.IsComparison,
Columns = new List<StatisticsColumn>
{
new StatisticsColumn
{
ColumnName = "项目",
Fixed = "left",
},
},
Datas = new List<Dictionary<string, string>>() { }
{ "HospitalID", query.HospitalID },
};
foreach (var item in query.Values)
{
pairs.Add(item.Title, item.Values);
}
var table = new List<Dictionary<string, string>>();
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, string>>>(JsonHelper.Serialize(data));
}
}
var columns = new List<StatisticsColumn>();
using (IDbConnection connection = new MySqlConnection(options.Value.PerformanceConnectionString))
if (table != null && table.Count > 0)
{
if (ReportStatisticsTree != null && ReportStatisticsTree.Count() > 0)
foreach (var item in table.First().Keys)
{
foreach (var item in ReportStatisticsTree)
/*
* 对列头特殊处理
* 按"_"拆分,并合并父子列头
*/
if (!item.Contains("_"))
{
List<string> where = new List<string>();
columns.Add(new StatisticsColumn { ColumnName = item, OrgColumnName = item, Fixed = "left" });
}
else
{
var cols = item.SplitRemoveEmpty("_");
foreach (var queryValues in query.Values)
var col = columns.FirstOrDefault(w => w.ColumnName == cols.First());
if (col == null)
{
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)}')");
col = new StatisticsColumn { ColumnName = cols.First(), OrgColumnName = item, };
columns.Add(col);
}
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);
if (!col.ChildColumns.Any(w => w.ColumnName == cols.Last()))
col.ChildColumns.Add(new StatisticsColumn { ColumnName = cols.Last(), OrgColumnName = item, });
}
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 = "" });
}
}
}
return new StatisticsQueryResultDto
{
IsComparison = query.IsComparison,
Columns = columns,
Datas = table,
};
}
});
dto.Datas.ForEach(t =>
{
if (ProportionFormula)
t.Add("占比", "");
if (WeightFormula)
t.Add("权重", "");
if (ReportStatistics.IsComparison == 1 && query.IsComparison == 1)
t.Add("增降幅", "");
});
/// <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, string>>();
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, string>>>(JsonHelper.Serialize(data));
}
else
}
var columns = new List<StatisticsColumn>();
string[] cols = new string[] { "数值", "金额", "占比", "权重" };
if (table != null && table.Count > 0)
{
foreach (var item in table.First().Keys)
{
List<string> where = new List<string>();
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 = "数值公式", });
}
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);
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);
}
where.Add($"{queryValues.Title} in ('{string.Join("','", queryValues.Values)}')");
}
var table = new List<Dictionary<string, string>>();
// 层级有几层,则数据就有几层
foreach (var item in reportStatisticsTree)
{
var row = new Dictionary<string, string>();
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 ?? "");
}
dto.Columns.ForEach(t =>
using (IDbConnection connection = new MySqlConnection(_options.Value.PerformanceConnectionString))
{
if (!string.IsNullOrEmpty(item.TotalScript))
{
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 = "" });
}
});
// 通过层级查询固定SQL
var (sql, param) = GetSqlQuery(item.TotalScript, pairs);
var data = connection.QueryFirstOrDefault<decimal?>(sql, param);
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 (row.ContainsKey("数值"))
row["数值"] = data?.ToString() ?? "";
else
row.Add("数值", data?.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);
}
table.Add(row);
}
return dto;
return new StatisticsQueryResultDto
{
IsComparison = query.IsComparison,
Columns = columns,
Datas = table,
};
}
}
}
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