From cbf2cc895f1d1e7dcf522a462e77709d92667747 Mon Sep 17 00:00:00 2001
From: lazhen <17772815105@139.com>
Date: 星期五, 11 十月 2024 18:10:13 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev-zlg

---
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelRight.def                                          |  164 +++++---
 _Main/BL/Type_CC_EngineRackCell/StaticMethod_CreateData.qbl                                                                                    |   70 +++
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuCapacities.def                                              |   11 
 _Main/BL/Type_DispatchShiftPlan/StaticMethod_Dispatch.qbl                                                                                      |   50 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlContent_ddslProductionLine_OnCreated.def          |    2 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlans.def                                                         |    3 
 _Main/UI/MacroPlannerWebApp/Component_FormPackagingPlan/Response_MatrixEditor493_OnCheckEditability.def                                        |   22 +
 _Main/BL/Type_CC_EngineRackCell/StaticMethod_Export.qbl                                                                                        |    4 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageReport.def                                                |   10 
 _Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPattern.qbl                                                                              |   40 ++
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/_ROOT_Component_FormProductionLineBatchSetShiftPattern.def        |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Response_PanelRight_bApply_OnClick.def                            |   39 ++
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuCapacities_MenuBatchSetShiftPattern_OnClick.def |   17 
 _Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_dhOfflinePlanTables_OnCreated#57.def                                 |    5 
 _Main/UI/MacroPlannerWebApp/Views/BatchSetShiftPattern.vw                                                                                      |  386 ++++++++++++++++++++
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlActions_btnOk_OnClick.def                         |    4 
 _Main/BL/Type_DL_EngineRackCell/StaticMethod_CreateData.qbl                                                                                    |  101 +++++
 _Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_Dispatch.qbl                                                                     |   35 +
 _Main/BL/Type_CC_EngineRackRow/Attribute_Index.qbl                                                                                             |    7 
 _Main/BL/Type_LocalTool/StaticMethod_SetUnitShiftPattern.qbl                                                                                   |   70 +++
 /dev/null                                                                                                                                      |   13 
 _Main/BL/Relations/Relation_DispatchShiftPlan_Archive_Archive_DispatchShiftPlan.qbl                                                            |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FormDL_EngineRackReport/Response_pHeader_bRefresh_OnClick.def                                            |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogPackagingPlanLotSize/Response_pHeader_bAdd_OnClick.def                                             |    5 
 _Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_SplitShifts.qbl                                                                  |   33 +
 25 files changed, 991 insertions(+), 126 deletions(-)

