From 5ed2c2076e3b8a907ac2d271ea627cc9f9c9b3f4 Mon Sep 17 00:00:00 2001
From: lihongji <3117313295@qq.com>
Date: 星期二, 09 七月 2024 13:19:13 +0800
Subject: [PATCH] 装配上线计划

---
 _Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_pHeader_bDownload_OnClick.def                                          |   22 
 _Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_MatrixEditor951#480.def                                               |   97 +++
 _Main/BL/Relations/Relation_OfflinePlanTable_MacroPlan_MacroPlan_OfflinePlanTable.qbl                                                        |   23 
 _Main/BL/Type_AssemblyOnlinePlanCell/Attribute_Value.qbl                                                                                     |    7 
 _Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_RowNr.qbl                                                                                   |    6 
 _Main/BL/Type_AssemblyOnlinePlanColumn/Attribute_ColumnIndex.qbl                                                                             |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Component_pnlContent.def                                                  |   36 +
 _Main/BL/Type_AssemblyOnlinePlanCell/_ROOT_Type_AssemblyOnlinePlanCell.qbl                                                                   |    9 
 _Main/BL/Type_AssemblyOnlinePlanColumn/Function_CalcColumnName.qbl                                                                           |   13 
 _Main/BL/Type_AssemblyOnlinePlanCell/Attribute_Quantity.qbl                                                                                  |    7 
 _Main/BL/Type_AssemblyOnlineQuantity/_ROOT_Type_AssemblyOnlineQuantity.qbl                                                                   |    9 
 _Main/BL/Type_OfflinePlanCell/Attribute_Quantity.qbl                                                                                         |    7 
 _var/_Main/ProjSettings/EditorTC/Views/车道整班分析_[413988.0.1301140601].vw                                                                       |   59 -
 _Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_ProductID.qbl                                                                               |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bDownload_OnClick.def                                                 |   10 
 _Main/BL/Type_AssemblyOnlinePlanColumn/DefaultValue_ColumnName.qbl                                                                           |    6 
 _Main/BL/Relations/Relation_OfflinePlanColumn_OfflinePlanTable_OfflinePlanTable_OfflinePlanColu.qbl                                          |   34 +
 _Main/BL/Type_OfflinePlanRow/Attribute_ProductionLine.qbl                                                                                    |    1 
 _Main/BL/Type_OfflinePlanCell/Attribute_InventoryWeight.qbl                                                                                  |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pContent_dhOfflinePlanTable_OnCreated.def                                     |   18 
 _Main/BL/Type_OfflinePlanTable/_ROOT_Type_OfflinePlanTable.qbl                                                                               |    9 
 _Main/BL/Type_AssemblyOnlinePlanRow/_ROOT_Type_AssemblyOnlinePlanRow.qbl                                                                     |    9 
 _Main/BL/Type_OfflinePlanCell/StaticMethod_Download.qbl                                                                                      |   48 +
 _Main/UI/MacroPlannerWebApp/Views/AssemblyOnlinePlan.vw                                                                                      |  134 +++++
 _Main/BL/Relations/Relation_OfflinePlanRow_OfflinePlanTable_OfflinePlanTable_OfflinePlanRow.qbl                                              |   23 
 _Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_Type.qbl                                                                                    |    6 
 _Main/BL/Type_AssemblyOnlinePlanRow/Attribute_ProductionLine.qbl                                                                             |    7 
 _Main/BL/Type_OfflinePlanColumn/Function_CalcColumnName.qbl                                                                                  |    2 
 _Main/BL/Type_AssemblyOnlinePlanColumn/_ROOT_Type_AssemblyOnlinePlanColumn.qbl                                                               |    9 
 _Main/BL/Type_AssemblyOnlinePlanRow/Attribute_RowNr.qbl                                                                                      |    7 
 _Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_ProductionLine.qbl                                                                          |    6 
 _Main/BL/Relations/Relation_AssemblyOnlinePlanColumn_MacroPlan_MacroPlan_AssemblyOnlinePlanColu.qbl                                          |   34 +
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pContent#611.def                                                             |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/_ROOT_Component_FormAssemblyOnlinePlan.def                                      |   17 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRestore_OnClick.def                                                  |   15 
 _Main/BL/Type_AssemblyOnlinePlanCell/Attribute_InventoryWeight.qbl                                                                           |    8 
 _Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Response_pnlActions_btnOk_OnClick.def                                     |   16 
 _Main/BL/Type_AssemblyOnlinePlanColumn/Attribute_ColumnDate.qbl                                                                              |    7 
 _Main/BL/Type_AssemblyOnlineQuantity/Attribute_DLMoMo.qbl                                                                                    |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Response_pnlActions_btnCancel_OnClick.def                                 |   15 
 _Main/BL/Type_AssemblyOnlinePlanRow/Attribute_Type.qbl                                                                                       |   15 
 _Main/BL/Type_AssemblyOnlineQuantity/Attribute_CCMoMo.qbl                                                                                    |    7 
 _Main/BL/Type_OfflinePlanColumn/Attribute_ColumnDate.qbl                                                                                     |    1 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgSecondDevelopmentPlan.def                                         |   14 
 _Main/BL/Type_AssemblyOnlinePlanCell/Attribute_ProductionSerialNumber.qbl                                                                    |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgSecondDevelopmentPlan_bAssemblyOnlinePlan_OnClick.def |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_pHeader.def                                                           |   46 +
 _Main/BL/Type_AssemblyOnlinePlanCell/StaticMethod_Download.qbl                                                                               |   47 +
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_MatrixEditor951.def                                                          |   12 
 _Main/BL/Type_OfflinePlanCell/StaticMethod_SaveAsDraft.qbl                                                                                   |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bSaveAsDraft_OnClick.def                                              |   11 
 _Main/BL/Type_OfflinePlanCell/Attribute_ProductionSerialNumber.qbl                                                                           |    7 
 _Main/BL/Type_AssemblyOnlinePlanCell/StaticMethod_RefreshData.qbl                                                                            |   36 +
 _Main/BL/Type_TransferPlanCell/StaticMethod_Download.qbl                                                                                     |   61 ++
 _Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_pHeader_bOnlineQuantity_OnClick.def                                    |   27 +
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRefresh_OnClick.def                                                  |    5 
 _Main/BL/Relations/Relation_AssemblyOnlineQuantity_MacroPlan_MacroPlan_AssemblyOnlineQuantity.qbl                                            |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bDownload_OnClick.def                                                |   10 
 _Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/_ROOT_Component_DialogAssemblyOnlineQuantity.def                          |   22 
 _Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_pContent.def                                                          |   14 
 _Main/BL/Type_AssemblyOnlinePlanColumn/Attribute_ColumnName.qbl                                                                              |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_matrixEditorActionBarPage250#1.def                                    |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_pHeader_bRefresh_OnClick#774.def                                       |   24 
 _Main/BL/Type_AssemblyOnlinePlanRow/Attribute_ProductID.qbl                                                                                  |    7 
 _Main/BL/Type_OfflinePlanTable/Attribute_SaveDateTime.qbl                                                                                    |    7 
 _Main/BL/Relations/Relation_AssemblyOnlinePlanColumn_AssemblyOnlinePlanCell_AssemblyOnlinePlanC.qbl                                          |   23 
 _Main/BL/Relations/Relation_AssemblyOnlinePlanRow_MacroPlan_MacroPlan_AssemblyOnlinePlanRow.qbl                                              |   23 
 _Main/BL/Relations/Relation_AssemblyOnlinePlanRow_AssemblyOnlinePlanCell_AssemblyOnlinePlanCell.qbl                                          |   23 
 /dev/null                                                                                                                                    |   20 
 _Main/UI/MacroPlannerWebApp/Views/OfflinePlan.vw                                                                                             |    2 
 _Main/BL/Type_AssemblyOnlinePlanCell/DefaultValue_Shift.qbl                                                                                  |    6 
 _Main/BL/Type_OfflinePlanCell/Method_FindType2.qbl                                                                                           |    9 
 _Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Component_pnlActions.def                                                  |   40 +
 _Main/BL/Type_OfflinePlanRow/Attribute_ProductID.qbl                                                                                         |    1 
 _Main/BL/Type_AssemblyOnlinePlanCell/Attribute_Shift.qbl                                                                                     |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_matrixeditorContextMenu204#1.def                                      |   10 
 _Main/BL/Type_OfflinePlanCell/StaticMethod_RefreshOfflinePlan.qbl                                                                            |  103 +++
 _Main/BL/Type_AssemblyOnlinePlanCell/DefaultValue_Value.qbl                                                                                  |    6 
 _Main/BL/Type_OfflinePlanRow/Attribute_Type.qbl                                                                                              |    1 
 79 files changed, 1,412 insertions(+), 89 deletions(-)

