From 48ce218f5329dd9a3e2ba8851b101a5b85f8aab4 Mon Sep 17 00:00:00 2001
From: hongjli <3117313295@qq.com>
Date: 星期一, 25 九月 2023 15:54:18 +0800
Subject: [PATCH] 产能分配结果优化

---
 _Main/BL/Type_CapacityAllocationResults/Attribute_Date.qbl                                                                                                            |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/_ROOT_Component_FormCapacityAllocationResultsRuleConfiguration.def               |   26 ++
 _Main/BL/EDI/Broker_GlobalOTDTable_CAR_Export.qbl                                                                                                                     |   65 +++++
 _Main/BL/Type_CapacityAllocationResults/Attribute_ID.qbl                                                                                                              |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Export_OnClick.def                                 |   16 +
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_ModuleMaterialCode.qbl                                                                             |    1 
 _Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def                                                                               |    2 
 _Main/BL/Type_CapacityAllocationResults/StaticMethod_Export.qbl                                                                                                       |   13 +
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_StockingPointID.qbl                                                                                |    3 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listActionBarPageCapacityAllocationResults.def                                          |    2 
 _Main/BL/Type_CapacityAllocationResults/StaticMethod_IterativeGeneration2.qbl                                                                                         |   78 +++++
 _Main/BL/Type_CapacityAllocationResults/Attribute_ManufacturedDate.qbl                                                                                                |    7 
 _Main/BL/Type_CapacityAllocationResults/StaticMethod_CreateDate.qbl                                                                                                   |   11 
 _Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Component_pnlContent.def                                                       |    4 
 _Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Response_pnlActions_btnOk_OnClick.def                                          |    9 
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/TypeIndex_CapacityAllocationResultsRuleConfigurationTypeIndex.qbl                                            |   20 +
 _Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Export.qbl                                                                                                                   |   49 ++++
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Import.qbl                                                                                      |   14 +
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_PanelImportAndExport.def                                               |   37 +++
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Import_OnClick.def                                 |   29 ++
 _Main/BL/Type_CapacityAllocationResults/DeclarativeReferenceRelation_CalcCapacityAllocationResultsRuleConfiguration.qbl                                               |   15 +
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_PanelCapacityAllocationResults.def                                                      |   37 +++
 _Main/BL/Relations/Relation_CapacityAllocationResultsRuleConfiguration_CapacityAllocationResult.qbl                                                                   |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_DataHolderSelectCapacityAllocationResultsRuleConfiguration_OnDataCh.def |   18 +
 _Main/BL/Type_CapacityAllocationResults/Attribute_ProductID.qbl                                                                                                       |    7 
 _Main/BL/Type_CapacityAllocationResults/Attribute_StockingPointID.qbl                                                                                                 |    7 
 _Main/BL/Type_CapacityAllocationResults/Attribute_UserQuantity.qbl                                                                                                    |    7 
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_PanelMaterialCode.qbl                                                                              |    1 
 /dev/null                                                                                                                                                             |   16 -
 _Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Import.qbl                                                                                                                   |   49 ++++
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listContextMenuCapacityAllocationResults.def                                            |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_ListCapacityAllocationResults.def                                                       |   14 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_ListCapacityAllocationResultsRuleConfiguration.def                     |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/_ROOT_Component_FormCapacityAllocationResults.def                                                 |   12 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_Export_OnClick.def                                        |   16 +
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Export.qbl                                                                                      |   14 +
 _Main/BL/Type_CapacityAllocationResults/Attribute_Description.qbl                                                                                                     |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_ButtonGenerateCapacityAllocationR#39.def                  |   16 +
 38 files changed, 604 insertions(+), 59 deletions(-)

