This commit is contained in:
2020-06-05 19:25:00 +00:00
parent 3111f7fdb7
commit ac3bfb50bf
3 changed files with 135 additions and 227 deletions

View File

@@ -22,78 +22,80 @@ namespace AyaNova.Biz
//Used by SEARCH and objects with JOBS //Used by SEARCH and objects with JOBS
internal static BizObject GetBizObject(AyaType ayaType, long userId = 1, AuthorizationRoles roles = AuthorizationRoles.All) internal static BizObject GetBizObject(AyaType ayaType, long userId = 1, AuthorizationRoles roles = AuthorizationRoles.All)
{ {
var dbcontext = ServiceProviderProvider.DBContext; using (AyContext ct = ServiceProviderProvider.DBContext)
switch (ayaType)
{ {
//CoreBizObject add here switch (ayaType)
case AyaType.ServerJob: {
return new JobOperationsBiz(dbcontext, userId, roles); //CoreBizObject add here
case AyaType.TrialSeeder: case AyaType.ServerJob:
return new TrialBiz(dbcontext, userId, roles); return new JobOperationsBiz(ct, userId, roles);
case AyaType.Translation: case AyaType.TrialSeeder:
return new TranslationBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new TrialBiz(ct, userId, roles);
case AyaType.DataListView: case AyaType.Translation:
return new DataListViewBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new TranslationBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.FormCustom: case AyaType.DataListView:
return new FormCustomBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new DataListViewBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Widget: case AyaType.FormCustom:
return new WidgetBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new FormCustomBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Widget:
return new WidgetBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Customer: case AyaType.Customer:
return new CustomerBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new CustomerBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.User: case AyaType.User:
return new UserBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new UserBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Contract: case AyaType.Contract:
return new ContractBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new ContractBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.HeadOffice: case AyaType.HeadOffice:
return new HeadOfficeBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new HeadOfficeBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.LoanUnit: case AyaType.LoanUnit:
return new LoanUnitBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new LoanUnitBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Part: case AyaType.Part:
return new PartBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new PartBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.PM: case AyaType.PM:
return new PMBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new PMBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.PMTemplate: case AyaType.PMTemplate:
return new PMTemplateBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new PMTemplateBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Project: case AyaType.Project:
return new ProjectBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new ProjectBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.PurchaseOrder: case AyaType.PurchaseOrder:
return new PurchaseOrderBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new PurchaseOrderBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Quote: case AyaType.Quote:
return new QuoteBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new QuoteBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.QuoteTemplate: case AyaType.QuoteTemplate:
return new QuoteTemplateBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new QuoteTemplateBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Unit: case AyaType.Unit:
return new UnitBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new UnitBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.UnitModel: case AyaType.UnitModel:
return new UnitModelBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new UnitModelBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Vendor: case AyaType.Vendor:
return new VendorBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new VendorBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
//--- WorkOrder //--- WorkOrder
case AyaType.WorkOrder: case AyaType.WorkOrder:
case AyaType.WorkOrderItem: case AyaType.WorkOrderItem:
case AyaType.WorkOrderItemExpense: case AyaType.WorkOrderItemExpense:
case AyaType.WorkOrderItemLabor: case AyaType.WorkOrderItemLabor:
case AyaType.WorkOrderItemLoan: case AyaType.WorkOrderItemLoan:
case AyaType.WorkOrderItemPart: case AyaType.WorkOrderItemPart:
case AyaType.WorkOrderItemPartRequest: case AyaType.WorkOrderItemPartRequest:
case AyaType.WorkOrderItemScheduledUser: case AyaType.WorkOrderItemScheduledUser:
case AyaType.WorkOrderItemTask: case AyaType.WorkOrderItemTask:
case AyaType.WorkOrderItemTravel: case AyaType.WorkOrderItemTravel:
case AyaType.WorkOrderItemUnit: case AyaType.WorkOrderItemUnit:
return new WorkOrderBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new WorkOrderBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
//--- //---
case AyaType.WorkOrderTemplate: case AyaType.WorkOrderTemplate:
return new WorkOrderTemplateBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); return new WorkOrderTemplateBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
default: default:
throw new System.NotSupportedException($"AyaNova.BLL.BizObjectFactory::GetBizObject type {ayaType.ToString()} is not supported"); throw new System.NotSupportedException($"AyaNova.BLL.BizObjectFactory::GetBizObject type {ayaType.ToString()} is not supported");
}
} }
} }

