Index: vhTest/Mock/APPS/Verpakking/OrgaluxBonOptimizer.cls.xml =================================================================== diff -u --- vhTest/Mock/APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (revision 0) +++ vhTest/Mock/APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (revision 72244) @@ -0,0 +1,32 @@ + + + + +Deze klasse werd automatisch gegenereerd en onderhouden - lokale aanpassingen zijn niet nodig. +Een hercompilatie van de basis interface - met een correct werkende studiohook ( v2.20 ++ ) - zorgt ervoor dat deze klasse aangepast wordt +1 +APPS.Verpakking.OrgaluxBonOptimizer,Tools.Mock.MockClassBase +right + + +%Status + + + + +Bon:DOM.VKP.Bon +%ListOfObjects + + + + +BONNr:%String + + + + + + Index: APPS/Verpakking/OrgaluxBonOptimizer.cls.xml =================================================================== diff -u --- APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (revision 0) +++ APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (revision 72244) @@ -0,0 +1,1163 @@ + + + +TECH.Mockable + + +%Integer +1170 + + + +%Integer +770 + + + +%Integer +730 + + + +%String +1 + + + +%String +Overdoos + + + +vhLib.Logger +1 + + + +%Boolean +1 + + + +APPS.Verpakking.BoxDataRepository +1 + + + +APPS.Verpakking.SnijDataRepository +1 + + + +DOM.PM.ProductAPI +1 + + + +%Boolean +0 + + + +%String +1 + + + +%Decimal +1 + + + +%Decimal +1 + + + +%Decimal +1 + + + +TECH.DateTime.impl.DateTimeAPI +1 + + + +APPS.Verpakking.DoosFactory +1 + + + +APPS.Verpakking.Optimizer +1 + + + +APPS.Verpakking.DoosAanvuller +1 + + + +%String +1 + + + +APPS.Verpakking.CubeIQRequestBuilder +1 + + + +DoosFactory:APPS.Verpakking.DoosFactory="",DoosAanvuller:APPS.Verpakking.DoosAanvuller="",Optimizer:APPS.Verpakking.Optimizer="",CubeIQRequestBuilder:APPS.Verpakking.CubeIQRequestBuilder +1 +1 +%Status +1 + + + + +1 +BonId:%String + + + + +BonId:%String + + + + +BoxDataLijstVanTeStapelenDozen:%ListOfObjects +APPS.Verpakking.dto.CubeIQ.Response + Score) { + Set BesteStapeling = CubeIQResponse + Set BesteScore = Score + } + } + } Else { + #dim MaxHoogteDoos As %Decimal = 150 + + While ((BesteStapeling = "") && (MaxHoogteDoos < ..#MaximumVerpakkingHoogteVoorEuropallet)) { + Set Request = ..CubeIQRequestBuilder.MaakCubeIQRequest(BoxDataLijstVanTeStapelenDozen, ..#MaximumVerpakkingBreedteVoorEuropallet, ..#MaximumVerpakkingDiepteVoorEuropallet, MaxHoogteDoos, $$$True) + Set Response = ..GeefParsedCubeIQResponse(Request) + + If ((Response.cubeiq.loadedcontainers.loadedcontainer.Count() = MinimumAantalPallettenVoorBon) && (Response.cubeiq.unloadedproducts = "")) { + Set BesteStapeling = Response + } + + Set MaxHoogteDoos = MaxHoogteDoos + 50 + } + } + + If (BesteStapeling = "") { + #dim FoutOmschrijving As %String = "Geen optimale stapeling gevonden voor bon "_ ..BonId _"." + Do ..Logger.ErrorMail("Optimaliseer bon orgalux", FoutOmschrijving) + Set Exception = ##class(TECH.Exceptions.DataNotFoundException).%New(FoutOmschrijving) + Do ##class(TECH.ExceptionHandler).Throw(Exception) + } + + Quit BesteStapeling +]]> + + + +BoxDataLijstVanTeStapelenDozen:%ListOfObjects +%Integer + + + + +CubeIQResponse:APPS.Verpakking.dto.CubeIQ.Response,BoxDataLijst:%ListOfObjects + 0) { + Set SnijDataDoos = ..MaakMetaDataVoorSnijOpdracht(BoxData, .OptiDataDoos, 1, NummerDoos, BoxData.ObjRef, "", SnijDataOverdoosBodem, OptiDataOverdoosBodem, "", AfbeeldingCodeDoos) + + #dim DelenVanBoxDataIterator As TECH.Iterator = ..BoxDataRepository.ZoekDeelVanBoxDataViaId(BoxData.%Id()) + While DelenVanBoxDataIterator.HasNext() { + #dim DeelVanBoxData As DS.Prod.OptiBox.BoxData = DelenVanBoxDataIterator.Next() + #dim OptiDataInnerDoos As DS.Prod.OptiBox.OptiData = "" + Do ..MaakMetaDataVoorSnijOpdracht(DeelVanBoxData, .OptiDataInnerDoos, 1, "", BoxData.ObjRef, SnijDataDoos, OptiDataDoos, OptiDataDoos,SnijDataDoos) + } + + Set Block.quantity = Block.quantity - 1 + Set NummerDoos = NummerDoos + 1 + } + } + Set NummerAfbeelding = NummerAfbeelding + 1 + } + } + Set NummerOverdoos = NummerOverdoos + 1 + } +]]> + + + + +1 +DS.Prod.OptiBox.SnijData + + + + + + + + + +BoxDataLijst:%ListOfObjects,ParentSnijData:DS.Prod.OptiBox.BoxData,OptiDataParent:DS.Prod.OptiBox.OptiData +1 + + + + +BoxData:DS.Prod.OptiBox.BoxData +1 +DS.Prod.OptiBox.sub.emSnijDef + + + + +BoxData:DS.Prod.OptiBox.BoxData +1 +APPS.Verpakking.dto.Doos + + + + + +1 +DS.Prod.OptiBox.SnijData + + + + +BoxData:DS.Prod.OptiBox.BoxData,Sequentie:%Integer,OptiData:DS.Prod.OptiBox.OptiData,Product:DOM.PM.Product,SnijDataParent:DS.Prod.OptiBox.SnijData,SnijDataBoxParent:DS.Prod.OptiBox.SnijData,ProductAantal:%Integer,AfbeeldingCode:%String="" +1 +DS.Prod.OptiBox.SnijData + 0) { + Set SnijData.Sequentie = Sequentie + } + Set SnijData.SnijMachineID = ##class(APPS.Verpakking.enu.MachineID).VH() + Set SnijData.Simulate = $$$False + + /* + #dim SnijHistoriek As DS.Prod.OptiBox.SnijHistoriek = ##class(DS.Prod.OptiBox.SnijHistoriek).%New() + Set SnijData.Status = "F" + + Set SnijHistoriek.CardboardID = Doos.CardBoardID + Set SnijHistoriek.CardboardProduct = ##class(Prod.Product).%OpenId(..KartonRepository.GeefKartonProductIdViaID(Doos.CardBoardID)) + Set SnijHistoriek.CardboardBreedte = ..KartonRepository.GeefKartonBreedteViaID(Doos.CardBoardID) + Set SnijHistoriek.Lengte = Doos.UsedCardBoardLength + + #dim SaveStatusSnijHistoriek As %Status = SnijHistoriek.%Save() + Do ##class(TECH.Exceptions.StatusException).ThrowIndienNietOK(SaveStatusSnijHistoriek,"Het bewaren van SnijHistoriek in MaakSnijData is niet gelukt.") + + Set SnijData.SnijHistoriek = SnijHistoriek + */ + + #dim SaveStatus As %Status = SnijData.%Save() + Do ##class(TECH.Exceptions.StatusException).ThrowIndienNietOK(SaveStatus,"Het bewaren van SnijData in MaakSnijData is niet gelukt.") + + Set SnijData.BoxDeelVan = SnijData + Set SaveStatus = SnijData.%Save() + Do ##class(TECH.Exceptions.StatusException).ThrowIndienNietOK(SaveStatus,"Het 2e keer bewaren van SnijData in MaakSnijData is niet gelukt.") + + Quit SnijData +]]> + + + +BoxData:DS.Prod.OptiBox.BoxData,Product:DOM.PM.Product="",OptiDataParent:DS.Prod.OptiBox.OptiData="",OptiDataBoxParent:DS.Prod.OptiBox.OptiData="" +1 +DS.Prod.OptiBox.OptiData + 0 : BoxData.Aantal, 1:1) + Set OptiData.Status = "L" + + #dim SaveStatus As %Status = OptiData.%Save() + Do ##class(TECH.Exceptions.StatusException).ThrowIndienNietOK(SaveStatus,"Het bewaren van OptiData is niet gelukt.") + + Quit OptiData +]]> + + + +1 + + + + +CubeIQRequest:APPS.Verpakking.dto.CubeIQ.Request +1 +APPS.Verpakking.dto.CubeIQ.Response + + + + +1 +%Boolean + + + + +Request:APPS.Verpakking.dto.CubeIQ.Request +1 +%Net.HttpRequest + + + + +BoxDataLijst:%ListOfObjects +1 +DS.Prod.OptiBox.BoxDataMetID + + + + +Overdoos:APPS.Verpakking.dto.CubeIQ.Response.LoadedContainer,MinimumAantalPallettenVoorBon:%Integer +1 +%Decimal + + + + + + + + + + + + + + + + + + + + + + */ + //Do ##class(Tools.Wlip).%New(110).String("SCORE NOG TE BEPALEN") + #dim VolumeFactor As %Integer = ##class(TECH.Math).Pow((Overdoos.overallheight * Overdoos.overalllength * Overdoos.overallwidth), 1/3) + #dim GrondOppervlakFactor As %Integer = ##class(TECH.Math).Pow((Overdoos.overalllength * Overdoos.overallwidth), 1/2) * 0.1 + #dim StabiliteitFactor As %Decimal = Overdoos.overallheight / ##class(TECH.Math).Min(Overdoos.overalllength, Overdoos.overallwidth) * 50 + #dim TotaleKartonOppervlakteFactor As %Integer = ##class(TECH.Math).Pow((2 * ((Overdoos.overalllength * Overdoos.overallwidth) + (Overdoos.overalllength * Overdoos.overallheight) + (Overdoos.overallheight * Overdoos.overallwidth))), 1/2) * 3 + #dim GrondOppervlakKleinerDanHalvePalletFactor As %Integer = $Select(((..GrootsteDimensieGrondvlak < (..#MaximumVerpakkingDiepteVoorEuropallet)) && (..TweedeGrootsteDimensieGrondvlak < (..#MaximumVerpakkingBreedteVoorEuropallet / 2))):-200, 1:0) + #dim VierkantigheidFactor As %Integer = ##class(TECH.Math).Max(##class(TECH.Math).Max(##class(TECH.Math).Abs(Overdoos.overalllength - Overdoos.overallwidth), ##class(TECH.Math).Abs(Overdoos.overalllength - Overdoos.overallheight)), ##class(TECH.Math).Abs(Overdoos.overallheight - Overdoos.overallwidth)) * 0.5 + #dim HoogteKleinerDan33cm As %Integer = $Select(Overdoos.overallheight < 330:-100, 1:0) + + //Score is nog te bekijken op de optboxbig rechtstreeks + ;set t = VolumeFactor + GrondOppervlakFactor + StabiliteitFactor + TotaleKartonOppervlakteFactor + GrondOppervlakKleinerDanHalvePalletFactor + VierkantigheidFactor + HoogteKleinerDan33cm + ;Do ##class(Tools.Wlip).%New(110).String(t _ " Vol " _VolumeFactor _" GrondOpp "_ GrondOppervlakFactor _" Stab "_ StabiliteitFactor _" TotKartonOpp "_ TotaleKartonOppervlakteFactor _" GrondOppKleinerDanHalvePlt "_ GrondOppervlakKleinerDanHalvePalletFactor _" Vierkantigheid "_ VierkantigheidFactor_" Hoogte<330 "_ HoogteKleinerDan33cm) + Quit (VolumeFactor + GrondOppervlakFactor + StabiliteitFactor + TotaleKartonOppervlakteFactor + GrondOppervlakKleinerDanHalvePalletFactor + VierkantigheidFactor + HoogteKleinerDan33cm) +]]> + + + +BoxDataLijst:%ListOfObjects +1 + + + + +BoxDataLijst:%ListOfObjects +1 +%ListOfObjects + + + + +BoxDataLijst:%ListOfObjects +1 +%ListOfObjects + 0) { + Do GegroepeerdeBoxDataLijst.Insert(BoxDataVoorGegroepeerdeMatten) + } + + While BoxDataIterator.HasNext() { + #dim BoxData As DS.Prod.OptiBox.BoxDataMetID = BoxDataIterator.Next() + #dim BoxDataGroep As DS.Prod.OptiBox.BoxData + + If $$$Not(BoxData.VolumeVan = "") + { + If $$$Not(BoxData.VolumeVan.%Id() = "OL||Antislipmat groep||1") { + Do ##class(TECH.ExceptionHandler).Throw(##class(TECH.Exceptions.UnimplementedException).%New("Groepering "_ BoxData.VolumeVan.%Id() _"' is nog niet geïmplementeerd bij de optimalisatie van de verpakking van de orgalux bonnen.")) + } + } Else { + Do GegroepeerdeBoxDataLijst.Insert(BoxData) + } + } + + Quit GegroepeerdeBoxDataLijst +]]> + + + +BonID:%String +1 +%ListOfObjects + 1)) { //Verdelen in evenredige stapels + #dim GelijkVerdeeldeAantallenLijstIterator As TECH.Iterator = ..GeefGelijkVerdeeldeAantallenLijstIterator(Qty, BoxData.MaxCombinAantal) + While GelijkVerdeeldeAantallenLijstIterator.HasNext() { + #dim Aantal As %Integer = GelijkVerdeeldeAantallenLijstIterator.Next() + Set Params("PRODAANTAL") = Aantal + Set Params("AANTAL") = Aantal + Set BoxData.Aantal = Aantal / BoxData.MaxCombinAantal //???????????? TODO + Set BoxData.Breedte = ..CalcMetDefault(1, BoxData.BreedteExec, .Params) + Set BoxData.Diepte = ..CalcMetDefault(1, BoxData.DiepteExec, .Params) + Set BoxData.Hoogte = ..CalcMetDefault(1, BoxData.HoogteExec, .Params) + Do BoxDataLijst.Insert(BoxData) + } + } Else { + Set Params("PRODAANTAL") = Qty + Set Params("AANTAL") = Qty + Set BoxData.Aantal = Qty + Set BoxData.Breedte = ..CalcMetDefault(1, BoxData.BreedteExec, .Params) + Set BoxData.Diepte = ..CalcMetDefault(1, BoxData.DiepteExec, .Params) + Set BoxData.Hoogte = ..CalcMetDefault(1, BoxData.HoogteExec, .Params) + + If (##class(TECH.Math).Max(BoxData.Breedte, BoxData.Diepte) > ..#MaximumVerpakkingBreedteVoorEuropallet) && (##class(TECH.Math).Min(BoxData.Breedte, BoxData.Diepte) > ..#MaximumVerpakkingDiepteVoorEuropallet) { + Do ..Logger.Debug("PastProductOpEuropallet", "Product "_PRNr_" past niet op een europallet voor bon " _ BonID_".") + } Else { + Do BoxDataLijst.Insert(BoxData) + } + } + } + } + + Quit BoxDataLijst +]]> + + + +BoxData:DS.Prod.OptiBox.BoxData +DS.Prod.OptiBox.BoxDataMetID + + + + +BonID:%String +1 +TECH.Iterator + + + + +TeVerdelenGetal:%Integer,MaximaleVerdeling:%Integer +1 +TECH.Iterator + MaximumProductenPerStapel) { + Do AantallenLijst.Insert(MaximumProductenPerStapel) + Set TeVerdelenGetal = TeVerdelenGetal - MaximumProductenPerStapel + } + + If (TeVerdelenGetal > 0) { + Do AantallenLijst.Insert(TeVerdelenGetal) + } + + Quit ##class(TECH.ListIterator).%New(AantallenLijst) +]]> + + + + +1 + + + + + +Berekenen van een expressie door gebruik te maken van de waarden in Params + +0 +",1)_"> "_Expression + New msg + Set $ECODE="" + Set msg="EXECUTE FOUT: "_Expression_$$ArrayToText^vhLib("Params",.Params) + Do WLFMT^vhDBG(msg,"B-Red") + Set Result="ERR" + Quit Result +]]> + + + +Status:%Status,HttpRequest:%Net.HttpRequest +1 + + + + +CubeIQRequest:APPS.Verpakking.dto.CubeIQ.Request +1 +%String + + + + +JsonStream:%Stream,RootObjectClassname:%String +1 +TECH.RegisteredObject + + + + +1 +%TimeStamp + + + + +Getal:%Integer,TotaleLengteGetal:%Integer +1 +%String + + + + +ProductID:%Integer +1 +TECH.Integer + + + + +ObjRef:%String +1 +TECH.Integer + + + + + + Index: vhTest/Fake/APPS/Verpakking/OrgaluxBonOptimizer.cls.xml =================================================================== diff -u --- vhTest/Fake/APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (revision 0) +++ vhTest/Fake/APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (revision 72244) @@ -0,0 +1,25 @@ + + + + +Deze klasse werd automatisch gegenereerd en onderhouden, nieuwe methodes worden automatisch bijgevoegd, bestaande blijven zoals ze zijn. +Een hercompilatie van de basis interface - met een correct werkende studiohook ( v2.20 ++ ) - zorgt ervoor dat deze klasse aangepast wordt +1 +APPS.Verpakking.OrgaluxBonOptimizer + + +Bon:DOM.VKP.Bon +%ListOfObjects + + + + +BONNr:%String + + + + + +