diff --git a/_Main/BL/Relations/Relation_DispatchShiftPlan_Archive_Archive_DispatchShiftPlan.qbl b/_Main/BL/Relations/Relation_DispatchShiftPlan_Archive_Archive_DispatchShiftPlan.qbl
new file mode 100644
index 0000000..f45c374
--- /dev/null
+++ b/_Main/BL/Relations/Relation_DispatchShiftPlan_Archive_Archive_DispatchShiftPlan.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation DispatchShiftPlan_Archive_Archive_DispatchShiftPlan
+{
+  #keys: '1[414996.1.121982603]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Archive
+  {
+    #keys: '3[414996.1.121982605][414996.1.121982604][414996.1.121982606]'
+    Cardinality: '0to1'
+    ObjectDefinition: DispatchShiftPlan
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide DispatchShiftPlan
+  {
+    #keys: '3[414996.1.121982608][414996.1.121982607][414996.1.121982609]'
+    Cardinality: '1toN'
+    ObjectDefinition: Archive
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_DispatchShiftPlan_RecycleBin_RecycleBin_DispatchShiftPlan.qbl b/_Main/BL/Relations/Relation_DispatchShiftPlan_RecycleBin_RecycleBin_DispatchShiftPlan.qbl
deleted file mode 100644
index 37b7f50..0000000
--- a/_Main/BL/Relations/Relation_DispatchShiftPlan_RecycleBin_RecycleBin_DispatchShiftPlan.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation DispatchShiftPlan_RecycleBin_RecycleBin_DispatchShiftPlan
-{
-  #keys: '1[414996.1.17706936]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide RecycleBin
-  {
-    #keys: '3[414996.1.17706938][414996.1.17706937][414996.1.17706939]'
-    Cardinality: '0to1'
-    ObjectDefinition: DispatchShiftPlan
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide DispatchShiftPlan
-  {
-    #keys: '3[414996.1.17706941][414996.1.17706940][414996.1.17706942]'
-    Cardinality: '1toN'
-    ObjectDefinition: RecycleBin
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Type_CC_EngineRackCell/Function_CalcEstimatedTotalCost.qbl b/_Main/BL/Type_CC_EngineRackCell/Function_CalcEstimatedTotalCost.qbl
deleted file mode 100644
index 1c8e4cb..0000000
--- a/_Main/BL/Type_CC_EngineRackCell/Function_CalcEstimatedTotalCost.qbl
+++ /dev/null
@@ -1,17 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Function CalcEstimatedTotalCost
-{
-  TextBody:
-  [*
-    // lihongji Oct-9-2024 (created)
-    
-    value := this.StorageFeesForRentedWarehouses()             + 
-             this.OutboundExpensesForRentedWarehouses()        + 
-             this.ExternalRentalWarehouseTransportationCosts() + 
-             this.RentalWarehouseStorageFees()                 +
-             this.CleaningCost()
-    
-    this.EstimatedTotalCost( value );
-  *]
-}
diff --git a/_Main/BL/Type_CC_EngineRackCell/Function_CalcNumberOfEmptyShelves.qbl b/_Main/BL/Type_CC_EngineRackCell/Function_CalcNumberOfEmptyShelves.qbl
deleted file mode 100644
index 8970d55..0000000
--- a/_Main/BL/Type_CC_EngineRackCell/Function_CalcNumberOfEmptyShelves.qbl
+++ /dev/null
@@ -1,13 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Function CalcNumberOfEmptyShelves
-{
-  TextBody:
-  [*
-    // vwedadmin Aug-20-2024 (created)
-    
-    value := guard( [Number] ( this.TotalQuantityOfMaterialRacks() - ( this.PlannedInventory() / this.PackagingCapacity() ) ), 0 );
-    
-    this.NumberOfEmptyShelves( value );
-  *]
-}
diff --git a/_Main/BL/Type_CC_EngineRackCell/Function_CalcRentalWarehouseStorageFees.qbl b/_Main/BL/Type_CC_EngineRackCell/Function_CalcRentalWarehouseStorageFees.qbl
deleted file mode 100644
index 12e3b4c..0000000
--- a/_Main/BL/Type_CC_EngineRackCell/Function_CalcRentalWarehouseStorageFees.qbl
+++ /dev/null
@@ -1,13 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Function CalcRentalWarehouseStorageFees
-{
-  TextBody:
-  [*
-    // vwedadmin Aug-25-2024 (created)
-    
-    value := guard( ( this.TotalQuantityOfMaterialRacks() - [Number]( this.PlannedInventory() / this.PackagingCapacity() ) ) * this.UnitPriceOfEmptyShelfStorage(), 0 );
-    
-    this.RentalWarehouseStorageFees( value );
-  *]
-}
diff --git a/_Main/BL/Type_CC_EngineRackCell/Function_CalcTotalCost.qbl b/_Main/BL/Type_CC_EngineRackCell/Function_CalcTotalCost.qbl
deleted file mode 100644
index 06eaa74..0000000
--- a/_Main/BL/Type_CC_EngineRackCell/Function_CalcTotalCost.qbl
+++ /dev/null
@@ -1,13 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Function CalcTotalCost
-{
-  TextBody:
-  [*
-    // lihongji Oct-9-2024 (created)
-    
-    value := this.EstimatedTotalCost() * this.Coefficient();
-    
-    this.TotalCost( value );
-  *]
-}
diff --git a/_Main/BL/Type_CC_EngineRackCell/StaticMethod_CreateData.qbl b/_Main/BL/Type_CC_EngineRackCell/StaticMethod_CreateData.qbl
index 9a3cdd1..180d987 100644
--- a/_Main/BL/Type_CC_EngineRackCell/StaticMethod_CreateData.qbl
+++ b/_Main/BL/Type_CC_EngineRackCell/StaticMethod_CreateData.qbl
@@ -9,12 +9,21 @@
     macroPlan.CC_EngineRackRow( relflush );
     macroPlan.CC_EngineRackColumn( relflush );
     
+    sumNumberOfEmptyShelves                       := 0.0;
+    sumStorageFeesForRentedWarehouses             := 0.0;
+    sumOutboundExpensesForRentedWarehouses        := 0.0;
+    sumExternalRentalWarehouseTransportationCosts := 0.0;
+    sumRentalWarehouseStorageFees                 := 0.0;
+    sumCleaningCost                               := 0.0;
+    sumEstimatedTotalCost                         := 0.0;
+    sumTotalCost                                  := 0.0;
+    
     // 鍒涘缓琛�
     genrations := selectuniquevalues( macroPlan, Product_MP, tempPMP, tempPMP.Generation().TrimBoth() <> "", tempPMP.Generation() );
     mqbmlbs    := selectuniquevalues( macroPlan, Product_MP, tempPMP, tempPMP.MQBMLB().TrimBoth() <> "", tempPMP.MQBMLB() );
     traverse ( genrations, Elements, g ) {
       traverse ( mqbmlbs, Elements, m ) {
-        macroPlan.CC_EngineRackRow( relnew, Generation := g, MLB_MQB := m );
+        macroPlan.CC_EngineRackRow( relnew, Generation := g, MLB_MQB := m, Index := 1  );
       }
     }
     
@@ -47,15 +56,18 @@
         
         // 绌烘枡鏋舵暟閲忥紙闀挎槬鍘傝浜у搧鐨勬枡鏋舵�绘暟閲� - 鍙戝姩鏈哄簱瀛� / 鍖呰瀹归噺 锛�
         plannedInventory := sum( macroPlan, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriod, tempPISPIP,
-                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().IsLeaf()                                                                and
-                                 exists( tempPISPIP.ProductInStockingPoint_MP().Product_MP(), AllParent.AsParent, tempPMP, tempPMP.ID() = "鍙戝姩鏈�" )         and
-                                 tempPISPIP.ProductInStockingPoint_MP().StockingPointID()                                               = "闀挎槬澶栫搴�"       and
-                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().Generation()                                       = ccerr.Generation() and
-                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().MQBMLB()                                           = ccerr.MLB_MQB()    and
-                                 tempPISPIP.Start().Date()                                                                              = lastDayOfThisMonth,
+                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().IsLeaf()                                                                 and
+                                 exists( tempPISPIP.ProductInStockingPoint_MP().Product_MP(), AllParent.AsParent, tempPMP, tempPMP.ID() =  "鍙戝姩鏈�" )         and
+                                 tempPISPIP.ProductInStockingPoint_MP().StockingPointID()                                               =  "闀挎槬澶栫搴�"       and
+                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().Generation()                                       =  ccerr.Generation() and
+                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().MQBMLB()                                           =  ccerr.MLB_MQB()    and
+                                 tempPISPIP.Start().Date()                                                                              >= ccerc.StartDate()  and
+                                 tempPISPIP.End().Date()                                                                                <= lastDayOfThisMonth,
                                  tempPISPIP.PlannedInventoryLevelEnd() );
         cell.PackagingCapacity( guard( lce.PackagingCapacity(), 1 ) );
         cell.PlannedInventory( plannedInventory );
+        cell.NumberOfEmptyShelves( guard( [Number] ( cell.TotalQuantityOfMaterialRacks() - ( plannedInventory / lce.PackagingCapacity() ) ), 0 ) );
+        sumNumberOfEmptyShelves := sumNumberOfEmptyShelves + cell.NumberOfEmptyShelves();
         
         // 澶栫搴撳叆搴撹垂鐢紙鍙戝姩鏈洪攢閲� / 鍖呰瀹归噺[鍚戜笂鍙栨暣] * 鏂欐灦鍏ュ簱鍗曚环锛�
         engineSales := sum( macroPlan, FSImportData, tempFSID, 
@@ -65,8 +77,8 @@
                             tempFSID.StartDate().Year()  = ccerc.StartDate().Year()                      and
                             tempFSID.StartDate().Month() = ccerc.StartDate().Month(),
                             tempFSID.Quantity() );
-        
         cell.StorageFeesForRentedWarehouses( [Number] ( engineSales / guard( lce.PackagingCapacity(), 1 ) * guard( lcmr.WarehousingPrice(), 1 ) ) );
+        sumStorageFeesForRentedWarehouses := sumStorageFeesForRentedWarehouses + cell.StorageFeesForRentedWarehouses();
              
         // 澶栫搴撳嚭搴撹垂鐢紙鍙戝姩鏈轰骇閲� / 鍖呰瀹归噺[鍚戜笂鍙栨暣] * 鏂欐灦鍑哄簱鍗曚环锛�
         engineProductions := sum( macroPlan, FPImportData, tempFPID, 
@@ -77,6 +89,7 @@
                                   tempFPID.StartDate().Month() = ccerc.StartDate().Month(),
                                   tempFPID.Quantity() );
         cell.OutboundExpensesForRentedWarehouses( [Number] ( engineProductions / guard( lce.PackagingCapacity(), 1 ) ) * guard( lcmr.OutboundPrice(), 1 ) );
+        sumOutboundExpensesForRentedWarehouses := sumOutboundExpensesForRentedWarehouses + cell.OutboundExpensesForRentedWarehouses();
         
         // 澶栫搴撹繍杈撹垂鐢細鍙戝姩鏈鸿繍杈撻噺 / 鍖呰瀹归噺 / 瑁呰浇瀹归噺锛堝悜涓婂彇鏁达級 * 鏂欐灦杩愯緭鍗曚环
         transportationQuantity := sum( macroPlan, Unit.Lane.LaneLeg.Trip.ProductInTrip, tempPIT, 
@@ -89,16 +102,53 @@
                                        tempPIT.Quantity()
                                       );
     //    info( "鏃堕棿锛�", ccerc.StartDate().Format( "Y-M2-D2" ), "    杩愯緭鏁版嵁锛�", transportationQuantity, "     杩愯緭鍗曚环锛�", lct.TransportPrice() );
-        cell.ExternalRentalWarehouseTransportationCosts( transportationQuantity / guard( lce.PackagingCapacity(), 1 ) / guard( lct.LoadingCapacity(), 1 ) * guard( lct.TransportPrice(), 1 ) );
+        cell.ExternalRentalWarehouseTransportationCosts( [Number] ( transportationQuantity / guard( lce.PackagingCapacity(), 1 ) / guard( lct.LoadingCapacity(), 1 ) * guard( lct.TransportPrice(), 1 ) ) );
+        sumExternalRentalWarehouseTransportationCosts := sumExternalRentalWarehouseTransportationCosts + cell.ExternalRentalWarehouseTransportationCosts();
              
         // 澶栫搴撲粨鍌ㄨ垂鐢細鏂欐灦鎬绘暟閲� - 鍙戝姩鏈哄簱瀛� / 鍖呰瀹归噺锛堝悜涓婂彇鏁达級锛屽啀涔樹互绌烘枡鏋朵粨鍌ㄥ崟浠峰緱鍒扮┖鏂欐灦浠撳偍璐圭敤銆傚彂鍔ㄦ満搴撳瓨鍙朅ctual inventories閲屽彇鍒伴暱鏄ュ绉熷簱璇ュ彂鍔ㄦ満鐨勪粨鍌ㄩ噺锛屾枡鏋舵�绘暟閲忛渶瑕佹墜鍔ㄧ淮鎶ゃ��
         cell.UnitPriceOfEmptyShelfStorage( lcmr.StoragePrice() );
+        cell.RentalWarehouseStorageFees( [Number] ( guard( ( cell.TotalQuantityOfMaterialRacks() - [Number]( plannedInventory / lce.PackagingCapacity() ) ) * lcmr.StoragePrice(), 0 ) ) );
+        sumRentalWarehouseStorageFees := sumRentalWarehouseStorageFees + cell.RentalWarehouseStorageFees();
         
         // 娓呮礂璐圭敤锛氬彂鍔ㄦ満鍏ュ簱閲� / 鍖呰瀹归噺 * 鏂欐灦娓呮礂鍗曚环銆傚彂鍔ㄦ満鍏ュ簱閲忓彇鍙戝姩鏈洪攢閲忥紝鍖呰瀹归噺鍙栬嚜鍙戝姩鏈烘垚鏈〃銆傛枡鏋舵竻娲楀崟浠峰彇鏂欐灦鎴愭湰琛ㄣ��
-        cell.CleaningCost( engineSales / guard( lce.PackagingCapacity(), 1 ) * lcmr.CleanPrice() );
+        cell.CleaningCost( [Number] ( engineProductions / guard( lce.PackagingCapacity(), 1 ) * lcmr.CleanPrice() ) );
+        sumCleaningCost := sumCleaningCost + cell.CleaningCost();
+        
+        // 棰勮鎬昏垂鐢�
+        cell.EstimatedTotalCost( cell.StorageFeesForRentedWarehouses()             + 
+                                 cell.OutboundExpensesForRentedWarehouses()        + 
+                                 cell.ExternalRentalWarehouseTransportationCosts() + 
+                                 cell.RentalWarehouseStorageFees()                 +
+                                 cell.CleaningCost()
+                                );
+        sumEstimatedTotalCost := sumEstimatedTotalCost + cell.EstimatedTotalCost();
+                                
+        // 绯绘暟
+        cell.Coefficient( 1.05 );
+        
+        // 鎬昏垂鐢�
+        cell.TotalCost( cell.EstimatedTotalCost() * cell.Coefficient() );
+        sumTotalCost := sumTotalCost + cell.TotalCost();
         
         cell.CC_EngineRackColumn( relset, ccerc );
       }
     }
+    
+    // 鍒涘缓SUM琛�
+    sumR := macroPlan.CC_EngineRackRow( relnew, Generation := "SUM", MLB_MQB := "", Index := 2 );
+    traverse ( macroPlan, CC_EngineRackColumn, ccerc ) {
+      cell := sumR.CC_EngineRackCell( relnew );
+      
+      cell.NumberOfEmptyShelves( sumNumberOfEmptyShelves );
+      cell.StorageFeesForRentedWarehouses( sumStorageFeesForRentedWarehouses );
+      cell.OutboundExpensesForRentedWarehouses( sumOutboundExpensesForRentedWarehouses );
+      cell.ExternalRentalWarehouseTransportationCosts( sumExternalRentalWarehouseTransportationCosts );
+      cell.RentalWarehouseStorageFees( sumRentalWarehouseStorageFees );
+      cell.CleaningCost( sumCleaningCost );
+      cell.EstimatedTotalCost( sumEstimatedTotalCost );
+      cell.TotalCost( sumTotalCost );
+      
+      cell.CC_EngineRackColumn( relset, ccerc );
+    }
   *]
 }
diff --git a/_Main/BL/Type_CC_EngineRackCell/StaticMethod_Export.qbl b/_Main/BL/Type_CC_EngineRackCell/StaticMethod_Export.qbl
index 8ce70a3..1d83bd4 100644
--- a/_Main/BL/Type_CC_EngineRackCell/StaticMethod_Export.qbl
+++ b/_Main/BL/Type_CC_EngineRackCell/StaticMethod_Export.qbl
@@ -12,7 +12,7 @@
     tableElement := xmlDOM.GetElementByTagName( "table", 0 );
     
     // 绗竴鍒楋紙鍚嶇О锛�
-    cerrs       := selectsortedset( macroPlan, CC_EngineRackRow, tempCERR, true, tempCERR.Name() );
+    cerrs       := selectsortedset( macroPlan, CC_EngineRackRow, tempCERR, true, tempCERR.Index(), tempCERR.Name() );
     firstColumn := xmlDOM.CreateElement( "column" );
     firstName   := xmlDOM.CreateElement( "name" );
     firstType   := xmlDOM.CreateElement( "type" );
@@ -63,7 +63,7 @@
       cellType.TextContent( "Number" );
       cellColumn.AppendChild( cellName );
       cellColumn.AppendChild( cellType );
-      cells := selectsortedset( cerc, CC_EngineRackCell, tempCELL, true, tempCELL.CC_EngineRackRow().Name() );
+      cells := selectsortedset( cerc, CC_EngineRackCell, tempCELL, true, tempCELL.CC_EngineRackRow().Index(), tempCELL.CC_EngineRackRow().Name() );
       traverse ( cells, Elements, c ) {
         cell := xmlDOM.CreateElement( "cell" );
         cell.SetAttribute( "value", [String]c.TotalQuantityOfMaterialRacks().Round( 0 ) ); // 鏂欐灦鎬绘暟閲�
diff --git a/_Main/BL/Type_CC_EngineRackRow/Attribute_Index.qbl b/_Main/BL/Type_CC_EngineRackRow/Attribute_Index.qbl
new file mode 100644
index 0000000..7a6c5ba
--- /dev/null
+++ b/_Main/BL/Type_CC_EngineRackRow/Attribute_Index.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Index
+{
+  #keys: '3[415754.0.356027162][415754.0.356027161][415754.0.356027163]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_DL_EngineRackCell/StaticMethod_CreateData.qbl b/_Main/BL/Type_DL_EngineRackCell/StaticMethod_CreateData.qbl
index f46648f..c4e7eee 100644
--- a/_Main/BL/Type_DL_EngineRackCell/StaticMethod_CreateData.qbl
+++ b/_Main/BL/Type_DL_EngineRackCell/StaticMethod_CreateData.qbl
@@ -32,6 +32,15 @@
         // 鍙戝姩鏈烘垚鏈弬鏁�
         lce  := select( macroPlan, LogisticsCostEngine, tempLCE, tempLCE.Generation() = dlerr.Generation() and tempLCE.MLB_MQB() = dlerr.MLB_MQB() and tempLCE.Factory() = "澶ц繛宸ュ巶" 
                         and tempLCE.StartDate() <= dlerc.StartDate() and tempLCE.EndDate() >= dlerc.StartDate().StartOfNextMonth() );
+                        
+        // 鏂欐灦鎴愭湰鍙傛暟
+        lcmr := select( macroPlan, LogisticsCostMaterialRack, tempLCMR, tempLCMR.Factory() = "澶ц繛宸ュ巶" 
+                        and tempLCMR.StartDate() <= dlerc.StartDate() and tempLCMR.EndDate() >= dlerc.StartDate().StartOfNextMonth() );
+                        
+        // 杩愯緭鎴愭湰鍙傛暟
+        lct1 := select( macroPlan, LogisticsCostTransport, tempLCT, tempLCT.Product() = "鍙戝姩鏈烘枡鏋�" and tempLCT.Origin() = "澶ц繛鍙戝姩鏈虹殑闀挎槬澶栫搴�" and tempLCT.Destination() = "澶ц繛鍘傚唴搴�" );
+        lct2 := select( macroPlan, LogisticsCostTransport, tempLCT, tempLCT.Product() = "鍙戝姩鏈烘枡鏋�" and tempLCT.Origin() = "澶ц繛澶栫搴�" and tempLCT.Destination() = "澶ц繛鍘傚唴搴�" );
+        lct3 := select( macroPlan, LogisticsCostTransport, tempLCT, tempLCT.Product() = "鍙戝姩鏈烘枡鏋�" and tempLCT.Origin() = "CC 瀹㈡埛搴�" and tempLCT.Destination() = "CC 澶栫搴�" );
         
         // 褰撳墠鏈堟湯鏈�鍚庝竴澶╂棩鏈�                
         lastDayOfThisMonth := dlerc.StartDate().StartOfNextMonth() - 1; 
@@ -40,20 +49,100 @@
         
         // 绌烘枡鏋舵暟閲忥細澶ц繛鍘傝浜у搧鐨勬枡鏋舵�绘暟閲� - 鍙戝姩鏈哄簱瀛� / 鍖呰瀹归噺锛堝悜涓婂彇鏁达級
         plannedInventory := sum( macroPlan, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriod, tempPISPIP,
-                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().IsLeaf()                                                                and
-                                 exists( tempPISPIP.ProductInStockingPoint_MP().Product_MP(), AllParent.AsParent, tempPMP, tempPMP.ID() = "鍙戝姩鏈�" )         and
-                                 tempPISPIP.ProductInStockingPoint_MP().StockingPointID()                                               = "澶ц繛澶栫搴�"       and
-                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().Generation()                                       = dlerr.Generation() and
-                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().MQBMLB()                                           = dlerr.MLB_MQB()    and
-                                 tempPISPIP.Start().Date()                                                                              = lastDayOfThisMonth,
+                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().IsLeaf()                                                                       and
+                                 exists( tempPISPIP.ProductInStockingPoint_MP().Product_MP(), AllParent.AsParent, tempPMP, tempPMP.ID() =  "鍙戝姩鏈�" )               and
+                                 tempPISPIP.ProductInStockingPoint_MP().StockingPointID()                                               =  "澶ц繛鍙戝姩鏈虹殑闀挎槬澶栫搴�" and
+                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().Generation()                                       =  dlerr.Generation()       and
+                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().MQBMLB()                                           =  dlerr.MLB_MQB()          and
+                                 tempPISPIP.Start().Date()                                                                              >= dlerc.StartDate()        and 
+                                 tempPISPIP.End().Date()                                                                                <= lastDayOfThisMonth,
                                  tempPISPIP.PlannedInventoryLevelEnd() );
         cell.PackagingCapacity( guard( lce.PackagingCapacity(), 1 ) );
         cell.PlannedInventory( plannedInventory );
         
         // CC澶栫搴撳叆搴撹垂鐢細鍙戝姩鏈洪攢閲� / 鍖呰瀹归噺锛堝悜涓婂彇鏁达級* 鏂欐灦鍏ュ簱鍗曚环
+        transportationQuantity1 := sum( macroPlan, SalesDemand.astype( Forecast ), tempF, 
+                                        tempF.Product_MP().Generation() =  dlerr.Generation()       and
+                                        tempF.Product_MP().MQBMLB()     =  dlerr.MLB_MQB()          and
+                                        tempF.StockingPointID()         =  "澶ц繛鍙戝姩鏈虹殑闀挎槬澶栫搴�" and
+                                        tempF.StartDate()               >= dlerc.StartDate()        and
+                                        tempF.EndDate()                 <= lastDayOfThisMonth,
+                                        tempF.FulfilledQuantity() );
+        cell.CCStorageFeesForRentedWarehouses( [Number] ( guard( transportationQuantity1 / lce.PackagingCapacity(), 0 ) * lcmr.WarehousingPrice() ) );
         
         // CC澶栫搴撳嚭搴撹垂鐢細鍙戝姩鏈洪攢閲� / 鍖呰瀹归噺锛堝悜涓婂彇鏁达級* 鏂欐灦鍑哄簱鍗曚环
+        cell.CCOutboundExpensesForRentedWarehouses( [Number] ( guard( transportationQuantity1 / lce.PackagingCapacity(), 0 ) * lcmr.OutboundPrice() ) );
         
+        // CC澶栫搴撲粨鍌ㄨ垂鐢細鏂欐灦鎬绘暟閲� - 鍙戝姩鏈哄簱瀛� / 鍖呰瀹归噺锛堝悜涓婂彇鏁达級 * 鏂欐灦浠撳偍鍗曚环
+        cell.CCRentalWarehouseStorageFees( [Number] ( ( cell.TotalQuantityOfMaterialRacks() - guard( plannedInventory / lce.PackagingCapacity(), 0 ) ) * lcmr.StoragePrice() ) );
+        
+        // CC闀块�旇繍杈撹垂鐢細璋冩嫧鏁伴噺 / 鍖呰瀹归噺 / 瑁呰浇瀹归噺 * 鏂欐灦杩愯緭鍗曚环
+        transportationQuantity2 := sum( macroPlan, Unit.Lane.LaneLeg.Trip.ProductInTrip, tempPIT, 
+                                        tempPIT.Product_MP().Generation()                                                =  dlerr.Generation()      and
+                                        tempPIT.Product_MP().MQBMLB()                                                    =  dlerr.MLB_MQB()         and
+                                        tempPIT.Trip().Departure().Date()                                                >= dlerc.StartDate()       and
+                                        tempPIT.Trip().Arrival().Date()                                                  <= lastDayOfThisMonth      and
+                                        tempPIT.Trip().LaneLeg().AsOriginStockingPointLeg().StockingPoint_MP().ID()      = "澶ц繛鍘傚唴搴�"              and
+                                        tempPIT.Trip().LaneLeg().AsDestinationStockingPointLeg().StockingPoint_MP().ID() = "澶ц繛鍙戝姩鏈虹殑闀挎槬澶栫搴�",
+                                        tempPIT.Quantity()
+                                       );
+    
+        cell.CCLineHaulCost( [Number] ( guard( transportationQuantity2 / lce.PackagingCapacity() / lct1.LoadingCapacity(), 0 ) * guard( lct1.TransportPrice(), 1 ) ) );
+        
+        // CC鐭�旇繍杈撹垂鐢細璋冩嫧鏁伴噺 / 鍖呰瀹归噺 / 瑁呰浇瀹归噺 * 鏂欐灦杩愯緭鍗曚环
+        cell.CCShortDistanceTransportationCosts( [Number] ( guard( transportationQuantity1 / lce.PackagingCapacity() / lct3.LoadingCapacity(), 0 ) * guard( lct3.TransportPrice(), 1 ) ) )
+        
+        // DL澶栫搴撳叆搴撹垂鐢細鍙戝姩鏈哄叆搴撻噺 / 鍖呰瀹归噺锛堝悜涓婂彇鏁达級* 鏂欐灦鍏ュ簱鍗曚环
+        inventoryQuantity := sum( macroPlan, SalesDemand.astype( Forecast ), tempF, 
+                                  tempF.Product_MP().Generation() =  dlerr.Generation()       and
+                                  tempF.Product_MP().MQBMLB()     =  dlerr.MLB_MQB()          and
+                                  tempF.StockingPointID()         =  "澶ц繛澶栫搴�"             and
+                                  tempF.StartDate().Year()        = dlerc.StartDate().Year()  and
+                                  tempF.StartDate().Month()       = dlerc.StartDate().Month(),
+                                  tempF.FulfilledQuantity() );
+    //                   info( "鏃堕棿锛�", dlerc.StartDate().Format( "Y-M2-D2" ), "    鍏ュ簱鏁伴噺锛�", inventoryQuantity, "    鍖呰瀹归噺锛�", guard( lce.PackagingCapacity(), 0 ),
+    //                         "    瑁呰浇瀹归噺锛�", guard( lct1.LoadingCapacity(), 0 ) ); // 娴嬭瘯杈撳嚭
+        cell.DLStorageFeesForRentedWarehouses( [Number] ( guard( inventoryQuantity / lce.PackagingCapacity(), 0 ) * guard( lcmr.WarehousingPrice(), 1 ) ) );
+        
+        // DL澶栫搴撳嚭搴撹垂鐢細鍙戝姩鏈哄嚭搴撻噺 / 鏂欐灦瀹归噺锛堝悜涓婂彇鏁达級* 鏂欐灦鍑哄簱鍗曚环
+        outboundQuantity := sum( macroPlan, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), tempPISPIPPL,
+                                 tempPISPIPPL.ProductInStockingPoint_MP().Product_MP().Generation() = dlerr.Generation()  and
+                                 tempPISPIPPL.ProductInStockingPoint_MP().Product_MP().MQBMLB()     = dlerr.MLB_MQB()     and
+                                 tempPISPIPPL.ProductInStockingPoint_MP().StockingPointID()         = "澶ц繛澶栫搴�"        and
+                                 tempPISPIPPL.Start().Date()                                        >= dlerc.StartDate()  and
+                                 tempPISPIPPL.End().Date()                                          <= lastDayOfThisMonth,
+                                 tempPISPIPPL.NewSupplyQuantity() );
+        cell.DLOutboundExpensesForRentedWarehouses( [Number] ( guard( outboundQuantity / lce.PackagingCapacity(), 0 ) * guard( lcmr.OutboundPrice(), 1 ) ) );
+        
+        // DL澶栫搴撹繍杈撹垂鐢細鍙戝姩鏈鸿繍杈撻噺 / 鍖呰瀹归噺 / 瑁呰浇瀹归噺锛堝悜涓婂彇鏁达級* 鏂欐灦杩愯緭鍗曚环
+        cell.DLExternalRentalWarehouseTransportationCosts( [Number] ( guard( inventoryQuantity / lce.PackagingCapacity() / lct2.LoadingCapacity(), 0 ) * guard( lct2.TransportPrice(), 1 ) ) );
+        
+        // DL澶栫搴撲粨鍌ㄨ垂鐢細鏂欐灦鎬绘暟閲� - 鍙戝姩鏈哄簱瀛� / 鍖呰瀹归噺锛堝悜涓婂彇鏁达級* 绌烘枡鏋朵粨鍌ㄥ崟浠�
+        plannedInventory1 := sum( macroPlan, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriod, tempPISPIP,
+                                  tempPISPIP.ProductInStockingPoint_MP().Product_MP().IsLeaf()                                                                       and
+                                  exists( tempPISPIP.ProductInStockingPoint_MP().Product_MP(), AllParent.AsParent, tempPMP, tempPMP.ID() =  "鍙戝姩鏈�" )               and
+                                  tempPISPIP.ProductInStockingPoint_MP().StockingPointID()                                               =  "澶ц繛澶栫搴�"             and
+                                  tempPISPIP.ProductInStockingPoint_MP().Product_MP().Generation()                                       =  dlerr.Generation()       and
+                                  tempPISPIP.ProductInStockingPoint_MP().Product_MP().MQBMLB()                                           =  dlerr.MLB_MQB()          and
+                                  tempPISPIP.Start().Date()                                                                              >= dlerc.StartDate()        and 
+                                  tempPISPIP.End().Date()                                                                                <= lastDayOfThisMonth,
+                                  tempPISPIP.PlannedInventoryLevelEnd() );
+        cell.DLRentalWarehouseStorageFees( [Number] ( guard( ( cell.TotalQuantityOfMaterialRacks() - plannedInventory1 ) / lce.PackagingCapacity(), 0 ) * guard( lcmr.StoragePrice(), 1 ) ) );
+        
+        //娓呮礂璐圭敤锛氬彂鍔ㄦ満鍏ュ簱閲� / 鍖呰瀹归噺 * 鏂欐灦娓呮礂鍗曚环銆傚彂鍔ㄦ満鍏ュ簱閲忓彇鍙戝姩鏈洪攢閲忥紝鍖呰瀹归噺鍙栬嚜鍙戝姩鏈烘垚鏈〃銆傛枡鏋舵竻娲楀崟浠峰彇鏂欐灦鎴愭湰琛ㄣ��
+        cell.CleaningCost( [Number] ( guard( inventoryQuantity / lce.PackagingCapacity(), 0 ) * guard( lcmr.CleanPrice(), 1 ) ) );
+        
+        // 棰勮鎬昏垂鐢�
+        cell.EstimatedTotalCost( cell.CCStorageFeesForRentedWarehouses() + cell.CCOutboundExpensesForRentedWarehouses() + cell.CCRentalWarehouseStorageFees() + cell.CCLineHaulCost() + 
+                                 cell.CCShortDistanceTransportationCosts() + cell.DLStorageFeesForRentedWarehouses() + cell.DLOutboundExpensesForRentedWarehouses() +
+                                 cell.DLExternalRentalWarehouseTransportationCosts() + cell.DLRentalWarehouseStorageFees() + cell.CleaningCost() );
+        
+        // 绯绘暟
+        cell.Coefficient( 1.05 );
+        
+        // 鎬昏垂鐢�
+        cell.TotalCost( cell.EstimatedTotalCost() * cell.Coefficient() );
+                
         cell.DL_EngineRackColumn( relset, dlerc );
       }
     }
diff --git a/_Main/BL/Type_DispatchShiftPlan/StaticMethod_Dispatch.qbl b/_Main/BL/Type_DispatchShiftPlan/StaticMethod_Dispatch.qbl
index 35bca5a..5d69146 100644
--- a/_Main/BL/Type_DispatchShiftPlan/StaticMethod_Dispatch.qbl
+++ b/_Main/BL/Type_DispatchShiftPlan/StaticMethod_Dispatch.qbl
@@ -2,19 +2,27 @@
 #parent: #root
 StaticMethod Dispatch (
   const MacroPlan macroPlan,
-  RecycleBin owner,
+  Archive owner,
   String versionFlag
 )
 {
   TextBody:
   [*
     // Akari Aug-21-2024 (created)
-    owner.DispatchShiftPlan( relflush );
+    // owner.DispatchShiftPlan( relflush );
     // owner.RB_DispatchShiftPlanBroker().Source().FlatQuery( "truncate table A_DispatchShiftPlan" );
+    
+    dispatchShiftPlans := selectset( owner,DispatchShiftPlan,dispatchShiftPlan,true );
+    dispatchShiftPlanIndexTree := NamedValueTree::Create();
+    for( i := 0 ; i < dispatchShiftPlans.Size() ; i++){
+      dispatchShiftPlan := dispatchShiftPlans.Element( i );
+      dispatchShiftPlanHandle := dispatchShiftPlanIndexTree.GetHandle( dispatchShiftPlan.FactoryName() + dispatchShiftPlan.ProductLine() + dispatchShiftPlan.ShiftDate().AsQUILL() );
+      dispatchShiftPlanIndexTree.Root().AddChild( dispatchShiftPlanHandle,i );
+    }
     
     now := DateTime::Now();
     macroPlanName := macroPlan.MDSMacroPlan().Description();
-    traverse( macroPlan,Unit.UnitPeriod.astype( UnitPeriodTime ).ShiftPlan,shiftPlan ){
+    traverse( macroPlan,Unit.UnitPeriod.astype( UnitPeriodTime ).ShiftPlan,shiftPlan ,shiftPlan.UnitPeriodTime().Period_MP().StartDate() >= macroPlan.StartOfPlanning().Date()){
        factory := shiftPlan.UnitPeriodTime().Unit();
        while( factory.HasParent() ){
          temp1 := factory;
@@ -23,19 +31,31 @@
            factory := temp1;
          }
        }
-      
-       owner.DispatchShiftPlan( relnew,ID := OS:: GenerateGUIDAsString(),
-                                ProductLine := shiftPlan.UnitPeriodTime().Unit().ID(),
-                                ShiftDate := shiftPlan.UnitPeriodTime().Period_MP().StartDate(),
-                                Tips := shiftPlan.Remark(),
-                                VersionName := macroPlanName,
-                                VersionFlag := versionFlag,
-                                FactoryName := factory.ID(),
-                                InterfaceTime := now
-                                );
-                                
+       productLine :=  shiftPlan.UnitPeriodTime().Unit().ID();
+       shiftDate := shiftPlan.UnitPeriodTime().Period_MP().StartDate();
+       factoryName := factory.ID();
+       
+       dispatchShiftPlanHandle := dispatchShiftPlanIndexTree.GetHandle( factoryName + productLine + shiftDate.AsQUILL() );
+       dispatchShiftPlanIndex := guard( dispatchShiftPlanIndexTree.Root().Child( dispatchShiftPlanHandle ),null( NamedValue ));
+       if( not isnull( dispatchShiftPlanIndex )){
+         dispatchShiftPlan := dispatchShiftPlans.Element( dispatchShiftPlanIndex.GetValueAsNumber() );
+         dispatchShiftPlan.Tips( shiftPlan.Remark() );
+         dispatchShiftPlan.VersionName( macroPlanName );
+         dispatchShiftPlan.VersionFlag( versionFlag );
+         dispatchShiftPlan.InterfaceTime( now );
+       }else{
+         owner.DispatchShiftPlan( relnew,ID := OS:: GenerateGUIDAsString(),
+                                  ProductLine := productLine,
+                                  FactoryName := factory.ID(),
+                                  
+                                  ShiftDate := shiftDate,
+                                  Tips := shiftPlan.Remark(),
+                                  VersionName := macroPlanName,
+                                  VersionFlag := versionFlag,
+                                  InterfaceTime := now );
+       }
     }
     
-    owner.RB_DispatchShiftPlanBroker().AsyncExecute();
+    // owner.RB_DispatchShiftPlanBroker().AsyncExecute();
   *]
 }
diff --git a/_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_Dispatch.qbl b/_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_Dispatch.qbl
index 6d686a2..2f98a27 100644
--- a/_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_Dispatch.qbl
+++ b/_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_Dispatch.qbl
@@ -61,22 +61,29 @@
             shiftDayTime := select( shiftPattern,ShiftDayTime,object,true );
           }
         }