diff --git a/_Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Export.qbl b/_Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Export.qbl
new file mode 100644
index 0000000..d50d284
--- /dev/null
+++ b/_Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Export.qbl
@@ -0,0 +1,49 @@
+Quintiq file version 2.0
+#parent: #root
+EDIBroker GlobalOTDTable_CARRC_Export
+{
+  MDSDefinition: GlobalOTDTable
+  TimeZone: 'ACT'
+  UseOSTimeZone: false
+  EDIModelLink.Source Source11
+  {
+    EDIMLTable CapacityAllocationResultsRuleConfiguration
+    {
+      PrimaryKeyColumns: ModuleMaterialCode
+      PrimaryKeyColumns: PanelMaterialCode
+      PrimaryKeyColumns: StockingPointID
+      TargetType: CapacityAllocationResultsRuleConfiguration
+      TypeIndex: CapacityAllocationResultsRuleConfigurationTypeIndex
+      EDIMLColumn Division { Attribute: Division ValueType: String }
+      EDIMLColumn ModuleMaterialCode { Attribute: ModuleMaterialCode ValueType: String }
+      EDIMLColumn PanelMaterialCode { Attribute: PanelMaterialCode ValueType: String }
+      EDIMLColumn StockingPointID { Attribute: StockingPointID ValueType: String }
+    }
+  }
+  EDITransformation.Transformation Transformation11
+  {
+    EDITableTransformation
+    {
+      InputTable: CapacityAllocationResultsRuleConfiguration
+      OutputTable: CapacityAllocationResultsRuleConfiguration
+      EDIColumnMatch { InputColumn: Division OutputColumn: Division }
+      EDIColumnMatch { InputColumn: ModuleMaterialCode OutputColumn: ModuleMaterialCode }
+      EDIColumnMatch { InputColumn: PanelMaterialCode OutputColumn: PanelMaterialCode }
+      EDIColumnMatch { InputColumn: StockingPointID OutputColumn: StockingPointID }
+    }
+  }
+  EDIXLSLink.Destination Destination12
+  {
+    FileName: 'Destination12'
+    EDIXLSLinkTable CapacityAllocationResultsRuleConfiguration
+    {
+      Columns:
+      [
+        EDIXLSLinkColumn Division { ValueType: String }
+        EDIXLSLinkColumn ModuleMaterialCode { ValueType: String }
+        EDIXLSLinkColumn PanelMaterialCode { ValueType: String }
+        EDIXLSLinkColumn StockingPointID { ValueType: String }
+      ]
+    }
+  }
+}
diff --git a/_Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Import.qbl b/_Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Import.qbl
new file mode 100644
index 0000000..e539ed2
--- /dev/null
+++ b/_Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Import.qbl
@@ -0,0 +1,49 @@
+Quintiq file version 2.0
+#parent: #root
+EDIBroker GlobalOTDTable_CARRC_Import
+{
+  MDSDefinition: GlobalOTDTable
+  TimeZone: 'ACT'
+  UseOSTimeZone: false
+  EDIModelLink.Destination Destination13
+  {
+    EDIMLTable CapacityAllocationResultsRuleConfiguration
+    {
+      PrimaryKeyColumns: ModuleMaterialCode
+      PrimaryKeyColumns: PanelMaterialCode
+      PrimaryKeyColumns: StockingPointID
+      TargetType: CapacityAllocationResultsRuleConfiguration
+      TypeIndex: CapacityAllocationResultsRuleConfigurationTypeIndex
+      EDIMLColumn Division { Attribute: Division ValueType: String }
+      EDIMLColumn ModuleMaterialCode { Attribute: ModuleMaterialCode ValueType: String }
+      EDIMLColumn PanelMaterialCode { Attribute: PanelMaterialCode ValueType: String }
+      EDIMLColumn StockingPointID { Attribute: StockingPointID ValueType: String }
+    }
+  }
+  EDITransformation.Transformation Transformation12
+  {
+    EDITableTransformation
+    {
+      InputTable: CapacityAllocationResultsRuleCo
+      OutputTable: CapacityAllocationResultsRuleConfiguration
+      EDIColumnMatch { InputColumn: Division OutputColumn: Division }
+      EDIColumnMatch { InputColumn: ModuleMaterialCode OutputColumn: ModuleMaterialCode }
+      EDIColumnMatch { InputColumn: PanelMaterialCode OutputColumn: PanelMaterialCode }
+      EDIColumnMatch { InputColumn: StockingPointID OutputColumn: StockingPointID }
+    }
+  }
+  EDIXLSLink.Source Source12
+  {
+    FileName: '浜ц兘鍒嗛厤缁撴灉瑙勫垯.xlsx'
+    EDIXLSLinkTable CapacityAllocationResultsRuleCo
+    {
+      Columns:
+      [
+        EDIXLSLinkColumn Division { ValueType: String }
+        EDIXLSLinkColumn ModuleMaterialCode { ValueType: String }
+        EDIXLSLinkColumn PanelMaterialCode { ValueType: String }
+        EDIXLSLinkColumn StockingPointID { ValueType: String }
+      ]
+    }
+  }
+}
diff --git a/_Main/BL/EDI/Broker_GlobalOTDTable_CAR_Export.qbl b/_Main/BL/EDI/Broker_GlobalOTDTable_CAR_Export.qbl
new file mode 100644
index 0000000..571fce9
--- /dev/null
+++ b/_Main/BL/EDI/Broker_GlobalOTDTable_CAR_Export.qbl
@@ -0,0 +1,65 @@
+Quintiq file version 2.0
+#parent: #root
+EDIBroker GlobalOTDTable_CAR_Export
+{
+  MDSDefinition: GlobalOTDTable
+  TimeZone: 'ACT'
+  UseOSTimeZone: false
+  EDIModelLink.Source Source13
+  {
+    EDIMLTable CapacityAllocationResults
+    {
+      TargetType: CapacityAllocationResults
+      EDIMLColumn Date { Attribute: Date ValueType: Date }
+      EDIMLColumn Description { Attribute: Description ValueType: String }
+      EDIMLColumn Division { Attribute: Division ValueType: String }
+      EDIMLColumn ID { Attribute: ID ValueType: String }
+      EDIMLColumn ManufacturedDate { Attribute: ManufacturedDate ValueType: Date }
+      EDIMLColumn ModuleBase { Attribute: ModuleBase ValueType: String }
+      EDIMLColumn ModuleMaterialCode { Attribute: ModuleMaterialCode ValueType: String }
+      EDIMLColumn ModuleMeasurementUnit { Attribute: ModuleMeasurementUnit ValueType: String }
+      EDIMLColumn NumberOfModules { Attribute: NumberOfModules ValueType: Real }
+      EDIMLColumn NumberOfPanels { Attribute: NumberOfPanels ValueType: Real }
+      EDIMLColumn PanelBase { Attribute: PanelBase ValueType: String }
+      EDIMLColumn PanelMaterialCode { Attribute: PanelMaterialCode ValueType: String }
+      EDIMLColumn PanelMeasurementUnit { Attribute: PanelMeasurementUnit ValueType: String }
+      EDIMLColumn ProductID { Attribute: ProductID ValueType: String }
+      EDIMLColumn RequirementDate { Attribute: RequirementDate ValueType: Date }
+      EDIMLColumn StockingPointID { Attribute: StockingPointID ValueType: String }
+      EDIMLColumn UserQuantity { Attribute: UserQuantity ValueType: Real }
+      EDIMLColumn VersionNumber { Attribute: VersionNumber ValueType: String }
+    }
+  }
+  EDITransformation.Transformation Transformation13
+  {
+    EDITableTransformation
+    {
+      InputTable: CapacityAllocationResults
+      OutputTable: CapacityAllocationResults
+      EDIColumnMatch { InputColumn: Date OutputColumn: Date }
+      EDIColumnMatch { InputColumn: Description OutputColumn: Description }
+      EDIColumnMatch { InputColumn: ID OutputColumn: ID }
+      EDIColumnMatch { InputColumn: ManufacturedDate OutputColumn: ManufacturedDate }
+      EDIColumnMatch { InputColumn: ProductID OutputColumn: ProductID }
+      EDIColumnMatch { InputColumn: StockingPointID OutputColumn: StockingPointID }
+      EDIColumnMatch { InputColumn: UserQuantity OutputColumn: UserQuantity }
+    }
+  }
+  EDIXLSLink.Destination Destination14
+  {
+    FileName: 'Destination14'
+    EDIXLSLinkTable CapacityAllocationResults
+    {
+      Columns:
+      [
+        EDIXLSLinkColumn Date { ValueType: Date }
+        EDIXLSLinkColumn Description { ValueType: String }
+        EDIXLSLinkColumn ID { ValueType: String }
+        EDIXLSLinkColumn ProductID { ValueType: String }
+        EDIXLSLinkColumn StockingPointID { ValueType: String }
+        EDIXLSLinkColumn UserQuantity { ValueType: Real }
+        EDIXLSLinkColumn ManufacturedDate { ValueType: Date }
+      ]
+    }
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAllocationResultsRuleConfiguration_CapacityAllocationResult.qbl b/_Main/BL/Relations/Relation_CapacityAllocationResultsRuleConfiguration_CapacityAllocationResult.qbl
new file mode 100644
index 0000000..744cd1a
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAllocationResultsRuleConfiguration_CapacityAllocationResult.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAllocationResultsRuleConfiguration_CapacityAllocationResults_CapacityAllocationResults_CapacityAllocationResultsRuleConfiguration
+{
+  #keys: '1[414702.0.387791788]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide CapacityAllocationResults
+  {
+    #keys: '3[414702.0.387791790][414702.0.387791789][414702.0.387791791]'
+    Cardinality: '1toN'
+    ObjectDefinition: CapacityAllocationResultsRuleConfiguration
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAllocationResultsRuleConfiguration
+  {
+    #keys: '3[414702.0.387791793][414702.0.387791792][414702.0.387791794]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAllocationResults
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_Date.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_Date.qbl
new file mode 100644
index 0000000..a158e2b
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_Date.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Date
+{
+  #keys: '3[414702.0.388471426][414702.0.388471425][414702.0.388471427]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_Description.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_Description.qbl
new file mode 100644
index 0000000..4d7f093
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_Description.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Description
+{
+  #keys: '3[414702.0.388471436][414702.0.388471435][414702.0.388471437]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_ID.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_ID.qbl
new file mode 100644
index 0000000..3a52d76
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_ID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ID
+{
+  #keys: '3[414702.0.388471446][414702.0.388471445][414702.0.388471447]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_ManufacturedDate.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_ManufacturedDate.qbl
new file mode 100644
index 0000000..15ee01f
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_ManufacturedDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ManufacturedDate
+{
+  #keys: '3[414702.0.388471486][414702.0.388471485][414702.0.388471487]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_ProductID.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_ProductID.qbl
new file mode 100644
index 0000000..ca7c6e4
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[414702.0.388471456][414702.0.388471455][414702.0.388471457]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_StockingPointID.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_StockingPointID.qbl
new file mode 100644
index 0000000..2a28f0d
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_StockingPointID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StockingPointID
+{
+  #keys: '3[414702.0.388471466][414702.0.388471465][414702.0.388471467]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_UserQuantity.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_UserQuantity.qbl
new file mode 100644
index 0000000..9c3d31c
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_UserQuantity.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute UserQuantity
+{
+  #keys: '3[414702.0.388471476][414702.0.388471475][414702.0.388471477]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/DeclarativeReferenceRelation_CalcCapacityAllocationResultsRuleConfiguration.qbl b/_Main/BL/Type_CapacityAllocationResults/DeclarativeReferenceRelation_CalcCapacityAllocationResultsRuleConfiguration.qbl
new file mode 100644
index 0000000..59c9af0
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/DeclarativeReferenceRelation_CalcCapacityAllocationResultsRuleConfiguration.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcCapacityAllocationResultsRuleConfiguration
+{
+  #keys: '1[414702.0.388304510]'
+  Expression:
+  [*
+    targetCapacityAllocationResultsRuleConfiguration := select( this.GlobalOTDTable(), CapacityAllocationResultsRuleConfiguration, tempCARRC, 
+                                                                tempCARRC.ModuleMaterialCode() = this.ModuleMaterialCode() and
+                                                                tempCARRC.PanelMaterialCode() = this.PanelMaterialCode() );
+    
+    return targetCapacityAllocationResultsRuleConfiguration;
+  *]
+  Relation: CapacityAllocationResultsRuleConfiguration
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/StaticMethod_CreateDate.qbl b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_CreateDate.qbl
index 9bea872..119198c 100644
--- a/_Main/BL/Type_CapacityAllocationResults/StaticMethod_CreateDate.qbl
+++ b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_CreateDate.qbl
@@ -2,7 +2,8 @@
 #parent: #root
 StaticMethod CreateDate (
   GlobalOTDTable globalOTDTable,
-  MacroPlan macroPlan
+  MacroPlan macroPlan,
+  Scenario scenario
 )
 {
   TextBody:
@@ -17,12 +18,16 @@
     }
     
     traverse ( finaleProductInStockingPoint_MPs, Elements, fpispmp ) {
-      capacityAllocationResultsRuleConfiguration := select( globalOTDTable, CapacityAllocationResultsRuleConfiguration, tempCARRC, tempCARRC.ModuleMaterialCode() = fpispmp.ProductID() and tempCARRC.StockingPointID() = fpispmp.StockingPointID() );
+      capacityAllocationResultsRuleConfigurations := selectset( globalOTDTable, CapacityAllocationResultsRuleConfiguration, tempCARRC, tempCARRC.ModuleMaterialCode() = fpispmp.ProductID() and tempCARRC.StockingPointID() = fpispmp.StockingPointID() );
       info( "鐢熶骇鐨勪骇鍝侊細", fpispmp.ProductID(), "------浜у搧鍦ㄥ簱瀛樼偣-------锛�", fpispmp.StockingPointID() );
       traverse ( period_MPS, Elements, pmp ) {     
         // CapacityAllocationResults::IterativeGeneration( globalOTDTable, pisp, 1, null( NewSupply ), -1.0, pmp.StartDate() ); 鑰佺増
-        CapacityAllocationResults::IterativeGeneration2( fpispmp, pmp.StartDate(), capacityAllocationResultsRuleConfiguration, 0, 0.0 );
+        CapacityAllocationResults::IterativeGeneration2( globalOTDTable, fpispmp, pmp.StartDate(), capacityAllocationResultsRuleConfigurations, 0, null( NewSupply ), 0.0 );
       }
     }
+    
+    traverse ( globalOTDTable, CapacityAllocationResults, car ) {
+      car.VersionNumber( scenario.Name() );
+    }
   *]
 }
diff --git a/_Main/BL/Type_CapacityAllocationResults/StaticMethod_Export.qbl b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_Export.qbl
new file mode 100644
index 0000000..14045dd
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_Export.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Export (
+  GlobalOTDTable globalOTDTable
+) as BinaryValue
+{
+  TextBody:
+  [*
+    binaryData := globalOTDTable.GlobalOTDTable_CAR_Export().ExecuteToXLS( true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/StaticMethod_IterativeGeneration2.qbl b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_IterativeGeneration2.qbl
index 37b0364..3f70ca5 100644
--- a/_Main/BL/Type_CapacityAllocationResults/StaticMethod_IterativeGeneration2.qbl
+++ b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_IterativeGeneration2.qbl
@@ -1,37 +1,93 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod IterativeGeneration2 (
+  GlobalOTDTable globalOTDTable,
   ProductInStockingPoint_MP pisp,
   Date targetDate,
-  CapacityAllocationResultsRuleConfiguration carrcs,
+  CapacityAllocationResultsRuleConfigurations carrcs,
   Number numberOfLayers,
-  Real firstLevelSupply
+  NewSupply firstLevelSupply,
+  Real currentLayerDependentDemandQuantity
 )
 {
   TextBody:
   [*
     numberOfLayers++;
-    info( "灞傛暟锛�", numberOfLayers, "    鐩爣鏃堕棿锛�", targetDate.Format( "Y-M2-D2" ) );
-    
+    info( "鐩爣鏃堕棿锛�", targetDate.Format( "Y-M2-D2" ) );
+    info( pisp.Name() );
     traverse ( pisp, ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), pispippl, pispippl.Start().Date() = targetDate ) {
       traverse ( pispippl, NewSupply, ns, ns.Quantity() > 0 ) {
-        info( "褰撳墠渚涘簲鐨刾isp锛�", ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().Name() );
         if ( numberOfLayers = 1 ) {
-          firstLevelSupply := ns.Quantity();
+          firstLevelSupply := ns;
         }
         
-        if ( guard( ns.PeriodTask_MP().astype( PeriodTaskOperation ).DependentDemand( relsize ) > 0, false ) ) {
-          traverse ( ns, PeriodTask_MP.astype( PeriodTaskOperation ).DependentDemand, dd ) { 
-            CapacityAllocationResults::IterativeGeneration2( dd.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP(),
+        ontype( ns.PeriodTask_MP() ) {
+          PeriodTaskOperation as pto : {
+            info( "Operation鍛ㄦ湡浠诲姟..." );     
+            traverse ( ns, PeriodTask_MP.astype( PeriodTaskOperation ).DependentDemand, dd ) {
+              currentLayerDependentDemandQuantity := currentLayerDependentDemandQuantity                     * 
+                                                     ns.ProcessOutput().astype( OperationOutput ).Quantity() *
+                                                     dd.ProcessInput().astype( OperationInput ).Quantity();
+              info( "灞傛暟锛�", numberOfLayers, "    褰撳墠渚涘簲鐨刾isp锛�", ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().Name(), "    鎬讳緵搴斿�硷細", ns.Quantity(), "    闇�瑕佷緵搴斿�硷細", currentLayerDependentDemandQuantity,
+                    "    褰撳墠闇�姹俻isp锛�", dd.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().Name(), "    闇�姹傚�硷細", currentLayerDependentDemandQuantity );
+              info( "-----------------------------------------------------------------------------------------------------------------" );
+              CapacityAllocationResults::IterativeGeneration2( globalOTDTable,
+                                                               dd.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP(),
+                                                               targetDate,
+                                                               carrcs,
+                                                               numberOfLayers,
+                                                               firstLevelSupply,
+                                                               currentLayerDependentDemandQuantity
+                                                              );
+            }
+            carrc := select( carrcs, Elements, carrc, carrc.PanelMaterialCode() = ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID() );
+            if ( not isnull( carrc ) ) {
+              info( "鎵惧埌闈㈡澘鐗╂枡..." );
+              globalOTDTable.CapacityAllocationResults( relnew,
+                                                        PanelBase             := pto.Operation().UnitID(),
+                                                        PanelMaterialCode     := ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID(),
+                                                        NumberOfPanels        := currentLayerDependentDemandQuantity,
+                                                        PanelMeasurementUnit  := ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().UnitOfMeasureName(),
+                                                        ModuleMaterialCode    := firstLevelSupply.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID(),
+                                                        NumberOfModules       := firstLevelSupply.Quantity(),
+                                                        ModuleMeasurementUnit := firstLevelSupply.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().UnitOfMeasureName(),
+                                                        ModuleBase            := guard( firstLevelSupply.PeriodTask_MP().astype( PeriodTaskOperation ).Operation().UnitID(), "杞﹂亾杩愯緭" ),
+                                                        Division              := carrc.Division(),
+                                                        RequirementDate       := ns.Start().Date(),
+                                                        Date                  := ns.Start().Date(),
+                                                        Description           := "",
+                                                        ID                    := OS::GenerateGUIDAsString(),
+                                                        ProductID             := ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID(),
+                                                        StockingPointID       := "",
+                                                        UserQuantity          := currentLayerDependentDemandQuantity,
+                                                        ManufacturedDate      := Date::MinDate()
+                                                       );
+                                                        
+            }
+            info( "-----------------------------------------------------------------------------------------------------------------" );
+          }
+          
+          PeriodTaskLaneLeg as ptll : {
+            targetDependentDemand := select( ptll, DependentDemand, dd, dd.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID() = ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID() );
+            currentLayerDependentDemandQuantity := ifexpr( numberOfLayers = 1, targetDependentDemand.Quantity(), currentLayerDependentDemandQuantity );
+            info( "灞傛暟锛�", numberOfLayers,"    褰撳墠渚涘簲鐨刾isp锛�", ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().Name(), "    鎬讳緵搴斿�硷細", ns.Quantity(), "    闇�瑕佷緵搴斿�硷細", currentLayerDependentDemandQuantity,
+                  "    褰撳墠闇�姹俻isp锛�", targetDependentDemand.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().Name(), "    闇�姹傚�硷細", currentLayerDependentDemandQuantity );
+            info( "LaneLeg鍛ㄦ湡浠诲姟..." );
+            info( "-----------------------------------------------------------------------------------------------------------------" );
+            CapacityAllocationResults::IterativeGeneration2( globalOTDTable,
+                                                             targetDependentDemand.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP(),
                                                              targetDate,
                                                              carrcs,
                                                              numberOfLayers,
-                                                             firstLevelSupply
+                                                             firstLevelSupply,
+                                                             currentLayerDependentDemandQuantity
                                                             );
           }
         }
         
-        firstLevelSupply := 0.0;
+        if ( numberOfLayers = 1 ) {
+          firstLevelSupply := null( NewSupply );
+        }
       }
     }
   *]
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_ModuleMaterialCode.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_ModuleMaterialCode.qbl
index 13e7a40..ca60799 100644
--- a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_ModuleMaterialCode.qbl
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_ModuleMaterialCode.qbl
@@ -4,5 +4,6 @@
 {
   #keys: '3[414702.0.374991437][414702.0.374991436][414702.0.374991438]'
   Description: '妯$粍鐗╂枡缂栫爜'
+  IsReadOnly: true
   ValueType: String
 }
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_PanelMaterialCode.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_PanelMaterialCode.qbl
index b2b1018..02037a2 100644
--- a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_PanelMaterialCode.qbl
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_PanelMaterialCode.qbl
@@ -4,5 +4,6 @@
 {
   #keys: '3[414702.0.374991427][414702.0.374991426][414702.0.374991428]'
   Description: '闈㈡澘鐗╂枡缂栫爜'
+  IsReadOnly: true
   ValueType: String
 }
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_StockingPointID.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_StockingPointID.qbl
index a0d789c..fb82a94 100644
--- a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_StockingPointID.qbl
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_StockingPointID.qbl
@@ -3,6 +3,7 @@
 Attribute StockingPointID
 {
   #keys: '3[414702.0.375010145][414702.0.375010144][414702.0.375010146]'
-  Description: '搴撳瓨鐐笽D'
+  Description: '妯$粍浜ф垚鍝佸簱瀛樼偣ID'
+  IsReadOnly: true
   ValueType: String
 }
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Export.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Export.qbl
new file mode 100644
index 0000000..4397413
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Export.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Export (
+  GlobalOTDTable globalOTDTable
+) as BinaryValue
+{
+  TextBody:
+  [*
+    // hongjli Sep-25-2023 (created)
+    binaryValue := globalOTDTable.GlobalOTDTable_CARRC_Export().ExecuteToXLS( true ).AsBinaryValue();
+    
+    return binaryValue;
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Import.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Import.qbl
new file mode 100644
index 0000000..a4eddc6
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Import.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Import (
+  GlobalOTDTable globalOTDTable,
+  String base64String
+)
+{
+  TextBody:
+  [*
+    binaryData := BinaryData::FromBase64EncodedString( base64String );
+    
+    globalOTDTable.GlobalOTDTable_CARRC_Import().ExecuteFromXLS( &binaryData, true );
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/TypeIndex_CapacityAllocationResultsRuleConfigurationTypeIndex.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/TypeIndex_CapacityAllocationResultsRuleConfigurationTypeIndex.qbl
new file mode 100644
index 0000000..ea74562
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/TypeIndex_CapacityAllocationResultsRuleConfigurationTypeIndex.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+TypeIndex CapacityAllocationResultsRuleConfigurationTypeIndex
+{
+  Attributes:
+  [
+    TypeIndexAttribute
+    {
+      ModelElement: ModuleMaterialCode
+    }
+    TypeIndexAttribute
+    {
+      ModelElement: PanelMaterialCode
+    }
+    TypeIndexAttribute
+    {
+      ModelElement: StockingPointID
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def b/_Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def
index 7b1da32..e164af9 100644
--- a/_Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def
+++ b/_Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def
@@ -5,7 +5,7 @@
   #keys: '[414702.0.340554926]'
   Body:
   [*
-    CapacityAllocationResults::CreateDate( GlobalOTDTable, MacroPlan );
+    CapacityAllocationResults::CreateDate( GlobalOTDTable, MacroPlan, SelectionScenario.Data() );
   *]
   CanBindMultiple: false
   DefinitionID: 'Responsedef_GUIButtonBase_OnClick'
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Component_pnlContent.def
index 320176c..f885a86 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Component_pnlContent.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Component_pnlContent.def
@@ -23,7 +23,7 @@
       Properties:
       [
         DataBinding: 'DataHolderDialogData.Data.ModuleMaterialCode'
-        Label: '妯℃澘鐗╂枡缂栫爜'
+        Label: '妯℃澘浜ф垚鍝両D'
         Taborder: 1
       ]
     }
@@ -45,7 +45,7 @@
       Properties:
       [
         DataBinding: 'DataHolderDialogData.Data.StockingPointID'
-        Label: '搴撳瓨鐐笽D'
+        Label: '妯$粍浜ф垚鍝佸簱瀛樼偣ID'
         Taborder: 3
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Response_pnlActions_btnOk_OnClick.def
index d088a4b..336e9a8 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Response_pnlActions_btnOk_OnClick.def
@@ -19,10 +19,11 @@
                                                                    StockingPointID    := efStockingPointID.Text()
                                                                   );
       } else {
-        data.PanelMaterialCode( efPanelMaterialCode.Text() );
-        data.ModuleMaterialCode( efModuleMaterialCode.Text() );
-        data.Division( efDivision.Text() );
-        data.StockingPointID( efStockingPointID.Text() );
+        DataHolderDialogData.Data().PanelMaterialCode( efPanelMaterialCode.Text() );
+        DataHolderDialogData.Data().ModuleMaterialCode( efModuleMaterialCode.Text() );
+        DataHolderDialogData.Data().Division( efDivision.Text() );
+        DataHolderDialogData.Data().StockingPointID( efStockingPointID.Text() );
+        DataHolderDialogData.Data().Commit();
       }
       
       
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_ListCapacityAllocationResults.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_ListCapacityAllocationResults.def
index c07b922..27d0374 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_ListCapacityAllocationResults.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_ListCapacityAllocationResults.def
@@ -1,26 +1,26 @@
 Quintiq file version 2.0
 Component ListCapacityAllocationResults
 {
-  #keys: '[414702.0.338762075]'
+  #keys: '[414702.0.390053833]'
   BaseType: 'WebList'
   Children:
   [
     Component DataExtractorCapacityAllocationResults
     {
-      #keys: '[414702.0.338762076]'
+      #keys: '[414702.0.390053834]'
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'GlobalOTDTable'
-        Source: 'GlobalOTDTable'
+        DataType: 'structured[CapacityAllocationResultsRuleConfiguration]'
+        Source: 'FormCapacityAllocationResultsRuleConfiguration.DataHolderSelectCapacityAllocationResultsRuleConfiguration'
         Taborder: 0
-        Transformation: 'CapacityAllocationResults'
+        Transformation: 'Elements.CapacityAllocationResults'
       ]
     }
     #child: listActionBarPageCapacityAllocationResults
     Component DataSetLevelCapacityAllocationResults
     {
-      #keys: '[414702.0.338762081]'
+      #keys: '[414702.0.390053839]'
       BaseType: 'WebDataSetLevel'
       Children:
       [
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"VersionNumber","title":"VersionNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"VersionNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PanelMeasurementUnit","title":"PanelMeasurementUnit","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"PanelMeasurementUnit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PanelMaterialCode","title":"PanelMaterialCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"PanelMaterialCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"NumberOfPanels","title":"NumberOfPanels","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"NumberOfPanels"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PanelMeasurementUnit","title":"PanelMeasurementUnit","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"PanelMeasurementUnit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ModuleMaterialCode","title":"ModuleMaterialCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ModuleMaterialCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"NumberOfModules","title":"NumberOfModules","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"NumberOfModules"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ModuleMeasurementUnit","title":"ModuleMeasurementUnit","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ModuleMeasurementUnit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ModuleMeasurementUnit","title":"ModuleMeasurementUnit","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ModuleMeasurementUnit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Division","title":"Division","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Division"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"RequirementDate","title":"RequirementDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"RequirementDate"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Date","title":"Date","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Date"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Description","title":"Description","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Description"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ID","title":"ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"ProductID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPointID","title":"StockingPointID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StockingPointID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UserQuantity","title":"UserQuantity","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"UserQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ManufacturedDate","title":"ManufacturedDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ManufacturedDate"}}]'
         ContextMenu: 'listContextMenuCapacityAllocationResults'
         Taborder: 2
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_PanelCapacityAllocationResults.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_PanelCapacityAllocationResults.def
new file mode 100644
index 0000000..a916ec0
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_PanelCapacityAllocationResults.def
@@ -0,0 +1,37 @@
+Quintiq file version 2.0
+Component PanelCapacityAllocationResults
+{
+  #keys: '[414702.0.391687385]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonGenerateCapacityAllocationResults id:ButtonGenerateCapacityAllocationResults_570
+    {
+      #keys: '[414702.0.391717497]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'PROCESS'
+        Label: '鐢熸垚鏁版嵁'
+        Taborder: 0
+      ]
+    }
+    Component Export id:Export_398
+    {
+      #keys: '[414702.0.392048461]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listActionBarPageCapacityAllocationResults.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listActionBarPageCapacityAllocationResults.def
index 5384f4a..81f7ddb 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listActionBarPageCapacityAllocationResults.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listActionBarPageCapacityAllocationResults.def
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 Component listActionBarPageCapacityAllocationResults
 {
-  #keys: '[414702.0.338762078]'
+  #keys: '[414702.0.390053836]'
   BaseType: 'listActionBarPage'
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listContextMenuCapacityAllocationResults.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listContextMenuCapacityAllocationResults.def
index 62d4067..b7e995a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listContextMenuCapacityAllocationResults.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listContextMenuCapacityAllocationResults.def
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 Component listContextMenuCapacityAllocationResults
 {
-  #keys: '[414702.0.338762083]'
+  #keys: '[414702.0.390053841]'
   BaseType: 'listContextMenu'
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_ButtonGenerateCapacityAllocationResults_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_ButtonGenerateCapacityAllocationResults_OnClick.def
deleted file mode 100644
index 2d97d02..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_ButtonGenerateCapacityAllocationResults_OnClick.def
+++ /dev/null
@@ -1,16 +0,0 @@
-Quintiq file version 2.0
-#parent: ButtonGenerateCapacityAllocationResults
-Response OnClick () id:Response_FormCapacityAllocationResults_ButtonGenerateCapacityAllocationResults_OnClick
-{
-  #keys: '[414702.0.340111671]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  QuillAction
-  {
-    Body:
-    [*
-      CapacityAllocationResults::CreateDate( GlobalOTDTable, MacroPlan );
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_ButtonGenerateCapacityAllocationR\04339.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_ButtonGenerateCapacityAllocationR\04339.def"
new file mode 100644
index 0000000..6a4fd16
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_ButtonGenerateCapacityAllocationR\04339.def"
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelCapacityAllocationResults/ButtonGenerateCapacityAllocationResults_570
+Response OnClick () id:Response_FormCapacityAllocationResults_ButtonGenerateCapacityAllocationResults_OnClick_39
+{
+  #keys: '[414702.0.391717496]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      CapacityAllocationResults::CreateDate( GlobalOTDTable, MacroPlan, DataHolderActiveScenario.Data() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_Export_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_Export_OnClick.def
new file mode 100644
index 0000000..4428575
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_Export_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelCapacityAllocationResults/Export_398
+Response OnClick () id:Response_PanelCapacityAllocationResults_Export_OnClick
+{
+  #keys: '[414702.0.391791234]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Application.Download( "浜ц兘鍒嗛厤缁撴灉.xlsx", CapacityAllocationResults::Export( GlobalOTDTable ).AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/_ROOT_Component_FormCapacityAllocationResults.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/_ROOT_Component_FormCapacityAllocationResults.def
index 432fdfa..983e0ed 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/_ROOT_Component_FormCapacityAllocationResults.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/_ROOT_Component_FormCapacityAllocationResults.def
@@ -8,17 +8,7 @@
   Children:
   [
     #child: ListCapacityAllocationResults
-    Component ButtonGenerateCapacityAllocationResults
-    {
-      #keys: '[414702.0.340677556]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'PROCESS'
-        Label: '鐢熸垚鏁版嵁'
-        Taborder: 0
-      ]
-    }
+    #child: PanelCapacityAllocationResults
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_ListCapacityAllocationResultsRuleConfiguration.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_ListCapacityAllocationResultsRuleConfiguration.def
index 98c0a3a..add7c86 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_ListCapacityAllocationResultsRuleConfiguration.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_ListCapacityAllocationResultsRuleConfiguration.def
@@ -36,7 +36,7 @@
   ]
   Properties:
   [
-    Taborder: 0
+    Taborder: 1
   ]
   ResponseDefinitions:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_PanelImportAndExport.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_PanelImportAndExport.def
new file mode 100644
index 0000000..367ca52
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_PanelImportAndExport.def
@@ -0,0 +1,37 @@
+Quintiq file version 2.0
+Component PanelImportAndExport
+{
+  #keys: '[414702.0.391512140]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component Import
+    {
+      #keys: '[414702.0.390081531]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'IMPORT1'
+        Label: '瀵煎叆'
+        Taborder: 0
+      ]
+    }
+    Component Export
+    {
+      #keys: '[414702.0.391512453]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_DataHolderSelectCapacityAllocationResultsRuleConfiguration_OnDataCh.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_DataHolderSelectCapacityAllocationResultsRuleConfiguration_OnDataCh.def
new file mode 100644
index 0000000..1c99357
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_DataHolderSelectCapacityAllocationResultsRuleConfiguration_OnDataCh.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: DataHolderSelectCapacityAllocationResultsRuleConfiguration
+Response OnDataChanged () id:Response_FormCapacityAllocationResultsRuleConfiguration_DataHolderSelectCapacityAllocationResultsRuleConfiguration_OnDataChanged
+{
+  #keys: '[414702.0.391379706]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      traverse ( this.Data(), Elements, e ) {
+        info( "闈㈡澘鐗╂枡ID锛�", e.PanelMaterialCode() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Export_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Export_OnClick.def
new file mode 100644
index 0000000..602baba
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Export_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelImportAndExport/Export
+Response OnClick () id:Response_PanelImportAndExport_Export_OnClick
+{
+  #keys: '[414702.0.391658465]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Application.Download( "浜ц兘鍒嗛厤缁撴灉瑙勫垯.xlsx", CapacityAllocationResultsRuleConfiguration::Export( GlobalOTDTable ).AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Import_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Import_OnClick.def
new file mode 100644
index 0000000..3e90d91
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Import_OnClick.def
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+#parent: PanelImportAndExport/Import
+Response OnClick () id:Response_PanelImportAndExport_Import_OnClick
+{
+  #keys: '[414702.0.391899822]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      try {
+        uploadJsonString := Application.GetFile();
+        if ( uploadJsonString <> "" ) {
+          uploadJson := JSON::Parse( uploadJsonString );
+          
+          fileName := uploadJson.Get( "name" ).GetString();
+          base64String := uploadJson.Get( "data" ).GetString();
+          CapacityAllocationResultsRuleConfiguration::Import( GlobalOTDTable, base64String );
+          
+          WebMessageBox::Success( "涓婁紶鎴愬姛", true );
+        }
+      } onerror {
+        WebMessageBox::Error( e.GeneralInformation(), true );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/_ROOT_Component_FormCapacityAllocationResultsRuleConfiguration.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/_ROOT_Component_FormCapacityAllocationResultsRuleConfiguration.def
index b4952be..436ef69 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/_ROOT_Component_FormCapacityAllocationResultsRuleConfiguration.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/_ROOT_Component_FormCapacityAllocationResultsRuleConfiguration.def
@@ -8,6 +8,32 @@
   Children:
   [
     #child: ListCapacityAllocationResultsRuleConfiguration
+    Component DataHolderSelectCapacityAllocationResultsRuleConfiguration
+    {
+      #keys: '[414702.0.390054479]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[CapacityAllocationResultsRuleConfiguration]*'
+      Children:
+      [
+        Component DataExtractorSelectCapacityAllocationResultsRuleConfiguration
+        {
+          #keys: '[414702.0.391186862]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'CapacityAllocationResultsRuleConfiguration'
+            ExtractionMode: 'Selected'
+            Source: 'ListCapacityAllocationResultsRuleConfiguration'
+            Taborder: 0
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+    #child: PanelImportAndExport
   ]
   Properties:
   [

--
Gitblit v1.9.3