Commit 9e4eefc5 by jianshuqin

优化:组件导出内存释放

parent 1f4f2198
...@@ -76,13 +76,16 @@ namespace Bailun.DC.Services.Component ...@@ -76,13 +76,16 @@ namespace Bailun.DC.Services.Component
return dto; 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>); IList<ColumnDTO> list = default(IList<ColumnDTO>);
if (queryFilter != null && !string.IsNullOrWhiteSpace(queryFilter.Code)) 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))) if (entity != null && (!string.IsNullOrWhiteSpace(entity.ColumnValue)))
{ {
switch (entity.ColumnType) switch (entity.ColumnType)
...@@ -222,12 +225,15 @@ namespace Bailun.DC.Services.Component ...@@ -222,12 +225,15 @@ namespace Bailun.DC.Services.Component
return list; return list;
} }
public PageListDTO GetListData(QueryFilterDTO queryFilter) public PageListDTO GetListData(QueryFilterDTO queryFilter, QueryDTO entity = null)
{ {
PageListDTO pageList = new PageListDTO(); PageListDTO pageList = new PageListDTO();
if (queryFilter != null && !string.IsNullOrWhiteSpace(queryFilter.Code)) 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))) if (entity != null && (!string.IsNullOrWhiteSpace(entity.DataValue)))
{ {
switch (entity.DataType) switch (entity.DataType)
...@@ -293,24 +299,11 @@ namespace Bailun.DC.Services.Component ...@@ -293,24 +299,11 @@ namespace Bailun.DC.Services.Component
#region 数据库表或视图/SQL #region 数据库表或视图/SQL
case DataTypeEnum.Table: case DataTypeEnum.Table:
case DataTypeEnum.Sql: case DataTypeEnum.Sql:
DynamicParameters sqlparam = new DynamicParameters(); (int, IDataReader) reader = this.GetListDataReader(queryFilter, entity);
int fetch = (queryFilter.pageSize > 0 ? queryFilter.pageSize : int.MaxValue).Value; using (reader.Item2)
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))
{ {
pageList.TotalCount = db.QueryFirstOrDefault<int>(totalSql, sqlparam); pageList.TotalCount = reader.Item1;
if (pageList.TotalCount > 0) pageList.List.Load(reader.Item2);
{
var reader = db.ExecuteReader(dataSql, sqlparam);
pageList.List.Load(reader);
}
} }
break; break;
...@@ -473,15 +466,32 @@ namespace Bailun.DC.Services.Component ...@@ -473,15 +466,32 @@ namespace Bailun.DC.Services.Component
byte[] b = default(byte[]); byte[] b = default(byte[]);
if (queryFilter != null) 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) 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.CurrentPage = null;
queryFilter.pageSize = null; queryFilter.pageSize = null;
PageListDTO pageList = this.GetListData(queryFilter); if (!string.IsNullOrWhiteSpace(entity.DataValue) && dataTypes.Contains(entity.DataType))
if (listColumn?.Count > 0)
{ {
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 ...@@ -578,7 +588,7 @@ namespace Bailun.DC.Services.Component
private string GetOrderBySql(QueryFilterDTO queryFilter, QueryDTO entity = null) private string GetOrderBySql(QueryFilterDTO queryFilter, QueryDTO entity = null)
{ {
string sql = "1"; string sql = string.Empty;
if (queryFilter?.ListOrder?.Where(l => l != null).Count() > 0) if (queryFilter?.ListOrder?.Where(l => l != null).Count() > 0)
{ {
...@@ -611,5 +621,23 @@ namespace Bailun.DC.Services.Component ...@@ -611,5 +621,23 @@ namespace Bailun.DC.Services.Component
return sql; 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 ...@@ -63,9 +63,10 @@ namespace Bailun.DC.Web.Areas.Component.Controllers
[HttpPost] [HttpPost]
public ActionResult Export(QueryFilterDTO queryFilter) public ActionResult Export(QueryFilterDTO queryFilter)
{ {
byte[] data = null;
try try
{ {
byte[] data = new QueryService().Export(queryFilter); data = new QueryService().Export(queryFilter);
return File(data, "text/plain", "ImportAttendeesInfol.xls"); return File(data, "text/plain", "ImportAttendeesInfol.xls");
} }
catch (Exception ex) catch (Exception ex)
...@@ -73,6 +74,11 @@ namespace Bailun.DC.Web.Areas.Component.Controllers ...@@ -73,6 +74,11 @@ namespace Bailun.DC.Web.Areas.Component.Controllers
ResultDTO result = new ResultDTO() { Message = ex.Message }; ResultDTO result = new ResultDTO() { Message = ex.Message };
return Json(result); return Json(result);
} }
finally
{
data = null;
GC.Collect();
}
} }
} }
......
...@@ -121,7 +121,7 @@ ...@@ -121,7 +121,7 @@
if (l.type == "daterange" && l.value.constructor == Array && l.value.length > 1) { if (l.type == "daterange" && l.value.constructor == Array && l.value.length > 1) {
filter.operator = "between"; filter.operator = "between";
if (l.value[0].constructor == Date && l.value[1].constructor == Date) { 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 { } else {
filter.value = l.value.join(","); filter.value = l.value.join(",");
} }
...@@ -286,7 +286,14 @@ ...@@ -286,7 +286,14 @@
'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8' 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8'
} }
}).then(function (json) { }).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) { }).catch(function (error) {
that.$message(error.message || " 未知错误!"); 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