+        if( shiftVolume <> 0 ){
+          shiftSchedulingInformations := DispatchShiftSchedulingInformation::SplitShifts( owner,shiftName,shiftVolume );
         
-        shiftSchedulingInformation := owner.DispatchShiftSchedulingInformation( relnew ,
-                                                                                ID := IDHolder::GetGUID() ,
-                                                                                InterfaceTime := now ,
-                                                                                VersionName := macroPlan.MDSMacroPlan().Description(),
-                                                                                Product := productID,
-                                                                                ProductLine := productLine,
-                                                                                ShiftDate := shiftDate,
-                                                                                ShiftName := shiftName,
-                                                                                ShiftVolume := shiftVolume );
-        if( not isnull( shiftDayTime )){
-          shiftSchedulingInformation.ShiftStartDate( shiftDayTime.StartDateTime() );
-          shiftSchedulingInformation.ShiftEndDate( shiftDayTime.EndDateTIme() );
+        traverse( shiftSchedulingInformations,Elements,shiftSchedulingInformation ){
+          shiftSchedulingInformation.InterfaceTime( now );
+          shiftSchedulingInformation.VersionName( macroPlan.MDSMacroPlan().Description() );
+          shiftSchedulingInformation.Product( productID );
+          shiftSchedulingInformation.ProductLine( productLine );
+          shiftSchedulingInformation.ShiftDate( shiftDate );
+    //      shiftSchedulingInformation.InterfaceTime( now );
+    //      shiftSchedulingInformation.InterfaceTime( now );
+    //      shiftSchedulingInformation.InterfaceTime( now );
+    //      shiftSchedulingInformation.InterfaceTime( now );
+          
+          
+          if( not isnull( shiftDayTime )){
+            shiftSchedulingInformation.ShiftStartDate( shiftDayTime.StartDateTime() );
+            shiftSchedulingInformation.ShiftEndDate( shiftDayTime.EndDateTIme() );
+          }
+          if( not isnull( factory )){
+            shiftSchedulingInformation.FactoryName( factory.Name() );
+          }
         }
-        if( not isnull( factory )){
-          shiftSchedulingInformation.FactoryName( factory.Name() );
         }
       }
     }
