Production Process Steering - Tandembox
Genereert van een Toelevering de verpakkingsdefinitie
serial
Prod.Product,BL.PPS.OL,BL.Prod.OptiBox,BL.Sys.Toegang,BL.Sys.Proxy,BL.Derde.KlantSpecifiek,vhLib.Macro
1
%SerialObject
Cutting simulatie
0
\
%String
"VH"
Definities voor de labelprinter
Parameter LabelPrinter1 = "\\FOP_disabled\OL Verpak2 6x10";
Parameter LabelPrinter2 = "\\FOP_disabled\OL Verpak2 6x10";
Parameter LabelPrinter1 = "OrgaluxColor";
ORGALUX1 KLEUR
ORGALUX2 KLEUR
\\FOP_disabled\OL Verpak3 6x10
TAORIndeling
OLDoos
TAORIndelingDoos
OLProduct
TAORIndelingProduct
Waarde 1, 2, 3, TAOR, dient bij initialisatie ingevuld te worden. Voor welke inpaktafel de output bedoeld is
%String
"1"
%Integer
%String
%Integer
%String
%XML.DataSet
Persistent storage
bestaat uit 4 delen:
1) type "O" (Overdoos), "OE" (Overdoos Einde), "P" (product)
2) SnijId
3) ProductSequence
4) Abrev (Pos 4-11 van de KortTekst)
%String
list
BL.PPS.OL.Inpak.MultiCountBepaler
1
1
TECH.String
1
DOM.PM.ProductTypeAPI
1
1
DOM.VKP.VerkoopAPI
1
1
DOM.VKP.impl.BonTypeAPI
1
1
%String
1
%String
1
%String
1
%String
Open : Initialiseren van object (properties + ophalen sequentie)
BONNr:%String,InpakTafelNr:%String=1
BL.Sys.Proxy.pxStatus
1
#dim OverdoosID As %String = $LI(lbOverdozen,1)
#dim lbProducten As %List = ..GetProducten(OverdoosID)
Quit:lbProducten=""
Quit:$LL(lbProducten)>Max
#dim SnijDataID As %String = $LI(lbProducten,1)
#dim Status As BL.Sys.Proxy.pxStatus = ..BlokkeerVerpakking(OverdoosID)
]]>
GetBONOverview : XmlDataset opbouwen met info alle te verpakken BONNr's
BL.Sys.Proxy.pxStatus
List : XmlDataset opbouwen met info alle te verpakken dozen
BL.Sys.Proxy.pxStatus
0) of achterwaarts (pDir<0)
De nodige snij- en (etiket)print-opdrachten worden verstuurd]]>
BL.Sys.Proxy.pxStatus
0)&&(..CurID >= ..SequenceList.Count())) $$$pxStatusErrorEx("Kan pointer niet verder voorwaarts verplaatsen", "..CurID="_..CurID_" ..SequenceList.Count()="_..SequenceList.Count()_" Dir="_pDir)
Quit:((pDir<1)&&(..CurID <= 1)) $$$pxStatusErrorEx("Kan pointer niet verder achterwaarts verplaatsen", "..CurID="_..CurID_" Dir="_pDir)
// pointer incrementeren (of decrementeren)
Set ..CurID=$S(pDir>0:..CurID+1,1:..CurID-1)
// we hebben een valid item, meer info opvragen en de juiste snijopdracht uitvoeren
#dim SnijItem As %List =..SequenceList.GetAt(..CurID)
Set pxInpakInfo = ##class(BL.PPS.OL.pxInpakInfo).%New()
#dim pxStatus As %Status = ..GetInfo(SnijItem, .pxInpakInfo,..CurID)
Quit:($$$pxStatusIsERR(pxStatus)) pxStatus
Do ..BepaalOutput(pxInpakInfo.PRNr)
// Snijopdrachten :
// - Een overdoos moet gesneden worden, er mag dan onmiddellijk verdergegaan worden tot het eerste item
// van die doos, die mag ook gesneden worden
// - Een product mag gesneden worden (als minstens 1 item is waarbij HasSnijDef=true
If ($LI(SnijItem,$$$lbPosType) = "O") {
Do ..PrintAllEtiket()
Do ..PrintAlleEtikettenOpnieuwIndienNodigOpOverdoosVoorKlant( pxInpakInfo )
Set pxInpakInfo.Status = $$$StatusStartOverdoos
Set pxStatus = ..SnijOverdoosStart($LI(SnijItem,$$$lbPosSnijId))
Set:$$$pxStatusIsOK(pxStatus) pxStatus = ..Next(pDir, .pxInpakInfo)
} ElseIf ($LI(SnijItem,$$$lbPosType) = "OE") {
Set pxInpakInfo.Status = $S((..CurID=..SequenceList.Count()):$$$StatusEindeBon,1:$$$StatusEindeOverdoos)
Set pxStatus = ..SnijOverdoosEnd($LI(SnijItem,$$$lbPosSnijId))
do:$$$pxStatusIsOK(pxStatus) ..PrintOverdoos(pxInpakInfo, 1, 0)
Do:pxInpakInfo.Status=$$$StatusEindeBon %blProdOptiBoxSnijden.StatusAllFinished("L",..BONNr)
} ElseIf ($LI(SnijItem,$$$lbPosType) = "P") {
Set pxInpakInfo.Status = $$$StatusProduct
If 'pxInpakInfo.VoorVerpakt {
Set pxStatus = ..SnijProduct($LI(SnijItem,$$$lbPosSnijId))
#dim LabelPrinter As BL.Sys.LabelPrinter = ##class(BL.Sys.LabelPrinter).Instantiate()
do:$$$pxStatusIsOK(pxStatus) ..PrintProduct(LabelPrinter, pxInpakInfo, 0)
Do ..PrintEnResetLabelPrinter(.LabelPrinter)
}
}
#dim xmlst As %Status = pxInpakInfo.XMLExportToString(.xmlOut,,"literal,indent")
#dim xmlOut As %String = $Extract(xmlOut,0,32000) // Voorkomen dat we over de maximum length van een String gaan.
Quit:($$$pxStatusIsERR(pxStatus)) pxStatus
Quit pxStatus
]]>
pxInpakInfo:BL.PPS.OL.pxInpakInfo
Refresh : meest actuele data ophalen van current element
BL.Sys.Proxy.pxStatus
BL.Sys.Proxy.pxStatus
HersnijDoos : Snijopdracht versturen voor actuele productlijn
todo : nog verder afwerken
pxInpakRedo:BL.PPS.OL.pxInpakRedo
BL.Sys.Proxy.pxStatus
0 do
. . Set lbSnijIDs = lbSnijIDs_$LB($LB(pxInpakRedo.Detail.GetAt(i).SnijID, +pxInpakRedo.Detail.GetAt(i).AantalRedo))
Do %blProdOptiBoxSnijden.SnijReDo(..SnijMachineID, lbSnijIDs, 9, 1)
Quit $$$pxStatusOK
]]>
HersnijNieuweDoos : Doos hersnijden volgens zijn nieuwe definitie
pxInpakRedo:BL.PPS.OL.pxInpakRedo
BL.Sys.Proxy.pxStatus
0)) do
. . Do ##class(BL.PPS.OL.OptiBox).SnijBoxDirect(SnijData.PRNr, +pxInpakRedo.Detail.GetAt(i).AantalRedo, ..SnijMachineID)
Quit $$$pxStatusOK
]]>
HerDrukEtiket : Een nieuwe PrintOpdracht voor etiketten maken
Ofwel is snijID ingevuld, dan herprinten we betreffend etiket
Ofwel is er niets ingevuld, en herprinten we etiket van de Current Id
pSnijID:%String,pPRNr:%String
BL.Sys.Proxy.pxStatus
1
BlokkeerVerpakking : Status van een doos op "Finished" forceren, zodat de doos niet zal gesneden worden
pSnijID:%String
BL.Sys.Proxy.pxStatus
StartBerekening : Optimalisatieberekening opstarten voor een Bon
pBONNr:%String
BL.Sys.Proxy.pxStatus
GetInfo : Alle info van een product ophalen en in een structuur steken die door de WS en zijn clients kan begrepen worden
Remark : woordje uitleg bij de velden :
- ProdQty ($$$snProductAantal) = aantal producten dan in 1 doos moet verpakt worden
- QtyRequired ($$$snAantalGevraagd) = Het aantal kartons dat moet versneden worden (berekend door optimizer)
- QtyRequested ($$$snAantalQueued) = Het aantal snijopdrachten dat naar snijmachine gestuurd is
- QtyFinished ($$$snAantalFinished) = Het aantal afgewerkte snijopdrachten
1
BL.Sys.Proxy.pxStatus
", 1)
Set ProductInfo.LangTekst=ProductInfo.LangTekst_"
"_"Onderdelen:"_"
"_..BouwStenenTekst(ProductInfo.PRNr,"
"," : ") ;""
Set ProductInfo.LangTekst=ProductInfo.LangTekst_"
Afmeting nu te stapelen:
"_..GeefAfmetingInfo(MasterSnijData)
Set ProductInfo.Image=..GeefProductAfbeelding(($LG(Prd,1)),##class(APPS.common.enu.Toepassing).Flex())
Set ProductInfo.Aantal = $LG(Prd,2)
do pxInpakInfo.ProductInfo.Insert(ProductInfo)
}
Set pxInpakInfo.KlantNaam = ..KlantNaam
Set pxInpakInfo.BONNr = ..BONNr
Set pxInpakInfo.PRNr = $LG(arInfo,$$$snPRNr)
Set pxInpakInfo.ProductSequence = SnijItemProductSequence
Set pxInpakInfo.AantalProducten = $LG(arInfo,$$$snProductAantal)
Set pxInpakInfo.AantalDozen = $LG(arInfo,$$$snAantalGevraagd)
Set ProductSnijData = ##class(DS.Prod.OptiBox.SnijData).%OpenId(SnijItemId)
If ((##class(TECH.StringUtils).Contains(ProductSnijData.BoxImage, ##class(TECH.Config.ConfigMgr).Instance().GetString("APPS.Verpakking.OrgaluxBonOptimizer.ImageURL")))
|| (##class(TECH.StringUtils).Contains(ProductSnijData.StapelImage, ##class(TECH.Config.ConfigMgr).Instance().GetString("APPS.Verpakking.OrgaluxBonOptimizer.ImageURL")))) {
Set pxInpakInfo.BoxImage = ProductSnijData.BoxImage
Set pxInpakInfo.StapelImage = ProductSnijData.StapelImage
} Else {
Set pxInpakInfo.BoxImage = %blProdOptiBoxSnijden.GetPathAndFile($$$URL(ProductSnijData.BoxImage),"FLEX")
Set pxInpakInfo.StapelImage = %blProdOptiBoxSnijden.GetPathAndFile(ProductSnijData.StapelImage,"FLEX")
}
//Alle elementen uit arInfo in de px steken
// product is voorverpakt, tenzij er een item bij is waarvoor een doos moet gesneden worden
Set pxInpakInfo.VoorVerpakt = 1
#dim SnijID As %String = ""
For set SnijID=$Order(arInfo(SnijID)) quit:SnijID="" do
. Set dtl = ##class(BL.PPS.OL.pxInpakInfoDtl).%New()
. Set dtl.SnijID = SnijID
. Set dtl.BoxUsage = $LI(arInfo(SnijID),$$$snLabel)
. Set dtl.AantalGevraagd = $LI(arInfo(SnijID),$$$snAantalGevraagd)
. Set dtl.AantalAf = $LI(arInfo(SnijID),$$$snProductAantal)
. if $LI(arInfo(SnijID),$$$snHasSnijDef) do
. . Set pxInpakInfo.VoorVerpakt = 0
. . do pxInpakInfo.Detail.Insert(dtl)
Set pxInpakInfo.AantalIdentiekeProducten = 1
if (SequenceID > 0) do
. Set pxInpakInfo.AbrevCurrent = $LG(..SequenceList.GetAt(SequenceID),$$$lbPosAbrev)
. Set:SequenceID>1 pxInpakInfo.AbrevPrevious = $LG(..SequenceList.GetAt(SequenceID-1),$$$lbPosAbrev)
. Set:SequenceID<..SequenceList.Count() pxInpakInfo.AbrevNext = $LG(..SequenceList.GetAt(SequenceID+1),$$$lbPosAbrev)
. if (pxInpakInfo.AbrevCurrent'="") do
. . Set pxInpakInfo.AantalIdentiekeProducten = 0
. . For i=1:1:..SequenceList.Count() do
. . . Set:($LG(..SequenceList.GetAt(i),$$$lbPosAbrev)=$LG(..SequenceList.GetAt(SequenceID),$$$lbPosAbrev)) pxInpakInfo.AantalIdentiekeProducten = pxInpakInfo.AantalIdentiekeProducten + 1
Quit $$$pxStatusOK
]]>
SnijData:DS.Prod.OptiBox.SnijData
1
%String
PRNr:%String,LijnSep:%String,KolomSep:%String
1
"_Txt_""
]]>
GetKortTekstFromSnijID : KortTekst van het product ophalen adhv snijID
SnijItemID:%String
1
%String
Ophalen van de overdozen lijst uit de optimalisatie
1
%List
OverdoosID:%String
1
SnijID:%String
1
BL.Sys.Proxy.pxStatus
SnijID:%String
1
BL.Sys.Proxy.pxStatus
SnijID:%String
1
BL.Sys.Proxy.pxStatus
Bij opstarten van de leveringsbon worden all etiketten eerst gedrukt
Dit omdat de kleuren labelprinter veel trager is dan een zwartwit labelprinter
Forced:%Boolean
1
1) && ModuloFrequentieOpAantalMultiCount = 0)
){
Do ..PrintProduct(LabelPrinter,pxInpakInfo,$G(Forced))
}
Do:('isVerzameldoos) GeprinteProducten.Verhoog(pxInpakInfo.PRNr)
}
}
Do ..PrintEnResetLabelPrinter(.LabelPrinter)
Set ..CurID = MemID ; terugzetten
]]>
1
%Boolean
1
Etiket printen voor overdoos
pxInpakInfo:BL.PPS.OL.pxInpakInfo,Aantal:%Integer,Forced:%Boolean
1
Etiket(ten) printen voor inhoud van 1 doos
ofwel (meestal) : 1 etiket voor 1 product
ofwel (Antislipmatten) : 1 etiket per product in de doos
LabelPrinter:BL.Sys.LabelPrinter,pxInpakInfo:BL.PPS.OL.pxInpakInfo,Forced:%Boolean
1
Etiket printen voor overdoos zonder bijkomende controle
BONNr:%String,Aantal:%Integer
Etiket(ten) printen voor 1 product zonder bijkomende controle)[ Private ]
Set bl=##class(BL.PPS.OL.Inpak).%New()
Set bl.Output=3
For I=1:1:15 D bl.PrintProductBare(371065,379831,1)
BonID:%String,ProductID:%String,Aantal:%Integer=1
BonID:%String,ProductID:%String,Aantal:%Integer
1
BL.Sys.LabelPrinter
LabelPrinter:BL.Sys.LabelPrinter,BonID:%String,ProductID:%String,Aantal:%Integer
1
BL.Sys.LabelPrinter
BonID:%String,ProductID:%String,Aantal:%Integer
1
%ListOfObjects
ELEMENTTYPE="BL.Sys.pxLabel"
1 {
#dim Step As %Integer
For Step=1:1:MultiCount {
Set pxLabel.MultiDeel = Step_"/"_MultiCount
Do pxLabels.Insert(pxLabel.%ConstructClone())
}
}Else{
Do pxLabels.Insert(pxLabel.%ConstructClone())
}
Quit pxLabels
]]>
ProductID:TECH.String
1
BonID:%String,ProductID:%String,Aantal:%Integer
1
BL.Sys.pxLabel
1 Set pxLabel.MultiDeel="x"_Aantal, pxLabel.Aantal=1
Set pxLabel.Device=..LabelDev()
If ..ProductTypeAPI.IsTAORIndelingProduct(ProductID) {
Set pxLabel.Layout = ..#LabelProductTAORIndeling
}Else{
Set pxLabel.Layout = ..#LabelProductOrgalux
}
Set pxLabel.Layout = pxLabel.Layout_##class(BL.Sys.LabelPrinter).PrinterLabelSize(pxLabel.Device)
Quit pxLabel
]]>
PRNr:%String,pxLabel:BL.Sys.pxLabel
1
Emum : "BARTENDER","FLEX" ]]>
ProductID:%String,Toepassing:APPS.common.enu.Toepassing
1
IsTAORIndeling:%Boolean,BONNr:%String
1
TECH.String
1
LabelPrinter is afhankelijk van de werkpost bepaalt door property Output
1
*************************************************************************** ListQuery
%Query
1
0
%Status
1
ListQueryExecute
%Status
1
ListQueryExecute
%Status
*************************************************************************** StapelImagesQuery
%Query
1
0
%Status
1
StapelImagesQueryExecute
%Status
1
StapelImagesQueryExecute
%Status
Zie ook de gelijknamigee method (niet de query) "GetBONOverview" (N.B. Studio toont enkel de query via Ctrl+G)!
%Query
1
0
%Status
1
GetBONOverviewExecute
%Status
1
GetBONOverviewExecute
%Status
1
BONNr:%String
D,Q,U
1
Datum:%Date,DueTime:%String,Cnt:%Integer
%Boolean
1
BL.Sys.Proxy.pxStatus
1
BONNr:%String
%String
w ##class(BL.PPS.OL.Inpak).GetBonStatus(303276)
1
BONNr:%String
%String
geen status
// 2. als er min. 1 Error is, is heel de bon in Error --> E
// 3. als alle rijen Finnished of Volume of Blocked zijn, is heel de bon Finished --> F
// 4. Als sommige rijen Finnished of Queued zijn is de bon partieel verwerkt --> P
// 5. Anders is ie wachtend --> W
if TerugName Do
. Set retval="-"
else if Cnt = 0 do
. Set retval = " "
else if ($Get(arrCntST($$$ssError),0) > 0) do
. Set retval=$$$ssError
else if (($Get(arrCntST($$$ssFinished),0) + $Get(arrCntST($$$ssVolume),0) + $Get(arrCntST($$$ssBlocked),0)) = Cnt),$Get(arrCntST($$$ssFinished),0) Do
. Set retval=$$$ssFinished
else if (BonProdCnt'=SnijProdCnt) do
. Set retval=$$$ssMissing
else if (($Get(arrCntST($$$ssFinished),0) > 0) || ($Get(arrCntST($$$ssQueued),0) > 0) ) do
. Set retval=$$$ssPartieel
else do
. Set retval=$$$ssWachtend
quit retval
]]>
1
SessionID:%String
Ophalen van de werkvolgorde :
Overdoos 1
Product 1.1
Product 1.2
Overdoos 2
Product 2.1
Product 2.2
met extra informatie als product, aantal, afgewerkt aantal, status
parameter : InclFinished ook de reeds afgewerkte opnemen
InclVolume ook de Volume (voor verpakte dozen) moeten opgenomen worden
%Query
InclFinished:%Boolean,InclVolume:%Boolean
Als de gebruiker op Prev/Next klikt moet de vorige/volgende taak opgehaald worden en de proxy klasse ingevuld met de taakinformatie
In de persistent storage wordt de taaksequence opgeslagen.
Key:%String,Dir:%String
%RegisteredObject
%Library.CacheSerialState
InpakState
^BL.PPS.OL.InpakS
"BL.PPS.OL.Inpak"
BONNr
Count
CurID
ListResult
SequenceList
KlantNaam
SnijMachineID
Output
BonTypeAPI
InpakTafelNr