From ae5ea57221f6bab29d84e8c58042a07130befcc8 Mon Sep 17 00:00:00 2001
From: hongji.li <hongji.a.li@capgemini.com>
Date: 星期二, 24 十月 2023 15:33:18 +0800
Subject: [PATCH] 异步分发优化

---
 _Main/BL/Type_Global_MAPISPIPCategory/_ROOT_Type_Global_MAPISPIPCategory.qbl                                                  |    9 
 _Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl                                                             |   28 +
 _Main/BL/Type_Global_StockingPointCostCategory/_ROOT_Type_Global_StockingPointCostCategory.qbl                                |    9 
 _Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingProduct_MP_Global_Ma.qbl                           |   23 +
 _Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl                           |   14 
 _Main/BL/Type_Global_ProductCategory/_ROOT_Type_Global_ProductCategory.qbl                                                    |    9 
 _Main/BL/Type_Global_ProductInLineCategory/StaticMethod_Create.qbl                                                            |   17 +
 _Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl                                                                  |    5 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button1_OnClick.def                                          |   16 +
 _Main/BL/Type_Global_MappingActualProductInStockingPointInPeriod/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl |   14 
 _Main/BL/Type_Global_MAPISPIPCategory/Attribute_ProductID.qbl                                                                 |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button4_OnClick.def                                          |   16 +
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button5_OnClick.def                                          |   24 +
 _Main/BL/Relations/Relation_Global_StockingPointCostCategory_GlobalOTDTable_GlobalOTDTable_Glob.qbl                           |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button2_OnClick.def                                          |   16 +
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button3_OnClick.def                                          |   16 +
 _Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingInventorySupply_Global.qbl                           |   23 +
 _Main/BL/Type_Global_ProductInLineCategory/_ROOT_Type_Global_ProductInLineCategory.qbl                                        |    9 
 _Main/BL/Type_Global_MAPISPIPCategory/Function_CalcKeyProduct.qbl                                                             |   13 
 _Main/BL/Relations/Relation_Global_ProductCategory_GlobalOTDTable_GlobalOTDTable_Global_Product.qbl                           |   23 +
 _Main/BL/Type_Global_InventorySupplyCategory/Function_CalcIsCommon.qbl                                                        |   13 
 _Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl                                                           |   33 +
 _Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl                  |   14 
 _Main/BL/Type_Global_MappingStockingPointCost/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl           |   14 
 _Main/BL/Type_Global_StockingPointCostCategory/StaticMethod_Create.qbl                                                        |   17 +
 _Main/BL/Relations/Relation_Global_InventorySupplyCategory_GlobalOTDTable_GlobalOTDTable_Global.qbl                           |   23 +
 _Main/BL/Relations/Relation_Global_ProductCategory_Global_MappingProduct_MP_Global_MappingProdu.qbl                           |   23 +
 _Main/BL/Type_Global_ProductCategory/Attribute_BusinessTypeName.qbl                                                           |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ButtonGenerateProductCategory_OnClick.def                    |   20 +
 _Main/BL/Type_Global_InventorySupplyCategory/_ROOT_Type_Global_InventorySupplyCategory.qbl                                    |    9 
 _Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingProduct_MP_Global_MappingProd.qbl                           |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def                                 |   66 ++++
 _Main/BL/Relations/Relation_Global_ProductInLineCategory_GlobalOTDTable_GlobalOTDTable_Global_P.qbl                           |   23 +
 _Main/BL/Type_Global_StockingPointCostCategory/Attribute_ProductID.qbl                                                        |    7 
 _Main/BL/Type_MacroPlan/StaticMethod_DoASync#253.qbl                                                                          |    4 
 _Main/BL/Type_Global_MAPISPIPCategory/Attribute_IsCommon.qbl                                                                  |    7 
 _Main/BL/Type_Global_InventorySupplyCategory/Attribute_IsCommon.qbl                                                           |    7 
 _Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl                    |   14 
 _Main/BL/Type_Global_ProductCategory/StaticMethod_Create.qbl                                                                  |   17 +
 _Main/BL/Relations/Relation_Global_MAPISPIPCategory_GlobalOTDTable_GlobalOTDTable_Global_MAPISP.qbl                           |   23 +
 _Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductCategory.qbl                            |   14 
 _Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProduct_MP_Global_Mappin.qbl                           |   23 +
 _Main/BL/Type_Global_InventorySupplyCategory/Attribute_ProductID.qbl                                                          |    7 
 _Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingActualProductInStockingPointI.qbl                           |   23 +
 _Main/BL/Type_Global_ProductInLineCategory/Attribute_ProductID.qbl                                                            |    7 
 _Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingStockingPointCost_Gl.qbl                           |   23 +
 _Main/BL/Type_Global_MAPISPIPCategory/Function_CalcIsCommon.qbl                                                               |   13 
 _Main/BL/Type_Global_MappingInventorySupply/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl               |   14 
 _Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl                                                    |   11 
 _Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl                                                            |   11 
 _Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProductInLane_Global_Map.qbl                           |   23 +
 _Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl                      |   14 
 _Main/BL/Type_Global_InventorySupplyCategory/StaticMethod_Create.qbl                                                          |   18 +
 _Main/BL/Type_Global_MAPISPIPCategory/StaticMethod_Create.qbl                                                                 |   18 +
 _Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingProduct_MP_Global_Mapp.qbl                           |   23 +
 _Main/UI/MacroPlannerWebApp/Views/接口测试.vw                                                                                     |    4 
 _Main/BL/Type_Global_MAPISPIPCategory/Attribute_KeyProduct.qbl                                                                |    7 
 _Main/BL/Type_Global_MappingProductInLane/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl                   |   14 
 58 files changed, 916 insertions(+), 29 deletions(-)

