Commit 9e4eefc5 by jianshuqin

优化:组件导出内存释放

parent 1f4f2198
......@@ -76,13 +76,16 @@ namespace Bailun.DC.Services.Component
return dto;
}
public IList<ColumnDTO> GetListColumn(QueryFilterDTO queryFilter = null)
public IList<ColumnDTO> GetListColumn(QueryFilterDTO queryFilter = null, QueryDTO entity = null)
{
IList<ColumnDTO> list = default(IList<ColumnDTO>);
if (queryFilter != null && !string.IsNullOrWhiteSpace(queryFilter.Code))
{
QueryDTO entity = this.Get(queryFilter.Code);
if (entity == null)
{
entity = this.Get(queryFilter.Code);
}
if (entity != null && (!string.IsNullOrWhiteSpace(entity.ColumnValue)))
{
switch (entity.ColumnType)
......@@ -222,12 +225,15 @@ namespace Bailun.DC.Services.Component
return list;
}
public PageListDTO GetListData(QueryFilterDTO queryFilter)
public PageListDTO GetListData(QueryFilterDTO queryFilter, QueryDTO entity = null)
{
PageListDTO pageList = new PageListDTO();
if (queryFilter != null && !string.IsNullOrWhiteSpace(queryFilter.Code))
{
QueryDTO entity = this.Get(queryFilter.Code);
if (entity == null)
{
entity = this.Get(queryFilter.Code);
}
if (entity != null && (!string.IsNullOrWhiteSpace(entity.DataValue)))
{
switch (entity.DataType)
......@@ -293,24 +299,11 @@ namespace Bailun.DC.Services.Component
#region 数据库表或视图/SQL
case DataTypeEnum.Table:
case DataTypeEnum.Sql:
DynamicParameters sqlparam = new DynamicParameters();
int fetch = (queryFilter.pageSize > 0 ? queryFilter.pageSize : int.MaxValue).Value;
int offset = (((queryFilter.CurrentPage > 1 ? queryFilter.CurrentPage : 1) - 1) * fetch).Value;
//过虑条件SQL
string whereSql = this.GetFilterSql(queryFilter, ref sqlparam);
//排序条件SQL
string orderbySql = this.GetOrderBySql(queryFilter, entity);
string fromSql = $"FROM {(entity.DataType == DataTypeEnum.Table ? $"[dbo].[{entity.DataValue}]" : $"( {entity.DataValue} )")} AS A {whereSql}";
string totalSql = $"SELECT COUNT(*) {fromSql}";
string dataSql = $"SELECT A.* {fromSql} ORDER BY {orderbySql} LIMIT {offset} , {fetch}";
using (var db = (entity.DataDB == DBEnum.DataWareHouse ? DW_DB : DB))
(int, IDataReader) reader = this.GetListDataReader(queryFilter, entity);
using (reader.Item2)
{
pageList.TotalCount = db.QueryFirstOrDefault<int>(totalSql, sqlparam);
if (pageList.TotalCount > 0)
{
var reader = db.ExecuteReader(dataSql, sqlparam);
pageList.List.Load(reader);
}
pageList.TotalCount = reader.Item1;
pageList.List.Load(reader.Item2);
}
break;
......@@ -473,15 +466,32 @@ namespace Bailun.DC.Services.Component
byte[] b = default(byte[]);
if (queryFilter != null)
{
IList<ColumnDTO> listColumn = this.GetListColumn(queryFilter);
QueryDTO entity = this.Get(queryFilter.Code);
IList<ColumnDTO> listColumn = this.GetListColumn(queryFilter, entity);
if (listColumn != null)
{
//数据类型
DataTypeEnum?[] dataTypes = { DataTypeEnum.Table, DataTypeEnum.Sql };
//列标题
IDictionary<string, string> listHeader = listColumn.Where(l => l.IsExport == true || (l.IsExport == null && l.IsHide != true)).ToDictionary(l => l.Prop, l => l.Name);
//全部数据导出
queryFilter.CurrentPage = null;
queryFilter.pageSize = null;
PageListDTO pageList = this.GetListData(queryFilter);
if (listColumn?.Count > 0)
if (!string.IsNullOrWhiteSpace(entity.DataValue) && dataTypes.Contains(entity.DataType))
{
b = DataTableToExcel(listColumn.Where(l => l.IsExport == true || (l.IsExport == null && l.IsHide != true)).ToDictionary(l => l.Prop, l => l.Name), pageList.List);
(int, IDataReader) reader = this.GetListDataReader(queryFilter, entity);
using (reader.Item2)
{
b = DataReaderToExcel(listHeader, reader.Item2, reader.Item1);
}
}
else
{
PageListDTO pageList = this.GetListData(queryFilter, entity);
if (listColumn?.Count > 0)
{
b = DataTableToExcel(listHeader, pageList.List);
}
}
}
}
......@@ -578,7 +588,7 @@ namespace Bailun.DC.Services.Component
private string GetOrderBySql(QueryFilterDTO queryFilter, QueryDTO entity = null)
{
string sql = "1";
string sql = string.Empty;
if (queryFilter?.ListOrder?.Where(l => l != null).Count() > 0)
{
......@@ -611,5 +621,23 @@ namespace Bailun.DC.Services.Component
return sql;
}
private (int, IDataReader) GetListDataReader(QueryFilterDTO queryFilter, QueryDTO entity)
{
(int, IDataReader) reader = (0, null);
DynamicParameters sqlparam = new DynamicParameters();
int fetch = (queryFilter.pageSize > 0 ? queryFilter.pageSize : int.MaxValue).Value;
int offset = (((queryFilter.CurrentPage > 1 ? queryFilter.CurrentPage : 1) - 1) * fetch).Value;
//过虑条件SQL
string whereSql = this.GetFilterSql(queryFilter, ref sqlparam);
//排序条件SQL
string orderbySql = this.GetOrderBySql(queryFilter, entity);
string fromSql = $"FROM {(entity.DataType == DataTypeEnum.Table ? $"[dbo].[{entity.DataValue}]" : $"( {entity.DataValue} )")} AS A {whereSql}";
string totalSql = $"SELECT COUNT(*) {fromSql}";
string dataSql = $"SELECT A.* {fromSql} {(!string.IsNullOrWhiteSpace(orderbySql) ? $"ORDER BY {orderbySql}" : string.Empty) } LIMIT {offset} , {fetch}";
var db = (entity.DataDB == DBEnum.DataWareHouse ? DW_DB : DB);
reader = (db.QueryFirstOrDefault<int>(totalSql, sqlparam), db.ExecuteReader(dataSql, sqlparam));
return reader;
}
}
}
......@@ -63,9 +63,10 @@ namespace Bailun.DC.Web.Areas.Component.Controllers
[HttpPost]
public ActionResult Export(QueryFilterDTO queryFilter)
{
byte[] data = null;
try
{
byte[] data = new QueryService().Export(queryFilter);
data = new QueryService().Export(queryFilter);
return File(data, "text/plain", "ImportAttendeesInfol.xls");
}
catch (Exception ex)
......@@ -73,6 +74,11 @@ namespace Bailun.DC.Web.Areas.Component.Controllers
ResultDTO result = new ResultDTO() { Message = ex.Message };
return Json(result);
}
finally
{
data = null;
GC.Collect();
}
}
}
......
......@@ -121,7 +121,7 @@
if (l.type == "daterange" && l.value.constructor == Array && l.value.length > 1) {
filter.operator = "between";
if (l.value[0].constructor == Date && l.value[1].constructor == Date) {
filter.value = [l.value[0].format("yyyy-MM-dd"), l.value[1].format("yyyy-MM-dd")];
filter.value = [l.value[0].format("yyyy-MM-dd"), l.value[1].format("yyyy-MM-dd")].join(",");
} else {
filter.value = l.value.join(",");
}
......@@ -286,7 +286,14 @@
'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8'
}
}).then(function (json) {
saveAs(json.bodyBlob, 'Export_' + (new Date().format("yyyyMMddhhmmss")) + '.xlsx');
var ext = "xlsx";
if (json.headers && json.headers.map && json.headers.map["content-disposition"] && json.headers.map["content-disposition"].length > 0) {
var fileInfo = json.headers.map["content-disposition"][0].split(';');
var fileName = fileInfo && fileInfo.length > 2 && fileInfo[1];
ext = fileName && fileName.split(".").length > 1 && fileName.split(".")[1];
}
var exportName = (that.setting.listCrumb && that.setting.listCrumb.length > 0 ? that.setting.listCrumb.join("") : ('Export')) + "_" + (new Date().format("yyyyMMddhhmm"));
saveAs(json.bodyBlob, exportName + "." + ext);
}).catch(function (error) {
that.$message(error.message || " 未知错误!");
});
......
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