From 57d0d2d7a076951b3497c635232f773ebedbfa58 Mon Sep 17 00:00:00 2001
From: hongji.li <hongji.a.li@capgemini.com>
Date: 星期四, 13 六月 2024 15:08:12 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev

---
 _Main/BL/Type_Operation/_ROOT_Type_Operation.qbl                                                              |    6 +
 _Main/BL/Type_Operation/Method_Copy.qbl                                                                       |   95 +++++++++++++++++++++++
 _Main/BL/Type_OperationBOM/Attribute_OldStockingPointID.qbl                                                   |    8 ++
 _Main/BL/InfoMessages.qbl                                                                                     |    4 +
 _Main/BL/Type_Routing/StaticMethod_ThermalTrialRatio.qbl                                                      |   53 +++++++++++++
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlMaxCapacity.def          |    1 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def                       |   15 ---
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Response_pnlActions_btnOk_OnClick.def |    7 +
 _Main/BL/Type_Routing/StaticMethod_ValidateThermalTrialRatio.qbl                                              |   25 ++++++
 _Main/BL/Type_OperationBOM/_ROOT_Type_OperationBOM.qbl                                                        |    6 +
 _Main/BL/Type_Routing/_ROOT_Type_Routing.qbl                                                                  |    6 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRatio.def                |    1 
 12 files changed, 213 insertions(+), 14 deletions(-)

diff --git a/_Main/BL/InfoMessages.qbl b/_Main/BL/InfoMessages.qbl
index e9d598e..ee5f15b 100644
--- a/_Main/BL/InfoMessages.qbl
+++ b/_Main/BL/InfoMessages.qbl
@@ -106,4 +106,8 @@
   {
     DefaultText: 'The Event type of binding Event exists.'
   }
+  InfoMessage MP_Routing_RequiredField
+  {
+    DefaultText: 'All fields Required This parameter is mandatory.'
+  }
 }
