This commit is contained in:
2021-12-23 17:48:01 +00:00
parent 8753c41f6b
commit 04abe2adcb
34 changed files with 115 additions and 81 deletions

View File

@@ -175,12 +175,20 @@ namespace AyaNova.Api.Controllers
//cap the data returned
selectedRequest.ReportDesignerSample = true;
var reportData = await biz.GetReportData(selectedRequest);
if (reportData == null)
return BadRequest(new ApiErrorResponse(biz.Errors));
else
return Ok(ApiOkResponse.Response(reportData));
JArray reportData;
try
{
reportData = await biz.GetReportData(selectedRequest, DateTime.UtcNow.AddMinutes(ServerBootConfig.AYANOVA_REPORT_RENDERING_TIMEOUT));
if (reportData == null)
return BadRequest(new ApiErrorResponse(biz.Errors));
else
return Ok(ApiOkResponse.Response(reportData));
}
catch (ReportRenderTimeOutException)
{
log.LogInformation($"GetReportData timeout data list key: {selectedRequest.DataListKey}, record count:{selectedRequest.SelectedRowIds.LongLength}, user:{UserNameFromContext.Name(HttpContext.Items)} ");
return Ok(ApiOkResponse.Response(new { timeout = true, timeoutconfig = ServerBootConfig.AYANOVA_REPORT_RENDERING_TIMEOUT }));
}
}
@@ -209,14 +217,17 @@ namespace AyaNova.Api.Controllers
var API_URL = $"http://127.0.0.1:{httpConnectionFeature.LocalPort}/api/v8/";
try
{
var result = await biz.RenderReport(reportRequest,DateTime.UtcNow.AddMinutes(ServerBootConfig.AYANOVA_REPORT_RENDERING_TIMEOUT), API_URL);
var result = await biz.RenderReport(reportRequest, DateTime.UtcNow.AddMinutes(ServerBootConfig.AYANOVA_REPORT_RENDERING_TIMEOUT), API_URL);
if (string.IsNullOrWhiteSpace(result))
return BadRequest(new ApiErrorResponse(biz.Errors));
else
return Ok(ApiOkResponse.Response(result));
}
catch (ReportRenderTimeOutException)
{
log.LogInformation($"Report render timeout report id: {reportRequest.ReportId}, record count:{reportRequest.SelectedRowIds.LongLength}, user:{UserNameFromContext.Name(HttpContext.Items)} ");
return Ok(ApiOkResponse.Response(new { timeout = true, timeoutconfig = ServerBootConfig.AYANOVA_REPORT_RENDERING_TIMEOUT }));
}
catch (System.Exception ex)
{
//The Javascript evaluation stack trace can be in the message making it long and internalized,

View File

@@ -480,7 +480,7 @@ MULTIPLE discount / markup ITEMS
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -557,7 +557,7 @@ MULTIPLE discount / markup ITEMS
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -329,7 +329,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -400,7 +400,7 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -180,7 +180,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -213,7 +213,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -290,7 +290,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -344,7 +344,7 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -286,7 +286,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -321,7 +321,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -1,6 +1,8 @@
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using AyaNova.Models;
using System;
namespace AyaNova.Biz
{
/// <summary>
@@ -11,7 +13,7 @@ namespace AyaNova.Biz
//Get items indicated in id list in exportable format
//called by ExportBiz rendering code
Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest);
Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry);
const int EXPORT_DATA_BATCH_SIZE = 100;
}

View File

