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
internal static BizObject GetBizObject(AyaType ayaType, long userId = 1, AuthorizationRoles roles = AuthorizationRoles.All)
{
var dbcontext = ServiceProviderProvider.DBContext;
switch (ayaType)
using (AyContext ct = ServiceProviderProvider.DBContext)
{
//CoreBizObject add here
case AyaType.ServerJob:
return new JobOperationsBiz(dbcontext, userId, roles);
case AyaType.TrialSeeder:
return new TrialBiz(dbcontext, userId, roles);
case AyaType.Translation:
return new TranslationBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.DataListView:
return new DataListViewBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.FormCustom:
return new FormCustomBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Widget:
return new WidgetBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
switch (ayaType)
{
//CoreBizObject add here
case AyaType.ServerJob:
return new JobOperationsBiz(ct, userId, roles);
case AyaType.TrialSeeder:
return new TrialBiz(ct, userId, roles);
case AyaType.Translation:
return new TranslationBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.DataListView:
return new DataListViewBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.FormCustom:
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:
return new CustomerBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.User:
return new UserBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Customer:
return new CustomerBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.User:
return new UserBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Contract:
return new ContractBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.HeadOffice:
return new HeadOfficeBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.LoanUnit:
return new LoanUnitBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Part:
return new PartBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.PM:
return new PMBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Contract:
return new ContractBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.HeadOffice:
return new HeadOfficeBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.LoanUnit:
return new LoanUnitBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Part:
return new PartBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.PM:
return new PMBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.PMTemplate:
return new PMTemplateBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.PMTemplate:
return new PMTemplateBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Project:
return new ProjectBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.PurchaseOrder:
return new PurchaseOrderBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Quote:
return new QuoteBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Project:
return new ProjectBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.PurchaseOrder:
return new PurchaseOrderBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Quote:
return new QuoteBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.QuoteTemplate:
return new QuoteTemplateBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.QuoteTemplate:
return new QuoteTemplateBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Unit:
return new UnitBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.UnitModel:
return new UnitModelBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Vendor:
return new VendorBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
//--- WorkOrder
case AyaType.WorkOrder:
case AyaType.WorkOrderItem:
case AyaType.WorkOrderItemExpense:
case AyaType.WorkOrderItemLabor:
case AyaType.WorkOrderItemLoan:
case AyaType.WorkOrderItemPart:
case AyaType.WorkOrderItemPartRequest:
case AyaType.WorkOrderItemScheduledUser:
case AyaType.WorkOrderItemTask:
case AyaType.WorkOrderItemTravel:
case AyaType.WorkOrderItemUnit:
return new WorkOrderBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
//---
case AyaType.WorkOrderTemplate:
return new WorkOrderTemplateBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Unit:
return new UnitBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.UnitModel:
return new UnitModelBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
case AyaType.Vendor:
return new VendorBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
//--- WorkOrder
case AyaType.WorkOrder:
case AyaType.WorkOrderItem:
case AyaType.WorkOrderItemExpense:
case AyaType.WorkOrderItemLabor:
case AyaType.WorkOrderItemLoan:
case AyaType.WorkOrderItemPart:
case AyaType.WorkOrderItemPartRequest:
case AyaType.WorkOrderItemScheduledUser:
case AyaType.WorkOrderItemTask:
case AyaType.WorkOrderItemTravel:
case AyaType.WorkOrderItemUnit:
return new WorkOrderBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
//---
case AyaType.WorkOrderTemplate:
return new WorkOrderTemplateBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
default:
throw new System.NotSupportedException($"AyaNova.BLL.BizObjectFactory::GetBizObject type {ayaType.ToString()} is not supported");
default:
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
/// <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>
/// Get a non tracked list of jobs that are ready to process and exclusive only
@@ -63,122 +46,39 @@ namespace AyaNova.Biz
/// <returns></returns>
private static async Task<List<OpsJob>> GetReadyJobsAsync(bool exclusiveOnly)
{
var ct = ServiceProviderProvider.DBContext;
var ret = await ct.OpsJob
.AsNoTracking()
.Where(z => z.StartAfter < System.DateTime.UtcNow && z.Exclusive == exclusiveOnly && z.JobStatus == JobStatus.Sleeping)
.OrderBy(z => z.Created)
.ToListAsync();
return ret;
using (AyContext ct = ServiceProviderProvider.DBContext)
{
var ret = await ct.OpsJob
.AsNoTracking()
.Where(z => z.StartAfter < System.DateTime.UtcNow && z.Exclusive == exclusiveOnly && z.JobStatus == JobStatus.Sleeping)
.OrderBy(z => z.Created)
.ToListAsync();
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>
/// Add a new job to the database
/// </summary>
/// <param name="newJob"></param>
/// <returns></returns>
internal static async Task<OpsJob> AddJobAsync(OpsJob newJob)
internal static async Task AddJobAsync(OpsJob newJob)
{
var 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)
using (AyContext ct = ServiceProviderProvider.DBContext)
{
await RemoveJobAndLogsAsync(jobToBeDeleted.GId);
await ct.OpsJob.AddAsync(newJob);
await ct.SaveChangesAsync();
}
}
/// <summary>
/// REmove the job and it's logs
/// Remove the job and it's logs
/// </summary>
/// <param name="jobIdToBeDeleted"></param>
internal static async Task RemoveJobAndLogsAsync(Guid jobIdToBeDeleted)
{
var ct = ServiceProviderProvider.DBContext;
using (AyContext ct = ServiceProviderProvider.DBContext)
using (var transaction = await ct.Database.BeginTransactionAsync())
{
try
@@ -205,18 +105,18 @@ namespace AyaNova.Biz
/// </summary>
/// <param name="jobId">(NOTE: Guid.empty indicates internal job)</param>
/// <param name="statusText"></param>
///
internal static async Task<OpsJobLog> LogJobAsync(Guid jobId, string statusText)
internal static async Task LogJobAsync(Guid jobId, string statusText)
{
var ct = ServiceProviderProvider.DBContext;
if (string.IsNullOrWhiteSpace(statusText))
statusText = "No status provided";
OpsJobLog newObj = new OpsJobLog();
newObj.JobId = jobId;
newObj.StatusText = statusText;
await ct.OpsJobLog.AddAsync(newObj);
await ct.SaveChangesAsync();
return newObj;
using (AyContext ct = ServiceProviderProvider.DBContext)
{
if (string.IsNullOrWhiteSpace(statusText))
statusText = "No status provided";
OpsJobLog newObj = new OpsJobLog();
newObj.JobId = jobId;
newObj.StatusText = statusText;
await ct.OpsJobLog.AddAsync(newObj);
await ct.SaveChangesAsync();
}
}
@@ -225,14 +125,15 @@ namespace AyaNova.Biz
/// </summary>
/// <param name="jobId"></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;
var oFromDb = await ct.OpsJob.SingleOrDefaultAsync(z => z.GId == jobId);
if (oFromDb == null) return null;
oFromDb.JobStatus = newStatus;
await ct.SaveChangesAsync();
return oFromDb;
using (AyContext ct = ServiceProviderProvider.DBContext)
{
var oFromDb = await ct.OpsJob.SingleOrDefaultAsync(z => z.GId == jobId);
if (oFromDb == null) return;
oFromDb.JobStatus = newStatus;
await ct.SaveChangesAsync();
}
}
#endregion Job ops
@@ -295,8 +196,8 @@ namespace AyaNova.Biz
//backup
//System.Diagnostics.Debug.WriteLine($"JobsBiz processing backup");
await CoreJobBackup.DoWorkAsync();//sb exclusive
//System.Diagnostics.Debug.WriteLine($"JobsBiz processing metrics snapshotter");
//System.Diagnostics.Debug.WriteLine($"JobsBiz processing metrics snapshotter");
//Capture metrics
CoreJobMetricsSnapshot.DoJob();
@@ -312,7 +213,7 @@ namespace AyaNova.Biz
try
{
//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)
{
@@ -323,14 +224,14 @@ namespace AyaNova.Biz
}
}
//Capture metrics
CoreJobMetricsSnapshot.DoJob();
//TODO: NOTIFICATIONS
}
}
catch (Exception ex)
{
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.Roles = AuthorizationRoles.All;//AuthorizationRoles.BizAdminFull | AuthorizationRoles.OpsAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryFull;
u.UserType = UserType.Administrator;
u.UserOptions = new UserOptions();
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, "de");
//Ensure Translations are present, not missing any keys and that there is a server default translation that exists
TranslationBiz lb = TranslationBiz.GetBiz(ServiceProviderProvider.DBContext);
await lb.ValidateTranslationsAsync();
//Ensure Translations are present, not missing any keys and that there is a server default translation that exists
using (AyContext ct = ServiceProviderProvider.DBContext)
{
TranslationBiz lb = TranslationBiz.GetBiz(ct);
await lb.ValidateTranslationsAsync();
}
}
private static async Task ImportTranslation(string resourceFolderPath, string translationCode)
{
AyContext ct = ServiceProviderProvider.DBContext;
var TranslationPath = Path.Combine(resourceFolderPath, $"{translationCode}.json");
if (!File.Exists(TranslationPath))
using (AyContext ct = ServiceProviderProvider.DBContext)
{
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();
}