diff --git a/_Main/BL/Relations/Relation_AssemblyOnlinePlanColumn_AssemblyOnlinePlanCell_AssemblyOnlinePlanC.qbl b/_Main/BL/Relations/Relation_AssemblyOnlinePlanColumn_AssemblyOnlinePlanCell_AssemblyOnlinePlanC.qbl
new file mode 100644
index 0000000..234a042
--- /dev/null
+++ b/_Main/BL/Relations/Relation_AssemblyOnlinePlanColumn_AssemblyOnlinePlanCell_AssemblyOnlinePlanC.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation AssemblyOnlinePlanColumn_AssemblyOnlinePlanCell_AssemblyOnlinePlanCell_AssemblyOnlinePlanColumn
+{
+  #keys: '1[413988.0.1348175595]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide AssemblyOnlinePlanCell
+  {
+    #keys: '3[413988.0.1348175597][413988.0.1348175596][413988.0.1348175598]'
+    Cardinality: '1toN'
+    ObjectDefinition: AssemblyOnlinePlanColumn
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide AssemblyOnlinePlanColumn
+  {
+    #keys: '3[413988.0.1348175600][413988.0.1348175599][413988.0.1348175601]'
+    Cardinality: '0to1'
+    ObjectDefinition: AssemblyOnlinePlanCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_AssemblyOnlinePlanColumn_MacroPlan_MacroPlan_AssemblyOnlinePlanColu.qbl b/_Main/BL/Relations/Relation_AssemblyOnlinePlanColumn_MacroPlan_MacroPlan_AssemblyOnlinePlanColu.qbl
new file mode 100644
index 0000000..bc0d983
--- /dev/null
+++ b/_Main/BL/Relations/Relation_AssemblyOnlinePlanColumn_MacroPlan_MacroPlan_AssemblyOnlinePlanColu.qbl
@@ -0,0 +1,34 @@
+Quintiq file version 2.0
+#parent: #root
+Relation AssemblyOnlinePlanColumn_MacroPlan_MacroPlan_AssemblyOnlinePlanColumn
+{
+  #keys: '1[413988.0.1348175552]'
+  DeclarativeSequenceRelationStrategy
+  {
+    #keys: '13[0.0.0][413988.0.1348175574][413988.0.1348175568][413988.0.1348175575][413988.0.1348175569][413988.0.1348175576][413988.0.1348175570][413988.0.1348175577][413988.0.1348175571][413988.0.1348175578][413988.0.1348175572][413988.0.1348175579][413988.0.1348175573]'
+    SequenceElementSuffix: 'Column'
+    SequenceSuffix: 'Column'
+    SortAttributes:
+    [
+      DeclarativeSequenceRelationSortAttribute
+      {
+        #keys: '1[413988.0.1348175584]'
+        Attribute: 'ColumnDate'
+      }
+    ]
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.0.1348175554][413988.0.1348175553][413988.0.1348175555]'
+    Cardinality: '0to1'
+    ObjectDefinition: AssemblyOnlinePlanColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide AssemblyOnlinePlanColumn
+  {
+    #keys: '3[413988.0.1348175557][413988.0.1348175556][413988.0.1348175558]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_AssemblyOnlinePlanRow_AssemblyOnlinePlanCell_AssemblyOnlinePlanCell.qbl b/_Main/BL/Relations/Relation_AssemblyOnlinePlanRow_AssemblyOnlinePlanCell_AssemblyOnlinePlanCell.qbl
new file mode 100644
index 0000000..e878ce8
--- /dev/null
+++ b/_Main/BL/Relations/Relation_AssemblyOnlinePlanRow_AssemblyOnlinePlanCell_AssemblyOnlinePlanCell.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation AssemblyOnlinePlanRow_AssemblyOnlinePlanCell_AssemblyOnlinePlanCell_AssemblyOnlinePlanRow
+{
+  #keys: '1[413988.0.1348175621]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide AssemblyOnlinePlanCell
+  {
+    #keys: '3[413988.0.1348175623][413988.0.1348175622][413988.0.1348175624]'
+    Cardinality: '1toN'
+    ObjectDefinition: AssemblyOnlinePlanRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide AssemblyOnlinePlanRow
+  {
+    #keys: '3[413988.0.1348175626][413988.0.1348175625][413988.0.1348175627]'
+    Cardinality: '0to1'
+    ObjectDefinition: AssemblyOnlinePlanCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_AssemblyOnlinePlanRow_MacroPlan_MacroPlan_AssemblyOnlinePlanRow.qbl b/_Main/BL/Relations/Relation_AssemblyOnlinePlanRow_MacroPlan_MacroPlan_AssemblyOnlinePlanRow.qbl
new file mode 100644
index 0000000..103c7c9
--- /dev/null
+++ b/_Main/BL/Relations/Relation_AssemblyOnlinePlanRow_MacroPlan_MacroPlan_AssemblyOnlinePlanRow.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation AssemblyOnlinePlanRow_MacroPlan_MacroPlan_AssemblyOnlinePlanRow
+{
+  #keys: '1[413988.0.1348175608]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.0.1348175610][413988.0.1348175609][413988.0.1348175611]'
+    Cardinality: '0to1'
+    ObjectDefinition: AssemblyOnlinePlanRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide AssemblyOnlinePlanRow
+  {
+    #keys: '3[413988.0.1348175613][413988.0.1348175612][413988.0.1348175614]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_AssemblyOnlineQuantity_MacroPlan_MacroPlan_AssemblyOnlineQuantity.qbl b/_Main/BL/Relations/Relation_AssemblyOnlineQuantity_MacroPlan_MacroPlan_AssemblyOnlineQuantity.qbl
new file mode 100644
index 0000000..3064591
--- /dev/null
+++ b/_Main/BL/Relations/Relation_AssemblyOnlineQuantity_MacroPlan_MacroPlan_AssemblyOnlineQuantity.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation AssemblyOnlineQuantity_MacroPlan_MacroPlan_AssemblyOnlineQuantity
+{
+  #keys: '1[413988.0.1348200027]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.0.1348200029][413988.0.1348200028][413988.0.1348200030]'
+    Cardinality: '0to1'
+    ObjectDefinition: AssemblyOnlineQuantity
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide AssemblyOnlineQuantity
+  {
+    #keys: '3[413988.0.1348200032][413988.0.1348200031][413988.0.1348200033]'
+    Cardinality: '0to1'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_OfflinePlanColumn_MacroPlan_MacroPlan_OfflinePlanColumn.qbl b/_Main/BL/Relations/Relation_OfflinePlanColumn_MacroPlan_MacroPlan_OfflinePlanColumn.qbl
deleted file mode 100644
index ddb1bef..0000000
--- a/_Main/BL/Relations/Relation_OfflinePlanColumn_MacroPlan_MacroPlan_OfflinePlanColumn.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation OfflinePlanColumn_MacroPlan_MacroPlan_OfflinePlanColumn
-{
-  #keys: '1[413988.0.1296697061]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MacroPlan
-  {
-    #keys: '3[413988.0.1296697063][413988.0.1296697062][413988.0.1296697064]'
-    Cardinality: '0to1'
-    ObjectDefinition: OfflinePlanColumn
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide OfflinePlanColumn
-  {
-    #keys: '3[413988.0.1296697066][413988.0.1296697065][413988.0.1296697067]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_OfflinePlanColumn_OfflinePlanTable_OfflinePlanTable_OfflinePlanColu.qbl b/_Main/BL/Relations/Relation_OfflinePlanColumn_OfflinePlanTable_OfflinePlanTable_OfflinePlanColu.qbl
new file mode 100644
index 0000000..d24e7bb
--- /dev/null
+++ b/_Main/BL/Relations/Relation_OfflinePlanColumn_OfflinePlanTable_OfflinePlanTable_OfflinePlanColu.qbl
@@ -0,0 +1,34 @@
+Quintiq file version 2.0
+#parent: #root
+Relation OfflinePlanColumn_OfflinePlanTable_OfflinePlanTable_OfflinePlanColumn
+{
+  #keys: '1[413988.0.1337732899]'
+  DeclarativeSequenceRelationStrategy
+  {
+    #keys: '13[0.0.0][413988.0.1337732918][413988.0.1337732912][413988.0.1337732919][413988.0.1337732913][413988.0.1337732920][413988.0.1337732914][413988.0.1337732921][413988.0.1337732915][413988.0.1337732922][413988.0.1337732916][413988.0.1337732923][413988.0.1337732917]'
+    SequenceElementSuffix: 'Column'
+    SequenceSuffix: 'Column'
+    SortAttributes:
+    [
+      DeclarativeSequenceRelationSortAttribute
+      {
+        #keys: '1[413988.0.1337732928]'
+        Attribute: 'ColumnDate'
+      }
+    ]
+  }
+  RelationSide.LeftSide OfflinePlanTable
+  {
+    #keys: '3[413988.0.1337732901][413988.0.1337732900][413988.0.1337732902]'
+    Cardinality: '0to1'
+    ObjectDefinition: OfflinePlanColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide OfflinePlanColumn
+  {
+    #keys: '3[413988.0.1337732904][413988.0.1337732903][413988.0.1337732905]'
+    Cardinality: '1toN'
+    ObjectDefinition: OfflinePlanTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_OfflinePlanRow_MacroPlan_MacroPlan_OfflinePlanRow.qbl b/_Main/BL/Relations/Relation_OfflinePlanRow_MacroPlan_MacroPlan_OfflinePlanRow.qbl
deleted file mode 100644
index c9dde81..0000000
--- a/_Main/BL/Relations/Relation_OfflinePlanRow_MacroPlan_MacroPlan_OfflinePlanRow.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation OfflinePlanRow_MacroPlan_MacroPlan_OfflinePlanRow
-{
-  #keys: '1[413988.0.1296696992]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MacroPlan
-  {
-    #keys: '3[413988.0.1296696994][413988.0.1296696993][413988.0.1296696995]'
-    Cardinality: '0to1'
-    ObjectDefinition: OfflinePlanRow
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide OfflinePlanRow
-  {
-    #keys: '3[413988.0.1296696997][413988.0.1296696996][413988.0.1296696998]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_OfflinePlanRow_OfflinePlanTable_OfflinePlanTable_OfflinePlanRow.qbl b/_Main/BL/Relations/Relation_OfflinePlanRow_OfflinePlanTable_OfflinePlanTable_OfflinePlanRow.qbl
new file mode 100644
index 0000000..c17df01
--- /dev/null
+++ b/_Main/BL/Relations/Relation_OfflinePlanRow_OfflinePlanTable_OfflinePlanTable_OfflinePlanRow.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation OfflinePlanRow_OfflinePlanTable_OfflinePlanTable_OfflinePlanRow
+{
+  #keys: '1[413988.0.1337732881]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide OfflinePlanTable
+  {
+    #keys: '3[413988.0.1337732883][413988.0.1337732882][413988.0.1337732884]'
+    Cardinality: '0to1'
+    ObjectDefinition: OfflinePlanRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide OfflinePlanRow
+  {
+    #keys: '3[413988.0.1337732886][413988.0.1337732885][413988.0.1337732887]'
+    Cardinality: '1toN'
+    ObjectDefinition: OfflinePlanTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_OfflinePlanTable_MacroPlan_MacroPlan_OfflinePlanTable.qbl b/_Main/BL/Relations/Relation_OfflinePlanTable_MacroPlan_MacroPlan_OfflinePlanTable.qbl
new file mode 100644
index 0000000..781206d
--- /dev/null
+++ b/_Main/BL/Relations/Relation_OfflinePlanTable_MacroPlan_MacroPlan_OfflinePlanTable.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation OfflinePlanTable_MacroPlan_MacroPlan_OfflinePlanTable
+{
+  #keys: '1[413988.0.1337732865]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.0.1337732867][413988.0.1337732866][413988.0.1337732868]'
+    Cardinality: '0to1'
+    ObjectDefinition: OfflinePlanTable
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide OfflinePlanTable
+  {
+    #keys: '3[413988.0.1337732870][413988.0.1337732869][413988.0.1337732871]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_InventoryWeight.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_InventoryWeight.qbl
new file mode 100644
index 0000000..4feff43
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_InventoryWeight.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute InventoryWeight
+{
+  #keys: '3[413988.0.1348175527][413988.0.1348175526][413988.0.1348175528]'
+  Description: '鍓╀綑搴撳瓨 - 鏈�灏忓簱瀛�'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_ProductionSerialNumber.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_ProductionSerialNumber.qbl
new file mode 100644
index 0000000..d4f3732
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_ProductionSerialNumber.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductionSerialNumber
+{
+  #keys: '3[413988.0.1348175536][413988.0.1348175535][413988.0.1348175537]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_Quantity.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_Quantity.qbl
new file mode 100644
index 0000000..4a88e03
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_Quantity.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Quantity
+{
+  #keys: '3[413988.0.1348175533][413988.0.1348175532][413988.0.1348175534]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_Shift.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_Shift.qbl
new file mode 100644
index 0000000..7a2ac9b
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_Shift.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Shift
+{
+  #keys: '3[413988.0.1348175530][413988.0.1348175529][413988.0.1348175531]'
+  Description: '鐝'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_Value.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_Value.qbl
new file mode 100644
index 0000000..07d672a
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell/Attribute_Value.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Value
+{
+  #keys: '3[413988.0.1348175524][413988.0.1348175523][413988.0.1348175525]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell/DefaultValue_Shift.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell/DefaultValue_Shift.qbl
new file mode 100644
index 0000000..b925fd8
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell/DefaultValue_Shift.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Shift
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell/DefaultValue_Value.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell/DefaultValue_Value.qbl
new file mode 100644
index 0000000..913414b
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell/DefaultValue_Value.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Value
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell/StaticMethod_Download.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell/StaticMethod_Download.qbl
new file mode 100644
index 0000000..3fc9100
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell/StaticMethod_Download.qbl
@@ -0,0 +1,47 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Download (
+  MacroPlan macroPlan
+) as BinaryValue
+{
+  TextBody:
+  [*
+    xmlDOMI      := XMLDOMImplementation::Create();
+    xmlDOM       := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>Sheet1</name></table>' );
+    
+    tableElement := xmlDOM.GetElementByTagName( "table", 0 );
+    
+    opcs := selectsortedset( macroPlan, AssemblyOnlinePlanColumn, tempOPC, true, tempOPC.ColumnDate() );
+    oprs := selectsortedset( macroPlan, AssemblyOnlinePlanRow, tempOPR, true, tempOPR.ProductionLine(), tempOPR.ProductID(), tempOPR.Type() );
+    traverse ( opcs, Elements, opc ) {
+      column := xmlDOM.CreateElement( "column" );
+      name   := xmlDOM.CreateElement( "name" );
+      type   := xmlDOM.CreateElement( "type" );
+      name.TextContent( ifexpr( opc.ColumnDate() < macroPlan.StartOfPlanning().Date(), "", opc.ColumnDate().Format( "Y/M2/D2" ) ) );
+      type.TextContent( "String" );
+      column.AppendChild( name );
+      column.AppendChild( type );
+      
+      traverse ( oprs, Elements, opr ) {
+        c    := select( opc, AssemblyOnlinePlanCell, tempOPC, tempOPC.AssemblyOnlinePlanRow() = opr );
+        cell := xmlDOM.CreateElement( "cell" );
+        cell.SetAttribute( "value", guard( c.Value(), "" ) );
+        column.AppendChild( cell );
+      }
+      
+      tableElement.AppendChild( column );
+    }
+    
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM )
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( "Sheet1" );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
+    tableGroupHandle.Add( tableHandle );
+    
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell/StaticMethod_RefreshData.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell/StaticMethod_RefreshData.qbl
new file mode 100644
index 0000000..733d439
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell/StaticMethod_RefreshData.qbl
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod RefreshData (
+  MacroPlan macroPlan,
+  OfflinePlanTable opt
+)
+{
+  TextBody:
+  [*
+    macroPlan.AssemblyOnlinePlanRow( relflush );
+    macroPlan.AssemblyOnlinePlanColumn( relflush );
+    
+    // 鎵捐閰嶇嚎琛�
+    oprs := selectsortedset( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = "Spider Assy Line 1", tempOPR.ProductionLine(), tempOPR.ProductID(), tempOPR.Type() );
+    opcs := selectsortedset( opt, OfflinePlanColumn, tempOPC, true, tempOPC.ColumnDate() );
+    
+    // 鐢熸垚琛ㄦ牸
+    traverse ( opcs, Elements, opc ) {
+      aopc := macroPlan.AssemblyOnlinePlanColumn( relnew, ColumnDate := opc.ColumnDate(), ColumnIndex := opc.ColumnIndex() );
+      traverse ( oprs, Elements, opr ) {
+        aopr := select( macroPlan, AssemblyOnlinePlanRow, tempAOPR, tempAOPR.ProductID() = opr.ProductID() and tempAOPR.ProductionLine() = opr.ProductionLine() and tempAOPR.Type() = opr.Type() );
+        if ( isnull( aopr ) ) {
+          aopr := macroPlan.AssemblyOnlinePlanRow( relnew, ProductID := opr.ProductID(), ProductionLine := opr.ProductionLine(), Type := opr.Type() );
+        }
+        
+        cellOPC := select( opr, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanColumn() = opc );
+        if ( not isnull( cellOPC ) ) {
+          cellAOPC := aopc.AssemblyOnlinePlanCell( relnew, Value := cellOPC.Value() );
+          cellAOPC.AssemblyOnlinePlanRow( relset, aopr );
+        }
+      }
+    }
+    
+    // 澶勭悊鏃ュ巻浜嬩欢
+  *]
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell/_ROOT_Type_AssemblyOnlinePlanCell.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell/_ROOT_Type_AssemblyOnlinePlanCell.qbl
new file mode 100644
index 0000000..f0ce00e
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell/_ROOT_Type_AssemblyOnlinePlanCell.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type AssemblyOnlinePlanCell
+{
+  #keys: '5[413988.0.1348175520][413988.0.1348175518][0.0.0][413988.0.1348175519][413988.0.1348175521]'
+  BaseType: Object
+  StructuredName: 'AssemblyOnlinePlanCells'
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanColumn/Attribute_ColumnDate.qbl b/_Main/BL/Type_AssemblyOnlinePlanColumn/Attribute_ColumnDate.qbl
new file mode 100644
index 0000000..8121276
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanColumn/Attribute_ColumnDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ColumnDate
+{
+  #keys: '3[413988.0.1348175542][413988.0.1348175541][413988.0.1348175543]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanColumn/Attribute_ColumnIndex.qbl b/_Main/BL/Type_AssemblyOnlinePlanColumn/Attribute_ColumnIndex.qbl
new file mode 100644
index 0000000..350460c
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanColumn/Attribute_ColumnIndex.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ColumnIndex
+{
+  #keys: '3[413988.0.1348175545][413988.0.1348175544][413988.0.1348175546]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanColumn/Attribute_ColumnName.qbl b/_Main/BL/Type_AssemblyOnlinePlanColumn/Attribute_ColumnName.qbl
new file mode 100644
index 0000000..d7e636b
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanColumn/Attribute_ColumnName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ColumnName
+{
+  #keys: '3[413988.0.1348175548][413988.0.1348175547][413988.0.1348175549]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanColumn/DefaultValue_ColumnName.qbl b/_Main/BL/Type_AssemblyOnlinePlanColumn/DefaultValue_ColumnName.qbl
new file mode 100644
index 0000000..2ba9476
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanColumn/DefaultValue_ColumnName.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: ColumnName
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanColumn/Function_CalcColumnName.qbl b/_Main/BL/Type_AssemblyOnlinePlanColumn/Function_CalcColumnName.qbl
new file mode 100644
index 0000000..5063e35
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanColumn/Function_CalcColumnName.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcColumnName
+{
+  TextBody:
+  [*
+    // lihongji Jun-27-2024 (created)
+    
+    value := ifexpr( this.ColumnDate() < this.MacroPlan().StartOfPlanning().Date(), "", this.ColumnDate().Format( "Y/M2/D2" ) );
+    
+    this.ColumnName( value );
+  *]
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanColumn/_ROOT_Type_AssemblyOnlinePlanColumn.qbl b/_Main/BL/Type_AssemblyOnlinePlanColumn/_ROOT_Type_AssemblyOnlinePlanColumn.qbl
new file mode 100644
index 0000000..5387722
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanColumn/_ROOT_Type_AssemblyOnlinePlanColumn.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type AssemblyOnlinePlanColumn
+{
+  #keys: '5[413988.0.1348175510][413988.0.1348175508][0.0.0][413988.0.1348175509][413988.0.1348175511]'
+  BaseType: Object
+  StructuredName: 'AssemblyOnlinePlanColumns'
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanRow/Attribute_ProductID.qbl b/_Main/BL/Type_AssemblyOnlinePlanRow/Attribute_ProductID.qbl
new file mode 100644
index 0000000..c0e500f
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanRow/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[413988.0.1348175641][413988.0.1348175640][413988.0.1348175642]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanRow/Attribute_ProductionLine.qbl b/_Main/BL/Type_AssemblyOnlinePlanRow/Attribute_ProductionLine.qbl
new file mode 100644
index 0000000..55d52d6
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanRow/Attribute_ProductionLine.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductionLine
+{
+  #keys: '3[413988.0.1348175644][413988.0.1348175643][413988.0.1348175645]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanRow/Attribute_RowNr.qbl b/_Main/BL/Type_AssemblyOnlinePlanRow/Attribute_RowNr.qbl
new file mode 100644
index 0000000..57cebfa
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanRow/Attribute_RowNr.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute RowNr
+{
+  #keys: '3[413988.0.1348175635][413988.0.1348175634][413988.0.1348175636]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanRow/Attribute_Type.qbl b/_Main/BL/Type_AssemblyOnlinePlanRow/Attribute_Type.qbl
new file mode 100644
index 0000000..9796d2d
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanRow/Attribute_Type.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Type
+{
+  #keys: '3[413988.0.1348175638][413988.0.1348175637][413988.0.1348175639]'
+  Description:
+  [*
+    浜х嚎鍚嶈    锛�0
+    Quantity琛岋細1
+    Order琛�     锛�2
+    鍚堣琛�        锛�3
+    鐝琛�        锛�4
+  *]
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_ProductID.qbl b/_Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_ProductID.qbl
new file mode 100644
index 0000000..98649b2
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_ProductID.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: ProductID
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_ProductionLine.qbl b/_Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_ProductionLine.qbl
new file mode 100644
index 0000000..c59ec43
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_ProductionLine.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: ProductionLine
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_RowNr.qbl b/_Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_RowNr.qbl
new file mode 100644
index 0000000..a05f652
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_RowNr.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: RowNr
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_Type.qbl b/_Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_Type.qbl
new file mode 100644
index 0000000..fd112e9
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanRow/DefaultValue_Type.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Type
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanRow/_ROOT_Type_AssemblyOnlinePlanRow.qbl b/_Main/BL/Type_AssemblyOnlinePlanRow/_ROOT_Type_AssemblyOnlinePlanRow.qbl
new file mode 100644
index 0000000..337cd85
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanRow/_ROOT_Type_AssemblyOnlinePlanRow.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type AssemblyOnlinePlanRow
+{
+  #keys: '5[413988.0.1348175515][413988.0.1348175513][0.0.0][413988.0.1348175514][413988.0.1348175516]'
+  BaseType: Object
+  StructuredName: 'AssemblyOnlinePlanRows'
+}
diff --git a/_Main/BL/Type_AssemblyOnlineQuantity/Attribute_CCMoMo.qbl b/_Main/BL/Type_AssemblyOnlineQuantity/Attribute_CCMoMo.qbl
new file mode 100644
index 0000000..6b4893d
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlineQuantity/Attribute_CCMoMo.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CCMoMo
+{
+  #keys: '3[413988.0.1348200056][413988.0.1348200055][413988.0.1348200057]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_AssemblyOnlineQuantity/Attribute_DLMoMo.qbl b/_Main/BL/Type_AssemblyOnlineQuantity/Attribute_DLMoMo.qbl
new file mode 100644
index 0000000..aeaad4a
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlineQuantity/Attribute_DLMoMo.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DLMoMo
+{
+  #keys: '3[413988.0.1348200046][413988.0.1348200045][413988.0.1348200047]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_AssemblyOnlineQuantity/_ROOT_Type_AssemblyOnlineQuantity.qbl b/_Main/BL/Type_AssemblyOnlineQuantity/_ROOT_Type_AssemblyOnlineQuantity.qbl
new file mode 100644
index 0000000..591a2de
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlineQuantity/_ROOT_Type_AssemblyOnlineQuantity.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type AssemblyOnlineQuantity
+{
+  #keys: '5[413988.0.1348200024][413988.0.1348200022][0.0.0][413988.0.1348200023][413988.0.1348200025]'
+  BaseType: Object
+  StructuredName: 'AssemblyOnlineQuantitys'
+}
diff --git a/_Main/BL/Type_OfflinePlanCell/Attribute_InventoryWeight.qbl b/_Main/BL/Type_OfflinePlanCell/Attribute_InventoryWeight.qbl
new file mode 100644
index 0000000..7a751da
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanCell/Attribute_InventoryWeight.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute InventoryWeight
+{
+  #keys: '3[413988.0.1322880151][413988.0.1322880150][413988.0.1322880152]'
+  Description: '鍓╀綑搴撳瓨 - 鏈�灏忓簱瀛�'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_OfflinePlanCell/Attribute_ProductionSerialNumber.qbl b/_Main/BL/Type_OfflinePlanCell/Attribute_ProductionSerialNumber.qbl
new file mode 100644
index 0000000..32962f1
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanCell/Attribute_ProductionSerialNumber.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductionSerialNumber
+{
+  #keys: '3[413988.0.1322244634][413988.0.1322244633][413988.0.1322244635]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_OfflinePlanCell/Attribute_Quantity.qbl b/_Main/BL/Type_OfflinePlanCell/Attribute_Quantity.qbl
new file mode 100644
index 0000000..44711cf
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanCell/Attribute_Quantity.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Quantity
+{
+  #keys: '3[413988.0.1313380008][413988.0.1313380007][413988.0.1313380009]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_OfflinePlanCell/Method_FindType2.qbl b/_Main/BL/Type_OfflinePlanCell/Method_FindType2.qbl
new file mode 100644
index 0000000..d2192ef
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanCell/Method_FindType2.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+Method FindType (
+  String type,
+  String pl
+) as Boolean
+{
+  TextBody: 'return this.OfflinePlanRow().Type() = type and this.OfflinePlanRow().ProductionLine() = pl and this.Quantity() > 0.0;'
+}
diff --git a/_Main/BL/Type_OfflinePlanCell/StaticMethod_Download.qbl b/_Main/BL/Type_OfflinePlanCell/StaticMethod_Download.qbl
new file mode 100644
index 0000000..d9685ab
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanCell/StaticMethod_Download.qbl
@@ -0,0 +1,48 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Download (
+  MacroPlan macroPlan
+) as BinaryValue
+{
+  TextBody:
+  [*
+    xmlDOMI      := XMLDOMImplementation::Create();
+    xmlDOM       := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>Sheet1</name></table>' );
+    
+    tableElement := xmlDOM.GetElementByTagName( "table", 0 );
+    
+    opt  := maxselect( macroPlan, OfflinePlanTable, tempOPT, true, tempOPT.SaveDateTime() );
+    opcs := selectsortedset( opt, OfflinePlanColumn, tempOPC, true, tempOPC.ColumnDate() );
+    oprs := selectsortedset( opt, OfflinePlanRow, tempOPR, true, tempOPR.ProductionLine(), tempOPR.ProductID(), tempOPR.Type() );
+    traverse ( opcs, Elements, opc ) {
+      column := xmlDOM.CreateElement( "column" );
+      name   := xmlDOM.CreateElement( "name" );
+      type   := xmlDOM.CreateElement( "type" );
+      name.TextContent( ifexpr( opc.ColumnDate() < macroPlan.StartOfPlanning().Date(), "", opc.ColumnDate().Format( "Y/M2/D2" ) ) );
+      type.TextContent( "String" );
+      column.AppendChild( name );
+      column.AppendChild( type );
+      
+      traverse ( oprs, Elements, opr ) {
+        c    := select( opc, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanRow() = opr );
+        cell := xmlDOM.CreateElement( "cell" );
+        cell.SetAttribute( "value", guard( c.Value(), "" ) );
+        column.AppendChild( cell );
+      }
+      
+      tableElement.AppendChild( column );
+    }
+    
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM )
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( "Sheet1" );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
+    tableGroupHandle.Add( tableHandle );
+    
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_OfflinePlanCell/StaticMethod_RefreshOfflinePlan.qbl b/_Main/BL/Type_OfflinePlanCell/StaticMethod_RefreshOfflinePlan.qbl
index 5e7cd09..75941d4 100644
--- a/_Main/BL/Type_OfflinePlanCell/StaticMethod_RefreshOfflinePlan.qbl
+++ b/_Main/BL/Type_OfflinePlanCell/StaticMethod_RefreshOfflinePlan.qbl
@@ -6,48 +6,51 @@
 {
   TextBody:
   [*
-    macroPlan.OfflinePlanRow( relflush );
-    macroPlan.OfflinePlanColumn( relflush );
+    macroPlan.OfflinePlanTable( relflush );
+    
+    opt := macroPlan.OfflinePlanTable( relnew, SaveDateTime := DateTime::ActualTime() );
     
     // 鐢熸垚涓嬬嚎璁″垝琛�
-    traverse ( macroPlan, Unit, u, u.HasCapacityTypeTime() and u.Name() = "ZP4-M3" ) {
+    traverse ( macroPlan, Unit, u, u.HasCapacityTypeTime() /*and u.Name() = "Spider Assy Line 1"*/ ) {
       // 鍒涘缓浜х嚎琛�
-      macroPlan.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := "", Type := "0" );
+      opt.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := "", Type := "0" );
       
       traverse ( u, Operation, o ) {
         traverse ( o, PeriodTaskOperation.NewSupply, ns ) {
           // 鎵捐
-          oprQuantity := OfflinePlanRow::FindOfflinePlanRowTypeIndex( u.ID(), ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID(), "1" );
-          oprOrder    := OfflinePlanRow::FindOfflinePlanRowTypeIndex( u.ID(), ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID(), "2" );
+          oprQuantity := select( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = u.ID() and tempOPR.ProductID() = ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID() and tempOPR.Type() = "1" );
+          oprOrder    := select( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = u.ID() and tempOPR.ProductID() = ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID() and tempOPR.Type() = "2" );
           if ( isnull( oprQuantity ) and isnull( oprOrder ) ) {
-            oprQuantity := macroPlan.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID(), Type := "1" );
-            oprOrder    := macroPlan.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID(), Type := "2" );
+            oprQuantity := opt.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID(), Type := "1" );
+            oprOrder    := opt.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID(), Type := "2" );
           }
           
           // 鎵惧垪
-          opc := OfflinePlanColumn::FindOfflinePlanColumnTypeIndex( ns.Start().Date() );
+          opc := select( opt, OfflinePlanColumn, tempOPC, tempOPC.ColumnDate() = ns.Start().Date() );
           if ( isnull( opc ) ) {
-            opc := macroPlan.OfflinePlanColumn( relnew, ColumnDate := ns.Start().Date() );
+            opc := opt.OfflinePlanColumn( relnew, ColumnDate := ns.Start().Date() );
           }
           
           // 璧嬪�煎崟鍏冩牸
-          cellQuantity := opc.OfflinePlanCell( relnew, Value := [String]ns.Quantity().Round( 0 ), Shift := ns.PeriodTask_MP().UnitPeriod().astype( UnitPeriodTimeBase ).ShiftPattern().Name() );
+          cellQuantity := opc.OfflinePlanCell( relnew, Value := [String]ns.Quantity().Round( 0 ), Shift := ns.PeriodTask_MP().UnitPeriod().astype( UnitPeriodTimeBase ).ShiftPattern().Name(), Quantity := ns.Quantity() );
           cellQuantity.OfflinePlanRow( relset, oprQuantity );
-          cellOrder := opc.OfflinePlanCell( relnew, Value := "鍗曞彿" );
+          cellOrder := opc.OfflinePlanCell( relnew, Value := "鍗曞彿" + [String]ns.Quantity().Round( 0 ) + "_" + [String]( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ), 
+                                            Quantity := ns.Quantity(), 
+                                            InventoryWeight := ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() );
           cellOrder.OfflinePlanRow( relset, oprOrder );
         }
       }
       
       // 鍒涘缓鎬婚噺琛�
-      macroPlan.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := "Z", Type := "3" );
+      opt.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := "Z", Type := "3" );
       // 鍒涘缓鐝琛�
-      macroPlan.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := "Z", Type := "4" );
+      opt.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := "Z", Type := "4" );
     }
     
     // 鍒涘缓浜у搧鍒�&绫诲瀷鍒�
-    productOPC := macroPlan.OfflinePlanColumn( relnew, ColumnDate := macroPlan.StartOfPlanning().Date() - 2 );
-    typeOPC    := macroPlan.OfflinePlanColumn( relnew, ColumnDate := macroPlan.StartOfPlanning().Date() - 1 );
-    traverse ( macroPlan, OfflinePlanRow, opr ) {
+    productOPC := opt.OfflinePlanColumn( relnew, ColumnDate := macroPlan.StartOfPlanning().Date() - 2 );
+    typeOPC    := opt.OfflinePlanColumn( relnew, ColumnDate := macroPlan.StartOfPlanning().Date() - 1 );
+    traverse ( opt, OfflinePlanRow, opr ) {
       if ( opr.Type() = "0" ) {
         productLineCell := productOPC.OfflinePlanCell( relnew, Value := opr.ProductionLine() );
         productLineCell.OfflinePlanRow( relset, opr );
@@ -71,9 +74,9 @@
     }
     
     // 琛ュ叏鎬婚噺鍜岀彮娆�
-    totalOPRs := selectset( macroPlan, OfflinePlanRow, tempOPR, tempOPR.Type() = "3" );
-    shiftOPRs := selectset( macroPlan, OfflinePlanRow, tempOPR, tempOPR.Type() = "4" );
-    traverse ( macroPlan, OfflinePlanColumn, opc, opc.OfflinePlanCell( relsize ) > 0 and opc.ColumnDate() >= macroPlan.StartOfPlanning().Date() ) {
+    totalOPRs := selectset( opt, OfflinePlanRow, tempOPR, tempOPR.Type() = "3" );
+    shiftOPRs := selectset( opt, OfflinePlanRow, tempOPR, tempOPR.Type() = "4" );
+    traverse ( opt, OfflinePlanColumn, opc, opc.OfflinePlanCell( relsize ) > 0 and opc.ColumnDate() >= macroPlan.StartOfPlanning().Date() ) {
       traverse ( totalOPRs, Elements, totalOPR ) {
         total     := sum( opc, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanRow().ProductionLine() = totalOPR.ProductionLine() and tempOPC.OfflinePlanRow().Type() = "1", [Real]tempOPC.Value() );
         totalCell := opc.OfflinePlanCell( relnew, Value := [String]total );
@@ -93,11 +96,67 @@
     indexDate := macroPlan.StartOfPlanning().Date();
     endDate   := Date::Construct( indexDate.Year(), 12, 31 );
     while ( indexDate <= endDate ) {
-      opc := OfflinePlanColumn::FindOfflinePlanColumnTypeIndex( indexDate );
+      opc := select( opt, OfflinePlanColumn, tempOPC, tempOPC.ColumnDate() = indexDate );
       if ( isnull( opc ) ) {
-        opc := macroPlan.OfflinePlanColumn( relnew, ColumnDate := indexDate );
+        opc := opt.OfflinePlanColumn( relnew, ColumnDate := indexDate );
       }
       indexDate := indexDate + 1;
     }
+    
+    Transaction::Transaction().PropagateAll();
+    
+    // 璁剧疆鐢熶骇椤哄簭
+    productionLines := selectuniquevalues( opt, OfflinePlanRow, tempOPR, true, tempOPR.ProductionLine() );
+    traverse ( productionLines, Elements, pl ) {
+      indexColumn    := select( opt, OfflinePlanColumn, tempOPC, tempOPC.ColumnDate() = macroPlan.StartOfPlanning().Date() );
+      previousColumn := indexColumn.PreviousColumn();
+      nextColumn     := indexColumn.NextColumn();
+      
+      while ( not isnull( indexColumn.NextColumn() ) ) {
+        productionSerialNumber := 1;
+        opcs                   := selectsortedset( indexColumn, OfflinePlanCell, tempOPC, tempOPC.FindType( "2", pl ), tempOPC.InventoryWeight() );
+        if ( opcs.Size() > 0 ) {
+          // 鍒ゅ畾1
+          previousOPC := maxselect( previousColumn, OfflinePlanCell, tempOPC, tempOPC.FindType( "2", pl ), tempOPC.ProductionSerialNumber() );
+          if ( isnull( previousOPC ) or indexColumn.ColumnDate() = macroPlan.StartOfPlanning().Date() ) {
+            opc := opcs.Element( 0 );
+            opc.Value( "#" + productionSerialNumber.Format( "N(LPad0(2))" ) );
+            opc.ProductionSerialNumber( productionSerialNumber );
+            productionSerialNumber++;
+            opcs.Remove( opc );
+          } else {
+            opc := select( opcs, Elements, tempOPC, tempOPC.OfflinePlanRow().ProductID() = previousOPC.OfflinePlanRow().ProductID() );
+            if ( not isnull( opc ) ) {
+              opc.Value( "#" + productionSerialNumber.Format( "N(LPad0(2))" ) );
+              opc.ProductionSerialNumber( productionSerialNumber );
+              productionSerialNumber++;
+              opcs.Remove( opc );
+            }
+          }
+          
+          // 鍒ゅ畾2
+          nextOPCs := selectset( opcs, Elements, tempOPC,
+                                 exists( nextColumn, OfflinePlanCell, nextOPC, nextOPC.FindType( "2", pl ) and nextOPC.OfflinePlanRow().ProductID() = tempOPC.OfflinePlanRow().ProductID() ) );
+          if ( nextOPCs.Size() = 1 ) {
+            opc := nextOPCs.Element( 0 );
+            opc.Value( "#" + opcs.Size().Format( "N(LPad0(2))" ) );
+            opc.ProductionSerialNumber( opcs.Size() );
+            opcs.Remove( opc );
+          }
+          
+          // 鍒ゅ畾3
+          traverse ( opcs, Elements, opc ) {
+            opc.Value( "#" + productionSerialNumber.Format( "N(LPad0(2))" ) );
+            opc.ProductionSerialNumber( productionSerialNumber );
+            productionSerialNumber++;
+            opcs.Remove( opc );
+          }
+        }
+        
+        indexColumn    := indexColumn.NextColumn();
+        previousColumn := indexColumn.PreviousColumn();
+        nextColumn     := indexColumn.NextColumn();
+      }
+    }
   *]
 }
diff --git a/_Main/BL/Type_OfflinePlanCell/StaticMethod_SaveAsDraft.qbl b/_Main/BL/Type_OfflinePlanCell/StaticMethod_SaveAsDraft.qbl
new file mode 100644
index 0000000..6ca5594
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanCell/StaticMethod_SaveAsDraft.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SaveAsDraft (
+  MacroPlan macroPlan,
+  OfflinePlanTable opt
+) as OfflinePlanTable
+{
+  TextBody:
+  [*
+    newTable := opt.DeepCopy().astype( OfflinePlanTable );
+    newOPT   := macroPlan.OfflinePlanTable( relinsert, &newTable );
+    newOPT.SaveDateTime( DateTime::ActualTime() );
+    
+    return newOPT;
+  *]
+}
diff --git a/_Main/BL/Type_OfflinePlanColumn/Attribute_ColumnDate.qbl b/_Main/BL/Type_OfflinePlanColumn/Attribute_ColumnDate.qbl
index 620f728..506fc85 100644
--- a/_Main/BL/Type_OfflinePlanColumn/Attribute_ColumnDate.qbl
+++ b/_Main/BL/Type_OfflinePlanColumn/Attribute_ColumnDate.qbl
@@ -3,6 +3,5 @@
 Attribute ColumnDate
 {
   #keys: '3[413988.0.1295080211][413988.0.1295080210][413988.0.1295080212]'
-  IsReadOnly: true
   ValueType: Date
 }
diff --git a/_Main/BL/Type_OfflinePlanColumn/Function_CalcColumnName.qbl b/_Main/BL/Type_OfflinePlanColumn/Function_CalcColumnName.qbl
index 5063e35..075e8f9 100644
--- a/_Main/BL/Type_OfflinePlanColumn/Function_CalcColumnName.qbl
+++ b/_Main/BL/Type_OfflinePlanColumn/Function_CalcColumnName.qbl
@@ -6,7 +6,7 @@
   [*
     // lihongji Jun-27-2024 (created)
     
-    value := ifexpr( this.ColumnDate() < this.MacroPlan().StartOfPlanning().Date(), "", this.ColumnDate().Format( "Y/M2/D2" ) );
+    value := ifexpr( this.ColumnDate() < this.OfflinePlanTable().MacroPlan().StartOfPlanning().Date(), "", this.ColumnDate().Format( "Y/M2/D2" ) );
     
     this.ColumnName( value );
   *]
diff --git a/_Main/BL/Type_OfflinePlanColumn/TypeIndex_OfflinePlanColumnTypeIndex.qbl b/_Main/BL/Type_OfflinePlanColumn/TypeIndex_OfflinePlanColumnTypeIndex.qbl
deleted file mode 100644
index 15f5410..0000000
--- a/_Main/BL/Type_OfflinePlanColumn/TypeIndex_OfflinePlanColumnTypeIndex.qbl
+++ /dev/null
@@ -1,12 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-TypeIndex OfflinePlanColumnTypeIndex
-{
-  Attributes:
-  [
-    TypeIndexAttribute
-    {
-      ModelElement: ColumnDate
-    }
-  ]
-}
diff --git a/_Main/BL/Type_OfflinePlanRow/Attribute_ProductID.qbl b/_Main/BL/Type_OfflinePlanRow/Attribute_ProductID.qbl
index 0bd3a84..a10bf69 100644
--- a/_Main/BL/Type_OfflinePlanRow/Attribute_ProductID.qbl
+++ b/_Main/BL/Type_OfflinePlanRow/Attribute_ProductID.qbl
@@ -3,6 +3,5 @@
 Attribute ProductID
 {
   #keys: '3[413988.0.1296697032][413988.0.1296697031][413988.0.1296697033]'
-  IsReadOnly: true
   ValueType: String
 }
diff --git a/_Main/BL/Type_OfflinePlanRow/Attribute_ProductionLine.qbl b/_Main/BL/Type_OfflinePlanRow/Attribute_ProductionLine.qbl
index 2393a64..8033bb8 100644
--- a/_Main/BL/Type_OfflinePlanRow/Attribute_ProductionLine.qbl
+++ b/_Main/BL/Type_OfflinePlanRow/Attribute_ProductionLine.qbl
@@ -3,6 +3,5 @@
 Attribute ProductionLine
 {
   #keys: '3[413988.0.1296697022][413988.0.1296697021][413988.0.1296697023]'
-  IsReadOnly: true
   ValueType: String
 }
diff --git a/_Main/BL/Type_OfflinePlanRow/Attribute_Type.qbl b/_Main/BL/Type_OfflinePlanRow/Attribute_Type.qbl
index 4905125..491fe54 100644
--- a/_Main/BL/Type_OfflinePlanRow/Attribute_Type.qbl
+++ b/_Main/BL/Type_OfflinePlanRow/Attribute_Type.qbl
@@ -11,6 +11,5 @@
     鍚堣琛�        锛�3
     鐝琛�        锛�4
   *]
-  IsReadOnly: true
   ValueType: String
 }
diff --git a/_Main/BL/Type_OfflinePlanRow/TypeIndex_OfflinePlanRowTypeIndex.qbl b/_Main/BL/Type_OfflinePlanRow/TypeIndex_OfflinePlanRowTypeIndex.qbl
deleted file mode 100644
index 9850e05..0000000
--- a/_Main/BL/Type_OfflinePlanRow/TypeIndex_OfflinePlanRowTypeIndex.qbl
+++ /dev/null
@@ -1,20 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-TypeIndex OfflinePlanRowTypeIndex
-{
-  Attributes:
-  [
-    TypeIndexAttribute
-    {
-      ModelElement: ProductionLine
-    }
-    TypeIndexAttribute
-    {
-      ModelElement: ProductID
-    }
-    TypeIndexAttribute
-    {
-      ModelElement: Type
-    }
-  ]
-}
diff --git a/_Main/BL/Type_OfflinePlanTable/Attribute_SaveDateTime.qbl b/_Main/BL/Type_OfflinePlanTable/Attribute_SaveDateTime.qbl
new file mode 100644
index 0000000..19036eb
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanTable/Attribute_SaveDateTime.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute SaveDateTime
+{
+  #keys: '3[413988.0.1337732856][413988.0.1337732855][413988.0.1337732857]'
+  ValueType: DateTime
+}
diff --git a/_Main/BL/Type_OfflinePlanTable/_ROOT_Type_OfflinePlanTable.qbl b/_Main/BL/Type_OfflinePlanTable/_ROOT_Type_OfflinePlanTable.qbl
new file mode 100644
index 0000000..808173a
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanTable/_ROOT_Type_OfflinePlanTable.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type OfflinePlanTable
+{
+  #keys: '5[413988.0.1337732852][413988.0.1337732850][0.0.0][413988.0.1337732851][413988.0.1337732853]'
+  BaseType: Object
+  StructuredName: 'OfflinePlanTables'
+}
diff --git a/_Main/BL/Type_TransferPlanCell/StaticMethod_Download.qbl b/_Main/BL/Type_TransferPlanCell/StaticMethod_Download.qbl
new file mode 100644
index 0000000..c870139
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanCell/StaticMethod_Download.qbl
@@ -0,0 +1,61 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Download (
+  MacroPlan macroPlan
+) as BinaryValue
+{
+  TextBody:
+  [*
+    xmlDOMI      := XMLDOMImplementation::Create();
+    xmlDOM       := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>Sheet1</name></table>' );
+    
+    tableElement := xmlDOM.GetElementByTagName( "table", 0 );
+    
+    // 绗竴鍒楋紙鍚嶇О锛�
+    tprs        := selectsortedset( macroPlan, TransferPlanRow, tempTPR, true, tempTPR.SourceStockpoingPointID(), tempTPR.TargetStockpoingPointID(), tempTPR.ProductID() );
+    firstColumn := xmlDOM.CreateElement( "column" );
+    firstName   := xmlDOM.CreateElement( "name" );
+    firstType   := xmlDOM.CreateElement( "type" );
+    firstName.TextContent( "" );
+    firstType.TextContent( "String" );
+    firstColumn.AppendChild( firstName );
+    firstColumn.AppendChild( firstType );
+    traverse ( tprs, Elements, tpr ) {
+      firstCell := xmlDOM.CreateElement( "cell" );
+      firstCell.SetAttribute( "value", tpr.Name() );
+      firstColumn.AppendChild( firstCell );
+    }
+    tableElement.AppendChild( firstColumn );
+    
+    tpcs := selectsortedset( macroPlan, TransferPlanColumn, tempTPC, true, tempTPC.ColumnDate() );
+    traverse ( tpcs, Elements, tpc ) {
+      column := xmlDOM.CreateElement( "column" );
+      name   := xmlDOM.CreateElement( "name" );
+      type   := xmlDOM.CreateElement( "type" );
+      name.TextContent( tpc.ColumnName() );
+      type.TextContent( /*ifexpr( tpc.ColumnDate().IsMinInfinity(), "String", "Number" )*/ "String" );
+      column.AppendChild( name );
+      column.AppendChild( type );
+      
+      traverse ( tprs, Elements, tpr ) {
+        c    := select( tpc, TransferPlanCell, tempTPC, tempTPC.TransferPlanRow() = tpr );
+        cell := xmlDOM.CreateElement( "cell" );
+        cell.SetAttribute( "value", guard( c.Value(), "" ) );
+        column.AppendChild( cell );
+      }
+      tableElement.AppendChild( column );
+    }
+    
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM )
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( "Sheet1" );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
+    tableGroupHandle.Add( tableHandle );
+    
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgSecondDevelopmentPlan.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgSecondDevelopmentPlan.def
index 0eca66a..db2e7a4 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgSecondDevelopmentPlan.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgSecondDevelopmentPlan.def
@@ -22,7 +22,7 @@
       BaseType: 'WebButton'
       Properties:
       [
-        Taborder: 2
+        Taborder: 3
       ]
     }
     Component bOfflinePlan
@@ -36,6 +36,18 @@
         Taborder: 1
       ]
     }
+    Component bAssemblyOnlinePlan
+    {
+      #keys: '[413988.0.1351375850]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Description: 'AssemblyOnlinePlan'
+        Image: 'PALM_TREE'
+        Label: 'Assembly online plan'
+        Taborder: 2
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgSecondDevelopmentPlan_bAssemblyOnlinePlan_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgSecondDevelopmentPlan_bAssemblyOnlinePlan_OnClick.def
new file mode 100644
index 0000000..22f9fef
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgSecondDevelopmentPlan_bAssemblyOnlinePlan_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: abgSecondDevelopmentPlan/bAssemblyOnlinePlan
+Response OnClick () id:Response_MacroPlanner_abgSecondDevelopmentPlan_bAssemblyOnlinePlan_OnClick
+{
+  #keys: '[413988.0.1351376064]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "AssemblyOnlinePlan", true);
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Component_pnlActions.def
new file mode 100644
index 0000000..06c800f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[413988.0.1353873495]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[413988.0.1353873499]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[413988.0.1353873501]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Cancel'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    Border: true
+    ExcludeFromActiveComponent: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Padding: 'true'
+    Style: 'footer'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Component_pnlContent.def
new file mode 100644
index 0000000..84293b3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Component_pnlContent.def
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[413988.0.1353873493]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component npDL
+    {
+      #keys: '[413988.0.1352730618]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        DataBinding: 'MacroPlan.AssemblyOnlineQuantity.DLMoMo'
+        Label: 'DL-MoMo (pcs)'
+        Taborder: 0
+      ]
+    }
+    Component npCC
+    {
+      #keys: '[413988.0.1353963744]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        DataBinding: 'MacroPlan.AssemblyOnlineQuantity.CCMoMo'
+        Label: 'CC-MoMo (pcs)'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..ed92cc0
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Response_pnlActions_btnCancel_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnCancel
+Response OnClick () id:Response_pnlActions_btnCancel_OnClick
+{
+  #keys: '[413988.0.1353873505]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..bceac07
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Response_pnlActions_btnOk_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnOk
+Response OnClick () id:Response_pnlActions_btnOk_OnClick
+{
+  #keys: '[413988.0.1353873504]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.ApplyChanges();
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/_ROOT_Component_DialogAssemblyOnlineQuantity.def b/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/_ROOT_Component_DialogAssemblyOnlineQuantity.def
new file mode 100644
index 0000000..0ebf0d4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/_ROOT_Component_DialogAssemblyOnlineQuantity.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogAssemblyOnlineQuantity
+{
+  #keys: '[413988.0.1353873491]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    Padding: 'false'
+    Title: 'Assembly Online Quantity'
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_MatrixEditor951\043480.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_MatrixEditor951\043480.def"
new file mode 100644
index 0000000..60dcc04
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_MatrixEditor951\043480.def"
@@ -0,0 +1,97 @@
+Quintiq file version 2.0
+Component MatrixEditor951 id:MatrixEditor951_480
+{
+  #keys: '[413988.0.1351212727]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCell491
+    {
+      #keys: '[413988.0.1351212728]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractor548
+        {
+          #keys: '[413988.0.1351212729]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'AssemblyOnlinePlanColumn.AssemblyOnlinePlanCell'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Value'
+        Column: 'AssemblyOnlinePlanColumn'
+        Row: 'AssemblyOnlinePlanRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRows271
+    {
+      #keys: '[413988.0.1351212730]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor869
+        {
+          #keys: '[413988.0.1351212731]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'AssemblyOnlinePlanRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'RowNr'
+        SortCriteria: 'ProductionLine;ProductID;Type'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumns844
+    {
+      #keys: '[413988.0.1351212732]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor259
+        {
+          #keys: '[413988.0.1351212733]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'AssemblyOnlinePlanColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'ColumnName'
+        SortCriteria: 'ColumnDate'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPage250_1
+    #child: matrixeditorContextMenu204_1
+  ]
+  Properties:
+  [
+    Columns: 'MatrixEditorColumns844'
+    ContextMenu: 'matrixeditorContextMenu204'
+    Rows: 'MatrixEditorRows271'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_matrixEditorActionBarPage250\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_matrixEditorActionBarPage250\0431.def"
new file mode 100644
index 0000000..85a4ce3
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_matrixEditorActionBarPage250\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPage250 id:matrixEditorActionBarPage250_1
+{
+  #keys: '[413988.0.1351212734]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_matrixeditorContextMenu204\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_matrixeditorContextMenu204\0431.def"
new file mode 100644
index 0000000..4f9427a
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_matrixeditorContextMenu204\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenu204 id:matrixeditorContextMenu204_1
+{
+  #keys: '[413988.0.1351212735]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_pContent.def b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_pContent.def
new file mode 100644
index 0000000..40be45a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_pContent.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component pContent
+{
+  #keys: '[413988.0.1351212599]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditor951_480
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_pHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_pHeader.def
new file mode 100644
index 0000000..68b8f49
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_pHeader.def
@@ -0,0 +1,46 @@
+Quintiq file version 2.0
+Component pHeader
+{
+  #keys: '[413988.0.1351212581]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bDownload
+    {
+      #keys: '[413988.0.1351212648]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Download'
+        Taborder: 1
+      ]
+    }
+    Component bOnlineQuantity
+    {
+      #keys: '[413988.0.1351212668]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Online quantity'
+        Taborder: 2
+      ]
+    }
+    Component bRefresh id:bRefresh_187
+    {
+      #keys: '[413988.0.1351403370]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Refresh'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_pHeader_bDownload_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_pHeader_bDownload_OnClick.def
new file mode 100644
index 0000000..182017c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_pHeader_bDownload_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pHeader/bDownload
+Response OnClick () id:Response_pHeader_bDownload_OnClick
+{
+  #keys: '[413988.0.1351313883]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      binaryValue := AssemblyOnlinePlanCell::Download( MacroPlan );
+      
+      Application.Download( "Assembly online plan.xlsx", binaryValue.AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_pHeader_bOnlineQuantity_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_pHeader_bOnlineQuantity_OnClick.def
new file mode 100644
index 0000000..a69b457
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_pHeader_bOnlineQuantity_OnClick.def
@@ -0,0 +1,27 @@
+Quintiq file version 2.0
+#parent: pHeader/bOnlineQuantity
+Response OnClick () id:Response_pHeader_bOnlineQuantity_OnClick
+{
+  #keys: '[413988.0.1352760396]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      aoq := MacroPlan.AssemblyOnlineQuantity();
+      if ( isnull( aoq ) ) {
+        MacroPlan.AssemblyOnlineQuantity( relnew );
+      }
+      
+      dlg := construct( DialogAssemblyOnlineQuantity );
+      
+      ApplicationMacroPlanner.ShowFormModal( dlg );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_pHeader_bRefresh_OnClick\043774.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_pHeader_bRefresh_OnClick\043774.def"
new file mode 100644
index 0000000..7dc7da8
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_pHeader_bRefresh_OnClick\043774.def"
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: pHeader/bRefresh_187
+Response OnClick () id:Response_pHeader_bRefresh_OnClick_774
+{
+  #keys: '[413988.0.1351403369]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      opt := maxselect( MacroPlan, OfflinePlanTable, tempOPT, true, tempOPT.SaveDateTime() );
+      
+      AssemblyOnlinePlanCell::RefreshData( MacroPlan, opt );
+      
+      WebMessageBox::Success( Translations::A_VWED_Success() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/_ROOT_Component_FormAssemblyOnlinePlan.def b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/_ROOT_Component_FormAssemblyOnlinePlan.def
new file mode 100644
index 0000000..0ab03c8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/_ROOT_Component_FormAssemblyOnlinePlan.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormAssemblyOnlinePlan
+{
+  #keys: '[413988.0.1351212562]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pHeader
+    #child: pContent
+  ]
+  Properties:
+  [
+    Title: 'Assembly online plan'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_MatrixEditor951.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_MatrixEditor951.def
index b27dd5e..c0791c3 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_MatrixEditor951.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_MatrixEditor951.def
@@ -17,8 +17,8 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'MacroPlan'
-            Source: 'MacroPlan'
+            DataType: 'OfflinePlanTable'
+            Source: 'dhOfflinePlanTable'
             Taborder: 0
             Transformation: 'OfflinePlanColumn.OfflinePlanCell'
           ]
@@ -44,8 +44,8 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'MacroPlan'
-            Source: 'MacroPlan'
+            DataType: 'OfflinePlanTable'
+            Source: 'dhOfflinePlanTable'
             Taborder: 0
             Transformation: 'OfflinePlanRow'
           ]
@@ -70,8 +70,8 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'MacroPlan'
-            Source: 'MacroPlan'
+            DataType: 'OfflinePlanTable'
+            Source: 'dhOfflinePlanTable'
             Taborder: 0
             Transformation: 'OfflinePlanColumn'
           ]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pContent\043611.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pContent\043611.def"
index 540aa26..a78013e 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pContent\043611.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pContent\043611.def"
@@ -6,6 +6,16 @@
   Children:
   [
     #child: MatrixEditor951
+    Component dhOfflinePlanTable
+    {
+      #keys: '[413988.0.1334780926]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'OfflinePlanTable'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pContent_dhOfflinePlanTable_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pContent_dhOfflinePlanTable_OnCreated.def
new file mode 100644
index 0000000..910175d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pContent_dhOfflinePlanTable_OnCreated.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pContent/dhOfflinePlanTable
+Response OnCreated () id:Response_pContent_dhOfflinePlanTable_OnCreated
+{
+  #keys: '[413988.0.1334780966]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      opt := maxselect( MacroPlan, OfflinePlanTable, tempOPT, true, tempOPT.SaveDateTime() );
+      
+      this.Data( opt );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bDownload_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bDownload_OnClick.def
index 3df7e29..7e12122 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bDownload_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bDownload_OnClick.def
@@ -5,8 +5,18 @@
   #keys: '[413988.0.1297973899]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
   QuillAction
   {
+    Body:
+    [*
+      binaryValue := OfflinePlanCell::Download( MacroPlan );
+      
+      Application.Download( "Offline plan.xlsx", binaryValue.AsBinaryData() );
+    *]
     GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRefresh_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRefresh_OnClick.def
index 98e2fa5..94d48f9 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRefresh_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRefresh_OnClick.def
@@ -14,6 +14,11 @@
     Body:
     [*
       OfflinePlanCell::RefreshOfflinePlan( MacroPlan );
+      
+      opt := maxselect( MacroPlan, OfflinePlanTable, tempOPT, true, tempOPT.SaveDateTime() );
+      dhOfflinePlanTable.Data( opt );
+      
+      WebMessageBox::Success( Translations::A_VWED_Success() );
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRestore_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRestore_OnClick.def
index 2fcf6dc..14e4993 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRestore_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRestore_OnClick.def
@@ -5,8 +5,23 @@
   #keys: '[413988.0.1297974069]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
   QuillAction
   {
+    Body:
+    [*
+      currentOPT := dhOfflinePlanTable.Data();
+      targetOPT  := maxselect( MacroPlan, OfflinePlanTable, tempOPT, tempOPT <> currentOPT, tempOPT.SaveDateTime() );
+      if ( not isnull( targetOPT ) ) {
+        currentOPT.Delete();
+        dhOfflinePlanTable.Data( targetOPT );
+      }
+      
+      WebMessageBox::Success( Translations::A_VWED_Success() );
+    *]
     GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bSaveAsDraft_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bSaveAsDraft_OnClick.def
index 6b50c94..e94ded1 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bSaveAsDraft_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bSaveAsDraft_OnClick.def
@@ -5,8 +5,19 @@
   #keys: '[413988.0.1297974155]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
   QuillAction
   {
+    Body:
+    [*
+      opt := OfflinePlanCell::SaveAsDraft( MacroPlan, dhOfflinePlanTable.Data() );
+      dhOfflinePlanTable.Data( opt );
+      
+      WebMessageBox::Success( Translations::A_VWED_Success() );
+    *]
     GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bDownload_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bDownload_OnClick.def
index 17323ed..3895e17 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bDownload_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bDownload_OnClick.def
@@ -5,8 +5,18 @@
   #keys: '[413988.0.1292330526]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
   QuillAction
   {
+    Body:
+    [*
+      binaryValue := TransferPlanCell::Download( MacroPlan );
+      
+      Application.Download( "Transfer plan.xlsx", binaryValue.AsBinaryData() );
+    *]
     GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Views/AssemblyOnlinePlan.vw b/_Main/UI/MacroPlannerWebApp/Views/AssemblyOnlinePlan.vw
new file mode 100644
index 0000000..949db5a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/AssemblyOnlinePlan.vw
@@ -0,0 +1,134 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormAssemblyOnlinePlan
+      {
+        title: 'QMacroPlanner::FormAssemblyOnlinePlan'
+        shown: true
+        componentID: 'QMacroPlanner::FormAssemblyOnlinePlan'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 14
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormAssemblyOnlinePlan_pHeader
+          {
+            sizeRatio: 1
+          }
+          FormAssemblyOnlinePlan_pContent
+          {
+            sizeRatio: 1
+          }
+          FormAssemblyOnlinePlan_MatrixEditor951
+          {
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 28
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 173
+            horizontalGrid: true
+            verticalGrid: true
+            backendState
+            {
+              componentId: 'QMacroPlanner::FormAssemblyOnlinePlan.MatrixEditor951'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_Value
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'Value'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'ColumnDate'"
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'ProductionLine';datamember:'ProductID';datamember:'Type'"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      form_FormGeneralSettings
+      {
+        title: 'General Settings'
+        shown: true
+        componentID: 'FormGeneralSettings'
+        layout
+        {
+          mode: 'dockright'
+          index: 0
+        }
+        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
+    {
+    }
+    page: ''
+    group: ''
+    index: 0
+    image: 'HANDHELD_DEVICE'
+    description: ''
+  }
+  formatversion: 2
+  id: 'AssemblyOnlinePlan'
+  name: 'AssemblyOnlinePlan'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/OfflinePlan.vw b/_Main/UI/MacroPlannerWebApp/Views/OfflinePlan.vw
index 7bce92d..14d976f 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/OfflinePlan.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/OfflinePlan.vw
@@ -33,7 +33,7 @@
             totalHeaderWidth: 36
             attributeHeaderWidthRatio: 0.6
             nameHeaderWidthRatio: 0.4
-            columnWidth: 100
+            columnWidth: 177
             horizontalGrid: true
             verticalGrid: true
             backendState
diff --git "a/_var/_Main/ProjSettings/EditorTC/Views/\350\275\246\351\201\223\346\225\264\347\217\255\345\210\206\346\236\220_\133413988.0.1301140601\135.vw" "b/_var/_Main/ProjSettings/EditorTC/Views/\350\275\246\351\201\223\346\225\264\347\217\255\345\210\206\346\236\220_\133413988.0.1301140601\135.vw"
index f976497..7f49c04 100644
--- "a/_var/_Main/ProjSettings/EditorTC/Views/\350\275\246\351\201\223\346\225\264\347\217\255\345\210\206\346\236\220_\133413988.0.1301140601\135.vw"
+++ "b/_var/_Main/ProjSettings/EditorTC/Views/\350\275\246\351\201\223\346\225\264\347\217\255\345\210\206\346\236\220_\133413988.0.1301140601\135.vw"
@@ -17,7 +17,7 @@
   CREATIONUSER 'quintiq/lihongji'
   UPDATEDATETIME '2024-06-28T13:59:54'
   UPDATEUSER 'quintiq/lihongji'
-  LASTACCESSDATE '2024-06-28'
+  LASTACCESSDATE '2024-07-09'
   VIEWSCOPE 0
 }
 AUTHORIZATIONS
@@ -43,13 +43,13 @@
 INFOOBJECT
 {
   KEY [892.10.659695]
-  OBJECTTYPE Application // appEditor
+  OBJECTTYPE Application
   INFOOBJECTS
   {
    INFOOBJECT
    {
     KEY [892.10.659696]
-    OBJECTTYPE Frame // Frame
+    OBJECTTYPE Frame
     CONTENTS
     {
      State := maximized
@@ -61,7 +61,7 @@
      INFOOBJECT
      {
       KEY [103784.990.795900613]
-      OBJECTTYPE ValueHolder // vhSearchHistory
+      OBJECTTYPE ValueHolder
       CONTENTS
       {
        Value ''
@@ -70,7 +70,7 @@
      INFOOBJECT
      {
       KEY [10786.1.820220316]
-      OBJECTTYPE ValueHolder // vhLoadingErrCount
+      OBJECTTYPE ValueHolder
       CONTENTS
       {
        Value '0'
@@ -79,7 +79,7 @@
      INFOOBJECT
      {
       KEY [10786.1.820229990]
-      OBJECTTYPE ValueHolder // vhLoadReason
+      OBJECTTYPE ValueHolder
       CONTENTS
       {
        Value 'Startup'
@@ -88,7 +88,7 @@
      INFOOBJECT
      {
       KEY [10786.1.821405088]
-      OBJECTTYPE ValueHolder // vhWriteErrorCount
+      OBJECTTYPE ValueHolder
       CONTENTS
       {
        Value '0'
@@ -97,13 +97,10 @@
      INFOOBJECT
      {
       KEY [10786.2.342765638]
-      OBJECTTYPE ValueHolder // vhGlobals
+      OBJECTTYPE ValueHolder
       CONTENTS
       {
        Value ''
-      }
-      BASEINFOOBJECTS
-      {
       }
      }
      INFOOBJECT
@@ -112,7 +109,7 @@
       SINGLEINSTANCE false
       ID 'Type Details'
       PARENTKEY [892.10.659696]
-      OBJECTTYPE Form // frmObjectDefinitionBrowser
+      OBJECTTYPE Form
       CREATETYPE frmObjectDefinitionBrowser
       CONTENTS
       {
@@ -120,15 +117,12 @@
        (485,0,400,912)
        DockableLocation := Station[MAIN]State[NORM]TreePath[L0.2;B0.5727;]TabIdx[0]Selection[FRONT]
       }
-      BASEINFOOBJECTS
-      {
-      }
       INFOOBJECTS
       {
        INFOOBJECT
        {
         KEY [121142.0.500922030]
-        OBJECTTYPE GUIDataSetLevel // dslTypes
+        OBJECTTYPE GUIDataSetLevel
         CONTENTS
         {
          Columns
@@ -170,7 +164,7 @@
        INFOOBJECT
        {
         KEY [121142.0.500923128]
-        OBJECTTYPE List // lstObjectDefinitionBrowser
+        OBJECTTYPE List
         CONTENTS
         {
          Quantorrow := false
@@ -180,7 +174,7 @@
          INFOOBJECT
          {
           KEY [121142.0.500923177]
-          OBJECTTYPE GUIDataSetLevel // dslElements
+          OBJECTTYPE GUIDataSetLevel
           CONTENTS
           {
            Columns
@@ -224,7 +218,7 @@
            INFOOBJECT
            {
             KEY [121142.0.500923178]
-            OBJECTTYPE GUIDataSetLevel // dslOverrides
+            OBJECTTYPE GUIDataSetLevel
             CONTENTS
             {
              Columns
@@ -261,7 +255,7 @@
       SINGLEINSTANCE false
       ID 'Types per Module'
       PARENTKEY [892.10.659696]
-      OBJECTTYPE Form // frmTypesByModule
+      OBJECTTYPE Form
       CREATETYPE frmTypesByModule
       CONTENTS
       {
@@ -274,7 +268,7 @@
        BASEINFOOBJECT
        {
         KEY [136402.0.98084624]
-        OBJECTTYPE GUIComponent // frmTypesByModule
+        OBJECTTYPE GUIComponent
         COMPONENTDATA
         {
          [136402.0.98084624]:[103784.990.728734692]:[892.10.659816]:[514.0.129466]:[892.10.659835] STR 'true'
@@ -286,7 +280,7 @@
        INFOOBJECT
        {
         KEY [121142.0.1211769996]
-        OBJECTTYPE GUIDataSetLevel // GUIDataSetLevel776
+        OBJECTTYPE GUIDataSetLevel
         CONTENTS
         {
          Columns
@@ -315,7 +309,7 @@
        INFOOBJECT
        {
         KEY [103784.990.728734692]
-        OBJECTTYPE List // ListTypes
+        OBJECTTYPE List
         CONTENTS
         {
          Quantorrow := false
@@ -325,7 +319,7 @@
          INFOOBJECT
          {
           KEY [101180.2.890701323]
-          OBJECTTYPE ValueHolder // ValueHolder
+          OBJECTTYPE ValueHolder
           CONTENTS
           {
            Value 'false'
@@ -334,7 +328,7 @@
          INFOOBJECT
          {
           KEY [10786.2.342808981]
-          OBJECTTYPE ValueHolder // vhGlobals
+          OBJECTTYPE ValueHolder
           CONTENTS
           {
            Value ''
@@ -343,7 +337,7 @@
          INFOOBJECT
          {
           KEY [892.10.659838]
-          OBJECTTYPE GUIDataSetLevel // dslTypes
+          OBJECTTYPE GUIDataSetLevel
           CONTENTS
           {
            Columns
@@ -377,7 +371,7 @@
            INFOOBJECT
            {
             KEY [136402.0.98091406]
-            OBJECTTYPE GUIDataSetLevel // GUIDataSetLevelTypes
+            OBJECTTYPE GUIDataSetLevel
             CONTENTS
             {
              Columns
@@ -410,7 +404,7 @@
              INFOOBJECT
              {
               KEY [135566.0.318964952]
-              OBJECTTYPE GUIDataSetLevel // GUIDataSetLevelSpecializations
+              OBJECTTYPE GUIDataSetLevel
               CONTENTS
               {
                Columns
@@ -451,7 +445,7 @@
       SINGLEINSTANCE false
       ID 'Model Overview'
       PARENTKEY [892.10.659696]
-      OBJECTTYPE Form // frmModelOverview
+      OBJECTTYPE Form
       CREATETYPE frmModelOverview
       CONTENTS
       {
@@ -464,7 +458,7 @@
        BASEINFOOBJECT
        {
         KEY [121142.0.36340892]
-        OBJECTTYPE GUIContainerComponent // frmModelOverview
+        OBJECTTYPE GUIContainerComponent
         COMPONENTDATA
         {
          [121142.0.36340892]:[121142.0.37512339]:[121142.0.40573788] STR 'PeriodTaskOperation:Unit:PeriodTaskLaneLeg:Operation:MacroPlan:Lane:PeriodTask_MP:NewSupply:LaneLeg:UnitPeriod:DependentDemand:ProductInTrip:Trip#601:266:-40:657:238:266:189:211:497:17:178:464:513#168:437:163:276:350:529:165:274:436:277:59:59:244#219:54:197:109:109:54:153:109:87:120:175:153:54#26:26:26:26:26:26:26:26:26:26:26:26:26'
@@ -477,14 +471,11 @@
        INFOOBJECT
        {
         KEY [121142.0.37512339]
-        OBJECTTYPE CustomDrawComponent // customDraw
+        OBJECTTYPE CustomDrawComponent
         CONTENTS
         {
          ZoomX 1.331
          ZoomY 1.331
-        }
-        INFOOBJECTS
-        {
         }
        }
       }

--
Gitblit v1.9.3