View File

@@ -19,23 +19,6 @@ namespace AyaNova.Biz
#region JOB OPS #region JOB OPS
/// <summary>
/// Get a non tracked list of jobs for an object
/// </summary>
/// <param name="ayObj"></param>
///
/// <returns></returns>
internal static async Task<List<OpsJob>> GetJobsForObjectAsync(AyaTypeId ayObj)
{
var ct = ServiceProviderProvider.DBContext;
return await ct.OpsJob
.AsNoTracking()
.Where(z => z.ObjectId == ayObj.ObjectId && z.ObjectType == ayObj.ObjectType)
.OrderBy(z => z.Created)
.ToListAsync();
}
/// <summary> /// <summary>
/// Get a non tracked list of jobs that are ready to process and exclusive only /// Get a non tracked list of jobs that are ready to process and exclusive only
@@ -63,122 +46,39 @@ namespace AyaNova.Biz
/// <returns></returns> /// <returns></returns>
private static async Task<List<OpsJob>> GetReadyJobsAsync(bool exclusiveOnly) private static async Task<List<OpsJob>> GetReadyJobsAsync(bool exclusiveOnly)
{ {
var ct = ServiceProviderProvider.DBContext; using (AyContext ct = ServiceProviderProvider.DBContext)
var ret = await ct.OpsJob {
.AsNoTracking() var ret = await ct.OpsJob
.Where(z => z.StartAfter < System.DateTime.UtcNow && z.Exclusive == exclusiveOnly && z.JobStatus == JobStatus.Sleeping) .AsNoTracking()
.OrderBy(z => z.Created) .Where(z => z.StartAfter < System.DateTime.UtcNow && z.Exclusive == exclusiveOnly && z.JobStatus == JobStatus.Sleeping)
.ToListAsync(); .OrderBy(z => z.Created)
.ToListAsync();
return ret; return ret;
}
} }
/// <summary>
/// Get a non tracked list of all jobs that are not completed
/// could be running or sleeping
/// </summary>
/// <returns></returns>
internal static async Task<List<OpsJob>> GetAllSleepingOrRunningJobsAsync()
{
var ct = ServiceProviderProvider.DBContext;
var ret = await ct.OpsJob
.AsNoTracking()
.Where(z => z.JobStatus == JobStatus.Sleeping || z.JobStatus == JobStatus.Running)
.OrderBy(z => z.Created)
.ToListAsync();
return ret;
}
/// <summary>
/// Get a non tracked list of all jobs for a JobType
/// </summary>
/// <returns></returns>
internal static async Task<List<OpsJob>> GetAllJobsForJobTypeAsync(JobType jobType)
{
var ct = ServiceProviderProvider.DBContext;
var ret = await ct.OpsJob
.AsNoTracking()
.Where(z => z.JobType == jobType)
.OrderBy(z => z.Created)
.ToListAsync();
return ret;
}
/// <summary>
/// Get a non tracked list of all jobs that are status running but have no last activity for XX HOURS
/// </summary>
/// <returns></returns>
internal static async Task<List<OpsJob>> GetPotentiallyDeadRunningJobsAsync()
{
var ct = ServiceProviderProvider.DBContext;
var ret = await ct.OpsJob
.AsNoTracking()
.Where(z => z.JobStatus == JobStatus.Sleeping || z.JobStatus == JobStatus.Running)
.OrderBy(z => z.Created)
.ToListAsync();
return ret;
}
/// <summary>
/// Get a count of all jobs for a JobStatus
/// </summary>
/// <returns></returns>
internal static async Task<long> GetCountForJobStatusAsync(JobStatus jobStatus)
{
var ct = ServiceProviderProvider.DBContext;
var ret = await ct.OpsJob
.Where(z => z.JobStatus == jobStatus)
.LongCountAsync();
return ret;
}
/// <summary> /// <summary>
/// Add a new job to the database /// Add a new job to the database
/// </summary> /// </summary>
/// <param name="newJob"></param> /// <param name="newJob"></param>
internal static async Task AddJobAsync(OpsJob newJob)
/// <returns></returns>
internal static async Task<OpsJob> AddJobAsync(OpsJob newJob)
{ {
var ct = ServiceProviderProvider.DBContext; using (AyContext ct = ServiceProviderProvider.DBContext)
await ct.OpsJob.AddAsync(newJob);
await ct.SaveChangesAsync();
return newJob;
}
/// <summary>
/// Remove any jobs or logs for the object in question
/// </summary>
/// <param name="ayObj"></param>
internal static async Task DeleteJobsForObjectAsync(AyaTypeId ayObj)
{
//Get a list of all jobid's for the object passed in
List<OpsJob> jobsForObject = await GetJobsForObjectAsync(ayObj);
if (jobsForObject.Count == 0)
return;
foreach (OpsJob jobToBeDeleted in jobsForObject)
{ {
await RemoveJobAndLogsAsync(jobToBeDeleted.GId); await ct.OpsJob.AddAsync(newJob);
await ct.SaveChangesAsync();
} }
} }
/// <summary> /// <summary>
/// REmove the job and it's logs /// Remove the job and it's logs
/// </summary> /// </summary>
/// <param name="jobIdToBeDeleted"></param> /// <param name="jobIdToBeDeleted"></param>
internal static async Task RemoveJobAndLogsAsync(Guid jobIdToBeDeleted) internal static async Task RemoveJobAndLogsAsync(Guid jobIdToBeDeleted)
{ {
var ct = ServiceProviderProvider.DBContext; using (AyContext ct = ServiceProviderProvider.DBContext)
using (var transaction = await ct.Database.BeginTransactionAsync()) using (var transaction = await ct.Database.BeginTransactionAsync())
{ {
try try
@@ -205,18 +105,18 @@ namespace AyaNova.Biz
/// </summary> /// </summary>
/// <param name="jobId">(NOTE: Guid.empty indicates internal job)</param> /// <param name="jobId">(NOTE: Guid.empty indicates internal job)</param>
/// <param name="statusText"></param> /// <param name="statusText"></param>
/// internal static async Task LogJobAsync(Guid jobId, string statusText)
internal static async Task<OpsJobLog> LogJobAsync(Guid jobId, string statusText)
{ {
var ct = ServiceProviderProvider.DBContext; using (AyContext ct = ServiceProviderProvider.DBContext)
if (string.IsNullOrWhiteSpace(statusText)) {
statusText = "No status provided"; if (string.IsNullOrWhiteSpace(statusText))
OpsJobLog newObj = new OpsJobLog(); statusText = "No status provided";
newObj.JobId = jobId; OpsJobLog newObj = new OpsJobLog();
newObj.StatusText = statusText; newObj.JobId = jobId;
await ct.OpsJobLog.AddAsync(newObj); newObj.StatusText = statusText;
await ct.SaveChangesAsync(); await ct.OpsJobLog.AddAsync(newObj);
return newObj; await ct.SaveChangesAsync();
}
} }
@@ -225,14 +125,15 @@ namespace AyaNova.Biz
/// </summary> /// </summary>
/// <param name="jobId"></param> /// <param name="jobId"></param>
/// <param name="newStatus"></param> /// <param name="newStatus"></param>
internal static async Task<OpsJob> UpdateJobStatusAsync(Guid jobId, JobStatus newStatus) internal static async Task UpdateJobStatusAsync(Guid jobId, JobStatus newStatus)
{ {
var ct = ServiceProviderProvider.DBContext; using (AyContext ct = ServiceProviderProvider.DBContext)
var oFromDb = await ct.OpsJob.SingleOrDefaultAsync(z => z.GId == jobId); {
if (oFromDb == null) return null; var oFromDb = await ct.OpsJob.SingleOrDefaultAsync(z => z.GId == jobId);
oFromDb.JobStatus = newStatus; if (oFromDb == null) return;
await ct.SaveChangesAsync(); oFromDb.JobStatus = newStatus;
return oFromDb; await ct.SaveChangesAsync();
}
} }
#endregion Job ops #endregion Job ops
@@ -295,8 +196,8 @@ namespace AyaNova.Biz
//backup //backup
//System.Diagnostics.Debug.WriteLine($"JobsBiz processing backup"); //System.Diagnostics.Debug.WriteLine($"JobsBiz processing backup");
await CoreJobBackup.DoWorkAsync();//sb exclusive await CoreJobBackup.DoWorkAsync();//sb exclusive
//System.Diagnostics.Debug.WriteLine($"JobsBiz processing metrics snapshotter"); //System.Diagnostics.Debug.WriteLine($"JobsBiz processing metrics snapshotter");
//Capture metrics //Capture metrics
CoreJobMetricsSnapshot.DoJob(); CoreJobMetricsSnapshot.DoJob();
@@ -312,7 +213,7 @@ namespace AyaNova.Biz
try try
{ {
//System.Diagnostics.Debug.WriteLine($"JobsBiz processing NON-exclusive biz job {j.Name}"); //System.Diagnostics.Debug.WriteLine($"JobsBiz processing NON-exclusive biz job {j.Name}");
TaskUtil.Forget(Task.Run(() => ProcessJobAsync(j))); TaskUtil.Forget(Task.Run(() => ProcessJobAsync(j)));
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -323,14 +224,14 @@ namespace AyaNova.Biz
} }
} }
//Capture metrics //Capture metrics
CoreJobMetricsSnapshot.DoJob(); CoreJobMetricsSnapshot.DoJob();
//TODO: NOTIFICATIONS //TODO: NOTIFICATIONS
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "JobsBiz::ProcessJobsAsync unexpected error during processing"); log.LogError(ex, "JobsBiz::ProcessJobsAsync unexpected error during processing");

View File

@@ -28,7 +28,7 @@ namespace AyaNova.Biz
u.Password = Hasher.hash(u.Salt, "l3tm3in"); u.Password = Hasher.hash(u.Salt, "l3tm3in");
u.Roles = AuthorizationRoles.All;//AuthorizationRoles.BizAdminFull | AuthorizationRoles.OpsAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryFull; u.Roles = AuthorizationRoles.All;//AuthorizationRoles.BizAdminFull | AuthorizationRoles.OpsAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryFull;
u.UserType = UserType.Administrator; u.UserType = UserType.Administrator;
u.UserOptions = new UserOptions(); u.UserOptions = new UserOptions();
u.UserOptions.TranslationId = ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID;//Ensure primeTranslations is called first u.UserOptions.TranslationId = ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID;//Ensure primeTranslations is called first
@@ -59,38 +59,43 @@ namespace AyaNova.Biz
await ImportTranslation(ResourceFolderPath, "fr"); await ImportTranslation(ResourceFolderPath, "fr");
await ImportTranslation(ResourceFolderPath, "de"); await ImportTranslation(ResourceFolderPath, "de");
//Ensure Translations are present, not missing any keys and that there is a server default translation that exists //Ensure Translations are present, not missing any keys and that there is a server default translation that exists
TranslationBiz lb = TranslationBiz.GetBiz(ServiceProviderProvider.DBContext); using (AyContext ct = ServiceProviderProvider.DBContext)
await lb.ValidateTranslationsAsync(); {
TranslationBiz lb = TranslationBiz.GetBiz(ct);
await lb.ValidateTranslationsAsync();
}
} }
private static async Task ImportTranslation(string resourceFolderPath, string translationCode) private static async Task ImportTranslation(string resourceFolderPath, string translationCode)
{ {
AyContext ct = ServiceProviderProvider.DBContext; using (AyContext ct = ServiceProviderProvider.DBContext)
var TranslationPath = Path.Combine(resourceFolderPath, $"{translationCode}.json");
if (!File.Exists(TranslationPath))
{ {
throw new System.Exception($"E1013: stock translation file \"{translationCode}\" not found where expected: \"{TranslationPath}\", installation damaged?"); var TranslationPath = Path.Combine(resourceFolderPath, $"{translationCode}.json");
if (!File.Exists(TranslationPath))
{
throw new System.Exception($"E1013: stock translation file \"{translationCode}\" not found where expected: \"{TranslationPath}\", installation damaged?");
}
JObject o = JObject.Parse(await File.ReadAllTextAsync(TranslationPath));
Translation l = new Translation();
l.Name = translationCode;
l.Stock = true;
l.CjkIndex = false;
foreach (JToken t in o.Children())
{
var key = t.Path;
var display = t.First.Value<string>();
l.TranslationItems.Add(new TranslationItem() { Key = key, Display = display });
}
await ct.Translation.AddAsync(l);
await ct.SaveChangesAsync();
} }
JObject o = JObject.Parse(await File.ReadAllTextAsync(TranslationPath));
Translation l = new Translation();
l.Name = translationCode;
l.Stock = true;
l.CjkIndex = false;
foreach (JToken t in o.Children())
{
var key = t.Path;
var display = t.First.Value<string>();
l.TranslationItems.Add(new TranslationItem() { Key = key, Display = display });
}
await ct.Translation.AddAsync(l);
await ct.SaveChangesAsync();
} }