diff --git a/_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_SplitShifts.qbl b/_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_SplitShifts.qbl
new file mode 100644
index 0000000..1de3a99
--- /dev/null
+++ b/_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_SplitShifts.qbl
@@ -0,0 +1,33 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SplitShifts (
+  RecycleBin owner,
+  String shiftName,
+  Real shiftVolume
+) as owning DispatchShiftSchedulingInformations
+{
+  TextBody:
+  [*
+    // Akari Oct-9-2024 (created)
+    shiftSchedulingInformations := construct( DispatchShiftSchedulingInformations );
+    if( shiftName = "3" ){
+      shiftSchedulingInformation1 := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume / 3 );
+      shiftSchedulingInformation1.SingleShiftName( "1鐝�" );
+      shiftSchedulingInformations.Add( shiftSchedulingInformation1 );
+      
+      shiftSchedulingInformation2 := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume / 3 );
+      shiftSchedulingInformation2.SingleShiftName( "2鐝�" );
+      shiftSchedulingInformations.Add( shiftSchedulingInformation2 );
+      
+      shiftSchedulingInformation3 := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume / 3 );
+      shiftSchedulingInformation3.SingleShiftName( "3鐝�" );
+      shiftSchedulingInformations.Add( shiftSchedulingInformation3 );
+    }else{
+      shiftSchedulingInformation := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume );
+      shiftSchedulingInformations.Add( shiftSchedulingInformation );
+    }
+    
+    
+    return &shiftSchedulingInformations;
+  *]
+}
diff --git a/_Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPattern.qbl b/_Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPattern.qbl
new file mode 100644
index 0000000..b53b40e
--- /dev/null
+++ b/_Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPattern.qbl
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod BatchSetUnitShiftPattern (
+  Unit unit,
+  ShiftPattern shiftPattern,
+  Date startDate,
+  Date endDate,
+  Numbers weekdays
+)
+{
+  TextBody:
+  [*
+    // Akari Oct-10-2024 (created)
+    owner := unit.MacroPlan();
+    dayPeriod_MPs := selectsortedset( owner,Period_MP,period_MP, 
+                                      period_MP.TimeUnit() = 'Day' and 
+                                      period_MP.StartDate() >= startDate and 
+                                      period_MP.EndDate() <= endDate and exists( weekdays, Elements,dayOfWeek,dayOfWeek = period_MP.StartDate().DayOfWeek() ) ,period_MP.StartDate());
+    weekPeriod_MPs := selectsortedset( owner,Period_MP,period_MP, 
+                                       period_MP.TimeUnit() = 'Week' and 
+                                       period_MP.StartDate() >= startDate and 
+                                       period_MP.EndDate() <= endDate and exists( weekdays, Elements,dayOfWeek,dayOfWeek = period_MP.StartDate().DayOfWeek() ),period_MP.StartDate());
+    
+    if( dayPeriod_MPs.Size() > 0 ){
+      unitPeriodTimes := selectset( unit,UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,exists( dayPeriod_MPs,Elements,period_MP,period_MP = unitPeriodTime.Period_MP()) and not isnull( unitPeriodTime.UnitAvailability()));
+      if( unitPeriodTimes.Size() > 0 ){
+        LocalTool::SetUnitShiftPattern( owner,unitPeriodTimes,shiftPattern );
+      }
+      
+    }
+    if( weekPeriod_MPs.Size() <> 0 ){
+      traverse( weekPeriod_MPs,Elements,period_MP ){
+        unitPeriodTimes := selectset( unit,UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,period_MP = unitPeriodTime.Period_MP() and not isnull( unitPeriodTime.UnitAvailability()));
+        if( unitPeriodTimes.Size() > 0 ){
+          LocalTool::SetUnitShiftPattern( owner,unitPeriodTimes,shiftPattern );
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LocalTool/StaticMethod_SetUnitShiftPattern.qbl b/_Main/BL/Type_LocalTool/StaticMethod_SetUnitShiftPattern.qbl
new file mode 100644
index 0000000..92b0e44
--- /dev/null
+++ b/_Main/BL/Type_LocalTool/StaticMethod_SetUnitShiftPattern.qbl
@@ -0,0 +1,70 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SetUnitShiftPattern (
+  MacroPlan macroPlan,
+  UnitPeriodTimes unitPeriodTimes,
+  ShiftPattern shiftPattern
+)
+{
+  TextBody:
+  [*
+    // Akari Oct-10-2024 (created)
+    firstElement := minselect( unitPeriodTimes, Elements, e, true, e.Start() );
+    
+    start := macroPlan.Start();
+    timeunit := macroPlan.StartOfPlanningPeriod().TimeUnit();
+    maintenance := Duration::Zero();
+    efficiency := 1.0;
+    allocation := 1.0;
+    
+    maxloadpercentage := macroPlan.GlobalParameters_MP().DefaultMaxLoadPercentage();
+    nrofunitopen := 1;
+    minloadthreshold := 0.0;
+    
+    if( not isnull( firstElement ) ){
+      // To inherit the value from last unit availability while creating a new unit availability
+      unitavailability := firstElement.UnitAvailability();
+      start := firstElement.Start();
+    
+      if( not isnull( unitavailability ) ){
+        timeunit := unitavailability.TimeUnit();
+        maintenance := unitavailability.Maintenance();
+        efficiency := unitavailability.Efficiency();
+        allocation := unitavailability.Allocation();
+    
+        maxloadpercentage := unitavailability.MaximumLoadPercentage();
+        nrofunitopen := unitavailability.NrOfUnitsOpen();
+        minloadthreshold := unitavailability.MinimumLoadThreshold();
+      }else{
+        timeunit := firstElement.Period_MP().TimeUnit();
+        maintenance := firstElement.Maintenance();
+        efficiency := firstElement.Efficiency();
+        allocation := firstElement.Allocation();
+    
+        maxloadpercentage := firstElement.MaximumLoadPercentage();
+        nrofunitopen := firstElement.NrOfOpen();
+        minloadthreshold := firstElement.MinimumLoadThreshold();
+      }
+    }
+    
+    isbatchedit := unitPeriodTimes.Size() > 1;
+    UnitAvailability::CreateOrUpdateForUnitPeriodTimes( unitPeriodTimes,
+                                                        not isbatchedit or false,
+                                                        timeunit,
+                                                        maintenance,
+                                                        not isbatchedit or false,
+                                                        efficiency,
+                                                        false,
+                                                        allocation,
+                                                        not isbatchedit or true,
+                                                        shiftPattern,
+                                                        not isbatchedit or false,
+                                                        maxloadpercentage,
+                                                        not isbatchedit or false,
+                                                        nrofunitopen,
+                                                        false,
+                                                        not isbatchedit or false,
+                                                        minloadthreshold
+                                                       );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageReport.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageReport.def
index a9e718b..a6f622c 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageReport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageReport.def
@@ -26,6 +26,16 @@
         Taborder: 2
       ]
     }
+    Component dhMDSHandles
+    {
+      #keys: '[414996.1.116451655]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[internal[ExternalMDSHandle]]*'
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuCapacities.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuCapacities.def
index f6224d2..0d25535 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuCapacities.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuCapacities.def
@@ -27,5 +27,16 @@
         Tooltip: 'Event type'
       ]
     }
+    Component MenuBatchSetShiftPattern
+    {
+      #keys: '[414996.1.119140284]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'QUEUE'
+        Taborder: 8
+        Title: '鎵归噺璁剧疆浜х嚎鐝'
+      ]
+    }
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlans.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlans.def
index bc17ce4..a6154d6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlans.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlans.def
@@ -7,11 +7,14 @@
   [*
     componentmds := ApplicationScope.ComponentMDS();
     
+    dhMDSHandles.Data().Flush();
+    
     macroPlans := construct( MacroPlans );
     scemps := selectset( ScenarioManager,ScenarioMP,mp,mp.IsLoaded());
     traverse( scemps,Elements,scemp ){
       mdsinstance     := select( componentmds, ComponentMDSKinds.ComponentMDSInstances, m, m.MDSID().MDSKey() = scemp.DatasetMDSID() );
       handle          := mdsinstance.GetMDSHandle();
+      dhMDSHandles.Data().Add( handle );
       demandMacroPlan := handle.AsMacroPlan();
       macroPlans.Add( demandMacroPlan );
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuCapacities_MenuBatchSetShiftPattern_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuCapacities_MenuBatchSetShiftPattern_OnClick.def
new file mode 100644
index 0000000..a6fab35
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuCapacities_MenuBatchSetShiftPattern_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ContextMenuCapacities/MenuBatchSetShiftPattern
+Response OnClick () id:Response_MacroPlanner_ContextMenuCapacities_MenuBatchSetShiftPattern_OnClick
+{
+  #keys: '[414996.1.119140372]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      // Open view
+      ApplicationMacroPlanner.OpenView( 'BatchSetShiftPattern', ButtonCapacities );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlActions_btnOk_OnClick.def
index 7ef6f8d..3775f82 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlActions_btnOk_OnClick.def
@@ -4,6 +4,10 @@
 {
   #keys: '[413988.0.1596179631]'
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not exists( MacroPlan, PackagingPlanNewCapability, tempPPNC, true, tempPPNC.ProductionLine() = ddslProductionLine.Text() );
+  *]
   QuillAction
   {
     Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlContent_ddslProductionLine_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlContent_ddslProductionLine_OnCreated.def
index 5c18585..0f1290b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlContent_ddslProductionLine_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlContent_ddslProductionLine_OnCreated.def
@@ -13,7 +13,7 @@
   {
     Body:
     [*
-      uids := selectuniquevalues( MacroPlan, Unit, tempU, true, tempU.ID() );
+      uids := selectuniquevalues( MacroPlan, Unit, tempU, tempU.HasCapacityTypeTime(), tempU.ID() );
       
       this.Strings( uids.Concatenate( ";" ) );
     *]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogPackagingPlanLotSize/Response_pHeader_bAdd_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogPackagingPlanLotSize/Response_pHeader_bAdd_OnClick.def
index bf6fca9..4ea5425 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogPackagingPlanLotSize/Response_pHeader_bAdd_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogPackagingPlanLotSize/Response_pHeader_bAdd_OnClick.def
@@ -5,6 +5,11 @@
   #keys: '[413988.0.1401876560]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not exists( MacroPlan, PackagingPlanLotSize, tempPPLS, true, tempPPLS.Factory() = ddslFactory.Text() and
+                       tempPPLS.ProductID() = ddlProductID.Data().ID() );
+  *]
   QuillAction
   {
     Body:
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_dhOfflinePlanTables_OnCreated\04357.def" "b/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_dhOfflinePlanTables_OnCreated\04357.def"
index fec74d0..0df72f7 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_dhOfflinePlanTables_OnCreated\04357.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_dhOfflinePlanTables_OnCreated\04357.def"
@@ -14,6 +14,11 @@
       traverse( macroPlans,Elements,element ){
         info( element.MDSID() ); 
       }
+      info( dhMDSHandles.Data().Size() );
+      traverse( dhMDSHandles.Data(),Elements,element ){
+        info( element.AsMacroPlan().MDSMacroPlan().Description() );
+      }
+      
       this.Data( &offlinePlanTables );
     *]
     GroupServerCalls: false
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDL_EngineRackReport/Response_pHeader_bRefresh_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormDL_EngineRackReport/Response_pHeader_bRefresh_OnClick.def
index 198ae43..b6158bf 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormDL_EngineRackReport/Response_pHeader_bRefresh_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDL_EngineRackReport/Response_pHeader_bRefresh_OnClick.def
@@ -14,6 +14,8 @@
     Body:
     [*
       DL_EngineRackCell::CreateData( MacroPlan );
+      
+      WebMessageBox::Success( Translations::A_VWED_Success() );
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPackagingPlan/Response_MatrixEditor493_OnCheckEditability.def b/_Main/UI/MacroPlannerWebApp/Component_FormPackagingPlan/Response_MatrixEditor493_OnCheckEditability.def
new file mode 100644
index 0000000..8be5f6a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPackagingPlan/Response_MatrixEditor493_OnCheckEditability.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: MatrixEditor493
+Response OnCheckEditability (
+  structured[PackagingPlanCell] cell,
+  Real value
+) id:Response_MatrixEditor493_OnCheckEditability
+{
+  #keys: '[415754.0.367460056]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMatrixEditor_OnCheckEditability'
+  QuillAction
+  {
+    Body:
+    [*
+      cond := focusedattribute = "Package" or focusedattribute = "Unpacking";
+      
+      editinfo.CanEdit( cond );
+      editinfo.UserHint( ifexpr( cond, "", "涓嶈兘淇敼" ) );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelRight.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelRight.def
index 8538493..3731f86 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelRight.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelRight.def
@@ -5,69 +5,6 @@
   BaseType: 'WebPanel'
   Children:
   [
-    Component cbMonday
-    {
-      #keys: '[414996.1.116589495]'
-      BaseType: 'WebCheckbox'
-      Properties:
-      [
-        Taborder: 3
-      ]
-    }
-    Component cbTuesday
-    {
-      #keys: '[414996.1.116589517]'
-      BaseType: 'WebCheckbox'
-      Properties:
-      [
-        Taborder: 4
-      ]
-    }
-    Component cbWednesday
-    {
-      #keys: '[414996.1.116589519]'
-      BaseType: 'WebCheckbox'
-      Properties:
-      [
-        Taborder: 5
-      ]
-    }
-    Component cbThursday
-    {
-      #keys: '[414996.1.116589521]'
-      BaseType: 'WebCheckbox'
-      Properties:
-      [
-        Taborder: 6
-      ]
-    }
-    Component cbFriday
-    {
-      #keys: '[414996.1.116589523]'
-      BaseType: 'WebCheckbox'
-      Properties:
-      [
-        Taborder: 7
-      ]
-    }
-    Component cbSaturday
-    {
-      #keys: '[414996.1.116589525]'
-      BaseType: 'WebCheckbox'
-      Properties:
-      [
-        Taborder: 8
-      ]
-    }
-    Component cbSunday
-    {
-      #keys: '[414996.1.116589527]'
-      BaseType: 'WebCheckbox'
-      Properties:
-      [
-        Taborder: 9
-      ]
-    }
     Component dsStartDate
     {
       #keys: '[414996.1.116589712]'
@@ -75,7 +12,7 @@
       Properties:
       [
         Label: 'Start'
-        Taborder: 1
+        Taborder: 2
       ]
     }
     Component dsEndDate
@@ -85,7 +22,7 @@
       Properties:
       [
         Label: 'End'
-        Taborder: 2
+        Taborder: 3
       ]
     }
     Component LabelSelectUnit
@@ -105,6 +42,103 @@
       Properties:
       [
         Label: 'Apply'
+        Taborder: 11
+      ]
+    }
+    Component ddlShiftPattern
+    {
+      #keys: '[414996.1.116430349]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ShiftPattern'
+      Children:
+      [
+        Component deContent710 id:deContent710_593
+        {
+          #keys: '[414996.1.116430350]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'ShiftPattern'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: 'Shift pattern 1'
+        Taborder: 1
+      ]
+    }
+    Component cbMonday
+    {
+      #keys: '[414996.1.117120493]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Monday'
+        Taborder: 4
+      ]
+    }
+    Component cbTuesday
+    {
+      #keys: '[414996.1.117120516]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Tuesday'
+        Taborder: 5
+      ]
+    }
+    Component cbWednesday
+    {
+      #keys: '[414996.1.117120539]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Wednesday'
+        Taborder: 6
+      ]
+    }
+    Component cbThursday
+    {
+      #keys: '[414996.1.117120576]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Thursday'
+        Taborder: 7
+      ]
+    }
+    Component cbFriday
+    {
+      #keys: '[414996.1.117120599]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Friday'
+        Taborder: 8
+      ]
+    }
+    Component cbSaturday id:cbSaturday_682
+    {
+      #keys: '[414996.1.117120636]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Saturday'
+        Taborder: 9
+      ]
+    }
+    Component cbSunday
+    {
+      #keys: '[414996.1.117120659]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Sunday'
         Taborder: 10
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Response_PanelRight_bApply_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Response_PanelRight_bApply_OnClick.def
new file mode 100644
index 0000000..1a2c721
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Response_PanelRight_bApply_OnClick.def
@@ -0,0 +1,39 @@
+Quintiq file version 2.0
+#parent: PanelRight/bApply
+Response OnClick () id:Response_PanelRight_bApply_OnClick
+{
+  #keys: '[414996.1.117189721]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      weekdays := construct( Numbers );
+      if( cbMonday.Checked() ){
+        weekdays.Add( 1 ); 
+      }
+      if( cbTuesday.Checked() ){
+        weekdays.Add( 2 ); 
+      }
+      if( cbWednesday.Checked() ){
+        weekdays.Add( 3 ); 
+      }
+      if( cbThursday.Checked() ){
+        weekdays.Add( 4 ); 
+      }
+      if( cbFriday.Checked() ){
+        weekdays.Add( 5 ); 
+      }
+      if( cbSaturday.Checked() ){
+        weekdays.Add( 6 ); 
+      }
+      if( cbSunday.Checked() ){
+        weekdays.Add( 7 ); 
+      }
+      LocalTool::BatchSetUnitShiftPattern( dhSelectUnit.Data(),ddlShiftPattern.Data(),dsStartDate.Date(),dsEndDate.Date(),weekdays );
+      WebMessageBox::Success( "Success");
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/_ROOT_Component_FormProductionLineBatchSetShiftPattern.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/_ROOT_Component_FormProductionLineBatchSetShiftPattern.def
index f7309e6..deb4d00 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/_ROOT_Component_FormProductionLineBatchSetShiftPattern.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/_ROOT_Component_FormProductionLineBatchSetShiftPattern.def
@@ -12,5 +12,6 @@
   Properties:
   [
     Description: 'FormProductionLineBatchData'
+    Title: '鎵归噺璁剧疆浜х嚎鐝'
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Views/BatchSetShiftPattern.vw b/_Main/UI/MacroPlannerWebApp/Views/BatchSetShiftPattern.vw
new file mode 100644
index 0000000..e1a08c5
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/BatchSetShiftPattern.vw
@@ -0,0 +1,386 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormProductionLineBatchSetShiftPattern
+      {
+        title: 'QMacroPlanner::FormProductionLineBatchSetShiftPattern'
+        shown: true
+        componentID: 'QMacroPlanner::FormProductionLineBatchSetShiftPattern'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 23
+          columnPosition: 1
+          columnSpan: 9
+        }
+        components
+        {
+          FormProductionLineBatchSetShiftPattern_PanelProductionLineBatchSetShiftPattern
+          {
+            sizeRatio: 1
+          }
+          FormProductionLineBatchSetShiftPattern_PanelLeft
+          {
+            sizeRatio: 1
+          }
+          FormProductionLineBatchSetShiftPattern_ListUnit
+          {
+          }
+          FormProductionLineBatchSetShiftPattern_DataSetLevelProductionLineBatchSetShiftPattern
+          {
+            groupDepth: -1
+            sort: 'Name'
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+          }
+          FormProductionLineBatchSetShiftPattern_PanelRight
+          {
+            sizeRatio: 1
+          }
+        }
+      }
+      form_FormKPI
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 0
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPISelection'
+          }
+          FormKPI_PanelKPIDashboard
+          {
+            sizeRatio: 1
+          }
+          FormKPI_PanelKPISelection
+          {
+            sizeRatio: 1
+          }
+          FormKPI_ListKPISelection
+          {
+            QuillViewData
+            {
+              Food_KPISetting: 'Cost of sales;Fulfillment;Fulfillment target;Inventory holding cost;Labor cost;Margin;Safety stock;Sales;Sourcing cost;Total CO2 emission;Transportation cost;Volume'
+            }
+          }
+          FormKPI_DataSetLevelKPISelection
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerStrategiesSlideIn
+      {
+        title: 'Optimizer Strategies'
+        shown: false
+        componentID: 'FormOptimizerStrategiesSlideIn'
+        layout
+        {
+          mode: 'dockright'
+          index: 1
+        }
+        components
+        {
+          FormOptimizerStrategiesSlideIn_ListOptimizerStrategiesSlideIn
+          {
+          }
+          FormOptimizerStrategiesSlideIn_DataSetLevelOptimizerStrategiesSlideIn
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_ImgIsValid
+            {
+              columnId: 'ImgIsValid'
+              dataPath: 'ImgIsValid'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 270
+            }
+          }
+        }
+      }
+      form_FormSanityCheck
+      {
+        title: 'Sanity Check'
+        shown: false
+        componentID: 'FormSanityCheck'
+        layout
+        {
+          mode: 'dockright'
+          index: 2
+        }
+        components
+        {
+          FormSanityCheck_PanelSanityCheckToolbar
+          {
+            sizeRatio: 1
+          }
+          FormSanityCheck_PanelSanityCheckContent
+          {
+            sizeRatio: 1
+          }
+          FormSanityCheck_PanelSanityCheckGroup
+          {
+            sizeRatio: 4
+          }
+          FormSanityCheck_ListSanityCheckGroup
+          {
+          }
+          FormSanityCheck_DataSetLevelSanityCheckGroup
+          {
+            groupDepth: -1
+            sort: 'DESC:IsShown,DESC:SanityCheckHighestCategory,DESC:_Expr3'
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Show
+            {
+              columnId: 'Show'
+              dataPath: 'Show'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 32
+            }
+            column_Category
+            {
+              columnId: 'Category'
+              dataPath: 'Category'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 32
+            }
+            column_Group
+            {
+              columnId: 'Group'
+              dataPath: 'Group'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 270
+            }
+            column__Expr3
+            {
+              columnId: '_Expr3'
+              dataPath: '_Expr3'
+              dataType: 'number'
+              index: 4
+              subtotals: ''
+              width: 95
+            }
+          }
+          FormSanityCheck_PanelSanityCheckMessage
+          {
+            sizeRatio: 5
+          }
+          FormSanityCheck_ListSanityCheckMessage
+          {
+          }
+          FormSanityCheck_DataSetLevelSanityCheckMessage
+          {
+            groupDepth: -1
+            sort: 'DESC:IsShown,SanityCheckGroup.Type,SanityCheckGroup.Group,Description'
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Show
+            {
+              columnId: 'Show'
+              dataPath: 'Show'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 32
+            }
+            column_Category
+            {
+              columnId: 'Category'
+              dataPath: 'Category'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 32
+            }
+            column_Messages
+            {
+              columnId: 'Messages'
+              dataPath: 'Messages'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 32
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 585
+            }
+          }
+        }
+      }
+      form_FormDefaultCapacities
+      {
+        title: 'Default Capacities'
+        shown: false
+        componentID: 'FormDefaultCapacities'
+        layout
+        {
+          mode: 'dockright'
+          index: 3
+        }
+        components
+        {
+          FormDefaultCapacities_PanelContent
+          {
+            sizeRatio: 1
+          }
+          FormDefaultCapacities_PanelTimeCapacities
+          {
+            sizeRatio: 1
+          }
+          FormDefaultCapacities_PanelQuantityAndTransportCapacities
+          {
+            sizeRatio: 1
+          }
+          FormDefaultCapacities_PanelStockingPointCapacities
+          {
+            sizeRatio: 1
+          }
+          FormDefaultCapacities_PanelActions
+          {
+            sizeRatio: 1
+          }
+        }
+      }
+      form_FormGeneralSettings
+      {
+        title: 'General Settings'
+        shown: true
+        componentID: 'FormGeneralSettings'
+        layout
+        {
+          mode: 'dockright'
+          index: 4
+        }
+        components
+        {
+          FormGeneralSettings_PanelContent
+          {
+            sizeRatio: 1
+          }
+          FormGeneralSettings_PanelGeneralParameter
+          {
+            sizeRatio: 1
+          }
+          FormGeneralSettings_PanelLeadTimeDependent
+          {
+            sizeRatio: 1
+          }
+          FormGeneralSettings_PanelShelfLife
+          {
+            sizeRatio: 1
+          }
+          FormGeneralSettings_PanelSustainability
+          {
+            sizeRatio: 1
+          }
+          FormGeneralSettings_PanelForecastNetting
+          {
+            sizeRatio: 1
+          }
+          FormGeneralSettings_PanelActions
+          {
+            sizeRatio: 1
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    image: 'QUEUE'
+    page: ''
+    group: ''
+    index: 0
+    description: ''
+  }
+  formatversion: 2
+  id: 'BatchSetShiftPattern'
+  name: 'BatchSetShiftPattern'
+  isglobal: false
+  isroot: true
+}

--
Gitblit v1.9.3