diff --git a/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_GlobalOTDTable_GlobalOTDTable_Global.qbl b/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_GlobalOTDTable_GlobalOTDTable_Global.qbl
new file mode 100644
index 0000000..6828008
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_GlobalOTDTable_GlobalOTDTable_Global.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_InventorySupplyCategory_GlobalOTDTable_GlobalOTDTable_Global_InventorySupplyCategory
+{
+  #keys: '1[414702.1.220612437]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414702.1.220612439][414702.1.220612438][414702.1.220612440]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_InventorySupplyCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_InventorySupplyCategory
+  {
+    #keys: '3[414702.1.220612442][414702.1.220612441][414702.1.220612443]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingInventorySupply_Global.qbl b/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingInventorySupply_Global.qbl
new file mode 100644
index 0000000..d5b1a83
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingInventorySupply_Global.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_InventorySupplyCategory_Global_MappingInventorySupply_Global_MappingInventorySupply_Global_InventorySupplyCategory
+{
+  #keys: '1[414702.1.220612411]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingInventorySupply
+  {
+    #keys: '3[414702.1.220612413][414702.1.220612412][414702.1.220612414]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_InventorySupplyCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_InventorySupplyCategory
+  {
+    #keys: '3[414702.1.220612416][414702.1.220612415][414702.1.220612417]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingInventorySupply
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingProduct_MP_Global_Mapp.qbl b/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingProduct_MP_Global_Mapp.qbl
new file mode 100644
index 0000000..76a7147
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingProduct_MP_Global_Mapp.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_InventorySupplyCategory_Global_MappingProduct_MP_Global_MappingProduct_MP_Global_InventorySupplyCategory
+{
+  #keys: '1[414702.1.220612424]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingProduct_MP
+  {
+    #keys: '3[414702.1.220612426][414702.1.220612425][414702.1.220612427]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_InventorySupplyCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_InventorySupplyCategory
+  {
+    #keys: '3[414702.1.220612429][414702.1.220612428][414702.1.220612430]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingProduct_MP
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_GlobalOTDTable_GlobalOTDTable_Global_MAPISP.qbl b/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_GlobalOTDTable_GlobalOTDTable_Global_MAPISP.qbl
new file mode 100644
index 0000000..783e09e
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_GlobalOTDTable_GlobalOTDTable_Global_MAPISP.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_MAPISPIPCategory_GlobalOTDTable_GlobalOTDTable_Global_MAPISPIPCategory
+{
+  #keys: '1[414702.1.226768030]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414702.1.226768032][414702.1.226768031][414702.1.226768033]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MAPISPIPCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_MAPISPIPCategory
+  {
+    #keys: '3[414702.1.226768035][414702.1.226768034][414702.1.226768036]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingActualProductInStockingPointI.qbl b/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingActualProductInStockingPointI.qbl
new file mode 100644
index 0000000..3952c31
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingActualProductInStockingPointI.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_MAPISPIPCategory_Global_MappingActualProductInStockingPointInPeriod_Global_MappingActualProductInStockingPointInPeriod_Global_MAPISPIPCategory
+{
+  #keys: '1[414702.1.226768004]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingActualProductInStockingPointInPeriod
+  {
+    #keys: '3[414702.1.226768006][414702.1.226768005][414702.1.226768007]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_MAPISPIPCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_MAPISPIPCategory
+  {
+    #keys: '3[414702.1.226768009][414702.1.226768008][414702.1.226768010]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingActualProductInStockingPointInPeriod
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingProduct_MP_Global_MappingProd.qbl b/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingProduct_MP_Global_MappingProd.qbl
new file mode 100644
index 0000000..408356c
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingProduct_MP_Global_MappingProd.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_MAPISPIPCategory_Global_MappingProduct_MP_Global_MappingProduct_MP_Global_MAPISPIPCategory
+{
+  #keys: '1[414702.1.226768017]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingProduct_MP
+  {
+    #keys: '3[414702.1.226768019][414702.1.226768018][414702.1.226768020]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_MAPISPIPCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_MAPISPIPCategory
+  {
+    #keys: '3[414702.1.226768022][414702.1.226768021][414702.1.226768023]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingProduct_MP
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_ProductCategory_GlobalOTDTable_GlobalOTDTable_Global_Product.qbl b/_Main/BL/Relations/Relation_Global_ProductCategory_GlobalOTDTable_GlobalOTDTable_Global_Product.qbl
new file mode 100644
index 0000000..b35e9f5
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_ProductCategory_GlobalOTDTable_GlobalOTDTable_Global_Product.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_ProductCategory_GlobalOTDTable_GlobalOTDTable_Global_ProductCategory
+{
+  #keys: '1[414702.1.222746446]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414702.1.222746448][414702.1.222746447][414702.1.222746449]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_ProductCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_ProductCategory
+  {
+    #keys: '3[414702.1.222746451][414702.1.222746450][414702.1.222746452]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_ProductCategory_Global_MappingProduct_MP_Global_MappingProdu.qbl b/_Main/BL/Relations/Relation_Global_ProductCategory_Global_MappingProduct_MP_Global_MappingProdu.qbl
new file mode 100644
index 0000000..0be0b32
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_ProductCategory_Global_MappingProduct_MP_Global_MappingProdu.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_ProductCategory_Global_MappingProduct_MP_Global_MappingProduct_MP_Global_ProductCategory
+{
+  #keys: '1[414702.1.222746433]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingProduct_MP
+  {
+    #keys: '3[414702.1.222746435][414702.1.222746434][414702.1.222746436]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_ProductCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_ProductCategory
+  {
+    #keys: '3[414702.1.222746438][414702.1.222746437][414702.1.222746439]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingProduct_MP
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_ProductInLineCategory_GlobalOTDTable_GlobalOTDTable_Global_P.qbl b/_Main/BL/Relations/Relation_Global_ProductInLineCategory_GlobalOTDTable_GlobalOTDTable_Global_P.qbl
new file mode 100644
index 0000000..399cbfd
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_ProductInLineCategory_GlobalOTDTable_GlobalOTDTable_Global_P.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_ProductInLineCategory_GlobalOTDTable_GlobalOTDTable_Global_ProductInLineCategory
+{
+  #keys: '1[414702.1.220556276]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414702.1.220556278][414702.1.220556277][414702.1.220556279]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_ProductInLineCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_ProductInLineCategory
+  {
+    #keys: '3[414702.1.220556281][414702.1.220556280][414702.1.220556282]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProductInLane_Global_Map.qbl b/_Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProductInLane_Global_Map.qbl
new file mode 100644
index 0000000..f827bdb
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProductInLane_Global_Map.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_ProductInLineCategory_Global_MappingProductInLane_Global_MappingProductInLane_Global_ProductInLineCategory
+{
+  #keys: '1[414702.1.220556250]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingProductInLane
+  {
+    #keys: '3[414702.1.220556252][414702.1.220556251][414702.1.220556253]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_ProductInLineCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_ProductInLineCategory
+  {
+    #keys: '3[414702.1.220556255][414702.1.220556254][414702.1.220556256]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingProductInLane
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProduct_MP_Global_Mappin.qbl b/_Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProduct_MP_Global_Mappin.qbl
new file mode 100644
index 0000000..bff781f
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProduct_MP_Global_Mappin.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_ProductInLineCategory_Global_MappingProduct_MP_Global_MappingProduct_MP_Global_ProductInLineCategory
+{
+  #keys: '1[414702.1.220556263]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingProduct_MP
+  {
+    #keys: '3[414702.1.220556265][414702.1.220556264][414702.1.220556266]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_ProductInLineCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_ProductInLineCategory
+  {
+    #keys: '3[414702.1.220556268][414702.1.220556267][414702.1.220556269]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingProduct_MP
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_GlobalOTDTable_GlobalOTDTable_Glob.qbl b/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_GlobalOTDTable_GlobalOTDTable_Glob.qbl
new file mode 100644
index 0000000..5f4ae65
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_GlobalOTDTable_GlobalOTDTable_Glob.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_StockingPointCostCategory_GlobalOTDTable_GlobalOTDTable_Global_StockingPointCostCategory
+{
+  #keys: '1[414702.1.224718240]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414702.1.224718242][414702.1.224718241][414702.1.224718243]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_StockingPointCostCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_StockingPointCostCategory
+  {
+    #keys: '3[414702.1.224718245][414702.1.224718244][414702.1.224718246]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingProduct_MP_Global_Ma.qbl b/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingProduct_MP_Global_Ma.qbl
new file mode 100644
index 0000000..9a77d29
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingProduct_MP_Global_Ma.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_StockingPointCostCategory_Global_MappingProduct_MP_Global_MappingProduct_MP_Global_StockingPointCostCategory
+{
+  #keys: '1[414702.1.224718214]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingProduct_MP
+  {
+    #keys: '3[414702.1.224718216][414702.1.224718215][414702.1.224718217]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_StockingPointCostCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_StockingPointCostCategory
+  {
+    #keys: '3[414702.1.224718219][414702.1.224718218][414702.1.224718220]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingProduct_MP
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingStockingPointCost_Gl.qbl b/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingStockingPointCost_Gl.qbl
new file mode 100644
index 0000000..207890c
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingStockingPointCost_Gl.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_StockingPointCostCategory_Global_MappingStockingPointCost_Global_MappingStockingPointCost_Global_StockingPointCostCategory
+{
+  #keys: '1[414702.1.224718227]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingStockingPointCost
+  {
+    #keys: '3[414702.1.224718229][414702.1.224718228][414702.1.224718230]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_StockingPointCostCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_StockingPointCostCategory
+  {
+    #keys: '3[414702.1.224718232][414702.1.224718231][414702.1.224718233]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingStockingPointCost
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Type_Global_InventorySupplyCategory/Attribute_IsCommon.qbl b/_Main/BL/Type_Global_InventorySupplyCategory/Attribute_IsCommon.qbl
new file mode 100644
index 0000000..0ee01a8
--- /dev/null
+++ b/_Main/BL/Type_Global_InventorySupplyCategory/Attribute_IsCommon.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsCommon
+{
+  #keys: '3[414702.1.228025354][414702.1.228025353][414702.1.228025355]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_InventorySupplyCategory/Attribute_ProductID.qbl b/_Main/BL/Type_Global_InventorySupplyCategory/Attribute_ProductID.qbl
new file mode 100644
index 0000000..8ed3bfe
--- /dev/null
+++ b/_Main/BL/Type_Global_InventorySupplyCategory/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[414702.1.220612402][414702.1.220612401][414702.1.220612403]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_InventorySupplyCategory/Function_CalcIsCommon.qbl b/_Main/BL/Type_Global_InventorySupplyCategory/Function_CalcIsCommon.qbl
new file mode 100644
index 0000000..3f5b37c
--- /dev/null
+++ b/_Main/BL/Type_Global_InventorySupplyCategory/Function_CalcIsCommon.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcIsCommon
+{
+  TextBody:
+  [*
+    // hongjli Oct-24-2023 (created)
+    
+    value := guard( select( this, Global_MappingProduct_MP, tempGMPMP, true ).IsCommon(), false );
+    
+    this.IsCommon( value );
+  *]
+}
diff --git a/_Main/BL/Type_Global_InventorySupplyCategory/StaticMethod_Create.qbl b/_Main/BL/Type_Global_InventorySupplyCategory/StaticMethod_Create.qbl
new file mode 100644
index 0000000..da22117
--- /dev/null
+++ b/_Main/BL/Type_Global_InventorySupplyCategory/StaticMethod_Create.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_InventorySupplyCategory( relflush );
+    
+    productIDs := selectuniquevalues( globalOTDTable, Global_MappingInventorySupply, 
+                                      tempGMIS, true, tempGMIS.ProductID() );
+    
+    traverse ( productIDs, Elements, id ) {
+      globalOTDTable.Global_InventorySupplyCategory( relnew, ProductID := id );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_InventorySupplyCategory/_ROOT_Type_Global_InventorySupplyCategory.qbl b/_Main/BL/Type_Global_InventorySupplyCategory/_ROOT_Type_Global_InventorySupplyCategory.qbl
new file mode 100644
index 0000000..9acdd56
--- /dev/null
+++ b/_Main/BL/Type_Global_InventorySupplyCategory/_ROOT_Type_Global_InventorySupplyCategory.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_InventorySupplyCategory
+{
+  #keys: '5[414702.1.220612398][414702.1.220612396][0.0.0][414702.1.220612397][414702.1.220612399]'
+  BaseType: Object
+  StructuredName: 'Global_InventorySupplyCategorys'
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_IsCommon.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_IsCommon.qbl
new file mode 100644
index 0000000..037726d
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_IsCommon.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsCommon
+{
+  #keys: '3[414702.1.226768068][414702.1.226768067][414702.1.226768069]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_KeyProduct.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_KeyProduct.qbl
new file mode 100644
index 0000000..6d30cca
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_KeyProduct.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute KeyProduct
+{
+  #keys: '3[414702.1.226768051][414702.1.226768050][414702.1.226768052]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_ProductID.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_ProductID.qbl
new file mode 100644
index 0000000..694b52b
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[414702.1.226767995][414702.1.226767994][414702.1.226767996]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcIsCommon.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcIsCommon.qbl
new file mode 100644
index 0000000..3f5b37c
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcIsCommon.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcIsCommon
+{
+  TextBody:
+  [*
+    // hongjli Oct-24-2023 (created)
+    
+    value := guard( select( this, Global_MappingProduct_MP, tempGMPMP, true ).IsCommon(), false );
+    
+    this.IsCommon( value );
+  *]
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcKeyProduct.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcKeyProduct.qbl
new file mode 100644
index 0000000..1e84bcc
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcKeyProduct.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcKeyProduct
+{
+  TextBody:
+  [*
+    // hongjli Oct-24-2023 (created)
+    
+    value := guard( select( this, Global_MappingProduct_MP, tempGMPMP, true ).KeyProduct(), false );
+    
+    this.KeyProduct( value );
+  *]
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/StaticMethod_Create.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/StaticMethod_Create.qbl
new file mode 100644
index 0000000..2134324
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/StaticMethod_Create.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MAPISPIPCategory( relflush );
+    
+    productIDs := selectuniquevalues( globalOTDTable, Global_MappingActualProductInStockingPointInPeriod, 
+                                      tempGMAPISPIP, true, tempGMAPISPIP.ProductID() );
+    
+    traverse ( productIDs, Elements, id ) {
+      globalOTDTable.Global_MAPISPIPCategory( relnew, ProductID := id );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/_ROOT_Type_Global_MAPISPIPCategory.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/_ROOT_Type_Global_MAPISPIPCategory.qbl
new file mode 100644
index 0000000..a8193a5
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/_ROOT_Type_Global_MAPISPIPCategory.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_MAPISPIPCategory
+{
+  #keys: '5[414702.1.226767991][414702.1.226767989][0.0.0][414702.1.226767990][414702.1.226767992]'
+  BaseType: Object
+  StructuredName: 'Global_MAPISPIPCategorys'
+}
diff --git a/_Main/BL/Type_Global_MappingActualProductInStockingPointInPeriod/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl b/_Main/BL/Type_Global_MappingActualProductInStockingPointInPeriod/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl
new file mode 100644
index 0000000..c5cc65f
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingActualProductInStockingPointInPeriod/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_MAPISPIPCategory
+{
+  #keys: '1[414702.1.226768045]'
+  Expression:
+  [*
+    targetGlobal_MAPISPIPCategory := select( this.GlobalOTDTable(), Global_MAPISPIPCategory, tempGMAPISPIPC,
+                                             tempGMAPISPIPC.ProductID() = this.ProductID() );
+    
+    return targetGlobal_MAPISPIPCategory;
+  *]
+  Relation: Global_MAPISPIPCategory
+}
diff --git a/_Main/BL/Type_Global_MappingInventorySupply/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl b/_Main/BL/Type_Global_MappingInventorySupply/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl
new file mode 100644
index 0000000..3756789
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingInventorySupply/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_InventorySupplyCategory
+{
+  #keys: '1[414702.1.220612460]'
+  Expression:
+  [*
+    targetGlobal_InventorySupplyCategory := select( this.GlobalOTDTable(), Global_InventorySupplyCategory, tempGISC,
+                                                    tempGISC.ProductID() = this.ProductID() );
+    
+    return targetGlobal_InventorySupplyCategory;
+  *]
+  Relation: Global_InventorySupplyCategory
+}
diff --git a/_Main/BL/Type_Global_MappingProductInLane/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl b/_Main/BL/Type_Global_MappingProductInLane/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl
new file mode 100644
index 0000000..e3c341b
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProductInLane/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_ProductInLineCategory
+{
+  #keys: '1[414702.1.224718199]'
+  Expression:
+  [*
+    targeGlobal_ProductInLineCategory := select( this.GlobalOTDTable(), Global_ProductInLineCategory, tempGPILC,
+                                                 tempGPILC.ProductID() = this.ProductID() );
+    
+    return targeGlobal_ProductInLineCategory;
+  *]
+  Relation: Global_ProductInLineCategory
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl
new file mode 100644
index 0000000..3abbab2
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_InventorySupplyCategory
+{
+  #keys: '1[414702.1.220612452]'
+  Expression:
+  [*
+    targetGlobal_InventorySupplyCategory := select( this.GlobalOTDTable(), Global_InventorySupplyCategory, tempGISC,
+                                                   tempGISC.ProductID() = this.ID() );
+    
+    return targetGlobal_InventorySupplyCategory;
+  *]
+  Relation: Global_InventorySupplyCategory
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl
new file mode 100644
index 0000000..163005b
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_MAPISPIPCategory
+{
+  #keys: '1[414702.1.220556366]'
+  Expression:
+  [*
+    targetGlobal_MAPISPIPCategory := select( this.GlobalOTDTable(), Global_MAPISPIPCategory, tempGMAPISPIPC,
+                                             tempGMAPISPIPC.ProductID() = this.ID() );
+    
+    return targetGlobal_MAPISPIPCategory;
+  *]
+  Relation: Global_MAPISPIPCategory
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductCategory.qbl b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductCategory.qbl
new file mode 100644
index 0000000..435f27d
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_ProductCategory
+{
+  #keys: '1[414702.1.223351035]'
+  Expression:
+  [*
+    targetGlobal_ProductCategory := select( this.GlobalOTDTable(), Global_ProductCategory, tempGPC,
+                                            tempGPC.BusinessTypeName() = this.BusinessType() );
+    
+    return targetGlobal_ProductCategory;
+  *]
+  Relation: Global_ProductCategory
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl
new file mode 100644
index 0000000..1b1d556
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_ProductInLineCategory
+{
+  #keys: '1[414702.1.220556292]'
+  Expression:
+  [*
+    targetGlobal_ProductInLineCategory := select( this.GlobalOTDTable(), Global_ProductInLineCategory, tempGPILC,
+                                                  tempGPILC.ProductID() = this.ID() );
+    
+    return targetGlobal_ProductInLineCategory;
+  *]
+  Relation: Global_ProductInLineCategory
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl
new file mode 100644
index 0000000..de4cbd5
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_StockingPointCostCategory
+{
+  #keys: '1[414702.1.224718256]'
+  Expression:
+  [*
+    targetGlobal_StockingPointCostCategory := select( this.GlobalOTDTable(), Global_StockingPointCostCategory, tempGSPCC,
+                                                      tempGSPCC.ProductID() = this.ID() );
+    
+    return targetGlobal_StockingPointCostCategory;
+  *]
+  Relation: Global_StockingPointCostCategory
+}
diff --git a/_Main/BL/Type_Global_MappingStockingPointCost/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl b/_Main/BL/Type_Global_MappingStockingPointCost/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl
new file mode 100644
index 0000000..09e4ac2
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingStockingPointCost/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_StockingPointCostCategory
+{
+  #keys: '1[414702.1.224718261]'
+  Expression:
+  [*
+    targetGlobal_StockingPointCostCategory := select( this.GlobalOTDTable(), Global_StockingPointCostCategory, tempGSPCC,
+                                                      tempGSPCC.ProductID() = this.ProductID() );
+    
+    return targetGlobal_StockingPointCostCategory;
+  *]
+  Relation: Global_StockingPointCostCategory
+}
diff --git a/_Main/BL/Type_Global_ProductCategory/Attribute_BusinessTypeName.qbl b/_Main/BL/Type_Global_ProductCategory/Attribute_BusinessTypeName.qbl
new file mode 100644
index 0000000..e7db0cb
--- /dev/null
+++ b/_Main/BL/Type_Global_ProductCategory/Attribute_BusinessTypeName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BusinessTypeName
+{
+  #keys: '3[414702.1.223351026][414702.1.223351025][414702.1.223351027]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_ProductCategory/StaticMethod_Create.qbl b/_Main/BL/Type_Global_ProductCategory/StaticMethod_Create.qbl
new file mode 100644
index 0000000..22faab2
--- /dev/null
+++ b/_Main/BL/Type_Global_ProductCategory/StaticMethod_Create.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_ProductCategory( relflush );
+    
+    businessTypes := selectuniquevalues( globalOTDTable, Global_MappingProduct_MP, tempGMPMP, true, tempGMPMP.BusinessType() );
+    
+    traverse ( businessTypes, Elements, bt ) {
+      globalOTDTable.Global_ProductCategory( relnew, BusinessTypeName := bt );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_ProductCategory/_ROOT_Type_Global_ProductCategory.qbl b/_Main/BL/Type_Global_ProductCategory/_ROOT_Type_Global_ProductCategory.qbl
new file mode 100644
index 0000000..1e27352
--- /dev/null
+++ b/_Main/BL/Type_Global_ProductCategory/_ROOT_Type_Global_ProductCategory.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_ProductCategory
+{
+  #keys: '5[414702.1.222746430][414702.1.222746428][0.0.0][414702.1.222746429][414702.1.222746431]'
+  BaseType: Object
+  StructuredName: 'Global_ProductCategorys'
+}
diff --git a/_Main/BL/Type_Global_ProductInLineCategory/Attribute_ProductID.qbl b/_Main/BL/Type_Global_ProductInLineCategory/Attribute_ProductID.qbl
new file mode 100644
index 0000000..4611fa8
--- /dev/null
+++ b/_Main/BL/Type_Global_ProductInLineCategory/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[414702.1.220556241][414702.1.220556240][414702.1.220556242]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_ProductInLineCategory/StaticMethod_Create.qbl b/_Main/BL/Type_Global_ProductInLineCategory/StaticMethod_Create.qbl
new file mode 100644
index 0000000..57d8a51
--- /dev/null
+++ b/_Main/BL/Type_Global_ProductInLineCategory/StaticMethod_Create.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_ProductInLineCategory( relflush );
+    
+    productIDs := selectuniquevalues( globalOTDTable, Global_MappingProductInLane, tempGMPIL, true, tempGMPIL.ProductID() );
+    
+    traverse ( productIDs, Elements, id ) {
+      globalOTDTable.Global_ProductInLineCategory( relnew, ProductID := id );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_ProductInLineCategory/_ROOT_Type_Global_ProductInLineCategory.qbl b/_Main/BL/Type_Global_ProductInLineCategory/_ROOT_Type_Global_ProductInLineCategory.qbl
new file mode 100644
index 0000000..0f700ee
--- /dev/null
+++ b/_Main/BL/Type_Global_ProductInLineCategory/_ROOT_Type_Global_ProductInLineCategory.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_ProductInLineCategory
+{
+  #keys: '5[414702.1.220556230][414702.1.220556228][0.0.0][414702.1.220556229][414702.1.220556231]'
+  BaseType: Object
+  StructuredName: 'Global_ProductInLineCategorys'
+}
diff --git a/_Main/BL/Type_Global_StockingPointCostCategory/Attribute_ProductID.qbl b/_Main/BL/Type_Global_StockingPointCostCategory/Attribute_ProductID.qbl
new file mode 100644
index 0000000..27e2084
--- /dev/null
+++ b/_Main/BL/Type_Global_StockingPointCostCategory/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[414702.1.224718205][414702.1.224718204][414702.1.224718206]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_StockingPointCostCategory/StaticMethod_Create.qbl b/_Main/BL/Type_Global_StockingPointCostCategory/StaticMethod_Create.qbl
new file mode 100644
index 0000000..5d5ba37
--- /dev/null
+++ b/_Main/BL/Type_Global_StockingPointCostCategory/StaticMethod_Create.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_StockingPointCostCategory( relflush );
+    
+    productIDs := selectuniquevalues( globalOTDTable, Global_MappingStockingPointCost, tempGMSPC, true, tempGMSPC.ProductID() );
+    
+    traverse ( productIDs, Elements, id ) {
+      globalOTDTable.Global_StockingPointCostCategory( relnew, ProductID := id );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_StockingPointCostCategory/_ROOT_Type_Global_StockingPointCostCategory.qbl b/_Main/BL/Type_Global_StockingPointCostCategory/_ROOT_Type_Global_StockingPointCostCategory.qbl
new file mode 100644
index 0000000..eec0dca
--- /dev/null
+++ b/_Main/BL/Type_Global_StockingPointCostCategory/_ROOT_Type_Global_StockingPointCostCategory.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_StockingPointCostCategory
+{
+  #keys: '5[414702.1.220556235][414702.1.220556233][0.0.0][414702.1.220556234][414702.1.220556236]'
+  BaseType: Object
+  StructuredName: 'Global_StockingPointCostCategorys'
+}
diff --git a/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl b/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl
index 076964d..391ecf9 100644
--- a/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl
+++ b/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl
@@ -2,7 +2,8 @@
 #parent: #root
 StaticMethod DoASync (
   MacroPlan macroPlan,
-  const GlobalOTDTable globalOTDTable
+  const GlobalOTDTable globalOTDTable,
+  String businessTypeName
 )
 {
   TextBody:
@@ -11,6 +12,6 @@
     //info( "ActualPISPIP Finished, Start InventoryCost Data Broker" );
     //macroPlan.Broker_OTD_InventoryCost().Execute();
     info( "InventoryCost Data Broker Finished, Start InventoryCost Mapping" );
-    macroPlan.DoASyncMappingInventoryValueAndCostData(globalOTDTable);
+    macroPlan.DoASyncMappingInventoryValueAndCostData(globalOTDTable,businessTypeName);
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl
index f9c40e7..d2f5724 100644
--- a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl
@@ -10,11 +10,21 @@
   TextBody:
   [*
     // renhao Aug-14-2023 (created)
-    listtodeal := selectset( globalOTDTable,
-                             Global_MappingActualProductInStockingPointInPeriod,
-                             actual,
-                             ( actual.ActualInventoryLevelEnd() > 0 ) and 
-                             ( organcodelist.Find( actual.StockingPointID().SubString( 0, 3 ) ) >= 0 ) );
+    listtodeal := construct( Global_MappingActualProductInStockingPointInPeriods, constcontent );
+    if ( businessTypes.Size() > 0 ) {
+      businessTypeName := businessTypes.Element( 0 );
+      targetGlobal_ProductCategory := select( globalOTDTable, Global_ProductCategory, tempGPC, tempGPC.BusinessTypeName() = businessTypeName );
+      listtodeal := selectset( targetGlobal_ProductCategory, Global_MappingProduct_MP.Global_MAPISPIPCategory.Global_MappingActualProductInStockingPointInPeriod, 
+                               tempGMPIL, 
+                               ( tempGMPIL.ActualInventoryLevelEnd() > 0 ) and 
+                               ( organcodelist.Find( tempGMPIL.StockingPointID().SubString( 0, 3 ) ) >= 0 ) );
+    } else {  
+      listtodeal := selectset( globalOTDTable,
+                               Global_MappingActualProductInStockingPointInPeriod,
+                               actual,
+                               ( actual.ActualInventoryLevelEnd() > 0 ) and 
+                               ( organcodelist.Find( actual.StockingPointID().SubString( 0, 3 ) ) >= 0 ) );
+    }
     totalcount := listtodeal.Size();
     info( "ActualPISPIP has " + totalcount.AsQUILL() + " rows in total" );
     
@@ -24,13 +34,13 @@
       if( count - [Number](count/1000) * 1000 = 0 or count = totalcount ){
         info( "Now is dealing with the " + count.AsQUILL() + "ActualPISPIP " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
         }
-      product := select( globalOTDTable,Global_MappingProduct_MP,product,product.ID() = actual.ProductID() and product.KeyProduct() = nuclear,true);
-      if( not isnull( product)){
+      //product := select( globalOTDTable,Global_MappingProduct_MP,product,product.ID() = actual.ProductID() and product.KeyProduct() = nuclear,true);
+      if( /*not isnull( product*/ guard( actual.Global_MAPISPIPCategory().KeyProduct() = nuclear, false ) ){
       if( not isnull(businessTypes)){
       
         for( i :=0 ;i < businessTypes.Size();i++ ){
-          businessType := businessTypes.Element( i );
-          if( product.BusinessType() = businessType and not product.IsCommon()){
+          //businessType := businessTypes.Element( i );
+          if( /*product.BusinessType() = businessType and not product.IsCommon()*/ not actual.Global_MAPISPIPCategory().IsCommon() ){
             ActualProductInStockingPointInPeriod::CreateOrUpdate( this,
                                                                   actual.ProductID(),
                                                                   actual.StockingPointID(),
diff --git a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl
index e8950bc..6596139 100644
--- a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl
@@ -12,12 +12,25 @@
     // renhao Aug-14-2023 (created)
     queryStartDate := guard( min( this, Period_MP, item, true, item.StartDate() ) - Duration::Days( 30 ), DateTime::MinDateTime() ).Date();
     queryEndDate := guard( max( this, Period_MP, item, true, item.EndDate() ), Date::MaxDate() );
-    listtodeal := selectset( globalOTDTable,
-                             Global_MappingInventorySupply,
-                             externalSupply, 
-                             ( externalSupply.UserQuantity()>0 ) and 
-                             ( externalSupply.Date() >= queryStartDate ) and 
-                             ( organcodelist.Find( externalSupply.StockingPointID().SubString( 0, 3 ) ) >= 0 )/*and externalSupply.Date() <= queryEndDate*/);
+    
+    listtodeal := construct( Global_MappingInventorySupplys, constcontent );
+    if ( businessTypes.Size() > 0 ) {
+      businessTypeName := businessTypes.Element( 0 );
+      targetGlobal_ProductCategory := select( globalOTDTable, Global_ProductCategory, tempGPC, tempGPC.BusinessTypeName() = businessTypeName );
+      listtodeal := selectset( targetGlobal_ProductCategory, Global_MappingProduct_MP.Global_InventorySupplyCategory.Global_MappingInventorySupply, 
+                               tempGMIS, 
+                               ( tempGMIS.UserQuantity()>0 ) and 
+                               ( tempGMIS.Date() >= queryStartDate ) and 
+                               ( organcodelist.Find( tempGMIS.StockingPointID().SubString( 0, 3 ) ) >= 0 ) );
+    } else {
+      listtodeal := selectset( globalOTDTable,
+                               Global_MappingInventorySupply,
+                               externalSupply, 
+                               ( externalSupply.UserQuantity()>0 ) and 
+                               ( externalSupply.Date() >= queryStartDate ) and 
+                               ( organcodelist.Find( externalSupply.StockingPointID().SubString( 0, 3 ) ) >= 0 )/*and externalSupply.Date() <= queryEndDate*/);
+    }
+    
     totalcount := listtodeal.Size();
     description := "鍦ㄩ�斿湪鍒�";
     info( "ExternalSupply has " + totalcount.AsQUILL() + " rows in total" );
@@ -28,18 +41,18 @@
       if( count - [Number](count/1000) * 1000 = 0 or count = totalcount ){
         info( "Now is dealing with the " + count.AsQUILL() + "ExternalSupply " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
        }
-      product := select( globalOTDTable,Global_MappingProduct_MP,product,product.ID() = externalSupply.ProductID(),true);
+      //product := select( globalOTDTable,Global_MappingProduct_MP,product,product.ID() = externalSupply.ProductID(),true);
       
       
-      if( not isnull( product)){
+      if( /*not isnull( product)*/ not isnull( externalSupply.Global_InventorySupplyCategory() ) ){
         productMP :=  Product_MP :: FindProductTypeIndex( externalSupply.ProductID());
         stockingpoint := select( this,StockingPoint_MP,st,st.ID() = externalSupply.StockingPointID(),true);
         if( not isnull( stockingpoint) and not isnull( productMP)){
         if( not isnull(businessTypes)){
         
           for( i :=0 ;i < businessTypes.Size();i++ ){
-            businessType := businessTypes.Element( i );
-            if( product.BusinessType() = businessType and not product.IsCommon()){
+            //businessType := businessTypes.Element( i );
+            if( /*product.BusinessType() = businessType and not product.IsCommon()*/ not externalSupply.Global_InventorySupplyCategory().IsCommon() ){
               InventorySupply::CreateOrUpdate( externalSupply.ID(),
                                                productMP,
                                                stockingpoint,
diff --git a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl
index b0e0349..78b1f55 100644
--- a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl
@@ -1,13 +1,20 @@
 Quintiq file version 2.0
 #parent: #root
 Method DoASyncMappingInventoryValueAndCostData (
-  const GlobalOTDTable globalOTDTable
+  const GlobalOTDTable globalOTDTable,
+  String businessTypeName
 )
 {
   TextBody:
   [*
     // yypsybs Aug-15-2023 (created)
-    listtodeal := selectset( globalOTDTable,Global_MappingStockingPointCost,item,true );
+    listtodeal := construct( Global_MappingStockingPointCosts, constcontent );
+    if ( businessTypeName = "" ) {
+      listtodeal := selectset( globalOTDTable,Global_MappingStockingPointCost,item,true );
+    } else {
+      targetGlobal_ProductCategory := select( globalOTDTable, Global_ProductCategory, tempGPC, tempGPC.BusinessTypeName() = businessTypeName );
+      listtodeal := selectset( targetGlobal_ProductCategory, Global_MappingProduct_MP.Global_StockingPointCostCategory.Global_MappingStockingPointCost, tempGMPIL, true );
+    }
     totalcount := listtodeal.Size();
     
     info( "InventoryCost has " + totalcount.AsQUILL() + " rows in total" );
diff --git a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl
index a0521a8..38a7a8b 100644
--- a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl
@@ -1,7 +1,8 @@
 Quintiq file version 2.0
 #parent: #root
 Method DoASyncMappingProductInLaneData (
-  const GlobalOTDTable globalOTDTable
+  const GlobalOTDTable globalOTDTable,
+  String businessTypeName
 )
 {
   Description: 'Get Product In Line data'
@@ -9,7 +10,13 @@
   [*
     // Administrator Aug-17-2023 (created)
     // list to deal
-    listtodeal := selectset( globalOTDTable, Global_MappingProductInLane, item ,true );
+    listtodeal := construct( Global_MappingProductInLanes, constcontent );
+    if ( businessTypeName = "" ) {
+      listtodeal := selectset( globalOTDTable, Global_MappingProductInLane, item ,true );
+    } else {
+      targetGlobal_ProductCategory := select( globalOTDTable, Global_ProductCategory, tempGPC, tempGPC.BusinessTypeName() = businessTypeName );
+      listtodeal := selectset( targetGlobal_ProductCategory, Global_MappingProduct_MP.Global_ProductInLineCategory.Global_MappingProductInLane, tempGMPIL, true );
+    }
     totalcount := listtodeal.Size();
     info( "ProductInLane has " + totalcount.AsQUILL() + " rows in total" );
     
diff --git "a/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043253.qbl" "b/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043253.qbl"
index 9da940a..0f6ac65 100644
--- "a/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043253.qbl"
+++ "b/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043253.qbl"
@@ -115,7 +115,7 @@
     //info( "Get Lanelegs From Api Finished, Start ProductInLane Data Broker" );
     //macroPlan.Broker_OTD_ProductInLane().Execute();
     info( "ProductInLane Data Broker Finished, Start ProductInLane Mapping" );
-    macroPlan.DoASyncMappingProductInLaneData(globalOTDTable);
+    macroPlan.DoASyncMappingProductInLaneData(globalOTDTable,guard( businessTypeName.Element( 0 ), "" ));
     
     // 鍦ㄥ簱搴撳瓨鏁版嵁-13
     //info( "ProductInLane Finished, Start ActualPISPIP Data Broker" );
@@ -130,7 +130,7 @@
     macroPlan.DoASyncMappingExternalSupplyData( businessTypeName, isKeyProduct ,globalOTDTable, organcodelist );
     
     // 搴撳瓨鎴愭湰-15
-    InventoryValueAndCost::DoASync( macroPlan,globalOTDTable );
+    InventoryValueAndCost::DoASync( macroPlan,globalOTDTable,guard( businessTypeName.Element( 0 ), "" ) );
     
     // todo 鍒堕�犳垚鏈�-16
     info( "InventoryCost Finished, Start OperationCost Mapping" );
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button1_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button1_OnClick.def
new file mode 100644
index 0000000..bf4fda9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button1_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: Button1
+Response OnClick () id:Response_FormInterfaceTest_Button1_OnClick
+{
+  #keys: '[414702.1.224832095]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Global_ProductInLineCategory::Create( GlobalOTDTable );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button2_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button2_OnClick.def
new file mode 100644
index 0000000..4da9e70
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button2_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: Button2
+Response OnClick () id:Response_FormInterfaceTest_Button2_OnClick
+{
+  #keys: '[414702.1.224832394]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Global_StockingPointCostCategory::Create( GlobalOTDTable );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button3_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button3_OnClick.def
new file mode 100644
index 0000000..43d8ae2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button3_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: Button3
+Response OnClick () id:Response_FormInterfaceTest_Button3_OnClick
+{
+  #keys: '[414702.1.226882201]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Global_MAPISPIPCategory::Create( GlobalOTDTable );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button4_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button4_OnClick.def
new file mode 100644
index 0000000..43ad89d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button4_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: Button4
+Response OnClick () id:Response_FormInterfaceTest_Button4_OnClick
+{
+  #keys: '[414702.1.226892014]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Global_InventorySupplyCategory::Create( GlobalOTDTable );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button5_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button5_OnClick.def
new file mode 100644
index 0000000..93cfb84
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button5_OnClick.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: Button5
+Response OnClick () id:Response_FormInterfaceTest_Button5_OnClick
+{
+  #keys: '[414702.1.228751233]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      GlobalOTDTable.Global_ProductCategory( relflush );
+      GlobalOTDTable.Global_ProductInLineCategory( relflush );
+      GlobalOTDTable.Global_InventorySupplyCategory( relflush );
+      GlobalOTDTable.Global_StockingPointCostCategory( relflush );
+      GlobalOTDTable.Global_MAPISPIPCategory( relflush );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ButtonGenerateProductCategory_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ButtonGenerateProductCategory_OnClick.def
new file mode 100644
index 0000000..6e100b7
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ButtonGenerateProductCategory_OnClick.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: ButtonGenerateProductCategory
+Response OnClick () id:Response_FormInterfaceTest_ButtonGenerateProductCategory_OnClick
+{
+  #keys: '[414702.1.220904292]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( GlobalOTDTable );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      Global_ProductCategory::Create( GlobalOTDTable );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def
index 91a9af4..16917a6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def
@@ -13,6 +13,72 @@
     #child: PanelInterfaceOption3
     #child: PanelInterfaceOption2
     #child: PanelInterfaceOption1
+    Component ButtonGenerateProductCategory
+    {
+      #keys: '[414702.1.220980872]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'TELEPHONE2'
+        Label: '鏍规嵁浜嬩笟閮ㄧ敓鎴愪骇鍝佸垎绫�'
+        Taborder: 6
+      ]
+    }
+    Component Button1
+    {
+      #keys: '[414702.1.225920560]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'BRUSH2'
+        Label: '鏍规嵁浜у搧ID鐢熸垚ProductInLine鍒嗙被'
+        Taborder: 7
+      ]
+    }
+    Component Button2
+    {
+      #keys: '[414702.1.225920577]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'INDUSTRIAL_ROBOT'
+        Label: '鏍规嵁浜у搧ID鐢熸垚StockingPoingCost鍒嗙被'
+        Taborder: 8
+      ]
+    }
+    Component Button3
+    {
+      #keys: '[414702.1.226882098]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'BANANA'
+        Label: '鏍规嵁浜у搧ID鐢熸垚MAPISPIP鍒嗙被'
+        Taborder: 9
+      ]
+    }
+    Component Button4
+    {
+      #keys: '[414702.1.226891739]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'BEER_GLASS'
+        Label: '鏍规嵁浜у搧ID鐢熸垚InventorySupply鍒嗙被'
+        Taborder: 10
+      ]
+    }
+    Component Button5
+    {
+      #keys: '[414702.1.228751221]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'BROOM'
+        Label: '娓呯┖鍒嗙被'
+        Taborder: 11
+      ]
+    }
   ]
   Properties:
   [
diff --git "a/_Main/UI/MacroPlannerWebApp/Views/\346\216\245\345\217\243\346\265\213\350\257\225.vw" "b/_Main/UI/MacroPlannerWebApp/Views/\346\216\245\345\217\243\346\265\213\350\257\225.vw"
index 31929b6..1977281 100644
--- "a/_Main/UI/MacroPlannerWebApp/Views/\346\216\245\345\217\243\346\265\213\350\257\225.vw"
+++ "b/_Main/UI/MacroPlannerWebApp/Views/\346\216\245\345\217\243\346\265\213\350\257\225.vw"
@@ -13,7 +13,7 @@
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 16
+          rowSpan: 23
           columnPosition: 1
           columnSpan: 6
         }
@@ -1184,10 +1184,10 @@
     userconfigurableinformation
     {
     }
+    image: 'SKIN_TIGER'
     page: ''
     group: ''
     index: 0
-    image: 'SKIN_TIGER'
     description: ''
   }
   formatversion: 2

--
Gitblit v1.9.3