Commit 64d01c52 by 钟博

Merge branch 'feature/自定义功能' into develop

parents 483449cd 617684ee
...@@ -852,5 +852,57 @@ public ApiResponse CopyDropDown() ...@@ -852,5 +852,57 @@ public ApiResponse CopyDropDown()
}; ; }; ;
return new ApiResponse(ResponseType.OK, result); return new ApiResponse(ResponseType.OK, result);
} }
/// <summary>
/// 自定义表Heads表头
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost("customheads")]
public ApiResponse CustomHeads([FromBody] CustomPagingRequest request)
{
if (string.IsNullOrEmpty(request.TableName))
return new ApiResponse(ResponseType.ParameterError, "表名为空");
var result = _configService.QueryHandsCustom(request);
if (result == null)
return new ApiResponse(ResponseType.ParameterError, "表不符合规范,请补全注释或修改重复注释");
else
return new ApiResponse(ResponseType.OK, result);
}
/// <summary>
/// 自定义表显示
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost("getcustomlist")]
public ApiResponse GetCustomList([FromBody] CustomPagingRequest request)
{
var allot = _allotService.GetAllot(request.AllotId);
if (allot == null)
return new ApiResponse(ResponseType.ParameterError, "AllotID错误");
return _configService.QueryCustom(request);
}
/// <summary>
/// 保存自定义表数据
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("savecustom")]
[HttpPost]
public ApiResponse BatchSaveCustom([FromBody] SaveCustomData request)
{
var allot = _allotService.GetAllot(request.AllotId);
if (allot == null)
return new ApiResponse(ResponseType.ParameterError, "AllotID错误");
else if (string.IsNullOrEmpty(request.TableName))
return new ApiResponse(ResponseType.ParameterError, "表名为空");
return _configService.SaveCustomTable(request);
}
} }
} }
\ No newline at end of file
...@@ -857,6 +857,27 @@ ...@@ -857,6 +857,27 @@
<param name="request"></param> <param name="request"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Performance.Api.Controllers.ConfigController.CustomHeads(Performance.DtoModels.CustomPagingRequest)">
<summary>
自定义表Heads表头
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.ConfigController.GetCustomList(Performance.DtoModels.CustomPagingRequest)">
<summary>
自定义表显示
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.ConfigController.BatchSaveCustom(Performance.DtoModels.SaveCustomData)">
<summary>
保存自定义表数据
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.CostTransferController.SubmitApplications(Performance.DtoModels.CostTransferRequest)"> <member name="M:Performance.Api.Controllers.CostTransferController.SubmitApplications(Performance.DtoModels.CostTransferRequest)">
<summary> <summary>
申请划拨 申请划拨
......
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class CustomRequest
{
public int AllotId { get; set; }
public string TableName { get; set; }
public string QuerySearch{ get; set; }
}
public class CustomPagingRequest : CustomRequest
{
public int PageIndex { get; set; } = 1;
public int PageSize { get; set; } = 20;
}
public class CustonPagingData
{
public List<dynamic> DataList { get; set; }
public int TotalCount { get; set; }
}
public class CustomResponse
{
public List<Heads> Heads { get; set; }
public CustonPagingData Datas { get; set; }
}
public class Heads
{
public string Cloumn { get; set; }
public string Name { get; set; }
}
}
...@@ -22,5 +22,11 @@ public class UserCollectData ...@@ -22,5 +22,11 @@ public class UserCollectData
public new string[][] Data { get; set; } public new string[][] Data { get; set; }
} }
public class SaveCustomData
{
public int AllotId { get; set; }
public string TableName { get; set; }
public string[] ColHeaders { get; set; }
public new string[][] Data { get; set; }
}
} }
using Performance.DtoModels; using Microsoft.EntityFrameworkCore;
using Performance.DtoModels;
using Performance.EntityModels; using Performance.EntityModels;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
...@@ -395,5 +396,80 @@ public List<dynamic> QueryCompute(int allotId, string viewName) ...@@ -395,5 +396,80 @@ public List<dynamic> QueryCompute(int allotId, string viewName)
return DapperQuery<dynamic>(sql, new { allotId })?.ToList(); return DapperQuery<dynamic>(sql, new { allotId })?.ToList();
} }
public CustonPagingData QueryCustom(CustomPagingRequest request, bool IsHead)
{
var result = new CustonPagingData();
string sql, Query;
if (string.IsNullOrEmpty(request.QuerySearch))
Query = " and 1=1 ";
else
Query = $@" and (AccountingUnit like '%{request.QuerySearch}%' or UnitType like '%{request.QuerySearch}%') ";
if (IsHead)
sql = $@"SELECT * FROM {request.TableName} WHERE AllotId = @AllotId ";
else
sql = $@"SELECT * FROM {request.TableName} WHERE AllotId = @AllotId {Query} order by UnitType,AccountingUnit LIMIT {(request.PageIndex - 1) * request.PageSize},{request.PageSize} ";
result.DataList = DapperQuery<dynamic>(sql, new { request.AllotId })?.ToList();
sql = $@"SELECT COUNT(*) FROM {request.TableName} WHERE AllotId = @AllotId {Query} ";
result.TotalCount = DapperQuery<int>(sql, new { request.AllotId })?.FirstOrDefault() ?? 0;
return result;
}
public bool QueryIsAllotId(string tableName)
{
var database = context.Database.GetDbConnection().Database;
var sql = $@"SELECT column_name FROM information_schema.COLUMNS s
WHERE table_name = @table_name AND TABLE_SCHEMA = @database AND (column_name='allotId' or column_name='AccountingUnit' or column_name='UnitType');";
var result = DapperQuery<string>(sql, new { database = database, table_name = tableName });
var isExist=result ?.Count() == 3;
return isExist;
}
public List<dynamic> QueryCustomColumn(string tableName)
{
var database = context.Database.GetDbConnection().Database;
var sql = $@"SELECT column_name,column_comment FROM information_schema.`COLUMNS` WHERE table_schema = @table_schema AND table_name = @table_name AND COLUMN_KEY <> 'PRI' ";
var result = DapperQuery<dynamic>(sql, new { table_schema = database, table_name = tableName })?.ToList();
return result;
}
public bool CreatCustom(int AllotId, string tableName, List<dynamic> datas)
{
var sql = $@"DELETE FROM {tableName} WHERE allotId=@AllotId ";
Execute(sql, new { AllotId });
if (datas == null)
return true;
var database = context.Database.GetDbConnection().Database;
sql = $@"SELECT column_name FROM information_schema.COLUMNS s
WHERE table_name = @table_name AND TABLE_SCHEMA = @database AND COLUMN_KEY <> 'PRI';";
var columns = DapperQuery<string>(sql, new { database = database, table_name = tableName })?.ToList();
sql = $"INSERT INTO {tableName}({string.Join(",", columns.ToArray())}) VALUES({string.Join(",", columns.Select(t => "@" + t))});";
var success = Execute(sql, datas);
if (success > 0)
return true;
else
return false;
}
public List<dynamic> QueryType(string tableName)
{
var database = context.Database.GetDbConnection().Database;
var sql = $@"select column_name,data_type from information_schema.columns where table_name=@table_name and table_schema=@table_schema AND (data_type like '%int%' or data_type like '%decimal%' or data_type like '%date%') AND COLUMN_KEY <> 'PRI' ";
var result = DapperQuery<dynamic>(sql, new { table_schema = database, table_name = tableName })?.ToList();
return result;
}
} }
} }
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
using System.Text; using System.Text;
using Performance.Repository.Repository; using Performance.Repository.Repository;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Text.RegularExpressions;
namespace Performance.Services namespace Performance.Services
{ {
...@@ -41,6 +42,7 @@ public class ConfigService : IAutoInjection ...@@ -41,6 +42,7 @@ public class ConfigService : IAutoInjection
private readonly PerforExmoduleRepository perforExmoduleRepository; private readonly PerforExmoduleRepository perforExmoduleRepository;
private readonly PerforCofdrugtypefactorRepository cofdrugtypefactorRepository; private readonly PerforCofdrugtypefactorRepository cofdrugtypefactorRepository;
private readonly PerforPerallotRepository perallotRepository; private readonly PerforPerallotRepository perallotRepository;
private readonly PerforReportRepository perforReport;
public ConfigService(PerforCofdirectorRepository cofdirectorRepository, public ConfigService(PerforCofdirectorRepository cofdirectorRepository,
//PerforCofdrugpropRepository cofdrugpropRepository, //PerforCofdrugpropRepository cofdrugpropRepository,
...@@ -65,7 +67,8 @@ public class ConfigService : IAutoInjection ...@@ -65,7 +67,8 @@ public class ConfigService : IAutoInjection
ExConfigService exConfigService, ExConfigService exConfigService,
PerforExmoduleRepository perforExmoduleRepository, PerforExmoduleRepository perforExmoduleRepository,
PerforCofdrugtypefactorRepository cofdrugtypefactorRepository, PerforCofdrugtypefactorRepository cofdrugtypefactorRepository,
PerforPerallotRepository perallotRepository) PerforPerallotRepository perallotRepository,
PerforReportRepository perforReport)
{ {
this._directorRepository = cofdirectorRepository; this._directorRepository = cofdirectorRepository;
//this._drugpropRepository = cofdrugpropRepository; //this._drugpropRepository = cofdrugpropRepository;
...@@ -91,6 +94,7 @@ public class ConfigService : IAutoInjection ...@@ -91,6 +94,7 @@ public class ConfigService : IAutoInjection
this.perforExmoduleRepository = perforExmoduleRepository; this.perforExmoduleRepository = perforExmoduleRepository;
this.cofdrugtypefactorRepository = cofdrugtypefactorRepository; this.cofdrugtypefactorRepository = cofdrugtypefactorRepository;
this.perallotRepository = perallotRepository; this.perallotRepository = perallotRepository;
this.perforReport = perforReport;
} }
#endregion #endregion
...@@ -1099,7 +1103,7 @@ public void NewCopy(CopyRequest request) ...@@ -1099,7 +1103,7 @@ public void NewCopy(CopyRequest request)
break; break;
case "drugTypes": case "drugTypes":
logger.LogInformation($"copy drugTypes"); logger.LogInformation($"copy drugTypes");
var drugTypes = _drugtypeRepository.GetEntities(t => t.AllotID == allot.ID && t.HospitalId==allot.HospitalId); var drugTypes = _drugtypeRepository.GetEntities(t => t.AllotID == allot.ID && t.HospitalId == allot.HospitalId);
if (drugTypes == null || !drugTypes.Any()) if (drugTypes == null || !drugTypes.Any())
{ {
drugTypes = _drugtypeRepository.GetEntities(t => t.AllotID == allotId) ?? _drugtypeRepository.GetEntities(t => t.AllotID == -1); drugTypes = _drugtypeRepository.GetEntities(t => t.AllotID == allotId) ?? _drugtypeRepository.GetEntities(t => t.AllotID == -1);
...@@ -1112,7 +1116,7 @@ public void NewCopy(CopyRequest request) ...@@ -1112,7 +1116,7 @@ public void NewCopy(CopyRequest request)
break; break;
case "drugTypeDisburses": case "drugTypeDisburses":
logger.LogInformation($"copy drugTypeDisburses"); logger.LogInformation($"copy drugTypeDisburses");
var drugTypeDisburses = drugtypeDisburseRepository.GetEntities(t => t.AllotID == allot.ID && t.HospitalId==allot.HospitalId); var drugTypeDisburses = drugtypeDisburseRepository.GetEntities(t => t.AllotID == allot.ID && t.HospitalId == allot.HospitalId);
if (drugTypeDisburses == null || !drugTypeDisburses.Any()) if (drugTypeDisburses == null || !drugTypeDisburses.Any())
{ {
drugTypeDisburses = drugtypeDisburseRepository.GetEntities(t => t.AllotID == allotId) ?? drugtypeDisburseRepository.GetEntities(t => t.AllotID == -1); drugTypeDisburses = drugtypeDisburseRepository.GetEntities(t => t.AllotID == allotId) ?? drugtypeDisburseRepository.GetEntities(t => t.AllotID == -1);
...@@ -1435,7 +1439,8 @@ public void SaveSecondaryAlias(SaveCollectData request) ...@@ -1435,7 +1439,8 @@ public void SaveSecondaryAlias(SaveCollectData request)
{ {
// 创建固定数据列 // 创建固定数据列
Dictionary<string, string> baseData = CreateBaseData(request, config, r); Dictionary<string, string> baseData = CreateBaseData(request, config, r);
baseData.Add(nameof(cof_hrp_department.AllotId), allotId.ToString());
baseData.Add(nameof(cof_hrp_department.HospitalId), hospitalId.ToString()); baseData.Add(nameof(cof_hrp_department.HospitalId), hospitalId.ToString());
allData.Add(baseData); allData.Add(baseData);
...@@ -1772,5 +1777,227 @@ public void SaveDrugtypeFactor(DrugtypeFactorRequest request) ...@@ -1772,5 +1777,227 @@ public void SaveDrugtypeFactor(DrugtypeFactorRequest request)
} }
#endregion #endregion
#region 自定义表
public HandsonTable QueryHandsCustom(CustomPagingRequest request)
{
var custom = perforReport.QueryCustomColumn(request.TableName);
var isExist = perforReport.QueryIsAllotId(request.TableName);
if (custom == null || isExist == false)
return null;
var dicCustom = new Dictionary<string, string>();
for (int i = 0; i < custom.Count(); i++)
{
var dic = ((IDictionary<string, object>)custom.ElementAt(i)).Values;
if (dic.ElementAt(0).ToString().ToLower() == "allotid")
continue;
dicCustom.Add(dic.ElementAt(0).ToString(), dic.ElementAt(1).ToString());
}
var customGroup = dicCustom.GroupBy(x => x.Value).Where(x => x.Count() > 1);
if (customGroup.Any())
return null;
var result = new HandsonTable((int)SheetType.Unidentifiable, new string[] { }, new List<collect_permission>());
var jsonData = JsonHelper.Serialize(perforReport.QueryCustom(request,true).DataList);
var data = JsonHelper.Deserialize<List<Dictionary<string, string>>>(jsonData);
var headDic = new List<Dictionary<string, object>>();
foreach (var item in data)
{
var head = new Dictionary<string, object>();
foreach (var dic in dicCustom)
{
if (item.ContainsKey(dic.Key.ToLower()))
head.Add(dic.Value, item.FirstOrDefault(t => t.Key == dic.Key.ToLower()).Value);
}
headDic.Add(head);
}
var Columns = dicCustom.Values.Select(t => new HandsonColumn(t, false, DataFormat.普通格式)).ToList();
//表类型
var columnType = perforReport.QueryType(request.TableName);
if (Columns != null && Columns.Any())
{
foreach (var column in Columns)
{
if (dicCustom.FirstOrDefault(t => t.Value.Contains(column.Data)).Key.ToLower() == "unittype")
{
{
column.Type = "autocomplete";
column.Source = EnumHelper.GetItems<UnitType>().Select(w => w.Description.Replace("行政后勤", "行政工勤")).ToArray();
column.Strict = true;
}
}
for (int i = 0; i < columnType.Count(); i++)
{
var type = ((IDictionary<string, object>)columnType.ElementAt(i)).Values;
var itemDic = column.Data.ToUpper() == type.ElementAt(0).ToString().ToUpper();
var dic = dicCustom.FirstOrDefault(t => t.Value == column.Data);
if (dic.Key.ToUpper() == type.ElementAt(0).ToString().ToUpper() && type.ElementAt(1).ToString() == "int")
{
column.Type = "numeric";
column.NumericFormat = new NumericFormat { Pattern = "0,00" };
}
if (dic.Key.ToUpper() == type.ElementAt(0).ToString().ToUpper() && type.ElementAt(1).ToString() == "decimal")
{
column.Type = "numeric";
column.NumericFormat = new NumericFormat { Pattern = "0,00.00" };
}
}
}
}
result.Data = headDic;
result.ColHeaders = dicCustom.Values.ToList();
result.Columns = Columns;
return result;
}
public ApiResponse SaveCustomTable(SaveCustomData request)
{
if (!request.Data.Any())
perforReport.CreatCustom(request.AllotId, request.TableName, null);
var custom = perforReport.QueryCustomColumn(request.TableName);
if(custom.Count>50)
return new ApiResponse(ResponseType.ParameterError, "最多支持50列数据!");
var dicCustom = new Dictionary<string, object>();
for (int i = 0; i < custom.Count(); i++)
{
var dic = ((IDictionary<string, object>)custom.ElementAt(i)).Values;
if (dic.ElementAt(0).ToString().ToLower() == "allotid")
continue;
dicCustom.Add(dic.ElementAt(0).ToString(), dic.ElementAt(1).ToString());
}
//重复表头
var customGroup = dicCustom.GroupBy(x => x.Value).Where(x => x.Count() > 1);
if (customGroup.Any())
return new ApiResponse(ResponseType.ParameterError, "表不符合规范,请补全注释或修改重复注释!");
var dicData = CreateCustomRow(request.AllotId, request, dicCustom);
//字段类型
var typeColumn = perforReport.QueryType(request.TableName);
var datas = new List<dynamic>();
foreach (var item in dicData)
{
for (int i = 0; i < typeColumn.Count(); i++)
{
var type = ((IDictionary<string, object>)typeColumn.ElementAt(i)).Values.ElementAt(0).ToString();
var itemDic = item.FirstOrDefault(t => t.Key.ToUpper() == type.ToUpper());
var value=((IDictionary<string, object>)typeColumn.ElementAt(i)).Values.ElementAt(1).ToString();
if (string.IsNullOrEmpty(itemDic.Value.ToString()) && value.Contains("date"))
item.AddOrUpdate(itemDic.Key,null);
else if(!string.IsNullOrEmpty(itemDic.Value.ToString()) && value.Contains("date"))
{
try
{
var s = DateTime.Parse(itemDic.Value.ToString());
}
catch (FormatException)
{
return new ApiResponse(ResponseType.ParameterError, "请输入正确的日期格式");
}
}
if (string.IsNullOrEmpty(itemDic.Value.ToString()) && !value.Contains("date"))
item.AddOrUpdate(itemDic.Key, 0);
if (!string.IsNullOrEmpty(itemDic.Value.ToString()) && !Regex.IsMatch(itemDic.Value.ToString(), @"^(\-|\+)?\d+(\.\d+)?$") && !value.Contains("date"))
return new ApiResponse(ResponseType.ParameterError, "保存失败,请修改红色输入内容!");
}
datas.Add(item);
}
if (datas.Any())
perforReport.CreatCustom(request.AllotId, request.TableName, datas);
return new ApiResponse(ResponseType.OK);
}
public ApiResponse QueryCustom(CustomPagingRequest request)
{
var result = new CustomResponse();
var heads = perforReport.QueryCustomColumn(request.TableName);
var isExist = perforReport.QueryIsAllotId(request.TableName);
if (isExist == false || heads == null)
return new ApiResponse(ResponseType.ParameterError, "表不符合规范,请补全注释或修改重复注释");
if(heads.Count>50)
return new ApiResponse(ResponseType.ParameterError, "最多支持50列数据");
var headList = new List<Heads>();
for (int i = 0; i < heads.Count(); i++)
{
var dic = ((IDictionary<string, object>)heads.ElementAt(i)).Values;
if (dic.ElementAt(0).ToString().ToLower() == "allotid")
continue;
var head = new Heads();
head.Cloumn = dic.ElementAt(0).ToString().ToLower();
head.Name = dic.ElementAt(1).ToString();
headList.Add(head);
}
var customGroup = headList.GroupBy(x => x.Name).Where(x => x.Count() > 1);
if (customGroup.Any())
return new ApiResponse(ResponseType.ParameterError, "表不符合规范,请补全注释或修改重复注释");
result.Heads = headList;
result.Datas = perforReport.QueryCustom(request,false);
return new ApiResponse(ResponseType.OK, result);
}
private List<Dictionary<string, object>> CreateCustomRow(int allotId, SaveCustomData request, Dictionary<string, object> config)
{
List<Dictionary<string, object>> allData = new List<Dictionary<string, object>>();
for (int r = 0; r < request.Data.Length; r++)
{
// 创建固定数据列
Dictionary<string, object> baseData = CreateCustomData(request, config, r);
baseData.Add(nameof(cof_hrp_department.AllotId), allotId);
allData.Add(baseData);
}
return allData;
}
private Dictionary<string, object> CreateCustomData(SaveCustomData request, Dictionary<string, object> config, int rownumber)
{
Dictionary<string, object> result = new Dictionary<string, object>();
for (int c = 0; c < request.ColHeaders.Length; c++)
{
var header = request.ColHeaders[c];
var first = config.FirstOrDefault(w => w.Value.ToString().ToUpper() == header);
if (!default(KeyValuePair<string, object>).Equals(first)
&& !result.ContainsKey(header)
&& request.Data[rownumber].Length > c)
{
result.Add(first.Key, request.Data[rownumber][c]);
}
}
return result;
}
#endregion
} }
} }
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