@@ -273,7 +273,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -308,7 +308,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -278,7 +278,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -316,7 +316,7 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -812,7 +812,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//quote reports for entire quote or just sub parts all go through here
//if the ayatype is a descendant of the quote then only the portion of the quote from that descendant directly up to the header will be populated and returned
@@ -920,7 +920,7 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -326,7 +326,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -362,7 +362,7 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -500,7 +500,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -543,7 +543,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -255,7 +255,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -309,7 +309,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -35,7 +35,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -73,7 +73,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -35,7 +35,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -73,7 +73,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -285,7 +285,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -314,7 +314,7 @@ namespace AyaNova.Biz
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -274,7 +274,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -311,7 +311,7 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -778,7 +778,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -807,7 +807,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -787,7 +787,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//quote reports for entire quote or just sub parts all go through here
//if the ayatype is a descendant of the quote then only the portion of the quote from that descendant directly up to the header will be populated and returned
@@ -901,7 +901,7 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -277,7 +277,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -311,7 +311,7 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -367,6 +367,8 @@ namespace AyaNova.Biz
if (selectedRequest.SelectedRowIds.Length == 0)
selectedRequest.SelectedRowIds = await DataListSelectedProcessingOptions.RehydrateIdList(selectedRequest, ct, effectiveRoles, log, UserId, UserTranslationId);
if (DateTime.UtcNow > renderTimeOutExpiry)
throw new ReportRenderTimeOutException();
log.LogDebug($"Instantiating biz object handler for {selectedRequest.AType}");
var biz = BizObjectFactory.GetBizObject(selectedRequest.AType, ct, UserId, CurrentUserRoles, UserTranslationId);
@@ -454,7 +456,7 @@ namespace AyaNova.Biz
// #if (DEBUG)
// log.LogInformation($"DBG: ReportBiz::RenderReport got report data");
// #endif
if (DateTime.UtcNow > renderTimeOutExpiry)
if (DateTime.UtcNow > renderTimeOutExpiry)
throw new ReportRenderTimeOutException();
//initialization
log.LogDebug("Initializing report rendering system");
@@ -514,6 +516,9 @@ namespace AyaNova.Biz
}
System.Text.StringBuilder PageLog = new System.Text.StringBuilder();
if (DateTime.UtcNow > renderTimeOutExpiry)
throw new ReportRenderTimeOutException();
//API DOCS http://www.puppeteersharp.com/api/index.html
log.LogDebug($"Launching headless Browser now:");
// #if (DEBUG)
@@ -523,7 +528,7 @@ namespace AyaNova.Biz
using (var page = await browser.NewPageAsync())
{
//track this process so it can be cancelled if it times out
ReportRenderManager.AddProcess(browser.Process.Id, log);
ReportRenderManager.AddProcess(browser.Process.Id, renderTimeOutExpiry, log);
page.DefaultTimeout = 0;//infinite timeout as we are controlling how long the process can live for with the reportprocessmanager
try
{
@@ -553,7 +558,8 @@ namespace AyaNova.Biz
};
log.LogDebug($"Preparing page: adding base reporting scripts to page");
if (DateTime.UtcNow > renderTimeOutExpiry)
throw new ReportRenderTimeOutException();
//Add Handlebars JS for compiling and presenting
//https://handlebarsjs.com/
@@ -577,7 +583,8 @@ namespace AyaNova.Biz
//execute to add to handlebars
await page.EvaluateExpressionAsync("ayRegisterHelpers();");
if (DateTime.UtcNow > renderTimeOutExpiry)
throw new ReportRenderTimeOutException();
log.LogDebug($"Preparing page: adding this report's scripts, style and templates to page");
//add report pre-render, helpers and style
@@ -632,7 +639,8 @@ namespace AyaNova.Biz
//duplicate meta data in report page wide variable for use by our internal functions
await page.AddScriptTagAsync(new AddTagOptions() { Content = $"var AYMETA={{ ayReportMetaData:{reportMeta}, ayClientMetaData:{clientMeta}, ayServerMetaData:{serverMeta} }}" });
if (DateTime.UtcNow > renderTimeOutExpiry)
throw new ReportRenderTimeOutException();
// #if (DEBUG)
// //view page contents
@@ -647,15 +655,19 @@ namespace AyaNova.Biz
// #endif
//PRE_RENDER (WITH TIMEOUT???)
await page.WaitForExpressionAsync($"ayPreRender({ReportDataObject})");
if (DateTime.UtcNow > renderTimeOutExpiry)
throw new ReportRenderTimeOutException();
//compile the template
log.LogDebug($"Calling Handlebars.compile...");
// #if (DEBUG)
// log.LogInformation($"DBG: ReportBiz::RenderReport - compiling handlebars template");
// #endif
var compileScript = $"Handlebars.compile(`{report.Template}`)(PreParedReportDataObject);";
if (DateTime.UtcNow > renderTimeOutExpiry)
throw new ReportRenderTimeOutException();
var compiledHTML = await page.EvaluateExpressionAsync<string>(compileScript);
if (DateTime.UtcNow > renderTimeOutExpiry)
throw new ReportRenderTimeOutException();
//render report as HTML
log.LogDebug($"Setting page content to compiled HTML");
// #if (DEBUG)
@@ -753,7 +765,8 @@ namespace AyaNova.Biz
PdfOptions.PrintBackground = report.PrintBackground;
//Defaults to 1. Scale amount must be between 0.1 and 2.
PdfOptions.Scale = report.Scale;
if (DateTime.UtcNow > renderTimeOutExpiry)
throw new ReportRenderTimeOutException();
//render to pdf and return
log.LogDebug($"Calling render page contents to PDF");
// #if (DEBUG)
@@ -764,6 +777,10 @@ namespace AyaNova.Biz
log.LogDebug($"Completed, returning results");
return outputFileName;
}
catch (ReportRenderTimeOutException)
{
throw;
}
catch
{
//This is the error when a helper is used on the template but doesn't exist:

View File

@@ -335,7 +335,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -378,7 +378,7 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -264,7 +264,7 @@
// ////////////////////////////////////////////////////////////////////////////////////////////////
// //REPORTING
// //
// public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
// public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
// {
// JArray ReportData = new JArray();
// while (idList.Any())
@@ -291,7 +291,7 @@
// // IMPORT EXPORT
// //
// public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
// public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
// {
// //for now just re-use the report data code
// //this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -302,7 +302,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -331,7 +331,7 @@ namespace AyaNova.Biz
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -286,7 +286,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -316,7 +316,7 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -331,7 +331,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -360,7 +360,7 @@ namespace AyaNova.Biz
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -298,7 +298,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -327,7 +327,7 @@ namespace AyaNova.Biz
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -293,7 +293,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -379,7 +379,7 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -142,7 +142,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -178,7 +178,7 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -276,7 +276,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -311,7 +311,7 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -1022,7 +1022,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -1079,7 +1079,7 @@ namespace AyaNova.Biz
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -315,7 +315,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
var idList = dataListSelectedRequest.SelectedRowIds;
JArray ReportData = new JArray();
@@ -344,7 +344,7 @@ namespace AyaNova.Biz
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time

View File

@@ -938,7 +938,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//REPORTING
//
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetReportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
// #if (DEBUG)
// var watch = System.Diagnostics.Stopwatch.StartNew();
@@ -952,6 +952,8 @@ namespace AyaNova.Biz
while (idList.Any())
{
if (DateTime.UtcNow > renderTimeOutExpiry)
throw new ReportRenderTimeOutException();
var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE);
idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray();
List<WorkOrder> batchResults = new List<WorkOrder>();
@@ -960,6 +962,8 @@ namespace AyaNova.Biz
foreach (WorkOrder w in batchResults)
{
if (DateTime.UtcNow > renderTimeOutExpiry)
throw new ReportRenderTimeOutException();
var jo = JObject.FromObject(w);
//WorkOrder header custom fields
@@ -1108,11 +1112,11 @@ namespace AyaNova.Biz
// IMPORT EXPORT
//
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest)
public async Task<JArray> GetExportData(DataListSelectedRequest dataListSelectedRequest, DateTime renderTimeOutExpiry)
{
//for now just re-use the report data code
//this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time
return await GetReportData(dataListSelectedRequest);
return await GetReportData(dataListSelectedRequest, renderTimeOutExpiry);
}
////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -34,7 +34,7 @@ namespace AyaNova.Util
internal static void KillExpiredRenders(ILogger log)
{
log.LogTrace("Clear expired render check");
log.LogDebug("Clear potential expired render jobs check");
//check for expired and remove
var Instances = _baginstances.ToArray();
var dtNow = DateTime.UtcNow;
@@ -52,7 +52,7 @@ namespace AyaNova.Util
internal static bool ForceCloseProcess(ReportRenderInstanceInfo instance, ILogger log)
{
log.LogTrace($"ForceCloseProcess on report render instance id {instance.ReporterProcessId} exired {instance.Expires.ToString()} utc");
log.LogDebug($"ForceCloseProcess on report render instance id {instance.ReporterProcessId} exired {instance.Expires.ToString()} utc");
try
{
var p = Process.GetProcessById(instance.ReporterProcessId);