From cc17c847442b07f7cc1765dca678cd45b199a995 Mon Sep 17 00:00:00 2001
From: xiaoding721 <33130084+xiaoding721@users.noreply.github.com>
Date: 星期三, 23 十月 2024 15:53:28 +0800
Subject: [PATCH] 修复一些bug

---
 _Main/BL/Type_ArchivePackagingPlanCell/Attribute_Package.qbl                                                          |    8 
 _Main/BL/Type_ArchivePackagingPlanCell/_ROOT_Type_ArchivePackagingPlanCell.qbl                                        |    9 
 _Main/BL/Type_ArchivePackagingPlanRow/Function_CalcFactoryAbbreviation.qbl                                            |   13 
 _Main/BL/Type_ArchivePackagingPlanCell/Function_CalcStartDate.qbl                                                     |   13 
 _Main/BL/Type_ArchivePackagingPlanRow/_ROOT_Type_ArchivePackagingPlanRow.qbl                                          |    9 
 _Main/BL/Relations/Relation_ArchivePackagingPlanColumn_Archive_Archive_ArchivePackagingPlanColu.qbl                   |   23 +
 _Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_Category.qbl                                                       |    6 
 _Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_SetPackagingAndUnpackingValues.qbl                                |  146 +++++++++
 _Main/BL/Type_ArchivePackagingPlanCell/Attribute_CC_UnpackagedInventory.qbl                                           |    8 
 _Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_GenerateReport.qbl                                                |  150 +++++++++
 _Main/BL/Type_ArchivePackagingPlanCell/Attribute_TransferIn.qbl                                                       |    8 
 _Main/BL/Relations/Relation_ArchivePackagingPlanCell_ArchivePackagingPlanRow_ArchivePackagingPl.qbl                   |   23 +
 _Main/BL/Type_ArchivePackagingPlanRow/Attribute_FactoryAbbreviation.qbl                                               |    7 
 _Main/BL/Type_ArchivePackagingPlanCell/Attribute_Out.qbl                                                              |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon763.def                          |   63 +++
 _Main/BL/Type_ArchivePackagingPlanRow/Attribute_Name.qbl                                                              |    7 
 _Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_Package.qbl                                                       |   61 +++
 _Main/BL/Type_ArchivePackagingPlanCell/Attribute_CC_PackagingInventory.qbl                                            |    8 
 _Main/BL/Type_ArchivePackagingPlanCell/Attribute_EndingInventory.qbl                                                  |    8 
 _Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl                                                                    |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon763_bExport_OnClick.def           |    6 
 _Main/BL/Type_ArchivePackagingPlanCell/Attribute_PackagingInventory.qbl                                               |    8 
 _Main/BL/Type_ArchivePackagingPlanCell/Attribute_InitialPackagingInventory.qbl                                        |    7 
 _Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_StockingPointID.qbl                                                |    6 
 _Main/BL/Relations/Relation_ArchivePackagingPlanRow_Archive_Archive_ArchivePackagingPlanRow.qbl                       |   23 +
 _Main/BL/Type_ArchivePackagingPlanRow/Method_FilterProduct.qbl                                                        |   14 
 _Main/BL/Type_ArchivePackagingPlanCell/Attribute_Unpacking.qbl                                                        |    8 
 _Main/BL/Type_ArchivePackagingPlanRow/Function_CalcName.qbl                                                           |   13 
 _Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_FactoryAbbreviation.qbl                                            |    6 
 _Main/BL/Type_ArchivePackagingPlanRow/Attribute_Factory.qbl                                                           |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon510.def                          |   28 +
 _Main/BL/Type_ArchivePackagingPlanRow/Attribute_ProductID.qbl                                                         |    7 
 _Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_ProductID.qbl                                                      |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon504.def                          |   67 ---
 _Main/BL/Type_ArchivePackagingPlanCell/Attribute_StartDate.qbl                                                        |    7 
 _Main/BL/Type_ArchivePackagingPlanCell/Function_CalcPackagingInventory.qbl                                            |   19 +
 _Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_CalculationPackagingPlanProperties.qbl                            |   11 
 _Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_Name.qbl                                                           |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon510_rbgTimeUnit_OnUserChanged.def |    6 
 _Main/BL/Type_ArchivePackagingPlanRow/Attribute_StockingPointID.qbl                                                   |    7 
 _Main/BL/Type_ArchivePackagingPlanCell/Function_CalcUnpackagedInventory.qbl                                           |   14 
 _Main/BL/Type_ArchivePackagingPlanColumn/Attribute_StartDate.qbl                                                      |    7 
 _Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_Factory.qbl                                                        |    6 
 _Main/BL/Type_ArchivePackagingPlanRow/Attribute_Category.qbl                                                          |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon763_bComparison_OnClick.def       |    6 
 _Main/BL/Relations/Relation_ArchivePackagingPlanCell_ArchivePackagingPlanColumn_ArchivePackagin.qbl                   |   23 +
 _Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport#1.qbl                                   |    4 
 _Main/BL/Type_ArchivePackagingPlanCell/Attribute_NetDemand.qbl                                                        |    8 
 _Main/BL/Type_ArchivePackagingPlanColumn/_ROOT_Type_ArchivePackagingPlanColumn.qbl                                    |    9 
 _Main/BL/Type_ArchivePackagingPlanCell/Attribute_NewSupply.qbl                                                        |    8 
 _Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl                                          |    9 
 _Main/BL/Type_ArchivePackagingPlanCell/Attribute_UnpackagedInventory.qbl                                              |    8 
 52 files changed, 874 insertions(+), 79 deletions(-)

