Spostamento altri metodi...
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
using EgwCoreLib.Lux.Data.DbModel.Items;
|
||||
using EgwCoreLib.Lux.Core.Generic;
|
||||
using EgwCoreLib.Lux.Core.RestPayload;
|
||||
using EgwCoreLib.Lux.Data.DbModel.Items;
|
||||
using EgwCoreLib.Lux.Data.DbModel.Production;
|
||||
using EgwCoreLib.Lux.Data.DbModel.Sales;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Newtonsoft.Json;
|
||||
using static EgwCoreLib.Lux.Core.Enums;
|
||||
|
||||
namespace EgwCoreLib.Lux.Data.Repository.Sales
|
||||
@@ -171,6 +175,221 @@ namespace EgwCoreLib.Lux.Data.Repository.Sales
|
||||
return await dbCtx.SaveChangesAsync() > 0;
|
||||
}
|
||||
|
||||
public async Task<bool> SaveProdEstAsync(string uID, string prodEstim)
|
||||
{
|
||||
// Add validation for null or empty list
|
||||
if (string.IsNullOrWhiteSpace(uID) || string.IsNullOrWhiteSpace(prodEstim)) return false;
|
||||
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
|
||||
// Wrap in transaction for atomicity (batch update multiple rows)
|
||||
await using var tx = dbCtx.Database.BeginTransaction();
|
||||
try
|
||||
{
|
||||
// recupero offerta...
|
||||
var currRec = dbCtx
|
||||
.DbSetOrderRow
|
||||
.Where(x => x.OrderRowUID == uID)
|
||||
.FirstOrDefault();
|
||||
|
||||
// se trovo aggiorno
|
||||
if (currRec != null)
|
||||
{
|
||||
// genero WLD x controllo
|
||||
var currWLD = new WorkLoadDetailDTO(currRec.OrderRowUID, currRec.ProdEstimate);
|
||||
|
||||
// faccio update in cascata dei record collegati x macchine e items
|
||||
var listMachDb = dbCtx
|
||||
.DbSetProdPlant
|
||||
.Select(x => x.ProdPlantCod)
|
||||
.ToList();
|
||||
List<string> listMaccCurr = currWLD.MachineCalcResults.Select(x => x.Name).OrderBy(x => x).ToList() ?? new List<string>();
|
||||
if (listMaccCurr != null && listMaccCurr.Any())
|
||||
{
|
||||
var listDiff = listMaccCurr.Except(listMachDb).ToList();
|
||||
if (listDiff.Any())
|
||||
{
|
||||
foreach (var macch in listDiff)
|
||||
{
|
||||
dbCtx
|
||||
.DbSetProdPlant
|
||||
.Add(new ProductionPlantModel() { ProdPlantCod = macch, ProdPlantDescript = macch });
|
||||
}
|
||||
}
|
||||
}
|
||||
// resetta assegnazioni prodgroup agli items...
|
||||
List<ProductionItemModel> listItem2upd = await dbCtx
|
||||
.DbSetProdItem
|
||||
.Where(x => x.OrderRowID == currRec.OrderRowID && x.ProdGroupID != null)
|
||||
.ToListAsync();
|
||||
if (listItem2upd != null && listItem2upd.Count > 0)
|
||||
{
|
||||
// li aggiorna tutti resettando ProdGroupID
|
||||
listItem2upd.ForEach(x => x.ProdGroupID = null);
|
||||
}
|
||||
|
||||
// elimina eventuali oggetti ProductionGroup precedenti
|
||||
List<ProductionGroupModel> listProdGroup2Rem = await dbCtx
|
||||
.DbSetProdGroup
|
||||
.Where(x => x.OrderRowID == currRec.OrderRowID)
|
||||
.ToListAsync();
|
||||
// rimuovo...
|
||||
if (listProdGroup2Rem != null && listProdGroup2Rem.Count > 0)
|
||||
{
|
||||
dbCtx.DbSetProdGroup.RemoveRange(listProdGroup2Rem);
|
||||
}
|
||||
|
||||
/*----------------------------------
|
||||
* Generazione ProdGroup
|
||||
* FixMe ToDo !!!
|
||||
*
|
||||
* rifare considerando le REALI combinazioni scaturite x questo specifico caso e
|
||||
* - ENUMERARE le combinazioni
|
||||
* - ogni combinazione sarà un caso specifico tra 0...N dove N è il totale delle macchine gestite
|
||||
* - i successivi calcoli di balance/stima saranno fatti x questo SPECIFICO ID GROUP così da fare prima... a sto punto GroupIP potrebbe essere un int 0...n oppure l'id del record... forse meglio il counter 0..n
|
||||
*
|
||||
* */
|
||||
int grpIdx = 1;
|
||||
// preparo x add nuovi ProductionGroup da analisi ritorno stime
|
||||
List<ProductionGroupModel> listProdGroup2Add = new List<ProductionGroupModel>();
|
||||
// 1: non lavorabili...
|
||||
if (currWLD.ListUnWorkable.Count > 0)
|
||||
{
|
||||
// calcolo il dizionario degli elementi...
|
||||
Dictionary<string, ProdMachineDetailDto> newWorkGroupList = new();
|
||||
ProdMachineDetailDto detProd = new ProdMachineDetailDto()
|
||||
{
|
||||
TagList = currWLD.ListUnWorkable
|
||||
};
|
||||
newWorkGroupList.Add("", detProd);
|
||||
string rawWGL = JsonConvert.SerializeObject(newWorkGroupList);
|
||||
ProductionGroupModel newRec = new ProductionGroupModel()
|
||||
{
|
||||
OrderRowID = currRec.OrderRowID,
|
||||
GrpIdx = grpIdx++,
|
||||
WorkGroupListRaw = rawWGL
|
||||
};
|
||||
listProdGroup2Add.Add(newRec);
|
||||
}
|
||||
|
||||
// dizionario x macchina delle parts LAVORABILI su impianto..
|
||||
var machineTags = currWLD.MachineCalcResults
|
||||
.ToDictionary(
|
||||
m => m.Name,
|
||||
m => m.PartList
|
||||
.Where(p => p.CalcResult == EgwCoreLib.Lux.Core.Enums.PartVerificationResult.MACHINABLE)
|
||||
.ToList()
|
||||
);
|
||||
|
||||
// ciclo x tutte le combinazioni di gruppi lavorabilità...
|
||||
foreach (var item in currWLD.LoadDetail)
|
||||
{
|
||||
// calcolo il dizionario degli elementi...
|
||||
Dictionary<string, ProdMachineDetailDto> newWorkGroupList = new();
|
||||
foreach (var machineName in item.Machines)
|
||||
{
|
||||
decimal effectiveTime = 0;
|
||||
// Recuperiamo i dati della macchina dal dizionario
|
||||
if (machineTags.TryGetValue(machineName, out var machineParts))
|
||||
{
|
||||
// Creiamo un set dei tag del gruppo per una ricerca veloce O(1)
|
||||
var groupTagsSet = item.Tags.ToHashSet();
|
||||
|
||||
// Sommiamo il tempo solo per i pezzi che appartengono a questo gruppo
|
||||
effectiveTime = machineParts
|
||||
.Where(p => groupTagsSet.Contains(p.Tag))
|
||||
.Sum(p => p.Time);
|
||||
}
|
||||
|
||||
ProdMachineDetailDto detProd = new ProdMachineDetailDto()
|
||||
{
|
||||
TagList = item.Tags,
|
||||
Time = effectiveTime // Tempo reale specifico per questa macchina/gruppo
|
||||
};
|
||||
newWorkGroupList.Add(machineName, detProd);
|
||||
}
|
||||
string rawWGL = JsonConvert.SerializeObject(newWorkGroupList);
|
||||
ProductionGroupModel newRec = new ProductionGroupModel()
|
||||
{
|
||||
OrderRowID = currRec.OrderRowID,
|
||||
GrpIdx = grpIdx++,
|
||||
WorkGroupListRaw = rawWGL
|
||||
};
|
||||
listProdGroup2Add.Add(newRec);
|
||||
}
|
||||
// aggiungo i record...
|
||||
dbCtx.DbSetProdGroup.AddRange(listProdGroup2Add);
|
||||
|
||||
// aggiorno info Estimation, tempi e stato
|
||||
currRec.ProdEstimate = prodEstim;
|
||||
if (!string.IsNullOrEmpty(prodEstim))
|
||||
{
|
||||
currRec.OrderRowState = OrderStates.Estimated;
|
||||
}
|
||||
var totEstim = listProdGroup2Add.Sum(x => x.TotalEstimTime);
|
||||
currRec.ProdEstimTime = totEstim;
|
||||
dbCtx.Entry(currRec).State = EntityState.Modified;
|
||||
}
|
||||
|
||||
// salvo TUTTI i cambiamenti...
|
||||
bool done = await dbCtx.SaveChangesAsync() > 0;
|
||||
|
||||
if (done)
|
||||
tx.Commit();
|
||||
|
||||
return done;
|
||||
}
|
||||
catch
|
||||
{
|
||||
tx.Rollback();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<int> ValidateAsync(List<OrderRowModel> list2chk)
|
||||
{
|
||||
int numDone = 0;
|
||||
|
||||
// Add validation for null or empty list
|
||||
if (list2chk.Count == 0)
|
||||
return numDone;
|
||||
|
||||
// context
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
// Wrap in transaction for atomicity (batch update multiple rows)
|
||||
await using var tx = dbCtx.Database.BeginTransaction();
|
||||
try
|
||||
{
|
||||
// verifica preliminare: serve SSE stato e estimate non corrispondono...
|
||||
var list2fix = list2chk
|
||||
.Where(x => x.OrderRowState == OrderStates.Created && !string.IsNullOrEmpty(x.ProdEstimate))
|
||||
.ToList();
|
||||
|
||||
if (list2fix.Any())
|
||||
{
|
||||
// per ogni record processo intera validazione
|
||||
foreach (var item in list2fix)
|
||||
{
|
||||
bool fatto = await SaveProdEstAsync(item.OrderRowUID, item.ProdEstimate);
|
||||
numDone += fatto ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
// salvo TUTTI i cambiamenti...
|
||||
bool done = await dbCtx.SaveChangesAsync() > 0;
|
||||
|
||||
if (done)
|
||||
tx.Commit();
|
||||
|
||||
return numDone;
|
||||
}
|
||||
catch
|
||||
{
|
||||
tx.Rollback();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user