diff --git a/_Main/BL/Type_Operation/Method_Copy.qbl b/_Main/BL/Type_Operation/Method_Copy.qbl
new file mode 100644
index 0000000..738acfd
--- /dev/null
+++ b/_Main/BL/Type_Operation/Method_Copy.qbl
@@ -0,0 +1,95 @@
+Quintiq file version 2.0
+#parent: #root
+Method Copy (
+  RoutingStep newroutingstep,
+  StockingPoint_MP stockingpoint,
+  String id,
+  Unit unit
+) as Operation
+{
+  Description: 'Duplicate the entire operation (including input product groups + input output products + costs)'
+  TextBody:
+  [*
+    idholder := this.MacroPlan().IDHolder();
+    //unit := this.Unit();
+    
+    // Create new Operation with information of this Operation
+    newoperation := Operation::Create( id,
+                                       unit,
+                                       id,
+                                       newroutingstep,
+                                       this.LeadTime(),
+                                       this.StandardDeviationLeadTime(),
+                                       this.Throughput(),
+                                       this.HasUserLotSize(),
+                                       this.UserMinimumQuantity(),
+                                       this.HasUserMaximumQuantity(),
+                                       this.UserMaximumQuantity(),
+                                       this.UserLotSize(),
+                                       this.CO2Emission(),
+                                       false,
+                                       false );
+    
+    // Copy OperationCosts of this Operation to the new Operation
+    traverse( this, OperationCost, operationcost )
+    {
+      // Select UnitAccount
+      accountassignment := select( unit, UnitAccount, ua,
+                                   ua.Account_MP() = operationcost.AccountAssignment().Account_MP()
+                                   and ua.CostDriver() = operationcost.AccountAssignment().CostDriver() );
+    
+      // Create OperationCost for the new Operation if UnitAccount is found
+      if( not isnull( accountassignment ) )
+      {
+        OperationCost::Create( idholder.GetOperationCostID(),
+                               newoperation,
+                               accountassignment.Account_MP(),
+                               accountassignment.CostDriver(),
+                               operationcost.Start(),
+                               operationcost.TimeUnit(),
+                               operationcost.LengthOfTime(),
+                               operationcost.Cost(),
+                               false );
+      }
+    }
+    
+    // Copy OperationBOM from this Operation to the new Operation
+    traverse( this, OperationBOM, ob, not ob.IsInput() )
+    {
+      pisp := ob.PISPNodeInRouting().ProductInStockingPoint_MP();
+      newpisp := pisp.Product_MP().AddToStockingPoint( stockingpoint );
+    //  info( 'last----', ob.IsInput(), ',', ob.OperationID(), ',', ob.ProductID(), ',', ob.StockingPointID(), ',', pisp.ProductID(), ',', pisp.StockingPointID() );
+      OperationBOM::Create( newoperation, newpisp,
+                            not ob.IsInput(),
+                            ob.InputGroupID(),
+                            ob.HasUserInputQuantity(),
+                            ob.Quantity(),
+                            ob.MinQuantityInGroup(),
+                            ob.MaxQuantityInGroup(),
+                            ob.IsExcluded(),
+                            false );
+    //  output.PISPNodeInRouting().Update( pisp.Product_MP(), stockingpoint );
+    //  info( 'new output----', output.IsInput(), ',', output.OperationID(), ',', output.ProductID(), ',', output.StockingPointID() );
+      OperationBOM::Create( newoperation, ob.PISPNodeInRouting().ProductInStockingPoint_MP(),
+                            ob.IsInput(),
+                            ob.InputGroupID(),
+                            ob.HasUserInputQuantity(),
+                            ob.Quantity(),
+                            ob.MinQuantityInGroup(),
+                            ob.MaxQuantityInGroup(),
+                            ob.IsExcluded(),
+                            false );
+    //  input.UpdateTypeIndex( input.OperationID(), input.ProductID(), ob.OldStockingPointID(), false );
+    //  info( 'new input----', input.IsInput(), ',', input.OperationID(), ',', input.ProductID(), ',', input.StockingPointID() );
+    }
+    
+    // Copy OpearationInputGroup of this Operation to the new Operation
+    traverse( this, OperationInputGroup, inputgroup )
+    {
+      inputgroup.Copy( newoperation );
+    }
+    
+    
+    return newoperation;
+  *]
+}
diff --git a/_Main/BL/Type_Operation/_ROOT_Type_Operation.qbl b/_Main/BL/Type_Operation/_ROOT_Type_Operation.qbl
new file mode 100644
index 0000000..5bb7d3e
--- /dev/null
+++ b/_Main/BL/Type_Operation/_ROOT_Type_Operation.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization Operation #extension
+{
+}
diff --git a/_Main/BL/Type_OperationBOM/Attribute_OldStockingPointID.qbl b/_Main/BL/Type_OperationBOM/Attribute_OldStockingPointID.qbl
new file mode 100644
index 0000000..68365b3
--- /dev/null
+++ b/_Main/BL/Type_OperationBOM/Attribute_OldStockingPointID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute OldStockingPointID
+{
+  #keys: '3[415136.0.782845096][415136.0.782845095][415136.0.782845097]'
+  Description: '娣诲姞鐑紡涔嬪墠鐨勫簱瀛樼偣'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_OperationBOM/_ROOT_Type_OperationBOM.qbl b/_Main/BL/Type_OperationBOM/_ROOT_Type_OperationBOM.qbl
new file mode 100644
index 0000000..76fbb55
--- /dev/null
+++ b/_Main/BL/Type_OperationBOM/_ROOT_Type_OperationBOM.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization OperationBOM #extension
+{
+}
diff --git a/_Main/BL/Type_Routing/StaticMethod_ThermalTrialRatio.qbl b/_Main/BL/Type_Routing/StaticMethod_ThermalTrialRatio.qbl
new file mode 100644
index 0000000..54256b2
--- /dev/null
+++ b/_Main/BL/Type_Routing/StaticMethod_ThermalTrialRatio.qbl
@@ -0,0 +1,53 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ThermalTrialRatio (
+  Routing routing,
+  Number capacity,
+  Date start,
+  Date end,
+  Number ratio
+) as owning Routings
+{
+  Description: 'Check input is valid'
+  TextBody:
+  [*
+    // Adhi Feb-10-2016 (created)
+    thermaltrial := '鐑紡';
+    newroutings := construct( Routings );
+    unit := selectobject( routing.MacroPlan(), Unit, unit, unit.ID() = thermaltrial and unit.HasCapacityTypeQuantity() );
+    newrouting := routing.Copy();
+    routingstep := newrouting.LastStep();
+    //info( '------------------', routingstep.Tool(), ',', unit.ID() );
+    newroutingstep := RoutingStep::Create( newrouting, thermaltrial, routingstep.Tool(), false );
+    
+    traverse( routingstep, Operation, operation ){
+      id := Operation::GetConcatenatedID( newrouting.ID(), newroutingstep.Name(), unit.ID() );
+    //  info( '------------------', operation.Name(), routingstep.Name(), newroutingstep.Name() );
+      stockingpoint := StockingPoint_MP::FindCreateUpdate( routing.MacroPlan(), thermaltrial, unit, newrouting, true );
+      
+      traverse( operation, OperationBOM, obom, not obom.IsInput() ){
+        pisp := obom.PISPNodeInRouting().ProductInStockingPoint_MP();
+    //    info( 'before----', ',', obom.StockingPointID(), pisp.StockingPointID(), pisp.ProductID() );
+        obom.OldStockingPointID( obom.StockingPointID() );
+        newpisp := pisp.Product_MP().AddToStockingPoint( stockingpoint );
+    //    obom.PISPNodeInRouting().ProductInStockingPoint_MP( relset, newpisp );
+        obom.PISPNodeInRouting().Update( newpisp.Product_MP(), newpisp.StockingPoint_MP() );
+    //    afterpisp := obom.PISPNodeInRouting().ProductInStockingPoint_MP();
+        obom.UpdateTypeIndex( obom.OperationID(), obom.ProductID(), stockingpoint.ID(), obom.IsInput() );
+    //    info( 'after----', obom.StockingPointID(), afterpisp.StockingPointID(), afterpisp.ProductID() );
+      }
+    //  info( '------------------------------', operation.SourceOperationLink( relsize ) );
+      
+      operation.Copy( newroutingstep, stockingpoint, id, unit );
+    }
+    
+    traverse( newrouting, RoutingStep.Operation.SourceOperationLink, ol )
+    {
+      ol.SynchronizeAll( false );
+    }
+    
+    newroutings.Add( routing );
+    
+    return &newroutings;
+  *]
+}
diff --git a/_Main/BL/Type_Routing/StaticMethod_ValidateThermalTrialRatio.qbl b/_Main/BL/Type_Routing/StaticMethod_ValidateThermalTrialRatio.qbl
new file mode 100644
index 0000000..ad8089d
--- /dev/null
+++ b/_Main/BL/Type_Routing/StaticMethod_ValidateThermalTrialRatio.qbl
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ValidateThermalTrialRatio (
+  output String feedback_o,
+  Routing routing,
+  Number capacity,
+  Date start,
+  Date end,
+  Number ratio
+) declarative remote as Boolean
+{
+  Description: 'Check input is valid'
+  TextBody:
+  [*
+    // Adhi Feb-10-2016 (created)
+    feedback_o := '';
+    
+    if( isnull( routing ) or capacity < 1 or start = Date::MinDate() or end = Date::MinDate() or ratio < 1 ){
+      feedback_o := Translations::MP_Routing_RequiredField();
+    }
+    
+    
+    return feedback_o = '';
+  *]
+}
diff --git a/_Main/BL/Type_Routing/_ROOT_Type_Routing.qbl b/_Main/BL/Type_Routing/_ROOT_Type_Routing.qbl
new file mode 100644
index 0000000..9aa44b8
--- /dev/null
+++ b/_Main/BL/Type_Routing/_ROOT_Type_Routing.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Routing #extension
+{
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlMaxCapacity.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlMaxCapacity.def
index 041a710..c4daa9b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlMaxCapacity.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlMaxCapacity.def
@@ -12,6 +12,7 @@
       Properties:
       [
         Label: 'Maximum thermal trial capacity'
+        Mask: 'NUMBER'
         Taborder: 0
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRatio.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRatio.def
index dbad8e2..f236d2a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRatio.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRatio.def
@@ -22,6 +22,7 @@
       Properties:
       [
         Label: '1:'
+        Mask: 'NUMBER'
         Taborder: 1
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def
index 013d36c..352eda7 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def
@@ -12,18 +12,9 @@
     
     data := dhDialogData.Data();
     
-    //if( isnull( data.WrappedInstance() ) ) // New
-    //{
-    //  // When create product, parent relation must be null (as server method has logic to detect parent change using this relation)
-    //  data.Parent( relflush );
-    //  data.Commit();
-    //  dhForm.Data().ListEventType().SelectByKey( data.WrappedInstance().Key() );
-    //}
-    //else
-    //{
-    //  LibCal_EventType::Update( dhDialogData.Data().WrappedInstance(), efID.Text(), efName.Text()
-    //                            ,guard( selParent.Data(), null(  LibCal_EventType ) ) );
-    //}
+    newroutings := Routing::ThermalTrialRatio( data, [Number]efMaxCapacity.Text(), dsStartTime.Date(), dsEndTime.Date(), [Number]efThermalTrialRatio.Text() );
+    
+    ApplicationMacroPlanner.SelectListObjects( dhForm.Data().ListRoutings(), newroutings );
     
     this.Close();
   *]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Response_pnlActions_btnOk_OnClick.def
index 8fd0a6d..94cd36f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Response_pnlActions_btnOk_OnClick.def
@@ -5,12 +5,15 @@
   #keys: '[415136.0.756140039]'
   DefinitionID: 'Responsedef_WebButton_OnClick'
   GroupServerCalls: true
+  Precondition:
+  [*
+    return Routing::ValidateThermalTrialRatio( feedback, ddlRouting.Data(), [Number]efMaxCapacity.Text(), dsStartTime.Date(), dsEndTime.Date(), [Number]efThermalTrialRatio.Text() );
+  *]
   QuillAction
   {
     Body:
     [*
-      Form.ApplyChanges();
-      Form.Close();
+      Form.OnOK();
     *]
   }
 }

--
Gitblit v1.9.3