diff --git a/_Main/BL/Relations/Relation_ArchivePackagingPlanCell_ArchivePackagingPlanColumn_ArchivePackagin.qbl b/_Main/BL/Relations/Relation_ArchivePackagingPlanCell_ArchivePackagingPlanColumn_ArchivePackagin.qbl
new file mode 100644
index 0000000..bcaa6e3
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ArchivePackagingPlanCell_ArchivePackagingPlanColumn_ArchivePackagin.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ArchivePackagingPlanCell_ArchivePackagingPlanColumn_ArchivePackagingPlanColumn_ArchivePackagingPlanCell
+{
+  #keys: '1[414996.1.150965285]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide ArchivePackagingPlanColumn
+  {
+    #keys: '3[414996.1.150965287][414996.1.150965286][414996.1.150965288]'
+    Cardinality: '0to1'
+    ObjectDefinition: ArchivePackagingPlanCell
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ArchivePackagingPlanCell
+  {
+    #keys: '3[414996.1.150965290][414996.1.150965289][414996.1.150965291]'
+    Cardinality: '1toN'
+    ObjectDefinition: ArchivePackagingPlanColumn
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ArchivePackagingPlanCell_ArchivePackagingPlanRow_ArchivePackagingPl.qbl b/_Main/BL/Relations/Relation_ArchivePackagingPlanCell_ArchivePackagingPlanRow_ArchivePackagingPl.qbl
new file mode 100644
index 0000000..a8456de
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ArchivePackagingPlanCell_ArchivePackagingPlanRow_ArchivePackagingPl.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ArchivePackagingPlanCell_ArchivePackagingPlanRow_ArchivePackagingPlanRow_ArchivePackagingPlanCell
+{
+  #keys: '1[414996.1.150965272]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide ArchivePackagingPlanRow
+  {
+    #keys: '3[414996.1.150965274][414996.1.150965273][414996.1.150965275]'
+    Cardinality: '0to1'
+    ObjectDefinition: ArchivePackagingPlanCell
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ArchivePackagingPlanCell
+  {
+    #keys: '3[414996.1.150965277][414996.1.150965276][414996.1.150965278]'
+    Cardinality: '1toN'
+    ObjectDefinition: ArchivePackagingPlanRow
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ArchivePackagingPlanColumn_Archive_Archive_ArchivePackagingPlanColu.qbl b/_Main/BL/Relations/Relation_ArchivePackagingPlanColumn_Archive_Archive_ArchivePackagingPlanColu.qbl
new file mode 100644
index 0000000..f2355e4
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ArchivePackagingPlanColumn_Archive_Archive_ArchivePackagingPlanColu.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ArchivePackagingPlanColumn_Archive_Archive_ArchivePackagingPlanColumn
+{
+  #keys: '1[414996.1.150965298]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Archive
+  {
+    #keys: '3[414996.1.150965300][414996.1.150965299][414996.1.150965301]'
+    Cardinality: '0to1'
+    ObjectDefinition: ArchivePackagingPlanColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ArchivePackagingPlanColumn
+  {
+    #keys: '3[414996.1.150965303][414996.1.150965302][414996.1.150965304]'
+    Cardinality: '1toN'
+    ObjectDefinition: Archive
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ArchivePackagingPlanRow_Archive_Archive_ArchivePackagingPlanRow.qbl b/_Main/BL/Relations/Relation_ArchivePackagingPlanRow_Archive_Archive_ArchivePackagingPlanRow.qbl
new file mode 100644
index 0000000..eaf6430
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ArchivePackagingPlanRow_Archive_Archive_ArchivePackagingPlanRow.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ArchivePackagingPlanRow_Archive_Archive_ArchivePackagingPlanRow
+{
+  #keys: '1[414996.1.150965311]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Archive
+  {
+    #keys: '3[414996.1.150965313][414996.1.150965312][414996.1.150965314]'
+    Cardinality: '0to1'
+    ObjectDefinition: ArchivePackagingPlanRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ArchivePackagingPlanRow
+  {
+    #keys: '3[414996.1.150965316][414996.1.150965315][414996.1.150965317]'
+    Cardinality: '1toN'
+    ObjectDefinition: Archive
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_CC_PackagingInventory.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_CC_PackagingInventory.qbl
new file mode 100644
index 0000000..fa23e2b
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_CC_PackagingInventory.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CC_PackagingInventory
+{
+  #keys: '3[414996.1.150965195][414996.1.150965194][414996.1.150965196]'
+  Description: '闀挎槬宸ュ巶鍖呰搴撳瓨'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_CC_UnpackagedInventory.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_CC_UnpackagedInventory.qbl
new file mode 100644
index 0000000..fb39d7e
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_CC_UnpackagedInventory.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CC_UnpackagedInventory
+{
+  #keys: '3[414996.1.150965198][414996.1.150965197][414996.1.150965199]'
+  Description: '闀挎槬宸ュ巶闈炲寘瑁呭簱瀛�'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_EndingInventory.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_EndingInventory.qbl
new file mode 100644
index 0000000..2224bb8
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_EndingInventory.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EndingInventory
+{
+  #keys: '3[414996.1.150965201][414996.1.150965200][414996.1.150965202]'
+  Description: '鏈熸湯搴撳瓨'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_InitialPackagingInventory.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_InitialPackagingInventory.qbl
new file mode 100644
index 0000000..804a801
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_InitialPackagingInventory.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute InitialPackagingInventory
+{
+  #keys: '3[414996.1.150965204][414996.1.150965203][414996.1.150965205]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_NetDemand.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_NetDemand.qbl
new file mode 100644
index 0000000..5eb582f
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_NetDemand.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute NetDemand
+{
+  #keys: '3[414996.1.150965207][414996.1.150965206][414996.1.150965208]'
+  Description: '鍑�闇�姹�'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_NewSupply.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_NewSupply.qbl
new file mode 100644
index 0000000..7e53466
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_NewSupply.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute NewSupply
+{
+  #keys: '3[414996.1.150965210][414996.1.150965209][414996.1.150965211]'
+  Description: '渚涘簲'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_Out.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_Out.qbl
new file mode 100644
index 0000000..4aeade0
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_Out.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Out
+{
+  #keys: '3[414996.1.150965213][414996.1.150965212][414996.1.150965214]'
+  Description: '璋冨嚭'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_Package.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_Package.qbl
new file mode 100644
index 0000000..69659ff
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_Package.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Package
+{
+  #keys: '3[414996.1.150965216][414996.1.150965215][414996.1.150965217]'
+  Description: '鍖呰'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_PackagingInventory.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_PackagingInventory.qbl
new file mode 100644
index 0000000..16c31d2
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_PackagingInventory.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute PackagingInventory
+{
+  #keys: '3[414996.1.150965219][414996.1.150965218][414996.1.150965220]'
+  Description: '鍖呰搴撳瓨'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_StartDate.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_StartDate.qbl
new file mode 100644
index 0000000..f197b14
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_StartDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StartDate
+{
+  #keys: '3[414996.1.150965222][414996.1.150965221][414996.1.150965223]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_TransferIn.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_TransferIn.qbl
new file mode 100644
index 0000000..a0190f9
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_TransferIn.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TransferIn
+{
+  #keys: '3[414996.1.150965225][414996.1.150965224][414996.1.150965226]'
+  Description: '璋冭繘'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_UnpackagedInventory.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_UnpackagedInventory.qbl
new file mode 100644
index 0000000..7f0026a
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_UnpackagedInventory.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute UnpackagedInventory
+{
+  #keys: '3[414996.1.150965228][414996.1.150965227][414996.1.150965229]'
+  Description: '闈炲寘瑁呭簱瀛�'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_Unpacking.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_Unpacking.qbl
new file mode 100644
index 0000000..84c6fef
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Attribute_Unpacking.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Unpacking
+{
+  #keys: '3[414996.1.150965231][414996.1.150965230][414996.1.150965232]'
+  Description: '鎷嗗寘'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Function_CalcPackagingInventory.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Function_CalcPackagingInventory.qbl
new file mode 100644
index 0000000..f799399
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Function_CalcPackagingInventory.qbl
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcPackagingInventory
+{
+  TextBody:
+  [*
+    // lihongji Jul-26-2024 (created)
+    
+    value := ifexpr( this.ArchivePackagingPlanRow().Factory() = "闀挎槬宸ュ巶", this.CC_PackagingInventory(),
+                     this.InitialPackagingInventory() + guard( this.Previous().PackagingInventory()                 + 
+                                                       guard( this.Package(), 0.0 )                         -  
+                                                       ifexpr( this.TransferIn() > 0.0, 0, this.Unpacking() ), 
+                                                       0.0 )
+                                              - this.Out()
+                    );
+    
+    this.PackagingInventory( value );
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Function_CalcStartDate.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Function_CalcStartDate.qbl
new file mode 100644
index 0000000..ba5011f
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Function_CalcStartDate.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcStartDate
+{
+  TextBody:
+  [*
+    // lihongji Jul-26-2024 (created)
+    
+    value := guard( this.ArchivePackagingPlanColumn().StartDate(), Date::MinDate() );
+    
+    this.StartDate( value );
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/Function_CalcUnpackagedInventory.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/Function_CalcUnpackagedInventory.qbl
new file mode 100644
index 0000000..b8c8108
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/Function_CalcUnpackagedInventory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcUnpackagedInventory
+{
+  TextBody:
+  [*
+    // lihongji Jul-24-2024 (created)
+    
+    value := ifexpr( this.ArchivePackagingPlanRow().Factory() = "闀挎槬宸ュ巶", this.CC_UnpackagedInventory(),
+                     guard( this.EndingInventory() - this.PackagingInventory(), 0.0 ) );
+    
+    this.UnpackagedInventory( value );
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_CalculationPackagingPlanProperties.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_CalculationPackagingPlanProperties.qbl
new file mode 100644
index 0000000..07379b6
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_CalculationPackagingPlanProperties.qbl
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CalculationPackagingPlanProperties
+{
+  TextBody:
+  [*
+    Transaction::Transaction().Propagate( attribute( PackagingPlanCell, PackagingInventory ) );
+    Transaction::Transaction().Propagate( attribute( PackagingPlanCell, StartDate ) );
+    Transaction::Transaction().Propagate( attribute( PackagingPlanCell, UnpackagedInventory ) );
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_GenerateReport.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_GenerateReport.qbl
new file mode 100644
index 0000000..4e84001
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_GenerateReport.qbl
@@ -0,0 +1,150 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateReport (
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    macroPlan.PackagingPlanRow( relflush );
+    macroPlan.PackagingPlanColumn( relflush );
+    
+    // 鍒涘缓璁″垝鍓嶄竴澶╁垪
+    planPre     := macroPlan.PackagingPlanColumn( relnew, StartDate := macroPlan.StartOfPlanning().Date() - 1 );
+    
+    // 鐢熸垚鎶ヨ〃
+    traverse ( macroPlan, Product_MP.ProductInStockingPoint_MP, pisp, pisp.IsLeaf() and not pisp.IsSystem() and 
+               ( pisp.StockingPointID().Regex( "CC" ) or pisp.StockingPointID().Regex( "DL" ) or pisp.StockingPointID().Regex( "澶ц繛" ) or pisp.StockingPointID().Regex( "闀挎槬" ) ) ) {
+      // 褰撳墠pisp鎵�澶勫湴鐐�
+      factory             := ifexpr( pisp.StockingPointID().Regex( "CC" ) or pisp.StockingPointID().Regex( "闀挎槬" ), "闀挎槬宸ュ巶", "澶ц繛宸ュ巶" );
+      factoryAbbreviation := ifexpr( pisp.StockingPointID().Regex( "CC" ) or pisp.StockingPointID().Regex( "闀挎槬" ), "CC", "DL" );
+      
+      // 鍒涘缓琛�
+      ppr := select( macroPlan, PackagingPlanRow, tempPPR, tempPPR.ProductID() = pisp.ProductID() and tempPPR.Factory() = factory );
+      if ( isnull( ppr ) ) {
+        ppr := macroPlan.PackagingPlanRow( relnew, ProductID := pisp.ProductID(), Factory := factory, Category := guard( pisp.Product_MP().ParentID(), "" ) );
+      }
+      
+      // 寰幆pispippl
+      traverse ( pisp, ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), pispipl, not pispipl.IsPeriodFrozen() ) {
+        // 鍒涘缓鍒�
+        ppc := select( macroPlan, PackagingPlanColumn, tempPPC, tempPPC.StartDate() = pispipl.Start().Date() );
+        if ( isnull( ppc ) ) {
+          ppc := macroPlan.PackagingPlanColumn( relnew, StartDate := pispipl.Start().Date() );
+        }
+        
+        // 鍒涘缓鍗曞厓鏍�
+        cell := select( ppr, PackagingPlanCell, tempPPCell, tempPPCell.PackagingPlanColumn() = ppc );
+        if ( isnull( cell ) ) {
+          cell := ppr.PackagingPlanCell( relnew ); 
+          cell.PackagingPlanColumn( relset, ppc );
+        }
+        
+        // 璁剧疆璋冨嚭
+        traverse ( pispipl, AsDeparturePISPIP, pit,
+                   pit.Quantity()                > 0                                                                         and
+                   pit.Trip().LaneLeg().AsOriginStockingPointLeg().StockingPoint_MP().ID().Regex( factoryAbbreviation )      and
+                   TransferPlanRow::IdentifyTheFactory( pit.Trip().LaneLeg().AsOriginStockingPointLeg().StockingPoint_MP() ) <> TransferPlanRow::IdentifyTheFactory( pit.Trip().LaneLeg().AsDestinationStockingPointLeg().StockingPoint_MP() )
+                  ) 
+        {
+          cell.Out( cell.Out() + pit.Quantity() );
+        }
+        
+        // 璁剧疆璋冭繘
+        traverse ( pispipl, AsArrivalPISPIP, pit,
+                   pit.Quantity()              > 0                                                                           and
+                   pit.Trip().LaneLeg().AsDestinationStockingPointLeg().StockingPoint_MP().ID().Regex( factoryAbbreviation ) and
+                   TransferPlanRow::IdentifyTheFactory( pit.Trip().LaneLeg().AsOriginStockingPointLeg().StockingPoint_MP() ) <> TransferPlanRow::IdentifyTheFactory( pit.Trip().LaneLeg().AsDestinationStockingPointLeg().StockingPoint_MP() )
+                  ) 
+        {
+          cell.TransferIn( cell.TransferIn() + pit.Quantity() );
+        }
+        
+        // 澶ц繛宸ュ巶璁剧疆鍊�
+        if ( factory = "澶ц繛宸ュ巶" ) {
+          // 鍑�闇�姹�&鍓╀綑搴撳瓨&渚涘簲閲�
+          cell.NetDemand( cell.NetDemand() + pispipl.DependentDemandAndSalesDemandQuantity() );
+          cell.EndingInventory( cell.EndingInventory() + pispipl.InventoryLevelEnd() );
+          cell.NewSupply( cell.NewSupply() + pispipl.NewSupplyQuantity() );
+        }
+        
+        // 闀挎槬宸ュ巶璁剧疆鍊�
+        if ( factory = "闀挎槬宸ュ巶" ) {
+          // 鍓╀綑搴撳瓨&渚涘簲閲�
+          cell.EndingInventory( cell.EndingInventory() + pispipl.InventoryLevelEnd() );
+          cell.NewSupply( cell.NewSupply() + pispipl.NewSupplyQuantity() );
+          
+          // 鍑�闇�姹傘�愬彧鍙栫嚎杈瑰簱銆�&鍖呰搴撳瓨&闈炲寘瑁呭簱瀛�
+          if ( pisp.StockingPointID().Regex( "澶栫搴�" ) ) {
+            cell.CC_PackagingInventory( pispipl.InventoryLevelEnd() );
+          } else if ( pisp.StockingPointID().Regex( "绾胯竟搴�" ) ) {
+            cell.CC_UnpackagedInventory( pispipl.InventoryLevelEnd() );
+            cell.NetDemand( cell.NetDemand() + pispipl.DependentDemandAndSalesDemandQuantity() );
+          }
+        }
+        
+        // 璁剧疆鍓嶄竴澶╁簱瀛�
+        if ( pispipl.Start().Date() = macroPlan.StartOfPlanning().Date() ) {
+          prePISPIPL  := pispipl.PreviousPlanningPISPIP().astype( ProductInStockingPointInPeriodPlanningLeaf ); // 鍓嶄竴涓猵ispippl
+          // 鍒涘缓璁″垝鍓嶄竴澶╂牸瀛�
+          preCell := select( ppr, PackagingPlanCell, tempPPCell, tempPPCell.PackagingPlanColumn() = planPre );
+          if ( isnull( preCell ) ) {
+            preCell := ppr.PackagingPlanCell( relnew );
+            preCell.EndingInventory( prePISPIPL.InventoryLevelEnd() );
+            preCell.PackagingPlanColumn( relset, planPre );
+          } else {
+            preCell.EndingInventory( preCell.EndingInventory() + prePISPIPL.InventoryLevelEnd() );
+          }
+        }
+      }
+    }
+    
+    Transaction::Transaction().Propagate( attribute( PackagingPlanRow, FactoryAbbreviation ) );
+    PackagingPlanCell::CalculationPackagingPlanProperties();
+    Transaction::Transaction().Propagate( relation( PackagingPlanCell, Next ) );
+    
+    // 璁剧疆鍖呰&鎷嗗寘-鏁伴噺
+    PackagingPlanCell::SetPackagingAndUnpackingValues( macroPlan );
+    //traverse ( macroPlan, PackagingPlanRow, ppr, ( ppr.ProductID() = "Windshield" and ppr.StockingPointID() = "Bosch" ) or ( ppr.ProductID() = "Windshield" and ppr.StockingPointID() = "Components (Spain)" ) ) {
+    //  traverse ( ppr, PackagingPlanCell, ppc/*, ppc.StartDate() = Date::Construct( 2020, 4, 1 )*/ ) {
+    //    // 璁剧疆鍖呰鏁伴噺
+    //    if ( ppc.PackagingInventory() < ppc.Out() ) { // 鍖呰搴撳瓨鏄惁灏忎簬璋冨嚭
+    //      prePPC                := ppc.Previous();
+    //      needPackagingQuantity := ppc.Out() - prePPC.PackagingInventory();
+    //      while ( not isnull( prePPC ) and needPackagingQuantity > 0.0 ) {
+    //        // 鑾峰彇鍖呰lotsize
+    //        ppls                   := select( macroPlan, PackagingPlanLotSize, tempPPLS, tempPPLS.Factory() =  ppc.PackagingPlanRow().Factory()    and 
+    //                                                                                    tempPPLS.ProductID() = ppc.PackagingPlanRow().ProductID() );
+    //        
+    //        // 鑾峰彇鏈�澶у寘瑁呮暟閲�
+    //        maxPackageReflection   := Reflection::FindAttribute( "PackagingPlanCapability", ppc.PackagingPlanRow().FactoryAbbreviation() + "_" + ppc.PackagingPlanRow().Category() + "_Package" );
+    ////        maxPackageQuantity     := maxPackageReflection.GetNumber( macroPlan.PackagingPlanCapability() ); // 姝ゅ闇�瑕佷慨鏀�
+    //        maxPackageQuantity     := 100000;
+    //        
+    //        // 鑾峰彇鏈�缁堝寘瑁呮暟閲�
+    //        finalPackagingQuantity := minvalue( ceil( needPackagingQuantity / ppls.LotSize() ), ceil( ( maxPackageQuantity - prePPC.Package() ) / ppls.LotSize() ) ) * ppls.LotSize();
+    //        needPackagingQuantity  := needPackagingQuantity - finalPackagingQuantity;
+    //        
+    //        // 璁剧疆鍖呰鍊�
+    //        prePPC.Package( prePPC.Package() + finalPackagingQuantity );
+    //        
+    //        //debuginfo( "闇�瑕佸寘瑁呮暟閲忥細", needPackagingQuantity, "    lotsize: ", ppls.LotSize(), "    鏈�澶у寘瑁呮暟閲忥細", maxPackageQuantity, "    鏈�缁堣ˉ鐨勬暟閲忥細", finalPackagingQuantity );
+    //        PackagingPlanCell::CalculationPackagingPlanProperties();
+    //      
+    //        prePPC := prePPC.Previous();
+    //      }
+    //    }
+    //    
+    //    // 璁剧疆鎷嗗寘鏁伴噺
+    //    if ( ppc.TransferIn() > 0.0 ) { // 鏈夎皟鍏ユ暟閲�
+    //      // 鑾峰彇鍖呰lotsize
+    //      ppls                 := select( macroPlan, PackagingPlanLotSize, tempPPLS, tempPPLS.Factory() =  ppc.PackagingPlanRow().Factory()    and 
+    //                                                                                 tempPPLS.ProductID() = ppc.PackagingPlanRow().ProductID() );
+    //    
+    //      // 璁剧疆鎷嗗寘鍊�
+    //      ppc.Unpacking( ppc.TransferIn() );
+    //    }
+    //  }
+    //}
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_Package.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_Package.qbl
new file mode 100644
index 0000000..7e0d597
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_Package.qbl
@@ -0,0 +1,61 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Package (
+  MacroPlan macroPlan,
+  PackagingPlanRow ppr,
+  PackagingPlanColumn ppc,
+  output Number needPackagingQuantity
+)
+{
+  TextBody:
+  [*
+    // 璁″垝寮�濮嬫椂闂�
+    plannedStartDate := macroPlan.StartOfPlanning().Date();
+    
+    traverse ( ppr, PackagingPlanCell, ppcell, ppcell.PackagingPlanColumn() = ppc ) {
+      // Product_MP
+      pmp                     := select( macroPlan, Product_MP, tempPMP, tempPMP.IsLeaf() and tempPMP.ID() = ppr.ProductID() );
+      // 鍖呰lotsize
+      ppls                    := select( macroPlan, PackagingPlanLotSize, tempPPLS, tempPPLS.Factory() = ppr.Factory() and 
+                                         tempPPLS.ProductID() = ifexpr( exists( macroPlan, PackagingPlanLotSize, tempPPLS1, tempPPLS1.ProductID() = pmp.ID() ),
+                                                                        pmp.ID(),
+                                                                        pmp.ParentID() ) );
+      // 涓�鏃ュ寘瑁呭閲�
+      ppnc                    := select( macroPlan, PackagingPlanNewCapability, tempPPNC, tempPPNC.Factory() = ppr.Factory() and 
+                                         tempPPNC.ProductID() = ifexpr( exists( macroPlan, PackagingPlanNewCapability, tempPPNC1, tempPPNC1.ProductID() = pmp.ID() ),
+                                                                        pmp.ID(),
+                                                                        pmp.ParentID() ) );
+      // Unit
+      us                      := selectset( macroPlan, Unit, tempU, tempU.ID().Regex( ppr.FactoryAbbreviation() + " " + ppr.Category() ) );
+       
+      // 鍖呰搴撳瓨鍑虹幇璐熷�硷紝闇�瑕佽缃寘瑁呴噺
+      if ( not isnull( ppls ) and not isnull( ppnc ) ) {
+        // 鍖呰寮�濮嬬殑绱㈠紩
+        indexPPCell           := ppcell.Previous();
+        
+    //      info( "浜х嚎涓暟锛�", us.Size(), "    寮�濮嬫椂闂达細", ppcell.StartDate().Format( "Y-M2-D2" ), "    鍖呰搴撳瓨鏁伴噺锛�", ppcell.PackagingInventory(), "    闇�瑕佸寘瑁呯殑鏁伴噺锛�", needPackagingQuantity, 
+    //            "    鍖呰lotsize锛�",guard( ppls.LotSize(), 0 ), "    鏈�澶у寘瑁呭閲忥細", ppnc.MaximumDailyPackagingQuantity() );
+          
+        while ( not isnull( indexPPCell )                                                   and 
+                indexPPCell.StartDate() >= plannedStartDate                                 and 
+                exists( us, Elements.UnitPeriod.astype( UnitPeriodTime ).ShiftPlan, tempSP, 
+                        tempSP.UnitPeriodTime().StartDate() = indexPPCell.StartDate(),
+                        tempSP.Outcome() <> "" )                                            and
+                needPackagingQuantity > 0 ) {
+          // 鑳藉寘瑁呯殑鏁伴噺
+          canPackagingQuantity  := ifexpr( ceil( needPackagingQuantity / ppls.LotSize() ) < floor( ppnc.MaximumDailyPackagingQuantity() / ppls.LotSize() ),
+                                           ceil( needPackagingQuantity / ppls.LotSize() ),
+                                           floor( ppnc.MaximumDailyPackagingQuantity() / ppls.LotSize() ) ) * ppls.LotSize();
+    //        info( "寮�濮嬪寘瑁呯殑鏃ユ湡锛�", indexPPCell.StartDate().Format( "Y-M2-D2" ), "    鑳藉寘瑁呯殑鏁伴噺:", canPackagingQuantity );
+            
+          indexPPCell.Package( canPackagingQuantity );
+          Transaction::Transaction().Propagate( attribute( PackagingPlanCell, PackagingInventory ) );
+          Transaction::Transaction().Propagate( attribute( PackagingPlanCell, UnpackagedInventory ) );
+            
+          needPackagingQuantity := needPackagingQuantity - canPackagingQuantity;
+          indexPPCell           := indexPPCell.Previous();
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_SetPackagingAndUnpackingValues.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_SetPackagingAndUnpackingValues.qbl
new file mode 100644
index 0000000..fab92f2
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/StaticMethod_SetPackagingAndUnpackingValues.qbl
@@ -0,0 +1,146 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SetPackagingAndUnpackingValues (
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    // 璁″垝寮�濮嬫椂闂�
+    plannedStartDate := macroPlan.StartOfPlanning().Date();
+    
+    // 璁剧疆鍖呰鍊硷紙绗﹀悎lotsize鍜屼竴鏃ユ渶澶у寘瑁呴噺锛�
+    traverse ( macroPlan, PackagingPlanRow, ppr/*, ppr.Factory() = "澶ц繛宸ュ巶" and ppr.ProductID() = "06K103011CM"*/ ) {
+      traverse ( ppr, PackagingPlanCell, ppcell/*, ppcell.StartDate() <= Date::Construct( 2025, 1, 4 )*/ ) {
+        // Product_MP
+        pmp                     := select( macroPlan, Product_MP, tempPMP, tempPMP.IsLeaf() and tempPMP.ID() = ppr.ProductID() );
+        // 鍖呰lotsize
+        ppls                    := select( macroPlan, PackagingPlanLotSize, tempPPLS, tempPPLS.Factory() = ppr.Factory() and 
+                                           tempPPLS.ProductID() = ifexpr( exists( macroPlan, PackagingPlanLotSize, tempPPLS1, tempPPLS1.ProductID() = pmp.ID() ),
+                                                                          pmp.ID(),
+                                                                          pmp.ParentID() ) );
+        // 涓�鏃ュ寘瑁呭閲�
+        ppnc                    := select( macroPlan, PackagingPlanNewCapability, tempPPNC, tempPPNC.Factory() = ppr.Factory() and 
+                                           tempPPNC.ProductID() = ifexpr( exists( macroPlan, PackagingPlanNewCapability, tempPPNC1, tempPPNC1.ProductID() = pmp.ID() ),
+                                                                          pmp.ID(),
+                                                                          pmp.ParentID() ) );
+        // Unit
+        us                      := selectset( macroPlan, Unit, tempU, tempU.ID().Regex( ppr.FactoryAbbreviation() + " " + ppr.Category() ) );
+         
+        // 鍖呰搴撳瓨鍑虹幇璐熷�硷紝闇�瑕佽缃寘瑁呴噺
+        if ( ppcell.PackagingInventory() < 0 and not isnull( ppls ) and not isnull( ppnc ) ) {
+          // 闇�瑕佸寘瑁呯殑鏁伴噺
+          needPackagingQuantity := abs( ppcell.PackagingInventory() ).Round( 0 );
+          // 鍖呰寮�濮嬬殑绱㈠紩
+          indexPPCell           := ppcell.Previous();
+          
+    //      info( "浜х嚎涓暟锛�", us.Size(), "    寮�濮嬫椂闂达細", ppcell.StartDate().Format( "Y-M2-D2" ), "    鍖呰搴撳瓨鏁伴噺锛�", ppcell.PackagingInventory(), "    闇�瑕佸寘瑁呯殑鏁伴噺锛�", needPackagingQuantity, 
+    //            "    鍖呰lotsize锛�",guard( ppls.LotSize(), 0 ), "    鏈�澶у寘瑁呭閲忥細", ppnc.MaximumDailyPackagingQuantity() );
+          
+          while ( not isnull( indexPPCell )                                                   and 
+                  indexPPCell.StartDate() >= plannedStartDate                                 and 
+                  exists( us, Elements.UnitPeriod.astype( UnitPeriodTime ).ShiftPlan, tempSP, 
+                          tempSP.UnitPeriodTime().StartDate() = indexPPCell.StartDate(),
+                          tempSP.Outcome() <> "" )                                            and
+                  needPackagingQuantity > 0 ) {
+            // 鑳藉寘瑁呯殑鏁伴噺
+            canPackagingQuantity  := ifexpr( ceil( needPackagingQuantity / ppls.LotSize() ) < floor( ppnc.MaximumDailyPackagingQuantity() / ppls.LotSize() ),
+                                             ceil( needPackagingQuantity / ppls.LotSize() ),
+                                             floor( ppnc.MaximumDailyPackagingQuantity() / ppls.LotSize() ) ) * ppls.LotSize();
+    //        info( "寮�濮嬪寘瑁呯殑鏃ユ湡锛�", indexPPCell.StartDate().Format( "Y-M2-D2" ), "    鑳藉寘瑁呯殑鏁伴噺:", canPackagingQuantity );
+            
+            indexPPCell.Package( canPackagingQuantity );
+            Transaction::Transaction().Propagate( attribute( PackagingPlanCell, PackagingInventory ) );
+            Transaction::Transaction().Propagate( attribute( PackagingPlanCell, UnpackagedInventory ) );
+            
+            needPackagingQuantity := needPackagingQuantity - canPackagingQuantity;
+            indexPPCell           := indexPPCell.Previous();
+          }
+        }
+      }
+    }
+    
+    // 璁剧疆鍖呰鍊硷紙绗﹀悎澶х被涓嬫墍鏈変骇鍝侀潪鍖呰閲忓簱瀛樺姞鍜屼笉鑳藉ぇ浜庣郴缁熷�硷級
+    factorys               := selectuniquevalues( macroPlan, PackagingPlanRow, tempPPR, true, tempPPR.FactoryAbbreviation() );
+    categorys              := selectuniquevalues( macroPlan, PackagingPlanRow, tempPPR, true, tempPPR.Category() );
+    traverse ( factorys, Elements, f/*, f = "DL"*/ ) {
+      traverse ( categorys, Elements, c/*, c = "ZKG"*/ ) {
+        // 绯荤粺瑙勫畾鐨勬渶澶ч潪鍖呰搴撳瓨鏁伴噺
+        ppmqReflection     := Reflection::FindAttribute( "PackagingPlanMaximumQuantity", f + "_" + c );
+        maxPackageQuantity := guard( ppmqReflection.GetNumber( macroPlan.PackagingPlanMaximumQuantity() ), 0 );
+        // 褰撳墠宸ュ巶涓嬩竴绫讳骇鍝佽
+        pprs               := selectset( macroPlan, PackagingPlanRow, tempPPR, tempPPR.FactoryAbbreviation() = f and tempPPR.Category() = c );
+         
+    //    info( "褰撳墠宸ュ巶锛�", f, "    褰撳墠澶х被锛�", c, "    澶х被涓嬬殑鏈�澶у寘瑁呮暟閲忥細", maxPackageQuantity );
+        traverse ( macroPlan, PackagingPlanColumn, ppc, ppc.StartDate() > plannedStartDate and maxPackageQuantity > 0 ) {
+          sumUnpackagedInventoryQuantity := sum( pprs, Elements.PackagingPlanCell, tempPPCell, tempPPCell.PackagingPlanColumn() = ppc, tempPPCell.UnpackagedInventory() ).Round( 0 );
+          
+          // 闇�瑕佸寘瑁�
+          if ( sumUnpackagedInventoryQuantity > maxPackageQuantity ) {
+            // 闇�瑕佸寘瑁呯殑鏁伴噺
+            needPackagingQuantity := [Number] ( sumUnpackagedInventoryQuantity - maxPackageQuantity );
+            // 鎸夐潪鍖呰搴撳瓨鎺掑簭鍚庣殑琛�
+            itemPPRs              := selectsortedset( pprs, Elements, tempPPR, true, 
+                                                      -select( tempPPR, PackagingPlanCell, tempPPCell, tempPPCell.PackagingPlanColumn() = ppc ).UnpackagedInventory() );
+            
+    //        info( "闇�瑕佸寘瑁呮椂闂达細", ppc.StartDate().Format( "Y-M2-D2" ), "    闇�瑕佸寘瑁呯殑鏁伴噺锛�", needPackagingQuantity );
+            traverse ( itemPPRs, Elements, ppr, needPackagingQuantity > 0 ) {
+              PackagingPlanCell::Package( macroPlan, ppr, ppc, needPackagingQuantity );
+            }
+          }
+        }
+      }
+    }
+    
+    // 璁剧疆鎷嗗寘鍊硷紙绗﹀悎lotsize鍜屼竴鏃ユ渶澶у寘瑁呴噺锛�
+    traverse ( macroPlan, PackagingPlanRow, ppr/*, ppr.Factory() = "澶ц繛宸ュ巶" and ppr.ProductID() = "06K103011CM"*/ ) {
+      traverse ( ppr, PackagingPlanCell, ppcell/*, ppcell.StartDate() <= Date::Construct( 2025, 1, 4 )*/ ) {
+        // Product_MP
+        pmp                     := select( macroPlan, Product_MP, tempPMP, tempPMP.IsLeaf() and tempPMP.ID() = ppr.ProductID() );
+        // 鍖呰lotsize
+        ppls                    := select( macroPlan, PackagingPlanLotSize, tempPPLS, tempPPLS.Factory() = ppr.Factory() and 
+                                           tempPPLS.ProductID() = ifexpr( exists( macroPlan, PackagingPlanLotSize, tempPPLS1, tempPPLS1.ProductID() = pmp.ID() ),
+                                                                          pmp.ID(),
+                                                                          pmp.ParentID() ) );
+        // 涓�鏃ュ寘瑁呭閲�
+        ppnc                    := select( macroPlan, PackagingPlanNewCapability, tempPPNC, tempPPNC.Factory() = ppr.Factory() and 
+                                           tempPPNC.ProductID() = ifexpr( exists( macroPlan, PackagingPlanNewCapability, tempPPNC1, tempPPNC1.ProductID() = pmp.ID() ),
+                                                                          pmp.ID(),
+                                                                          pmp.ParentID() ) );
+        // Unit
+        us                      := selectset( macroPlan, Unit, tempU, tempU.ID().Regex( ppr.FactoryAbbreviation() + " " + ppr.Category() ) );
+         
+        // 褰撳墠闈炲寘瑁呭簱瀛� + 涓嬩竴澶╃殑NewSupply < 涓嬩竴澶╃殑鍑�闇�姹�
+        if ( ppcell.UnpackagedInventory() < guard( ppcell.Next().NetDemand(), 0 ) and not isnull( ppls ) and not isnull( ppnc ) ) {
+          // 闇�瑕佸寘瑁呯殑鏁伴噺
+          needPackagingQuantity := abs( ppcell.PackagingInventory() ).Round( 0 );
+          // 鍖呰寮�濮嬬殑绱㈠紩
+          indexPPCell           := ppcell.Previous();
+          
+    //      info( "浜х嚎涓暟锛�", us.Size(), "    寮�濮嬫椂闂达細", ppcell.StartDate().Format( "Y-M2-D2" ), "    鍖呰搴撳瓨鏁伴噺锛�", ppcell.PackagingInventory(), "    闇�瑕佸寘瑁呯殑鏁伴噺锛�", needPackagingQuantity, 
+    //            "    鍖呰lotsize锛�",guard( ppls.LotSize(), 0 ), "    鏈�澶у寘瑁呭閲忥細", ppnc.MaximumDailyPackagingQuantity() );
+          
+          while ( not isnull( indexPPCell )                                                   and 
+                  indexPPCell.StartDate() >= plannedStartDate                                 and 
+                  exists( us, Elements.UnitPeriod.astype( UnitPeriodTime ).ShiftPlan, tempSP, 
+                          tempSP.UnitPeriodTime().StartDate() = indexPPCell.StartDate(),
+                          tempSP.Outcome() <> "" )                                            and
+                  needPackagingQuantity > 0 ) {
+            // 鑳藉寘瑁呯殑鏁伴噺
+            canPackagingQuantity  := ifexpr( ceil( needPackagingQuantity / ppls.LotSize() ) < floor( ppnc.MaximumDailyPackagingQuantity() / ppls.LotSize() ),
+                                             ceil( needPackagingQuantity / ppls.LotSize() ),
+                                             floor( ppnc.MaximumDailyPackagingQuantity() / ppls.LotSize() ) ) * ppls.LotSize();
+    //        info( "寮�濮嬪寘瑁呯殑鏃ユ湡锛�", indexPPCell.StartDate().Format( "Y-M2-D2" ), "    鑳藉寘瑁呯殑鏁伴噺:", canPackagingQuantity );
+            
+            indexPPCell.Package( canPackagingQuantity );
+            Transaction::Transaction().Propagate( attribute( PackagingPlanCell, PackagingInventory ) );
+            Transaction::Transaction().Propagate( attribute( PackagingPlanCell, UnpackagedInventory ) );
+            
+            needPackagingQuantity := needPackagingQuantity - canPackagingQuantity;
+            indexPPCell           := indexPPCell.Previous();
+          }
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanCell/_ROOT_Type_ArchivePackagingPlanCell.qbl b/_Main/BL/Type_ArchivePackagingPlanCell/_ROOT_Type_ArchivePackagingPlanCell.qbl
new file mode 100644
index 0000000..2291c68
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanCell/_ROOT_Type_ArchivePackagingPlanCell.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ArchivePackagingPlanCell
+{
+  #keys: '5[414996.1.150965192][414996.1.150965190][0.0.0][414996.1.150965191][414996.1.150965193]'
+  BaseType: Object
+  StructuredName: 'ArchivePackagingPlanCells'
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanColumn/Attribute_StartDate.qbl b/_Main/BL/Type_ArchivePackagingPlanColumn/Attribute_StartDate.qbl
new file mode 100644
index 0000000..0c68cd8
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanColumn/Attribute_StartDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StartDate
+{
+  #keys: '3[414996.1.150965242][414996.1.150965241][414996.1.150965243]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanColumn/_ROOT_Type_ArchivePackagingPlanColumn.qbl b/_Main/BL/Type_ArchivePackagingPlanColumn/_ROOT_Type_ArchivePackagingPlanColumn.qbl
new file mode 100644
index 0000000..e51b358
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanColumn/_ROOT_Type_ArchivePackagingPlanColumn.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ArchivePackagingPlanColumn
+{
+  #keys: '5[414996.1.150965239][414996.1.150965237][0.0.0][414996.1.150965238][414996.1.150965240]'
+  BaseType: Object
+  StructuredName: 'ArchivePackagingPlanColumns'
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_Category.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_Category.qbl
new file mode 100644
index 0000000..4b419d9
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_Category.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Category
+{
+  #keys: '3[414996.1.150965250][414996.1.150965249][414996.1.150965251]'
+  Description: '澶х被'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_Factory.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_Factory.qbl
new file mode 100644
index 0000000..f1ae9f1
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_Factory.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Factory
+{
+  #keys: '3[414996.1.150965253][414996.1.150965252][414996.1.150965254]'
+  Description: '宸ュ巶'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_FactoryAbbreviation.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_FactoryAbbreviation.qbl
new file mode 100644
index 0000000..e4e64b3
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_FactoryAbbreviation.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute FactoryAbbreviation
+{
+  #keys: '3[414996.1.150965256][414996.1.150965255][414996.1.150965257]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_Name.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_Name.qbl
new file mode 100644
index 0000000..9c9443e
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[414996.1.150965259][414996.1.150965258][414996.1.150965260]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_ProductID.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_ProductID.qbl
new file mode 100644
index 0000000..0b0eefc
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[414996.1.150965262][414996.1.150965261][414996.1.150965263]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_StockingPointID.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_StockingPointID.qbl
new file mode 100644
index 0000000..a0e85d7
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/Attribute_StockingPointID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StockingPointID
+{
+  #keys: '3[414996.1.150965265][414996.1.150965264][414996.1.150965266]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_Category.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_Category.qbl
new file mode 100644
index 0000000..5e9af9f
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_Category.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Category
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_Factory.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_Factory.qbl
new file mode 100644
index 0000000..49653fb
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_Factory.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Factory
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_FactoryAbbreviation.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_FactoryAbbreviation.qbl
new file mode 100644
index 0000000..898cd6b
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_FactoryAbbreviation.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: FactoryAbbreviation
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_Name.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_ProductID.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_ProductID.qbl
new file mode 100644
index 0000000..98649b2
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_ProductID.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: ProductID
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_StockingPointID.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_StockingPointID.qbl
new file mode 100644
index 0000000..fbb83fc
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/DefaultValue_StockingPointID.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: StockingPointID
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/Function_CalcFactoryAbbreviation.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/Function_CalcFactoryAbbreviation.qbl
new file mode 100644
index 0000000..d7563fb
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/Function_CalcFactoryAbbreviation.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcFactoryAbbreviation
+{
+  TextBody:
+  [*
+    // lihongji Jul-26-2024 (created)
+    
+    value := ifexpr( this.Factory() = "澶ц繛宸ュ巶", "DL", "CC" );
+    
+    this.FactoryAbbreviation( value );
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/Function_CalcName.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/Function_CalcName.qbl
new file mode 100644
index 0000000..9a558f8
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/Function_CalcName.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcName
+{
+  TextBody:
+  [*
+    // lihongji Jul-24-2024 (created)
+    
+    value := guard( this.ProductID(), "" );
+    
+    this.Name( value );
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/Method_FilterProduct.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/Method_FilterProduct.qbl
new file mode 100644
index 0000000..6f7e08b
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/Method_FilterProduct.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method FilterProduct (
+  Product_MPs products,
+  String factory
+) declarative remote as Boolean
+{
+  TextBody:
+  [*
+    flag := exists( products, Elements, tempP, tempP.ID() = this.ProductID() ) and this.Factory() = factory;
+    
+    return flag;
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePackagingPlanRow/_ROOT_Type_ArchivePackagingPlanRow.qbl b/_Main/BL/Type_ArchivePackagingPlanRow/_ROOT_Type_ArchivePackagingPlanRow.qbl
new file mode 100644
index 0000000..9d81058
--- /dev/null
+++ b/_Main/BL/Type_ArchivePackagingPlanRow/_ROOT_Type_ArchivePackagingPlanRow.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ArchivePackagingPlanRow
+{
+  #keys: '5[414996.1.150965247][414996.1.150965245][0.0.0][414996.1.150965246][414996.1.150965248]'
+  BaseType: Object
+  StructuredName: 'ArchivePackagingPlanRows'
+}
diff --git "a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl" "b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
index d033d04..323a459 100644
--- "a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
+++ "b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
@@ -94,11 +94,11 @@
               holidayOvertimeHourCell.RealValue( holidayOvertimeHourCell.RealValue() + nextDayOvertime );
             }else if( shiftPlan.DefaultRemark().LikeUserLocale( "鍛ㄥ叚" ) or shiftPlan.DefaultRemark().LikeUserLocale( "鍛ㄦ棩" ) ){
               // 涓嬩竴澶╂槸鍛ㄥ叚鎴栧懆鏃�
-              nextDayOvertime := shiftPlan.GetBreakDayOvertimeHour( true );
+              nextDayOvertime := shiftPlan.GetHolidayOvertimeHour( true );
               breakDayOvertimeHourCell.RealValue( breakDayOvertimeHourCell.RealValue() + nextDayOvertime );
             }else{
               // 涓嬩竴澶╂槸骞冲父鐨勫伐浣滄棩
-              nextDayOvertime := shiftPlan.GetDefaultDayOvertimeHour( true );
+              nextDayOvertime := shiftPlan.GetHolidayOvertimeHour( true );
               defaultDayOvertimeHourCell.RealValue( defaultDayOvertimeHourCell.RealValue() + nextDayOvertime );
             }
           }
diff --git a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
index 94d74a0..1a2649b 100644
--- a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
+++ b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
@@ -97,11 +97,11 @@
               holidayOvertimeHourCell.RealValue( holidayOvertimeHourCell.RealValue() + nextDayOvertime );
             }else if( shiftPlan.DefaultRemark().LikeUserLocale( "鍛ㄥ叚" ) or shiftPlan.DefaultRemark().LikeUserLocale( "鍛ㄦ棩" ) ){
               // 涓嬩竴澶╂槸鍛ㄥ叚鎴栧懆鏃�
-              nextDayOvertime := shiftPlan.GetBreakDayOvertimeHour( true );
+              nextDayOvertime := shiftPlan.GetHolidayOvertimeHour( true );
               breakDayOvertimeHourCell.RealValue( breakDayOvertimeHourCell.RealValue() + nextDayOvertime );
             }else{
               // 涓嬩竴澶╂槸骞冲父鐨勫伐浣滄棩
-              nextDayOvertime := shiftPlan.GetDefaultDayOvertimeHour( true );
+              nextDayOvertime := shiftPlan.GetHolidayOvertimeHour( true );
               defaultDayOvertimeHourCell.RealValue( defaultDayOvertimeHourCell.RealValue() + nextDayOvertime );
             }
           }
@@ -129,12 +129,13 @@
           overtime := shiftPlan.GetDefaultDayOvertimeHour( false );
           defaultDayOvertimeHourCell.RealValue( defaultDayOvertimeHourCell.RealValue() + overtime );
           if( not isnull( nextShiftPlan )){
-            nextDayOvertime := shiftPlan.GetBreakDayOvertimeHour( true );
             if( nextShiftPlan.IsHoliday()){
               // 涓嬩竴澶╂槸鑺傚亣鏃�
+              nextDayOvertime := shiftPlan.GetHolidayOvertimeHour( true );
               holidayOvertimeHourCell.RealValue( holidayOvertimeHourCell.RealValue() + nextDayOvertime );
             }else if( shiftPlan.DefaultRemark().LikeUserLocale( "鍛ㄥ叚" ) or shiftPlan.DefaultRemark().LikeUserLocale( "鍛ㄦ棩" ) ){
               // 涓嬩竴澶╂槸鍛ㄥ叚鎴栧懆鏃�
+              nextDayOvertime := shiftPlan.GetBreakDayOvertimeHour( true );
               breakDayOvertimeHourCell.RealValue( breakDayOvertimeHourCell.RealValue() + nextDayOvertime );
             }else{
               // 涓嬩竴澶╂槸骞冲父鐨勫伐浣滄棩
@@ -201,7 +202,7 @@
       
       // 娆犲伐璐�
       qiangongCell := LocalCell_Default::GetCell(  rowKey + column7.CustomName(), cellIndexTree, cells, row, column7 );
-      qiangongCell.RealValue( qiangongCell.RealValue() - 8 );
+      qiangongCell.RealValue( qiangongCell.RealValue() );
       
       qiangongfeiCell := LocalCell_Default::GetCell(  rowKey + column11.CustomName(), cellIndexTree, cells, row, column11 );
       qiangongfeiCell.RealValue( EmployeeCost::GetSalary( unit,qiangongMultiplier,qiangongCell.RealValue() ));
diff --git a/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl b/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl
index 8ec6afe..f73846d 100644
--- a/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl
+++ b/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl
@@ -10,6 +10,6 @@
   TextBody:
   [*
     // rislai Jun-14-2024 (created)
-    return start1 <= end2 and start2 <= end1 ;
+    return start1 <= start2 and end1 >= end2 ;
   *]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon504.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon504.def
index 5b49ff3..9b59356 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon504.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon504.def
@@ -5,44 +5,6 @@
   BaseType: 'WebPanel'
   Children:
   [
-    Component ddlOfflinePlanTable
-    {
-      #keys: '[412672.1.64850982]'
-      BaseType: 'WebDropDownList'
-      Databinding: 'OfflinePlanTableInfo'
-      Children:
-      [
-        Component DataExtractorRibbon
-        {
-          #keys: '[412672.1.64850983]'
-          BaseType: 'WebDataExtractor'
-          Properties:
-          [
-            DataType: 'RecycleBin'
-            Source: 'RecycleBin'
-            Taborder: 0
-            Transformation: 'OfflinePlanTableInfo'
-          ]
-        }
-      ]
-      Properties:
-      [
-        DisplayField: 'TableName'
-        Label: '涓嬬嚎璁″垝:'
-        NumberOfColumns: 50
-        Taborder: 0
-      ]
-    }
-    Component bComparison
-    {
-      #keys: '[412672.1.64851009]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Label: '寮�濮嬪姣�'
-        Taborder: 1
-      ]
-    }
     Component LabelRibbon
     {
       #keys: '[412672.1.66018113]'
@@ -51,16 +13,6 @@
       [
         DataBinding: 'ddlOfflinePlanTable.Data.TableName'
         NumberOfColumns: 50
-        Taborder: 6
-      ]
-    }
-    Component bExport id:bExport_298
-    {
-      #keys: '[414996.1.108480376]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'EXPORT1'
         Taborder: 4
       ]
     }
@@ -87,19 +39,7 @@
       ]
       Properties:
       [
-        Taborder: 5
-      ]
-    }
-    Component rbgTimeUnit
-    {
-      #keys: '[414996.1.147730565]'
-      BaseType: 'WebRadioButtonGroup'
-      Properties:
-      [
-        BoundValue: 'Day'
-        ButtonLabels: 'Day;Week;Month'
-        ButtonValues: 'Day;Week;Month'
-        Taborder: 2
+        Taborder: 3
       ]
     }
     Component dhTimeUnit
@@ -109,14 +49,15 @@
       Databinding: 'String*'
       Properties:
       [
-        Taborder: 3
+        Taborder: 2
       ]
     }
+    #child: PanelRibbon510
+    #child: PanelRibbon763
   ]
   Properties:
   [
     FixedSize: true
-    Orientation: 'horizontal'
     Taborder: 0
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon510.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon510.def
new file mode 100644
index 0000000..942eb3a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon510.def
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+Component PanelRibbon510
+{
+  #keys: '[414996.1.148040419]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component rbgTimeUnit id:rbgTimeUnit_19
+    {
+      #keys: '[414996.1.148040622]'
+      BaseType: 'WebRadioButtonGroup'
+      Properties:
+      [
+        BoundValue: 'Day'
+        ButtonLabels: 'Day;Week;Month'
+        ButtonValues: 'Day;Week;Month'
+        Orientation: 'horizontal'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon763.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon763.def
new file mode 100644
index 0000000..1c87d6e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon763.def
@@ -0,0 +1,63 @@
+Quintiq file version 2.0
+Component PanelRibbon763
+{
+  #keys: '[414996.1.148040406]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddlOfflinePlanTable id:ddlOfflinePlanTable_217
+    {
+      #keys: '[414996.1.148040527]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'OfflinePlanTableInfo'
+      Children:
+      [
+        Component DataExtractorRibbon id:DataExtractorRibbon_568
+        {
+          #keys: '[414996.1.148040528]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'RecycleBin'
+            Source: 'RecycleBin'
+            Taborder: 0
+            Transformation: 'OfflinePlanTableInfo'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'TableName'
+        Label: '涓嬬嚎璁″垝:'
+        NumberOfColumns: 50
+        Taborder: 0
+      ]
+    }
+    Component bComparison id:bComparison_136
+    {
+      #keys: '[414996.1.148040554]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '寮�濮嬪姣�'
+        Taborder: 1
+      ]
+    }
+    Component bExport
+    {
+      #keys: '[414996.1.148040586]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_rbgTimeUnit_OnUserChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon510_rbgTimeUnit_OnUserChanged.def
similarity index 60%
rename from _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_rbgTimeUnit_OnUserChanged.def
rename to _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon510_rbgTimeUnit_OnUserChanged.def
index 12ede48..bf2b6d7 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_rbgTimeUnit_OnUserChanged.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon510_rbgTimeUnit_OnUserChanged.def
@@ -1,8 +1,8 @@
 Quintiq file version 2.0
-#parent: PanelRibbon504/rbgTimeUnit
-Response OnUserChanged () id:Response_PanelRibbon504_801_rbgTimeUnit_OnUserChanged
+#parent: PanelRibbon510/rbgTimeUnit_19
+Response OnUserChanged () id:Response_PanelRibbon504_rbgTimeUnit_OnUserChanged
 {
-  #keys: '[414996.1.147730564]'
+  #keys: '[414996.1.148040621]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebRadioButtonGroup_OnUserChanged'
   GroupServerCalls: true
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bComparison_OnClick\043613.def" b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon763_bComparison_OnClick.def
similarity index 87%
rename from "_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bComparison_OnClick\043613.def"
rename to _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon763_bComparison_OnClick.def
index ee0cdcb..8211a83 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bComparison_OnClick\043613.def"
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon763_bComparison_OnClick.def
@@ -1,8 +1,8 @@
 Quintiq file version 2.0
-#parent: PanelRibbon504/bComparison
-Response OnClick () id:Response_PanelRibbon504_bComparison_OnClick_613
+#parent: PanelRibbon763/bComparison_136
+Response OnClick () id:Response_PanelRibbon504_bComparison_OnClick
 {
-  #keys: '[412672.1.64851008]'
+  #keys: '[414996.1.148040553]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   QuillAction
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bExport_OnClick\043891.def" b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon763_bExport_OnClick.def
similarity index 80%
rename from "_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bExport_OnClick\043891.def"
rename to _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon763_bExport_OnClick.def
index 9917d6f..0a82310 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bExport_OnClick\043891.def"
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon763_bExport_OnClick.def
@@ -1,8 +1,8 @@
 Quintiq file version 2.0
-#parent: PanelRibbon504/bExport_298
-Response OnClick () id:Response_pOperaction_bExport_OnClick_891
+#parent: PanelRibbon763/bExport
+Response OnClick () id:Response_PanelRibbon504_bExport_OnClick
 {
-  #keys: '[414996.1.108480375]'
+  #keys: '[414996.1.148040585]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   GroupServerCalls: true

--
Gitblit v1.9.3