From 0881cdfab4fab719d811b0dee4c488f591e995de Mon Sep 17 00:00:00 2001
From: hongji.li <hongji.a.li@capgemini.com>
Date: 星期一, 25 九月 2023 22:19:17 +0800
Subject: [PATCH] Merge branch 'dev_cyy' into dev_realse_cyy

---
 _Main/BL/Relations/Relation_H_CustomOrder_MacroPlan_MacroPlan_H_CustomOrder.qbl                                  |   23 +
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_VCode.qbl                                                         |    8 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastDataEx.qbl                                           |   95 ++---
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_SKUName.qbl                                                       |    8 
 _Main/UI/MacroPlannerWebApp/Component_Frm_TEST/_ROOT_Component_Frm_TEST.def                                      |    5 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/_ROOT_Component_FrmOrderForecast.def                      |   96 -----
 _Main/BL/Type_H_FunctionClass/StaticMethod_UpdateOrderForecastRealQty.qbl                                        |    2 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomCode.qbl                                                    |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSDIP.def                              |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/_ROOT_Component_FormCustomerOrders226.def            |   18 +
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_StockingPointID.qbl                                               |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSDIP.def                               |   20 +
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSalesDemands.def                       |   30 +
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuEdit_OnClick.def       |   20 +
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_MaterialReverse.qbl                                                |    7 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecastQty.qbl                                                   |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSalesDemands.def                      |   12 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_SKU.qbl                                                           |    2 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_Unit.qbl                                                          |    2 
 _Main/BL/Type_H_CustomOrder/_ROOT_Type_H_CustomOrder.qbl                                                         |   10 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel351.def                                    |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Query_FOF_OnClick.def               |   21 +
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_liH_Forecast.def                                |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelSalesDemands.def                         |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelAllSalesDemands.def                      |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelAllSalesDemands.def                   |   11 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Material_FOF503_OnClick#222.def |   30 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetProductInfo#1.qbl                                               |    1 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_liH_Forecast_OnDoubleClick.def                   |   24 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_Department.qbl                                                    |    8 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastData.qbl                                             |   14 
 _Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_OnCreated.def                                         |    6 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_Month.qbl                                                         |    2 
 /dev/null                                                                                                        |   25 -
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetMaterialData.qbl                                                |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCopy_OnClick.def       |   19 +
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_OnCreated.def                                    |   10 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderHedging.qbl                                                   |  321 +++++++++-------
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/_ROOT_Component_FormCustomerOrders.def                  |   10 
 _Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_List832_OnDoubleClick.def                             |   44 ++
 _Main/BL/Type_CustomerOrder/Attribute_OrderTag.qbl                                                               |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_ListSalesDemands.def                          |   14 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderReverseOrAuthorize.qbl                                        |    7 
 _Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp                                                  |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCreate_OnClick#715.def |   19 +
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Order_FOF449_OnClick#880.def    |   18 
 46 files changed, 662 insertions(+), 398 deletions(-)

diff --git a/_Main/BL/Relations/Relation_H_CustomOrder_MacroPlan_MacroPlan_H_CustomOrder.qbl b/_Main/BL/Relations/Relation_H_CustomOrder_MacroPlan_MacroPlan_H_CustomOrder.qbl
new file mode 100644
index 0000000..6a5b131
--- /dev/null
+++ b/_Main/BL/Relations/Relation_H_CustomOrder_MacroPlan_MacroPlan_H_CustomOrder.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation H_CustomOrder_MacroPlan_MacroPlan_H_CustomOrder
+{
+  #keys: '1[414724.0.177854649]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[414724.0.177854651][414724.0.177854650][414724.0.177854652]'
+    Cardinality: '0to1'
+    ObjectDefinition: H_CustomOrder
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide H_CustomOrder
+  {
+    #keys: '3[414724.0.177854654][414724.0.177854653][414724.0.177854655]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_CustomerOrder/Attribute_OrderTag.qbl b/_Main/BL/Type_CustomerOrder/Attribute_OrderTag.qbl
new file mode 100644
index 0000000..4d3e7e6
--- /dev/null
+++ b/_Main/BL/Type_CustomerOrder/Attribute_OrderTag.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute OrderTag
+{
+  #keys: '3[414724.0.177854629][414724.0.177854628][414724.0.177854630]'
+  Description: '璁㈠崟鐘舵�侊紝鍐插噺鍚庤祴鍊硷紝绾娴�,鏈夐娴嬶紝鏃犻娴嬶紝鍙嶇锛屾巿鏉�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_CustomOrder/_ROOT_Type_H_CustomOrder.qbl b/_Main/BL/Type_H_CustomOrder/_ROOT_Type_H_CustomOrder.qbl
new file mode 100644
index 0000000..a8c4845
--- /dev/null
+++ b/_Main/BL/Type_H_CustomOrder/_ROOT_Type_H_CustomOrder.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type H_CustomOrder
+{
+  #keys: '5[414724.0.177854646][414724.0.177854644][0.0.0][414724.0.177854645][414724.0.177854647]'
+  BaseType: Object
+  Description: '閲嶅缓鍚庣殑璁㈠崟'
+  StructuredName: 'H_CustomOrders'
+}
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_NewStaticMethod.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_NewStaticMethod.qbl
deleted file mode 100644
index 7118da1..0000000
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_NewStaticMethod.qbl
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod NewStaticMethod () as owning JSON
-{
-  TextBody:
-  [*
-    jResult := JSON::Object().Add( "A","123");
-    return jResult.Build();
-  *]
-}
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetALlBOM.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetALlBOM.qbl
deleted file mode 100644
index 5ab9f90..0000000
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetALlBOM.qbl
+++ /dev/null
@@ -1,27 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod SM_GetALlBOM (
-  MacroPlan Owner,
-  MappingBOM Material
-) as Number
-{
-  Description: '鏍规嵁SKU鑾峰彇鏈熸牴閮ㄦ墍鏈夋暟鎹�'
-  TextBody:
-  [*
-    AllMaterials := selectset( Owner,MappingBOM,Obj,Obj.ComponentCode()=Material.ProductCode())
-    if( AllMaterials.Size()>0) 
-    {
-          traverse( AllMaterials,Elements,Obj,not isnull( Obj))
-         {
-              H_FunctionClass::SM_GetALlBOM( Owner,Obj);
-         }   
-    }
-    else
-    {
-        Owner.H_MaterialInfo(relnew,ID := H_FunctionClass::SM_GenerateID( "BM")
-                                    ,MaterialName := Material.ComponentType()  );
-      
-    }
-    return 0;
-  *]
-}
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetMaterialData.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetMaterialData.qbl
index 3edc063..2850793 100644
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetMaterialData.qbl
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetMaterialData.qbl
@@ -34,7 +34,7 @@
         StockPoint := "";
         NRate:=1.0;
         NComponentsUsed :=0.0;
-        ObjBOM := H_FunctionClass::SM_GetBOMBySKU( Owner,ParentSKU);
+        ObjBOM := H_FunctionClass::SM_GetBOMBySKU(Owner,ParentSKU);
         if(not isnull( ObjBOM))
         {
           NRate := ObjBOM.ComponentOutputRate();
@@ -56,7 +56,7 @@
               // 鐗╂枡绫诲瀷
               MaterialType := Obj.ProductType();
               // 寰楀埌鐗╂枡淇℃伅
-              ObjProduct:= H_FunctionClass::SM_GetProductInfo(Owner, Obj.ProductCode());
+              ObjProduct:= H_FunctionClass::SM_GetProductInfo(Owner,Obj.ProductCode());
               if( not isnull( ObjProduct))
               {
                 MaterialType:= ObjProduct.ProductMajorType();
@@ -87,6 +87,10 @@
                                     ,ID := H_FunctionClass::SM_GenerateID( "MI"),MaterialType := "鍘熸潗鏂�",NeedDate := NDate
                                     ,NeedQty := [Number](ProductQty*0.8).Round( 0),Unit := "PCS"
                                     ,StockPoint :="娴嬭瘯",MaterialName := "娴嬭瘯鏁版嵁" );
+        Owner.H_MaterialInfo(relnew,ParentSKU := ParentSKU,SKU := "SKU_M"+ (nCount+1).AsQUILL() ,ForecastID := ForecastId,OrgCode := "ORG_000",VCode := VCode
+                                    ,ID := H_FunctionClass::SM_GenerateID( "MI"),MaterialType := "鍗婃垚鍝�",NeedDate := NDate
+                                    ,NeedQty := [Number](ProductQty*0.8).Round( 0),Unit := "PCS"
+                                    ,StockPoint :="娴嬭瘯",MaterialName := "娴嬭瘯鏁版嵁" );
       }
       bStatus := true;
       strMsg :="";
diff --git "a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetProductInfo\0431.qbl" "b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetProductInfo\0431.qbl"
index 2b1ed8f..53f30eb 100644
--- "a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetProductInfo\0431.qbl"
+++ "b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetProductInfo\0431.qbl"
@@ -9,6 +9,7 @@
   TextBody:
   [*
     // 鏍规嵁SKU鑾峰彇鐗╂枡淇℃伅
+    // 娉ㄦ剰锛氱墿鏂欑被鍨嬪彇 ParentID锛�
     Obj := null( MappingProduct,constcontent );
     if( not isnull( Owner) and SKU.Length()>0)
     {
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastData.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastData.qbl
index edf6c16..d69f3c1 100644
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastData.qbl
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastData.qbl
@@ -10,7 +10,7 @@
     /**********************************鍒濆鍖栬鍗曢娴嬩俊鎭�***************************************
     *娉細鏈‘瀹氫笂娓搁娴嬭鍗曟洿鏂伴�昏緫鍜屾暟鎹湁鏁堟�э紝杩欓噷杩涜浜屾澶勭悊锛屾柊鐢熸垚涓�涓垪琛紝閬垮厤涓婃父淇℃伅鍙樺姩涓ラ噸
     *    褰卞搷鍔熻兘
-    *
+    *---------------------璇ュ嚱鏁板凡浣滃簾----------------------
     *****************************************************************************************/
     // 鍒濆鍖栫粨鏋�
     bStatus := false;
@@ -70,25 +70,25 @@
                                StockingPointID := Obj.StockingPointID(),
                                Department:=DepartMent);
          // 鍐欏叆棰勬祴瀹炴椂淇℃伅
-         ObjOrderRealQty := select( Owner,H_OrderForecastRealQty,ObjO,ObjO.CustomID()=CustomName and ObjO.SKU()=Obj.ProductID() 
+         ObjOrderRealQty := select( Owner,H_OrderForecastRealQty,ObjO,ObjO.CustomCode()=CustomName and ObjO.SKU()=Obj.ProductID() 
                                     and ObjO.Month().StartOfMonth() = Obj.EndDate().StartOfMonth() )
          if( isnull( ObjOrderRealQty))
          {
-             Owner.H_OrderForecastRealQty(relnew,CustomID := CustomName,CustomName := CustomName,ForecatsQty := [Number]Obj.Quantity().Round( 0)
+             Owner.H_OrderForecastRealQty(relnew,CustomCode := CustomName,CustomName := CustomName,ForecastQty := [Number]Obj.Quantity().Round( 0)
                                            ,ForecatsRealQty := [Number]Obj.Quantity().Round( 0),ID := H_FunctionClass::SM_GenerateID( "OR")
-                                           ,Month := Obj.EndDate(),OrderCode := strOrderCode,SKU := Obj.ProductID(),Unit := Obj.UnitOfMeasureName());
+                                           ,Month := Obj.EndDate(),SKU := Obj.ProductID(),Unit := Obj.UnitOfMeasureName());
          }
          else
          {
-            if( [Number]Obj.Quantity().Round( 0)<> ObjOrderRealQty.ForecatsQty())
+            if( [Number]Obj.Quantity().Round( 0)<> ObjOrderRealQty.ForecastQty())
             {
-                  RQty := [Number]Obj.Quantity().Round( 0) - ObjOrderRealQty.ForecatsQty();
+                  RQty := [Number]Obj.Quantity().Round( 0) - ObjOrderRealQty.ForecastQty();
                   RQty := ObjOrderRealQty.ForecatsRealQty() + RQty;
                   if( RQty<0)
                   {
                       RQty :=0;
                   }
-                  ObjOrderRealQty.ForecatsQty([Number]Obj.Quantity().Round( 0));
+                  ObjOrderRealQty.ForecastQty([Number]Obj.Quantity().Round( 0));
                   ObjOrderRealQty.ForecatsRealQty(RQty);
             }
          }
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastDataEx.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastDataEx.qbl
index 524b723..b1801df 100644
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastDataEx.qbl
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastDataEx.qbl
@@ -2,7 +2,8 @@
 #parent: #root
 StaticMethod SM_InitialForcastDataEx (
   MacroPlan Owner,
-  Boolean IsNew
+  Boolean IsNew,
+  String VersionCode
 ) as owning JSON
 {
   Description: '鍒濆鍖栬鍗曢娴嬩俊鎭�'
@@ -11,36 +12,43 @@
     /**********************************鍒濆鍖栬鍗曢娴嬩俊鎭�***************************************
     *娉細鏈‘瀹氫笂娓搁娴嬭鍗曟洿鏂伴�昏緫鍜屾暟鎹湁鏁堟�э紝杩欓噷杩涜浜屾澶勭悊锛屾柊鐢熸垚涓�涓垪琛紝閬垮厤涓婃父淇℃伅鍙樺姩涓ラ噸
     *    褰卞搷鍔熻兘
-    *
+    *鍙傛暟锛欼sNew 鏄惁鏃跺叏鏂版暟鎹紝鍏ㄦ柊鏁版嵁浼氬皢鏃х殑鏁版嵁娓呴櫎锛岀劧鍚庨噸鏂板~鍏咃紝涓嶆槸鍏ㄦ柊鏁版嵁锛屽皢绱鍜屾洿鏂�
     *****************************************************************************************/
     // 鍒濆鍖栫粨鏋�
     bStatus := false;
     strMsg :="";
     
     try{
-      // 娓呴櫎鏃ф暟鎹紝閲嶆柊鎷夊彇
-      if(Owner.H_Forecast(relget ).Size()>0)
+      // 20230925 浼樺寲鐨勪笟鍔¢�昏緫,濡傛灉鏃舵柊鏁版嵁锛屽垯棰勬祴鏁版嵁鍏ㄩ儴骞叉帀锛岀劧鍚庨噸鏂扮敓鎴�
+      if( IsNew)
       {
-        traverse( Owner,H_Forecast,Obj,not isnull( Obj))
+        if( Owner.H_OrderForecastRealQty(relsize )>0)
         {
-          Owner.H_Forecast(reldelete, Obj);
+          traverse( Owner,H_OrderForecastRealQty,Obj,not isnull( Obj))
+          {
+            Owner.H_OrderForecastRealQty(reldelete, Obj);
+          }
         }
       }
       
       // 鑾峰彇棰勬祴璁㈠崟锛氬綋鏈堝拰涔嬪悗鐨�3涓湀棰勬祴鏁版嵁 涓旈娴嬫暟閲�>0鐨�
-      AllData:= selectset( Owner, Product_MP.SalesDemand.astype( Forecast ),object,object.EndDate().DateTime().Date() >= Date::ActualDate().StartOfMonth() 
-                           and object.EndDate().DateTime().Date() <= Date::ActualDate().StartOfNextMonth().StartOfNextMonth().StartOfNextMonth().StartOfNextMonth()
+      AllData:= selectset( Owner, Product_MP.SalesDemand.astype( Forecast ),object,
+                           object.EndDate().DateTime().Date() >= Date::ActualDate().StartOfMonth() 
+                           // 闇�姹傜粰鏈潵4涓湀鐨勬暟鎹紝浣嗗彲鑳藉苟涓嶅噯纭紝鏆傛椂娉ㄩ噴鎺夛紝鍥涗釜鏈堥檺鍒�
+                           //and object.EndDate().DateTime().Date() <= Date::ActualDate().StartOfNextMonth().StartOfNextMonth().StartOfNextMonth().StartOfNextMonth()
                            and object.Quantity()>0 );
       
       CustomName:="";
       DepartMent:="";
       idx:=0;
-      strOrderCode:="";
       RQty:=0;
       ObjOrderRealQty:=null( H_OrderForecastRealQty,constcontent );
-    //  ObjPruduct :=null( MappingProduct,constcontent );
+    
       traverse( AllData,Elements,Obj,not isnull(Obj))
       {
+        // 娌℃湁瀹㈡埛淇℃伅鍜岄儴闂ㄤ俊鎭紝SalesSegmentName=浜嬩笟閮�+鈥�-鈥�+瀹㈡埛鍚嶇О
+        CustomName := Obj.SalesSegmentName();
+        DepartMent := Obj.SalesSegmentName();
         // 杩欓噷鐢ㄦ煡鎵惧悗鎴彇锛屽洜涓轰笉纭畾鏈夊嚑涓í绾匡紝浠ョ涓�涓负鍑�
         idx:=Obj.SalesSegmentName().FindString( "-",0);
         if(idx>0)
@@ -48,61 +56,32 @@
           DepartMent:=Obj.SalesSegmentName().SubString( 0,idx);
           CustomName := Obj.SalesSegmentName().SubString( idx+1, Obj.SalesSegmentName().Length() - (idx+1));
         }
-        else
-        {
-          CustomName :=Obj.SalesSegmentName();
-          DepartMent := "閮ㄩ棬鏁版嵁鑾峰彇澶辫触锛�"
-        }
-    //    // 浠庣墿鏂欒〃鑾峰彇鐗╂枡淇℃伅
-    //    ObjPruduct := H_FunctionClass::SM_GetProductInfo( Owner,Obj.ProductID());
-    //    if( not isnull( ObjPruduct))
-    //    {
-    //      
-    //    }
-         // 鍐欏叆棰勬祴璁㈠崟淇℃伅琛�
-         strOrderCode:=H_FunctionClass::SM_GenerateID( "OF");
-         Owner.H_Forecast(relnew,OrderCode := strOrderCode,
-                                SKU := Obj.ProductID(),
-                               CustomCode := CustomName,
-                               CustomName := CustomName,
-                               Util:=Obj.UnitOfMeasureName(),
-                               NeedTime:=Obj.EndDate(),
-                               ForecastQty:=[Number]Obj.Quantity().Round( 0),
-                               StockingPointID := Obj.StockingPointID(),
-                               Department:=DepartMent);
-         // 鍐欏叆棰勬祴瀹炴椂淇℃伅
-         ObjOrderRealQty := select( Owner,H_OrderForecastRealQty,ObjO,ObjO.CustomID()=CustomName and ObjO.SKU()=Obj.ProductID() 
+         // 鏇存柊棰勬祴淇℃伅锛岄潪鏂版暟鎹洿鏂颁俊鎭��
+         ObjOrderRealQty := select( Owner,H_OrderForecastRealQty,ObjO,ObjO.CustomCode()=CustomName and ObjO.SKU()=Obj.ProductID() 
                                     and ObjO.Month().StartOfMonth() = Obj.EndDate().StartOfMonth() )
-         if( isnull( ObjOrderRealQty))
+         if( IsNew or isnull( ObjOrderRealQty))
          {
-             Owner.H_OrderForecastRealQty(relnew,CustomID := CustomName,CustomName := CustomName,ForecatsQty := [Number]Obj.Quantity().Round( 0)
-                                           ,ForecatsRealQty := [Number]Obj.Quantity().Round( 0),ID := H_FunctionClass::SM_GenerateID( "OR")
-                                           ,Month := Obj.EndDate(),OrderCode := strOrderCode,SKU := Obj.ProductID(),Unit := Obj.UnitOfMeasureName());
+           Owner.H_OrderForecastRealQty(relnew,CustomCode := CustomName,CustomName := CustomName,ForecastQty := [Number]Obj.Quantity().Round( 0)
+                                         ,ForecatsRealQty := [Number]Obj.Quantity().Round( 0),ID := H_FunctionClass::SM_GenerateID( "OR")
+                                         ,Month := Obj.EndDate(),SKU := Obj.ProductID(),Unit := Obj.UnitOfMeasureName()
+                                         ,Department := DepartMent,VCode := VersionCode);
          }
          else
          {
-           if( IsNew)
-           {
-              ObjOrderRealQty.ForecatsQty([Number]Obj.Quantity().Round( 0));
-              ObjOrderRealQty.ForecatsRealQty([Number]Obj.Quantity().Round( 0));
-           }
-           else
-           {
-              if( [Number]Obj.Quantity().Round( 0)<> ObjOrderRealQty.ForecatsQty())
-              {
-                    RQty := [Number]Obj.Quantity().Round( 0) - ObjOrderRealQty.ForecatsQty();
-                    RQty := ObjOrderRealQty.ForecatsRealQty() + RQty;
-                    if( RQty<0)
-                    {
-                        RQty :=0;
-                    }
-                    ObjOrderRealQty.ForecatsQty([Number]Obj.Quantity().Round( 0));
-                    ObjOrderRealQty.ForecatsRealQty(RQty);
-              }
-           }
+           // 鏇存柊浜嗛娴嬫暟鎹紝鍒欒绠楀疄鏃舵暟鎹鍑�
+            if( [Number]Obj.Quantity().Round( 0)<> ObjOrderRealQty.ForecastQty())
+            {
+                  RQty := [Number]Obj.Quantity().Round( 0) - ObjOrderRealQty.ForecastQty();
+                  RQty := ObjOrderRealQty.ForecatsRealQty() + RQty;
+                  if( RQty<0)
+                  {
+                      RQty :=0;
+                  }
+                  ObjOrderRealQty.ForecastQty([Number]Obj.Quantity().Round( 0));
+                  ObjOrderRealQty.ForecatsRealQty(RQty);
+            }
          }
       }
-     
       
       bStatus := true;
       strMsg :="璁㈠崟棰勬祴鍒濆鍖栨垚鍔�!";
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_MaterialReverse.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_MaterialReverse.qbl
index d096a87..b044a49 100644
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_MaterialReverse.qbl
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_MaterialReverse.qbl
@@ -39,7 +39,7 @@
         nNoHaveForecastQty:=0;//浜旈娴嬫暟閲�
         // 鑾峰彇棰勬祴鏁伴噺锛堝鎴�+SKU+鏈堜唤 鐞嗚鏄病鏈夌墿鏂欓娴嬶級
         OrderForecast := select(Owner, H_OrderForecastRealQty , Obj, Obj.SKU() = SKU 
-                                              and Obj.CustomID() = CustomerCode 
+                                              and Obj.CustomCode() = CustomerCode 
                                               and Obj.Month().Format( "YM2") = Date::ActualDate().Format( "YM2"));                                   
         if ( not isnull(OrderForecast))
         {
@@ -195,10 +195,9 @@
           {
             Owner.H_OrderForecastRealQty(relnew,ID := H_FunctionClass::SM_GenerateID( "OF"),SKU := SKU,
                                                                                             Month := Date::ActualDate(),
-                                                                                            CustomID := CustomerCode,
+                                                                                            CustomCode := CustomerCode,
                                                                                             CustomName := "瀹㈡埛琛ㄨ幏鍙�",
-                                                                                            OrderCode := "-",
-                                                                                            ForecatsQty :=0,
+                                                                                            ForecastQty := 0,
                                                                                             ForecatsRealQty :=nForecastQtyNew,
                                                                                             Unit := "SKU 鍒扮墿鏂欒〃鑾峰彇");
           } 
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderHedging.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderHedging.qbl
index c4c2894..88c8f1d 100644
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderHedging.qbl
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderHedging.qbl
@@ -26,161 +26,198 @@
       if( not isnull( Owner))
       {
         // 鍒濆鍖栭娴嬩俊鎭�
-        JResult := H_FunctionClass::SM_InitialForcastDataEx( Owner,IsNew);
+        JResult := H_FunctionClass::SM_InitialForcastDataEx( Owner,IsNew,"--");
+        // 棰勬祴鍒濆鍖栧畬鎴�
         if( JResult.Get( "Status").GetBoolean())
         {
-          traverse( Owner,SalesDemand.astype( CustomerOrder ),ObjOrder,not isnull( ObjOrder))
+          nForecastQtyOld := 0; //鍘熼娴嬫暟閲�
+          nReverseQtyOld :=0;   //鍘熷弽绛炬暟閲�
+          nAuthorizeQtyOld :=0; //鍘熸巿鏉冩暟閲�
+          nForecastQtyNew :=0;  //璁$畻鍚庣殑棰勬祴鏁伴噺
+          nReverseQtyNew :=0;   //璁$畻鍚庣殑鍙嶇鏁伴噺
+          nAuthorizeQtyNew :=0; //璁$畻鍚庣殑鎺堟潈鏁伴噺
+          nHaveForecastQty :=0; //鏈夐娴嬫暟閲�
+          nNoHaveForecastQty:=0;//浜旈娴嬫暟閲�
+          OrderQuantity := 0;   //鍓╀綑璁㈠崟鏁伴噺
+          traverse( Owner,SalesDemand.astype( CustomerOrder ),ObjOrder)
           {
-            //----------------------------------------浠ヤ笅鍚庡幓棰勬祴 鍙嶇 鎺堟潈鏁版嵁淇℃伅----------------
-            nForecastQtyOld := 0; //鍘熼娴嬫暟閲�
-            nReverseQtyOld :=0;   //鍘熷弽绛炬暟閲�
-            nAuthorizeQtyOld :=0; //鍘熸巿鏉冩暟閲�
-            nForecastQtyNew :=0;  //璁$畻鍚庣殑棰勬祴鏁伴噺
-            nReverseQtyNew :=0;   //璁$畻鍚庣殑鍙嶇鏁伴噺
-            nAuthorizeQtyNew :=0; //璁$畻鍚庣殑鎺堟潈鏁伴噺
-            nHaveForecastQty :=0; //鏈夐娴嬫暟閲�
-            nNoHaveForecastQty:=0;//浜旈娴嬫暟閲�
-            OrderQuantity := 0;   //鍓╀綑璁㈠崟鏁伴噺
-           
-            // 鑾峰彇棰勬祴鏁伴噺锛堝鎴�+SKU+鏈堜唤 鐞嗚鏄病鏈夌墿鏂欓娴嬶級
-            OrderForecast := select(Owner, H_OrderForecastRealQty , Obj, Obj.SKU() = ObjOrder.ProductID() 
-                                                  and Obj.CustomID() = ObjOrder.CustomerName() 
-                                                  and Obj.Month().Format( "YM2") =ObjOrder.EndDate().Format( "YM2"));
-            if ( not isnull(OrderForecast))
+            // 鐩存帴鍒犻櫎鏈湀涔嬪墠鐨勮鍗�
+            if( ObjOrder.EndDate()<Date::ActualDate().StartOfMonth())
             {
-                nForecastQtyOld := OrderForecast.ForecatsRealQty();
-                nForecastQtyNew := nForecastQtyOld;
-            }
-            
-            // 鑾峰彇鍙嶇鏁伴噺锛堝彧鍒ゆ柇SKU锛�
-            ObjReverse := select(Owner, H_ReverseRealQty , Obj, Obj.SKU() = ObjOrder.ProductID());
-            if ( not isnull(ObjReverse))
-            {
-                nReverseQtyOld := ObjReverse.ReverseRealQty();
-                nReverseQtyNew := nReverseQtyOld;
-            }
-            
-            // 鑾峰彇鎺堟潈鏁伴噺锛堝鎴稩D+SKU锛�
-            ObjAuthorize := select(Owner, H_AuthorizeRealQty , Obj, Obj.SKU() = ObjOrder.ProductID() 
-                                                                    and Obj.CustomID() = ObjOrder.CustomerName());
-            if ( not isnull(ObjAuthorize))
-            {
-                nAuthorizeQtyOld := ObjAuthorize.AuthorizeRealQty();
-                nAuthorizeQtyNew :=nAuthorizeQtyOld;
-            }
-            //-----------------------------浠ヤ笅璁㈠崟鍐插噺--------------------
-            // 鎺堟潈璁板綍ID
-            AQID := H_FunctionClass::SM_GenerateID( "AQ");
-            // 璁㈠崟鍓╀綑鏁伴噺
-            OrderQuantity := [Number]ObjOrder.Quantity().Round( 0);
-            // 1 鍏堝啿鎺堟潈
-            if( OrderQuantity>0 and nAuthorizeQtyOld>0)
-            { 
-               OrderQuantity := OrderQuantity-nAuthorizeQtyOld;
-               nAuthorizeQtyNew :=0; 
-               if( OrderQuantity<0)
-               {
-                 nAuthorizeQtyNew := abs(OrderQuantity);
-                 OrderQuantity :=0;
-               }
-            }
-            // 2 鍐嶅啿鍙嶇
-            if( OrderQuantity>0 and nReverseQtyOld>0)
-            { 
-               OrderQuantity := OrderQuantity-nReverseQtyOld;
-               nReverseQtyNew :=0; 
-               if( OrderQuantity<0)
-               {
-                 nReverseQtyNew := abs(OrderQuantity);
-                 OrderQuantity :=0;
-               }
-            }
-            // 3 鏈�鍚庡啿棰勬祴
-            if( OrderQuantity>0 and nForecastQtyOld>0)
-            { 
-               //榛樿璁㈠崟鏁伴噺>棰勬祴鏁伴噺
-               OrderQuantity := OrderQuantity-nForecastQtyOld;
-               nForecastQtyNew :=0;
-               nHaveForecastQty := nForecastQtyOld;
-               nNoHaveForecastQty := OrderQuantity; 
-               if( OrderQuantity<0)
-               {
-                 nForecastQtyNew := abs(OrderQuantity);
-                 OrderQuantity :=0;
-                 nHaveForecastQty := nForecastQtyOld - nForecastQtyNew;
-                 nNoHaveForecastQty := 0;
-               }
-            }
-            // 璁板綍鍔ㄤ綔
-            Owner.H_OrderRecord(relnew,
-                                   ID := AQID,
-                                   VCode:=VCode,
-                                   SKU:=ObjOrder.ProductID(),
-                                   ReverseQty := nReverseQtyNew,
-                                   CustomerCode := ObjOrder.CustomerName(),
-                                   CustomerName := ObjOrder.CustomerName(),
-                                   ForecastQty := nForecastQtyNew,
-                                   OrderDateTime := ObjOrder.EndDate(),
-                                   OrderQty := [Number]ObjOrder.Quantity().Round( 0),
-                                   OrderCode:=ObjOrder.OrderID(),
-                                   AuthorizeQty := nAuthorizeQtyNew,
-                                   ReverseDeductQty := nReverseQtyOld - nReverseQtyNew,
-                                   AuthorizeDeductQty := 0,
-                                   ForecastHitQty :=nHaveForecastQty,
-                                   ForecastNoHitQty :=nNoHaveForecastQty,
-                                   OperateType := OperatorType,
-                                   Operator := Operator,
-                                   Unit := ObjOrder.UnitOfMeasureName(),
-                                   OperateQty := [Number]ObjOrder.Quantity().Round( 0),
-                                   OperateTime := DateTime::ActualTime());
-                                   
-            // 鏇存柊褰撳墠鍙嶇鏁伴噺
-            if( not isnull( ObjReverse))
-            {
-              ObjReverse.ReverseRealQty(nReverseQtyNew);
+               ObjOrder.Delete();  
             }
             else
             {
-              Owner.H_ReverseRealQty(relnew,ID := H_FunctionClass::SM_GenerateID( "RQ"),SKU := ObjOrder.ProductID(),Unit := ObjOrder.UnitOfMeasureName()
-                                      ,ReverseRealQty := nReverseQtyNew);
-            } 
-            // 鏇存柊鎺堟潈
-            if( not isnull( ObjAuthorize))
-            {
-              ObjAuthorize.AuthorizeRealQty(nAuthorizeQtyNew);
+              //----------------------------------------浠ヤ笅鍚庡幓棰勬祴 鍙嶇 鎺堟潈鏁版嵁淇℃伅----------------
+              nForecastQtyOld := 0; //鍘熼娴嬫暟閲�
+              nReverseQtyOld :=0;   //鍘熷弽绛炬暟閲�
+              nAuthorizeQtyOld :=0; //鍘熸巿鏉冩暟閲�
+              nForecastQtyNew :=0;  //璁$畻鍚庣殑棰勬祴鏁伴噺
+              nReverseQtyNew :=0;   //璁$畻鍚庣殑鍙嶇鏁伴噺
+              nAuthorizeQtyNew :=0; //璁$畻鍚庣殑鎺堟潈鏁伴噺
+              nHaveForecastQty :=0; //鏈夐娴嬫暟閲�
+              nNoHaveForecastQty:=0;//浜旈娴嬫暟閲�
+              OrderQuantity := 0;   //鍓╀綑璁㈠崟鏁伴噺
+              // 鑾峰彇棰勬祴鏁伴噺锛堝鎴�+SKU+鏈堜唤 鐞嗚鏄病鏈夌墿鏂欓娴嬶級
+              OrderForecast := select(Owner, H_OrderForecastRealQty , Obj, Obj.SKU() = ObjOrder.ProductID() 
+                                                    and Obj.CustomCode() = ObjOrder.CustomerName() 
+                                                    and Obj.Month().Format( "YM2") =ObjOrder.EndDate().Format( "YM2"));
+              if ( not isnull(OrderForecast))
+              {
+                  nForecastQtyOld := OrderForecast.ForecatsRealQty();
+                  nForecastQtyNew := nForecastQtyOld;
+              }
+              // 鑾峰彇鍙嶇鏁伴噺锛堝彧鍒ゆ柇SKU锛�
+              ObjReverse := select(Owner, H_ReverseRealQty , Obj, Obj.SKU() = ObjOrder.ProductID());
+              if ( not isnull(ObjReverse))
+              {
+                  nReverseQtyOld := ObjReverse.ReverseRealQty();
+                  nReverseQtyNew := nReverseQtyOld;
+              }
+              // 鑾峰彇鎺堟潈鏁伴噺锛堝鎴稩D+SKU锛�
+              ObjAuthorize := select(Owner, H_AuthorizeRealQty , Obj, Obj.SKU() = ObjOrder.ProductID() 
+                                                                      and Obj.CustomID() = ObjOrder.CustomerName());
+              if ( not isnull(ObjAuthorize))
+              {
+                  nAuthorizeQtyOld := ObjAuthorize.AuthorizeRealQty();
+                  nAuthorizeQtyNew :=nAuthorizeQtyOld;
+              }
+              //-----------------------------浠ヤ笅璁㈠崟鍐插噺--------------------
+              // 鎺堟潈璁板綍ID
+              AQID := H_FunctionClass::SM_GenerateID( "AQ");
+              // 璁㈠崟鍓╀綑鏁伴噺
+              OrderQuantity := [Number]ObjOrder.Quantity().Round( 0);
+              // 1 鍏堝啿鎺堟潈
+              if( OrderQuantity>0 and nAuthorizeQtyOld>0)
+              { 
+                 OrderQuantity := OrderQuantity-nAuthorizeQtyOld;
+                 nAuthorizeQtyNew :=0; 
+                 if( OrderQuantity<0)
+                 {
+                   nAuthorizeQtyNew := abs(OrderQuantity);
+                   OrderQuantity :=0;
+                 }
+              }
+              // 2 鍐嶅啿鍙嶇
+              if( OrderQuantity>0 and nReverseQtyOld>0)
+              { 
+                 OrderQuantity := OrderQuantity-nReverseQtyOld;
+                 nReverseQtyNew :=0; 
+                 if( OrderQuantity<0)
+                 {
+                   nReverseQtyNew := abs(OrderQuantity);
+                   OrderQuantity :=0;
+                 }
+              }
+              // 3 鏈�鍚庡啿棰勬祴
+              if( OrderQuantity>0)
+              { 
+                 //榛樿璁㈠崟鏁伴噺>棰勬祴鏁伴噺
+                 OrderQuantity := OrderQuantity-nForecastQtyOld;
+                 nForecastQtyNew :=0;
+                 nHaveForecastQty := nForecastQtyOld;
+                 nNoHaveForecastQty := OrderQuantity; 
+                 if( OrderQuantity<0)
+                 {
+                   nForecastQtyNew := abs(OrderQuantity);
+                   OrderQuantity :=0;
+                   nHaveForecastQty := nForecastQtyOld - nForecastQtyNew;
+                   nNoHaveForecastQty := 0;
+                 }
+              }
+              // 璁板綍鍔ㄤ綔
+              Owner.H_OrderRecord(relnew,
+                                     ID := AQID,
+                                     VCode:=VCode,
+                                     SKU:=ObjOrder.ProductID(),
+                                     ReverseQty := nReverseQtyNew,
+                                     CustomerCode := ObjOrder.CustomerName(),
+                                     CustomerName := ObjOrder.CustomerName(),
+                                     ForecastQty := nForecastQtyNew,
+                                     OrderDateTime := ObjOrder.EndDate(),
+                                     OrderQty := [Number]ObjOrder.Quantity().Round( 0),
+                                     OrderCode:=ObjOrder.OrderID(),
+                                     AuthorizeQty := nAuthorizeQtyNew,
+                                     ReverseDeductQty := nReverseQtyOld - nReverseQtyNew,
+                                     AuthorizeDeductQty := 0,
+                                     ForecastHitQty :=nHaveForecastQty,
+                                     ForecastNoHitQty :=nNoHaveForecastQty,
+                                     OperateType := OperatorType,
+                                     Operator := Operator,
+                                     Unit := ObjOrder.UnitOfMeasureName(),
+                                     OperateQty := [Number]ObjOrder.Quantity().Round( 0),
+                                     OperateTime := DateTime::ActualTime());
+              // 绾娴嬭鍗�
+              if( nForecastQtyNew>0)
+              {
+                FOrder := ObjOrder.Copy();
+                FOrder.OrderTag("绾娴�");
+                FOrder.Quantity(nForecastQtyNew);
+              }
+              // 鏈夐娴嬭鍗�
+              if(nHaveForecastQty>0)
+              {
+                HFOrder := ObjOrder.Copy();
+                HFOrder.OrderTag("鏈夐娴�");
+                HFOrder.Quantity(nHaveForecastQty);
+              }
+              // 鏃犻娴�
+              if(nNoHaveForecastQty>0)
+              {
+                NHFOrder := ObjOrder.Copy();
+                NHFOrder.OrderTag("鏃犻娴�");
+                NHFOrder.Quantity(nNoHaveForecastQty);
+              }
+              // ERP鍙嶇鎺堟潈璁㈠崟-鎺ュ彛鏈彁渚�
+             
+              // 鏇存柊褰撳墠鍙嶇鏁伴噺
+              if( not isnull( ObjReverse))
+              {
+                ObjReverse.ReverseRealQty(nReverseQtyNew);
+              }
+              else
+              {
+                Owner.H_ReverseRealQty(relnew,ID := H_FunctionClass::SM_GenerateID( "RQ"),SKU := ObjOrder.ProductID(),Unit := ObjOrder.UnitOfMeasureName()
+                                        ,ReverseRealQty := nReverseQtyNew);
+              } 
+              // 鏇存柊鎺堟潈
+              if( not isnull( ObjAuthorize))
+              {
+                ObjAuthorize.AuthorizeRealQty(nAuthorizeQtyNew);
+              }
+              else
+              {
+                Owner.H_AuthorizeRealQty(relnew,ID := H_FunctionClass::SM_GenerateID( "AR"),SKU := ObjOrder.ProductID(),
+                                                                                                Month := ObjOrder.EndDate(),
+                                                                                                CustomID := ObjOrder.CustomerName(),
+                                                                                                CustomName := ObjOrder.CustomerName(),
+                                                                                                OrderCode := "-",
+                                                                                                AuthorizeRealQty :=nAuthorizeQtyNew,
+                                                                                                Unit := ObjOrder.UnitOfMeasureName());
+              } 
+              // 鏇存柊棰勬祴
+              if( not isnull( OrderForecast))
+              {
+                OrderForecast.ForecatsRealQty(nForecastQtyNew);
+              }
+              else
+              {
+                Owner.H_OrderForecastRealQty(relnew,ID := H_FunctionClass::SM_GenerateID( "OF"),SKU := ObjOrder.ProductID(),
+                                                                                                Month := ObjOrder.EndDate(),
+                                                                                                CustomCode := ObjOrder.CustomerName(),
+                                                                                                CustomName := ObjOrder.CustomerName(),
+                                                                                                ForecastQty := 0,
+                                                                                                ForecatsRealQty :=nForecastQtyNew,
+                                                                                                Unit := ObjOrder.UnitOfMeasureName());
+              }
+              ObjOrder.Delete();
             }
-            else
-            {
-              Owner.H_AuthorizeRealQty(relnew,ID := H_FunctionClass::SM_GenerateID( "AR"),SKU := ObjOrder.ProductID(),
-                                                                                              Month := ObjOrder.EndDate(),
-                                                                                              CustomID := ObjOrder.CustomerName(),
-                                                                                              CustomName := ObjOrder.CustomerName(),
-                                                                                              OrderCode := "-",
-                                                                                              AuthorizeRealQty :=nAuthorizeQtyNew,
-                                                                                              Unit := ObjOrder.UnitOfMeasureName());
-            } 
-            // 鏇存柊棰勬祴
-            if( not isnull( OrderForecast))
-            {
-              OrderForecast.ForecatsRealQty(nForecastQtyNew);
-            }
-            else
-            {
-              Owner.H_OrderForecastRealQty(relnew,ID := H_FunctionClass::SM_GenerateID( "OF"),SKU := ObjOrder.ProductID(),
-                                                                                              Month := ObjOrder.EndDate(),
-                                                                                              CustomID := ObjOrder.CustomerName(),
-                                                                                              CustomName := ObjOrder.CustomerName(),
-                                                                                              OrderCode := "-",
-                                                                                              ForecatsQty :=0,
-                                                                                              ForecatsRealQty :=nForecastQtyNew,
-                                                                                              Unit := ObjOrder.UnitOfMeasureName());
-            } 
           }
         }
         else
         {
           strMsg:="棰勬祴璁㈠崟淇℃伅鍔犺浇澶辫触锛岃鑱旂郴绯荤粺绠$悊鍛橈紒";
-        }    
+        }  
       }
     }
     onerror
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderReverseOrAuthorize.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderReverseOrAuthorize.qbl
index 72a96c0..a74b90f 100644
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderReverseOrAuthorize.qbl
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderReverseOrAuthorize.qbl
@@ -42,7 +42,7 @@
         nNoHaveForecastQty:=0;//浜旈娴嬫暟閲�
         // 鑾峰彇棰勬祴鏁伴噺锛堝鎴�+SKU+鏈堜唤 鐞嗚鏄病鏈夌墿鏂欓娴嬶級
         OrderForecast := select(Owner, H_OrderForecastRealQty , Obj, Obj.SKU() = SKU 
-                                              and Obj.CustomID() = CustomerCode 
+                                              and Obj.CustomCode() = CustomerCode 
                                               and Obj.Month().Format( "YM2") = Date::ActualDate().Format( "YM2"));
         if ( not isnull(OrderForecast))
         {
@@ -189,10 +189,9 @@
           {
             Owner.H_OrderForecastRealQty(relnew,ID := H_FunctionClass::SM_GenerateID( "OF"),SKU := SKU,
                                                                                             Month := Date::ActualDate(),
-                                                                                            CustomID := CustomerCode,
+                                                                                            CustomCode := CustomerCode,
                                                                                             CustomName := CustomName,
-                                                                                            OrderCode := "-",
-                                                                                            ForecatsQty :=0,
+                                                                                            ForecastQty := 0,
                                                                                             ForecatsRealQty :=nForecastQtyNew,
                                                                                             Unit := Unit);
           } 
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_UpdateOrderForecastRealQty.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_UpdateOrderForecastRealQty.qbl
index 988d53e..4a0d857 100644
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_UpdateOrderForecastRealQty.qbl
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_UpdateOrderForecastRealQty.qbl
@@ -24,7 +24,7 @@
         for ( x := 1; x <= 10; x := x + 1 )
         {
             Owner.H_OrderForecastRealQty(relnew,ID := "AAAAA_"+ x.AsQUILL(),SKU := "OTN-01-ACC-00"+ x.AsQUILL() , Month := Date::ActualDate(),CustomName := "灏忕背",
-                                          CustomID := "XM0001",OrderCode:="OD0001",ForecatsQty:=1000,ForecatsRealQty:=1000, Unit := "PCS");
+                                          CustomCode := "XM0001",ForecastQty := 1000,ForecatsRealQty:=1000, Unit := "PCS");
         }
       }
       //H_FunctionClass := Owner.H_FunctionClass(relnew,VCode_Material := VCode,UpdateTime_Material := Date::ActualDate());
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomCode.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomCode.qbl
new file mode 100644
index 0000000..9cb80f6
--- /dev/null
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomCode.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CustomCode
+{
+  #keys: '3[414724.0.174571651][414724.0.174571650][414724.0.174571652]'
+  Description: '瀹㈡埛ID锛屽敮涓�寤轰箣涓�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomID.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomID.qbl
deleted file mode 100644
index f0cb7e7..0000000
--- a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomID.qbl
+++ /dev/null
@@ -1,8 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Attribute CustomID
-{
-  #keys: '3[414724.0.46380328][414724.0.46380327][414724.0.46380329]'
-  Description: '瀹㈡埛ID'
-  ValueType: String
-}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Department.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Department.qbl
new file mode 100644
index 0000000..efe5e78
--- /dev/null
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Department.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Department
+{
+  #keys: '3[414724.0.174571661][414724.0.174571660][414724.0.174571662]'
+  Description: '閮ㄩ棬锛屾病鏈変环鍊硷紝鏄剧ず浣跨敤'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecatsQty.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecastQty.qbl
similarity index 87%
rename from _Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecatsQty.qbl
rename to _Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecastQty.qbl
index 2edd0bc..bdc2eb0 100644
--- a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecatsQty.qbl
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecastQty.qbl
@@ -1,6 +1,6 @@
 Quintiq file version 2.0
 #parent: #root
-Attribute ForecatsQty
+Attribute ForecastQty
 {
   #keys: '3[414724.0.46380358][414724.0.46380357][414724.0.46380359]'
   Description: '棰勬祴鏁伴噺'
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Month.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Month.qbl
index cc1224e..8e83213 100644
--- a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Month.qbl
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Month.qbl
@@ -3,6 +3,6 @@
 Attribute Month
 {
   #keys: '3[414724.0.46380308][414724.0.46380307][414724.0.46380309]'
-  Description: '鏈堜唤'
+  Description: '鏈堜唤锛屽敮涓�閿箣涓�'
   ValueType: Date
 }
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_OrderCode.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_OrderCode.qbl
deleted file mode 100644
index 66e08c7..0000000
--- a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_OrderCode.qbl
+++ /dev/null
@@ -1,8 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Attribute OrderCode
-{
-  #keys: '3[414724.0.46380338][414724.0.46380337][414724.0.46380339]'
-  Description: '璁㈠崟缂栧彿'
-  ValueType: String
-}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKU.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKU.qbl
index a9eab85..5f2e17f 100644
--- a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKU.qbl
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKU.qbl
@@ -3,6 +3,6 @@
 Attribute SKU
 {
   #keys: '3[414724.0.46380348][414724.0.46380347][414724.0.46380349]'
-  Description: 'SKU缂栫爜'
+  Description: 'SKU缂栫爜锛屽敮涓�閿箣涓�'
   ValueType: String
 }
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKUName.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKUName.qbl
new file mode 100644
index 0000000..ddbce61
--- /dev/null
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKUName.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute SKUName
+{
+  #keys: '3[414724.0.174572228][414724.0.174572227][414724.0.174572229]'
+  Description: 'SKU鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_StockingPointID.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_StockingPointID.qbl
new file mode 100644
index 0000000..ebf027f
--- /dev/null
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_StockingPointID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StockingPointID
+{
+  #keys: '3[414724.0.174571671][414724.0.174571670][414724.0.174571672]'
+  Description: '搴撳瓨鐐癸紝娌℃湁浠峰�硷紝鏄剧ず浣跨敤'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Unit.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Unit.qbl
index 6569ece..eb7052c 100644
--- a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Unit.qbl
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Unit.qbl
@@ -3,6 +3,6 @@
 Attribute Unit
 {
   #keys: '3[414724.0.46380378][414724.0.46380377][414724.0.46380379]'
-  Description: '鍗曚綅'
+  Description: '鍗曚綅锛屾病鏈変环鍊硷紝鏄剧ず浣跨敤'
   ValueType: String
 }
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_VCode.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_VCode.qbl
new file mode 100644
index 0000000..fb94eeb
--- /dev/null
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_VCode.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute VCode
+{
+  #keys: '3[414724.0.174571641][414724.0.174571640][414724.0.174571642]'
+  Description: '鐗堟湰鍙凤紝鏆傛椂涓嶉�傜敤锛岄粯璁�-'
+  ValueType: String
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_ListSalesDemands.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_ListSalesDemands.def
new file mode 100644
index 0000000..352a599
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_ListSalesDemands.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component ListSalesDemands #extension
+{
+  Children:
+  [
+    Component DataSetLevelSalesDemands #extension
+    {
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPoint_MP.ID","title":"Stocking point","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"StockingPoint_MP.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SalesSegment_MP.Name","title":"Sales segment","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"SalesSegment_MP.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerName","title":"Customer name","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerID","title":"Customer ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderID","title":"Order ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderLineID","title":"Order line ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderLineID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"Order date","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Product_MP.ID","title":"Product","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Product_MP.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UnitOfMeasure_MP.Name","title":"UoM","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"UnitOfMeasure_MP.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Quantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FulfilledQuantity","title":"Fulfilled","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"FulfilledQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeChart","columnid":"Fulfillment","title":"Fulfillment","subtotals":"","tooltip":"","width":-1,"display":"shown","type":"stackbar","relative":true,"attributes":[{"name":"Unfulfilled demand","color":"rgb(232,123,0)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Unfulfilled demand","title":"Unfulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"maxvalue( object.Quantity() - object.FulfilledQuantity(), 0.0).Round( 2)"}},{"name":"Fulfilled demand","color":"rgb(87,184,71)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Fulfilled demand","title":"Fulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"object.FulfilledQuantity().Round( 2)"}}]}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IsFirmed","title":"Is firmed","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IsFirmed"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IsEligibleForNetting","title":"Is eligible for netting","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IsEligibleForNetting"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Price","title":"Price","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Price"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PriceUoM","title":"PriceUoM","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"PriceUoM"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderTag","title":"璁㈠崟鏍囩","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderTag"}}]'
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelAllSalesDemands.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelAllSalesDemands.def
new file mode 100644
index 0000000..b6550d1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelAllSalesDemands.def
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+Component PanelAllSalesDemands #extension
+{
+  Children:
+  [
+    #child: ListSalesDemands
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelSalesDemands.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelSalesDemands.def
new file mode 100644
index 0000000..14acdde
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelSalesDemands.def
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+Component PanelSalesDemands #extension
+{
+  Children:
+  [
+    #child: PanelAllSalesDemands
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/_ROOT_Component_FormCustomerOrders.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/_ROOT_Component_FormCustomerOrders.def
new file mode 100644
index 0000000..040c94f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/_ROOT_Component_FormCustomerOrders.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: LibMacroPlannerWebUI
+OrphanComponent FormCustomerOrders #extension
+{
+  Children:
+  [
+    #child: PanelSalesDemands
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSDIP.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSDIP.def
new file mode 100644
index 0000000..b0cbc0a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSDIP.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+Component ListSDIP
+{
+  #keys: '[134266.1.1970512356]'
+  BaseType: 'ListSDIP'
+  IsDerived: true
+  Children:
+  [
+    Component DataSetLevelSDIP
+    {
+      #keys: '[134266.1.1970512358]'
+      BaseType: 'DataSetLevelSDIP'
+      IsDerived: true
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsRestricted","title":"ImgIsRestricted","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsRestricted"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SalesSegmentName","title":"Sales segment","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"SalesSegmentName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"Product","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPointID","title":"Stocking point","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"StockingPointID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"Start","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EndDate","title":"End","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"EndDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MasterSalesDemand.UnitOfMeasureName","title":"UoM","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MasterSalesDemand.UnitOfMeasureName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"QuantityInSalesDemandUOM","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"QuantityInSalesDemandUOM"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FulfilledQuantityInSalesDemandUOM","title":"Fulfilled","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"FulfilledQuantityInSalesDemandUOM"}},{"attribute":{"classtype":"WebApiDefinitionAttributeChart","columnid":"Fulfillment","title":"Fulfillment","subtotals":"","tooltip":"","width":-1,"display":"shown","type":"stackbar","relative":true,"attributes":[{"name":"Fulfilled demand","color":"rgb(87,184,71)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Fulfilled demand","title":"Fulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"object.FulfilledQuantity().Round( 2)"}},{"name":"Unfulfilled demand","color":"rgb(232,123,0)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Unfulfilled demand","title":"Unfulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"maxvalue( object.Quantity()-object.FulfilledQuantity(),0.0)"}}]}}]'
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSalesDemands.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSalesDemands.def
new file mode 100644
index 0000000..0abeb62
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSalesDemands.def
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+Component ListSalesDemands
+{
+  #keys: '[134266.1.1970507083]'
+  BaseType: 'ListSalesDemands'
+  IsDerived: true
+  Children:
+  [
+    Component DataExtractorSalesDemands
+    {
+      #keys: '[134266.1.1970507084]'
+      BaseType: 'DataExtractorSalesDemands'
+      IsDerived: true
+      Properties:
+      [
+        Transformation: 'Elements.astype(CustomerOrder)'
+      ]
+    }
+    Component DataSetLevelSalesDemands
+    {
+      #keys: '[134266.1.1970507085]'
+      BaseType: 'DataSetLevelSalesDemands'
+      IsDerived: true
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPoint_MP.ID","title":"Stocking point","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"StockingPoint_MP.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SalesSegment_MP.Name","title":"Sales segment","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"SalesSegment_MP.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerName","title":"Customer name","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerID","title":"Customer ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderID","title":"Order ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderLineID","title":"Order line ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderLineID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"Order date","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Product_MP.ID","title":"Product","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Product_MP.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UnitOfMeasure_MP.Name","title":"UoM","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"UnitOfMeasure_MP.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Quantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FulfilledQuantity","title":"Fulfilled","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"FulfilledQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeChart","columnid":"Fulfillment","title":"Fulfillment","subtotals":"","tooltip":"","width":-1,"display":"shown","type":"stackbar","relative":true,"attributes":[{"name":"Unfulfilled demand","color":"rgb(232,123,0)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Unfulfilled demand","title":"Unfulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"maxvalue( object.Quantity() - object.FulfilledQuantity(), 0.0).Round( 2)"}},{"name":"Fulfilled demand","color":"rgb(87,184,71)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Fulfilled demand","title":"Fulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"object.FulfilledQuantity().Round( 2)"}}]}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IsFirmed","title":"Is firmed","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IsFirmed"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IsEligibleForNetting","title":"Is eligible for netting","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IsEligibleForNetting"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Price","title":"Price","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Price"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PriceUoM","title":"PriceUoM","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"PriceUoM"}}]'
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelAllSalesDemands.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelAllSalesDemands.def
new file mode 100644
index 0000000..60db013
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelAllSalesDemands.def
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+Component PanelAllSalesDemands
+{
+  #keys: '[134266.1.1970497658]'
+  BaseType: 'PanelAllSalesDemands'
+  IsDerived: true
+  Children:
+  [
+    #child: ListSalesDemands
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSDIP.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSDIP.def
new file mode 100644
index 0000000..6ddf675
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSDIP.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+Component PanelSDIP
+{
+  #keys: '[134266.1.1970511019]'
+  BaseType: 'PanelSDIP'
+  IsDerived: true
+  Children:
+  [
+    #child: ListSDIP
+  ]
+  Properties:
+  [
+    Title: 'Customer orders at planning level'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSalesDemands.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSalesDemands.def
new file mode 100644
index 0000000..e90068d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSalesDemands.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+Component PanelSalesDemands
+{
+  #keys: '[134266.1.1970506995]'
+  BaseType: 'PanelSalesDemands'
+  IsDerived: true
+  Children:
+  [
+    #child: PanelSDIP
+    #child: PanelAllSalesDemands
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCopy_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCopy_OnClick.def
new file mode 100644
index 0000000..e6db580
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCopy_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: ListSalesDemands
+Response OnClick () inherited id:Response_ListSalesDemands_MenuCopy_OnClick
+{
+  #keys: '[136682.1.799924425]'
+  BaseType: 'Response_ListSalesDemands_MenuCopy_OnClick'
+  DefinitionID: 'Responsedef_ListSalesDemands_WebMenu_OnClick'
+  Initiator: 'MenuCopy'
+  QuillAction
+  {
+    Body:
+    [*
+      // Copy sales demand
+      data := selectset( selection, Elements.astype( CustomerOrder ), co, true, true );
+      CustomerOrder::Copy( data );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCreate_OnClick\043715.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCreate_OnClick\043715.def"
new file mode 100644
index 0000000..85a98aa
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCreate_OnClick\043715.def"
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: ListSalesDemands
+Response OnClick () inherited id:Response_ListSalesDemands_MenuCreate_OnClick_715
+{
+  #keys: '[136682.1.803262814]'
+  BaseType: 'Response_ListSalesDemands_MenuCreate_OnClick_715'
+  DefinitionID: 'Responsedef_ListSalesDemands_WebMenu_OnClick'
+  Initiator: 'MenuCreate'
+  QuillAction
+  {
+    Body:
+    [*
+      //Create new sales demand
+      dlg := construct( DialogCreateEditCustomerOrder );
+      dlg.New();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuEdit_OnClick.def
new file mode 100644
index 0000000..edf9a16
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuEdit_OnClick.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: ListSalesDemands
+Response OnClick () inherited id:Response_ListSalesDemands_MenuEdit_OnClick
+{
+  #keys: '[136682.1.803135245]'
+  BaseType: 'Response_ListSalesDemands_MenuEdit_OnClick'
+  DefinitionID: 'Responsedef_ListSalesDemands_WebMenu_OnClick'
+  Initiator: 'MenuEdit'
+  QuillAction
+  {
+    Body:
+    [*
+      //Edit sales demand
+      dlg := construct( DialogCreateEditCustomerOrder );
+      
+      data := selectset( selection, Elements.astype( CustomerOrder ), f, true, true );
+      dlg.Edit( data );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/_ROOT_Component_FormCustomerOrders226.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/_ROOT_Component_FormCustomerOrders226.def
new file mode 100644
index 0000000..4e72e24
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/_ROOT_Component_FormCustomerOrders226.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormCustomerOrders226
+{
+  #keys: '[414724.0.179160850]'
+  Accessibility: 'Extensible'
+  BaseType: 'FormSalesDemands'
+  Children:
+  [
+    #child: PanelSalesDemands
+  ]
+  Properties:
+  [
+    Image: 'SALES_QUOTATION'
+    Title: 'Customer orders'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_List832_OnDoubleClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_List832_OnDoubleClick.def
index b04f7cf..8519bc2 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_List832_OnDoubleClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_List832_OnDoubleClick.def
@@ -13,19 +13,31 @@
     [*
       if( not isnull( selection))
       {
+        // 棰勬祴璁㈠崟鍩烘湰淇℃伅
+        CustomCode:="";
+        CustomName:="";
+        SValueJsonString:="";
+        // 鑾峰彇瀹㈡埛鍚嶇О鍜屽鎴稩D
+        if(txtSaveForecastData_FM.Text().Length()>0)
+        {
+           jForecast := JSON::Parse( txtSaveForecastData_FM.Text());
+           CustomCode := jForecast.Get( "CustomCode").GetString();
+           CustomName := jForecast.Get( "CustomName").GetString();
+        }
+        
         if(selection.MaterialType()="鍗婃垚鍝�")
         {
-          OrderCode:="";
+          ForecastID:="";
           if( txtSaveForecastData_FM.Text().Length()>0)
           {
-            JForecast := JSON::Parse( txtSaveForecastData_FM.Text());
-            OrderCode := JForecast.Get( "OrderCode").GetString();
+            JForecast := JSON::Parse(txtSaveForecastData_FM.Text());
+            ForecastID := JForecast.Get( "ForecastID").GetString();
           }
-         jResult := H_FunctionClass::SM_GetMaterialData( MacroPlan,selection.SKU(),selection.NeedQty(), OrderCode,"-",selection.NeedDate());
+         jResult := H_FunctionClass::SM_GetMaterialData( MacroPlan,selection.SKU(),selection.NeedQty(), ForecastID,"-",selection.NeedDate());
           if(jResult.Get( "Status").GetBoolean())
           {
                 de_dh_FM_ProductMP.FixedFilter( "object.ParentSKU() = " +  selection.SKU().AsQUILL()
-                                                + " and object.ForecastID() = " + OrderCode.AsQUILL()
+                                                + " and object.ForecastID() = " + ForecastID.AsQUILL()
                                                 );
           }
           else
@@ -35,7 +47,27 @@
         }
         else
         {
-            // 寮瑰嚭鐗╂枡鍙嶇鎺堟潈
+          SelectItem :=  select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmMaterial" and Obj.ItemKey()="ListSelect");
+          if(not isnull(selection))
+          {
+            SValueJsonString:= JSON::Object().Add( "SKU",selection.SKU())
+                        .Add( "MaterialName",selection.MaterialName())
+                        .Add( "MaterialType",selection.MaterialType())
+                        .Add( "OrgCode",selection.OrgCode())
+                        .Add( "Unit",selection.Unit())
+                        .Add( "CustomCode",CustomCode)
+                        .Add( "ParentSKU",lb_SUK_FM.Text())
+                        .Add( "CustomName",CustomName).Build().AsString();
+          }
+          if(isnull( SelectItem))
+          {
+            MacroPlan.H_MessagePassing(relnew,FKey := "FrmMaterial",ItemKey := "ListSelect", ValueJsonString:=SValueJsonString);
+          }
+          else
+          {
+            SelectItem.ValueJsonString( SValueJsonString);
+          }
+          Application.OpenForm( "FrmAuthorizeAndCountersign_Material","modal");
         }
       }
     *]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_OnCreated.def
index c3a42c1..4529905 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_OnCreated.def
@@ -17,11 +17,11 @@
       {
         if( SelectItem.ValueJsonString().Length()>0)
         {
-          txtSaveForecastData_FM.Text(  SelectItem.ValueJsonString());
-          JSelect := JSON::Parse( SelectItem.ValueJsonString());
+          txtSaveForecastData_FM.Text(SelectItem.ValueJsonString());
+          JSelect := JSON::Parse(SelectItem.ValueJsonString());
           lb_SUK_FM.Text(JSelect.Get( "SKU").GetString());
           de_dh_FM_ProductMP.FixedFilter( "object.ParentSKU() = " + JSelect.Get( "SKU").GetString().AsQUILL()
-                                          + " and object.ForecastID() = " + JSelect.Get( "OrderCode").GetString().AsQUILL()
+                                          + " and object.ForecastID() = " + JSelect.Get( "ForecastID").GetString().AsQUILL()
                                           );
         }
       }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel351.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel351.def
index c6fbad5..130115e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel351.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel351.def
@@ -85,6 +85,29 @@
         Taborder: 3
       ]
     }
+    Component txt_QueryContent_FOF
+    {
+      #keys: '[414724.0.172390935]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        PlaceHolder: '妯$硦鎼滅储'
+        Taborder: 4
+      ]
+    }
+    Component btn_Query_FOF
+    {
+      #keys: '[414724.0.172390951]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        ButtonSize: 'compact'
+        Description: '鏌ヨ'
+        Image: 'VIEW'
+        Label: '鏌ヨ'
+        Taborder: 5
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel383.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel383.def
deleted file mode 100644
index ff6b8ad..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel383.def
+++ /dev/null
@@ -1,53 +0,0 @@
-Quintiq file version 2.0
-Component Panel383
-{
-  #keys: '[414724.0.86151558]'
-  BaseType: 'WebPanel'
-  Children:
-  [
-    Component ds_Month_FOF
-    {
-      #keys: '[414724.0.86151747]'
-      BaseType: 'WebDateSelector'
-      Properties:
-      [
-        DateFormat: 'YMM'
-        Label: '鏈堜唤'
-        Taborder: 0
-        Visible: false
-      ]
-    }
-    Component txt_QueryContent_FOF
-    {
-      #keys: '[414724.0.86151766]'
-      BaseType: 'WebEditField'
-      Properties:
-      [
-        PlaceHolder: '妯$硦鎼滅储'
-        Taborder: 1
-        Visible: false
-      ]
-    }
-    Component btn_Query_FOF
-    {
-      #keys: '[414724.0.88914059]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Description: '鏌ヨ'
-        Image: 'VIEW'
-        Label: '鏌ヨ'
-        Taborder: 2
-        Visible: false
-      ]
-    }
-  ]
-  Properties:
-  [
-    FixedSize: true
-    MinimumColumns: 80
-    Orientation: 'horizontal'
-    Taborder: 0
-    Visible: false
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel647.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel647.def
deleted file mode 100644
index 7b147ac..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel647.def
+++ /dev/null
@@ -1,50 +0,0 @@
-Quintiq file version 2.0
-Component Panel647
-{
-  #keys: '[414724.0.86151576]'
-  BaseType: 'WebPanel'
-  Children:
-  [
-    Component btn_Add_Order_FOF
-    {
-      #keys: '[414724.0.87342042]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Description: '璁㈠崟鏂板鍙嶇/鎺堟潈'
-        Label: '璁㈠崟鏂板鍙嶇/鎺堟潈'
-        Taborder: 1
-      ]
-    }
-    Component btn_Add_Material_FOF
-    {
-      #keys: '[414724.0.86151707]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Description: '鍘熸枡鏂板鍙嶇/鎺堟潈'
-        Label: '鍘熸枡鏂板鍙嶇/鎺堟潈'
-        Taborder: 2
-      ]
-    }
-    Component btn_InitialData
-    {
-      #keys: '[414724.0.93657921]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Description: '鍔犺浇鏁版嵁锛堝亣鐨勶紝鍚庣画闇�瑕佸鎺ユ暟鎹級'
-        Label: '鍔犺浇棰勬祴璁㈠崟鏁版嵁'
-        Taborder: 0
-        Visible: false
-      ]
-    }
-  ]
-  Properties:
-  [
-    Alignment: 'trailing'
-    FixedSize: true
-    Orientation: 'horizontal'
-    Taborder: 1
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel849.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel849.def
deleted file mode 100644
index 35b07f6..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel849.def
+++ /dev/null
@@ -1,19 +0,0 @@
-Quintiq file version 2.0
-Component Panel849
-{
-  #keys: '[414724.0.87341748]'
-  BaseType: 'WebPanel'
-  Children:
-  [
-    #child: Panel383
-    #child: Panel647
-  ]
-  Properties:
-  [
-    Description: '宸茬粡闅愯棌锛屾殏鏈娇鐢�'
-    FixedSize: true
-    Orientation: 'horizontal'
-    Taborder: 2
-    Visible: false
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_liH_Forecast.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_liH_Forecast.def
index e056848..67ab89e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_liH_Forecast.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_liH_Forecast.def
@@ -11,8 +11,8 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'structured[H_Forecast]'
-        Source: 'dh_FOF_H_Forecast'
+        DataType: 'structured[H_OrderForecastRealQty]'
+        Source: 'dh_FOF_H_OrderForecastRealQty'
         Taborder: 0
         Transformation: 'Elements'
       ]
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderCode","title":"璁㈠崟缂栧彿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"SKU缂栫爜","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastQty","title":"棰勬祴鏁伴噺","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"NeedTime","title":"闇�姹傛椂闂�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"NeedTime"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Util","title":"鍗曚綅","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Util"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomName","title":"瀹㈡埛鍚嶇О","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Department","title":"閿�鍞儴闂�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Department"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Month","title":"鏈堜唤","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Month"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomName","title":"瀹㈡埛鍚嶇О","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"SKU缂栧彿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecatsQty","title":"棰勬祴鏁伴噺","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecatsQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecatsRealQty","title":"绾娴嬫暟閲�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecatsRealQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit","title":"鍗曚綅","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Unit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Department","title":"閮ㄩ棬","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Department"}}]'
         ContextMenu: 'listContextMenu367'
         Taborder: 2
       ]
@@ -36,6 +36,6 @@
   ]
   Properties:
   [
-    Taborder: 7
+    Taborder: 3
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_listActionBarPage963.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_listActionBarPage963.def
deleted file mode 100644
index 320820a..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_listActionBarPage963.def
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-Component listActionBarPage963
-{
-  #keys: '[414724.0.86151897]'
-  BaseType: 'listActionBarPage'
-  Properties:
-  [
-    Taborder: 1
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_listContextMenu687.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_listContextMenu687.def
deleted file mode 100644
index 5f3683c..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_listContextMenu687.def
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-Component listContextMenu687
-{
-  #keys: '[414724.0.86151902]'
-  BaseType: 'listContextMenu'
-  Properties:
-  [
-    Taborder: 0
-  ]
-}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_list_ForecastView_FOF\043670.def" "b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_list_ForecastView_FOF\043670.def"
deleted file mode 100644
index 0c21175..0000000
--- "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_list_ForecastView_FOF\043670.def"
+++ /dev/null
@@ -1,43 +0,0 @@
-Quintiq file version 2.0
-Component list_ForecastView_FOF
-{
-  #keys: '[414724.0.86151894]'
-  BaseType: 'WebList'
-  Children:
-  [
-    Component de_list_ForecastView_FOF
-    {
-      #keys: '[414724.0.86151895]'
-      BaseType: 'WebDataExtractor'
-      Properties:
-      [
-        DataType: 'structured[SalesDemandBase]'
-        Source: 'dh_FOF_Data'
-        Taborder: 0
-        Transformation: 'Elements.astype(Forecast)'
-      ]
-    }
-    #child: listActionBarPage963
-    Component DataSetLevel191
-    {
-      #keys: '[414724.0.86151900]'
-      BaseType: 'WebDataSetLevel'
-      Children:
-      [
-        #child: listContextMenu687
-      ]
-      Properties:
-      [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgNotLinkedToPeriod","title":"ImgNotLinkedToPeriod","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgNotLinkedToPeriod"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsPostponed","title":"ImgIsPostponed","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsPostponed"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPoint_MP.ID","title":"Stocking point","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"StockingPoint_MP.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SalesSegment_MP.Name","title":"Sales segment","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"SalesSegment_MP.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Product_MP.ID","title":"Product","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Product_MP.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"Start","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EndDate","title":"End","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EndDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UnitOfMeasure_MP.Name","title":"Quantity UoM","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"UnitOfMeasure_MP.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Original Qty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Quantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"NettedQuantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"NettedQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FulfilledQuantity","title":"Fulfilled","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"FulfilledQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeChart","columnid":"Fulfillment Illustration","title":"Fulfillment","subtotals":"","tooltip":"","width":-1,"display":"shown","type":"stackbar","relative":true,"attributes":[{"name":"Fulfilled demand","color":"rgb(87,184,71)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Fulfillment","title":"Fulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"object.FulfilledQuantity().Round(2)"}},{"name":"Unfulfilled demand","color":"rgb(232,123,0)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Unfulfilled demand","title":"Unfulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"maxvalue(object.NettedQuantity()-object.FulfilledQuantity(),0.0).Round(2)"}}]}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Price","title":"Price","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Price"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PriceUoM","title":"PriceUoM","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"PriceUoM"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Priority.Name","title":"Priority","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Priority.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DemandUncertaintyPercentage","title":"Uncertainty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DemandUncertaintyPercentage"}}]'
-        ContextMenu: 'listContextMenu687'
-        FixedFilter: 'object.EndDate().DateTime().Date() >= Date::ActualDate().StartOfMonth() and object.EndDate().DateTime().Date() <= Date::ActualDate().StartOfNextMonth().StartOfNextMonth().StartOfNextMonth().StartOfNextMonth()'
-        Taborder: 2
-      ]
-    }
-  ]
-  Properties:
-  [
-    Taborder: 5
-    Visible: false
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_OnCreated.def
index 5cb899a..700b61d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_OnCreated.def
@@ -9,13 +9,15 @@
   {
     Body:
     [*
-      // 鍒濆鍖栨煡璇㈠弬鏁版湀浠�
-      ds_Month_FOF.Date(Date::ActualDate());
       // 鍒濆鍖栭娴嬫暟鎹�
-      JResult := H_FunctionClass::SM_InitialForcastData( MacroPlan);
+      JResult := H_FunctionClass::SM_InitialForcastDataEx( MacroPlan,true,"-");
       if(not JResult.Get( "Status").GetBoolean())
       {
-          WebMessageBox::Warning( JResult.Get( "Msg").GetString());
+        WebMessageBox::Warning( JResult.Get( "Msg").GetString());
+      }
+      else
+      {
+        WebMessageBox::Information( JResult.Get( "Msg").GetString());
       }
     *]
     GroupServerCalls: false
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Material_FOF503_OnClick\043222.def" "b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Material_FOF503_OnClick\043222.def"
index 0f50e1f..bda5c5d 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Material_FOF503_OnClick\043222.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Material_FOF503_OnClick\043222.def"
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: Panel351/btn_Add_Material_FOF503
 Response OnClick (
-  H_Forecast selection
+  H_OrderForecastRealQty selection
 ) id:Response_Panel351_btn_Add_Material_FOF503_OnClick_222
 {
   #keys: '[414724.0.145178766]'
@@ -17,28 +17,26 @@
         if( isnull( SelectItem))
         {
            MacroPlan.H_MessagePassing(relnew,FKey :="FrmOrderForecast",ItemKey := "ListSelect",
-                                       Value := selection.SKU()+";"+selection.Util()+";"+selection.CustomCode()+";"+selection.CustomName(),
                                        ValueJsonString := JSON::Object().Add( "SKU",selection.SKU())
-                                                                         .Add( "Util",selection.Util())
-                                                                         .Add( "CustomCode",selection.CustomCode())
-                                                                         .Add( "CustomName",selection.CustomName())
-                                                                         .Add( "ForecastQty",selection.ForecastQty())
-                                                                         .Add( "NeedTime",selection.NeedTime().AsQUILL())
-                                                                         .Add( "OrderCode",selection.OrderCode()).Build().AsString());
+                                                                       .Add( "Util",selection.Unit())
+                                                                       .Add( "CustomCode",selection.CustomCode())
+                                                                       .Add( "CustomName",selection.CustomName())
+                                                                       .Add( "ForecastQty",selection.ForecastQty())
+                                                                       .Add( "ForecastID",selection.ID())
+                                                                       .Add( "NeedTime",selection.Month().AsQUILL()).Build().AsString());
         }
         else
         {
-          SelectItem.Value(selection.SKU()+";"+selection.Util()+";"+selection.CustomCode()+";"+selection.CustomName());
           SelectItem.ValueJsonString(JSON::Object().Add( "SKU",selection.SKU())
-                                   .Add( "Util",selection.Util())
-                                   .Add( "CustomCode",selection.CustomCode())
-                                   .Add( "CustomName",selection.CustomName())
-                                   .Add( "ForecastQty",selection.ForecastQty())
-                                   .Add( "NeedTime",selection.NeedTime().AsQUILL())
-                                   .Add( "OrderCode",selection.OrderCode()).Build().AsString());
+                                                   .Add( "Util",selection.Unit())
+                                                   .Add( "CustomCode",selection.CustomCode())
+                                                   .Add( "CustomName",selection.CustomName())
+                                                   .Add( "ForecastQty",selection.ForecastQty())
+                                                   .Add( "ForecastID",selection.ID())
+                                                   .Add( "NeedTime",selection.Month().AsQUILL()).Build().AsString());
         }
         
-        jResult := H_FunctionClass::SM_GetMaterialData( MacroPlan,selection.SKU(),selection.ForecastQty(),selection.OrderCode(),"-",selection.NeedTime());
+        jResult := H_FunctionClass::SM_GetMaterialData( MacroPlan,selection.SKU(),selection.ForecastQty(),selection.ID(),"-",selection.Month());
         if(jResult.Get( "Status").GetBoolean())
         {
             Application.OpenForm( "FrmMaterial","popout");
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Order_FOF449_OnClick\043880.def" "b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Order_FOF449_OnClick\043880.def"
index bf1f99c..8eb0570 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Order_FOF449_OnClick\043880.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Order_FOF449_OnClick\043880.def"
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: Panel351/btn_Add_Order_FOF449
 Response OnClick (
-  H_Forecast selection
+  H_OrderForecastRealQty selection
 ) id:Response_Panel351_btn_Add_Order_FOF449_OnClick_880
 {
   #keys: '[414724.0.141244111]'
@@ -17,19 +17,17 @@
         if( isnull( SelectItem))
         {
            MacroPlan.H_MessagePassing(relnew,FKey :="FrmOrderForecast",ItemKey := "ListSelect",
-                                       Value := selection.SKU()+";"+selection.Util()+";"+selection.CustomCode()+";"+selection.CustomName(),
-                                       ValueJsonString := JSON::Object().Add( "SKU",selection.SKU())
-                                                                         .Add( "Util",selection.Util())
-                                                                         .Add( "CustomCode",selection.CustomCode())
-                                                                         .Add( "CustomName",selection.CustomName()).Build().AsString());
+                                      ValueJsonString := JSON::Object().Add( "SKU",selection.SKU())
+                                                                       .Add( "Util",selection.Unit())
+                                                                       .Add( "CustomCode",selection.CustomCode())
+                                                                       .Add( "CustomName",selection.CustomName()).Build().AsString());
         }
         else
         {
-          SelectItem.Value(selection.SKU()+";"+selection.Util()+";"+selection.CustomCode()+";"+selection.CustomName());
           SelectItem.ValueJsonString(JSON::Object().Add( "SKU",selection.SKU())
-                                   .Add( "Util",selection.Util())
-                                   .Add( "CustomCode",selection.CustomCode())
-                                   .Add( "CustomName",selection.CustomName()).Build().AsString());
+                                                   .Add( "Util",selection.Unit())
+                                                   .Add( "CustomCode",selection.CustomCode())
+                                                   .Add( "CustomName",selection.CustomName()).Build().AsString());
         }
         Application.OpenForm( "FrmAuthorizeAndCountersign_Order","modal");  
       }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Query_FOF_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Query_FOF_OnClick.def
new file mode 100644
index 0000000..1b95a1a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Query_FOF_OnClick.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: Panel351/btn_Query_FOF
+Response OnClick () id:Response_Panel351_btn_Query_FOF_OnClick
+{
+  #keys: '[414724.0.172390950]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      de_dh_FOF_H_Foecast.FixedFilter( "object.SKU().LikeUserLocale( " + txt_QueryContent_FOF.Text().AsQUILL() + " )"
+                                                   + " or " + "object.CustomName().LikeUserLocale( " + txt_QueryContent_FOF.Text().AsQUILL() + " )"  
+                                                   + " or " + "object.Unit().LikeUserLocale( " + txt_QueryContent_FOF.Text().AsQUILL() + " )" 
+                                                   + " or " + "object.Department().LikeUserLocale( " + txt_QueryContent_FOF.Text().AsQUILL() + " )" 
+                                                   + " or " + "object.StockingPointID().LikeUserLocale( " + txt_QueryContent_FOF.Text().AsQUILL() + " )"
+                                      );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel383_btn_Query_FOF_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel383_btn_Query_FOF_OnClick.def
deleted file mode 100644
index 41a29a8..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel383_btn_Query_FOF_OnClick.def
+++ /dev/null
@@ -1,17 +0,0 @@
-Quintiq file version 2.0
-#parent: Panel383/btn_Query_FOF
-Response OnClick () id:Response_Panel383_btn_Query_FOF_OnClick
-{
-  #keys: '[414724.0.91472695]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  QuillAction
-  {
-    Body:
-    [*
-      MacroPlan.H_Forecast(relnew, CustomName := "灏忕背",CustomCode := "XM001",ForecastQty := 100,Department := "閿�鍞�1閮�",
-                                         NeedTime := Date::ActualDate(),OrderCode := "00010101",SKU := "ANNDDSSSS",Util := "PCS");
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_Add_Material_FOF_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_Add_Material_FOF_OnClick.def
deleted file mode 100644
index b54e053..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_Add_Material_FOF_OnClick.def
+++ /dev/null
@@ -1,20 +0,0 @@
-Quintiq file version 2.0
-#parent: Panel647/btn_Add_Material_FOF
-Response OnClick () id:Response_Panel647_btn_Add_Material_FOF_OnClick
-{
-  #keys: '[414724.0.86152486]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  Precondition:
-  [*
-    return not isnull( MacroPlan);
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      Application.OpenForm( "FrmMaterial","popout");
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_Add_Order_FOF_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_Add_Order_FOF_OnClick.def
deleted file mode 100644
index 82c16f5..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_Add_Order_FOF_OnClick.def
+++ /dev/null
@@ -1,28 +0,0 @@
-Quintiq file version 2.0
-#parent: Panel647/btn_Add_Order_FOF
-Response OnClick () id:Response_Panel647_btn_Add_Order_FOF_OnClick
-{
-  #keys: '[414724.0.86152095]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  Precondition:
-  [*
-    return not isnull( MacroPlan);
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      SelectItem := select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmOrderForecast" and Obj.ItemKey()="ListSelect");
-      if(not isnull( SelectItem) and SelectItem.Value().Length()>0)
-      {
-        Application.OpenForm( "FrmAuthorizeAndCountersign_Order","popout");
-      }
-      else
-      {
-        WebMessageBox::Information( "璇烽�夋嫨涓�椤归娴嬪悗鍐嶇偣鍑绘寜閽紒");  
-      }
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_InitialData_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_InitialData_OnClick.def
deleted file mode 100644
index 1804c2e..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_InitialData_OnClick.def
+++ /dev/null
@@ -1,39 +0,0 @@
-Quintiq file version 2.0
-#parent: Panel647/btn_InitialData
-Response OnClick () id:Response_Panel647_btn_InitialData_OnClick
-{
-  #keys: '[414724.0.93657952]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  Precondition:
-  [*
-    return not isnull( MacroPlan);
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      // 娌℃湁鐢ㄧ殑鎸夐挳鍜屽嚱鏁帮紝鍙负浜嗘祴璇曠敓鎴愬亣鏁版嵁銆�
-      StrCustoms:="XM_2023,灏忕背;HW_2023,鍗庝负;OV_2023,VIVO;OP_2023,OPPO;HX_2023,娴蜂俊;YJ_2023,涓�鍔�;HE_2023,娴峰皵;GL_2023,鏍煎姏;";
-      ArrayCustom := StrCustoms.Tokenize( ";"); //8涓鎴�
-      idx :=0;
-      for( i:=0;i<20;i:=i+1)
-      {
-        idx :=Number::Random( 0,7);
-        arrCustomInfo := ArrayCustom.Element( idx).Tokenize( ",");
-        MacroPlan.H_Forecast(relnew, CustomName := arrCustomInfo.Element( 1),CustomCode := arrCustomInfo.Element( 0),ForecastQty := Number::Random( 100,5000),
-                              Department := "閿�鍞�1閮�",NeedTime := Date::ActualDate(),OrderCode := H_FunctionClass::SM_GenerateID( "OF") ,SKU := "SKU-CP-2023-N"+(Number::Random( 1000,9999)).AsQUILL(),Util := "PCS");  
-        
-      }
-      // 鐢熸垚棰勬祴 瀹炴椂鏁版嵁锛屽弽绛炬暟鎹紝鎺堟潈鏁版嵁锛堝弽绛� 鎺堟潈榛樿涓�0锛屽鑷姩鍒涘缓锛岃繖閲屼笉鍐嶆坊鍔狅級
-       traverse(MacroPlan,H_Forecast ,Obj,not isnull(Obj) )
-      {
-        MacroPlan.H_OrderForecastRealQty(relnew,CustomID := Obj.CustomCode(),CustomName := Obj.CustomName(),ForecatsQty := Obj.ForecastQty(),
-                                          ForecatsRealQty := Obj.ForecastQty(),ID := H_FunctionClass::SM_GenerateID( "OF"),Month := Date::ActualDate(),
-                                          OrderCode := Obj.OrderCode(),SKU := Obj.SKU(),Unit := Obj.Util());
-                                          
-      }
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_liH_Forecast_OnDoubleClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_liH_Forecast_OnDoubleClick.def
index 991029e..c178467 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_liH_Forecast_OnDoubleClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_liH_Forecast_OnDoubleClick.def
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: liH_Forecast
 Response OnDoubleClick (
-  H_Forecast selection
+  H_OrderForecastRealQty selection
 ) id:Response_liH_Forecast_OnDoubleClick
 {
   #keys: '[414724.0.111761136]'
@@ -15,28 +15,26 @@
       if( isnull( SelectItem))
       {
          MacroPlan.H_MessagePassing(relnew,FKey :="FrmOrderForecast",ItemKey := "ListSelect",
-                                     Value := selection.SKU()+";"+selection.Util()+";"+selection.CustomCode()+";"+selection.CustomName(),
                                      ValueJsonString := JSON::Object().Add( "SKU",selection.SKU())
-                                                                       .Add( "Util",selection.Util())
+                                                                       .Add( "Util",selection.Unit())
                                                                        .Add( "CustomCode",selection.CustomCode())
                                                                        .Add( "CustomName",selection.CustomName())
                                                                        .Add( "ForecastQty",selection.ForecastQty())
-                                                                       .Add( "NeedTime",selection.NeedTime().AsQUILL())
-                                                                       .Add( "OrderCode",selection.OrderCode()).Build().AsString());
+                                                                       .Add( "ForecastID",selection.ID())
+                                                                       .Add( "NeedTime",selection.Month().AsQUILL()).Build().AsString());
       }
       else
       {
-        SelectItem.Value(selection.SKU()+";"+selection.Util()+";"+selection.CustomCode()+";"+selection.CustomName());
         SelectItem.ValueJsonString(JSON::Object().Add( "SKU",selection.SKU())
-                                 .Add( "Util",selection.Util())
-                                 .Add( "CustomCode",selection.CustomCode())
-                                 .Add( "CustomName",selection.CustomName())
-                                 .Add( "ForecastQty",selection.ForecastQty())
-                                 .Add( "NeedTime",selection.NeedTime().AsQUILL())
-                                 .Add( "OrderCode",selection.OrderCode()).Build().AsString());
+                                                 .Add( "Util",selection.Unit())
+                                                 .Add( "CustomCode",selection.CustomCode())
+                                                 .Add( "CustomName",selection.CustomName())
+                                                 .Add( "ForecastQty",selection.ForecastQty())
+                                                 .Add( "ForecastID",selection.ID())
+                                                 .Add( "NeedTime",selection.Month().AsQUILL()).Build().AsString());
       }
       
-      jResult := H_FunctionClass::SM_GetMaterialData( MacroPlan,selection.SKU(),selection.ForecastQty(),selection.OrderCode(),"-",selection.NeedTime());
+      jResult := H_FunctionClass::SM_GetMaterialData( MacroPlan,selection.SKU(),selection.ForecastQty(),selection.ID(),"-",selection.Month());
       if(jResult.Get( "Status").GetBoolean())
       {
         Application.OpenForm( "FrmMaterial","popout");
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_list_ForecastView_FOF_OnDoubleClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_list_ForecastView_FOF_OnDoubleClick.def
deleted file mode 100644
index 3d85f54..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_list_ForecastView_FOF_OnDoubleClick.def
+++ /dev/null
@@ -1,30 +0,0 @@
-Quintiq file version 2.0
-#parent: list_ForecastView_FOF
-Response OnDoubleClick (
-  Forecast selection
-) id:Response_list_ForecastView_FOF_OnDoubleClick
-{
-  #keys: '[414724.0.92081867]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebList_OnDoubleClick'
-  GroupServerCalls: true
-  Precondition:
-  [*
-    return not isnull( MacroPlan);
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      SelectItem :=  select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmOrderForecast" and Obj.ItemKey()="ListSelect");
-      if( isnull( SelectItem))
-      {
-         MacroPlan.H_MessagePassing(relnew,FKey :="FrmOrderForecast",ItemKey := "ListSelect",Value := "");
-      }
-      CustomID := "NO";
-      CustonName :="鏈姄鍙栧埌";
-      SelectItem.Value(selection.ProductID()+";"+selection.UnitOfMeasureName()+";"+CustomID+";"+CustonName);
-      Application.OpenForm( "FrmMaterial","popout");
-    *]
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_list_ForecastView_FOF_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_list_ForecastView_FOF_OnSelectionChanged.def
deleted file mode 100644
index 582090d..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_list_ForecastView_FOF_OnSelectionChanged.def
+++ /dev/null
@@ -1,25 +0,0 @@
-Quintiq file version 2.0
-#parent: list_ForecastView_FOF
-Response OnSelectionChanged (
-  Forecast selection
-) id:Response_list_ForecastView_FOF_OnSelectionChanged
-{
-  #keys: '[414724.0.91684287]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebList_OnSelectionChanged'
-  QuillAction
-  {
-    Body:
-    [*
-      SelectItem :=  select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmOrderForecast" and Obj.ItemKey()="ListSelect");
-      if( isnull( SelectItem))
-      {
-         MacroPlan.H_MessagePassing(relnew,FKey :="FrmOrderForecast",ItemKey := "ListSelect",Value := "");
-      }
-      CustomID := "NO";
-      CustonName :="鏈姄鍙栧埌";
-      SelectItem.Value(selection.ProductID()+";"+selection.UnitOfMeasureName()+";"+CustomID+";"+CustonName);
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/_ROOT_Component_FrmOrderForecast.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/_ROOT_Component_FrmOrderForecast.def
index d6e1cad..3d07f93 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/_ROOT_Component_FrmOrderForecast.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/_ROOT_Component_FrmOrderForecast.def
@@ -7,100 +7,12 @@
   BaseType: 'WebForm'
   Children:
   [
-    #child: Panel849
-    #child: list_ForecastView_FOF
-    Component dh_FOF_Data
-    {
-      #keys: '[414724.0.86151860]'
-      BaseType: 'WebDataHolder'
-      Databinding: 'structured[SalesDemandBase]*'
-      Children:
-      [
-        Component de_dh_FOF_Data
-        {
-          #keys: '[414724.0.86151875]'
-          BaseType: 'WebDataExtractor'
-          Properties:
-          [
-            DataType: 'structured[SalesDemandBase]'
-            Source: 'dh_FOF_ChildrenData'
-            Taborder: 0
-            Transformation: 'Elements'
-          ]
-        }
-        Component DataExtractor819
-        {
-          #keys: '[414724.0.107645127]'
-          BaseType: 'WebDataExtractor'
-          Properties:
-          [
-            DataType: 'MacroPlan'
-            Source: 'MacroPlan'
-            Taborder: 1
-            Transformation: 'SalesDemand'
-          ]
-        }
-      ]
-      Properties:
-      [
-        Taborder: 4
-      ]
-    }
     #child: Panel961
-    Component dh_FOF_ChildrenData
-    {
-      #keys: '[414724.0.106541535]'
-      BaseType: 'WebDataHolder'
-      Databinding: 'structured[SalesDemandBase]*'
-      Children:
-      [
-        Component de_FOF_ChildrenData_0
-        {
-          #keys: '[414724.0.106541577]'
-          BaseType: 'WebDataExtractor'
-          Properties:
-          [
-            DataType: 'structured[Product_MP]'
-            Source: 'ApplicationMacroPlanner.DataHolderProduct'
-            Taborder: 0
-            Transformation: 'Elements.SalesDemand'
-          ]
-        }
-        Component de_FOF_ChildrenData_1
-        {
-          #keys: '[414724.0.106541594]'
-          BaseType: 'WebDataExtractor'
-          Properties:
-          [
-            DataType: 'structured[StockingPoint_MP]'
-            Source: 'ApplicationMacroPlanner.DataHolderStockingPoint'
-            Taborder: 1
-            Transformation: 'Elements.SalesDemand'
-          ]
-        }
-        Component de_FOF_ChildrenData_2
-        {
-          #keys: '[414724.0.106541611]'
-          BaseType: 'WebDataExtractor'
-          Properties:
-          [
-            DataType: 'structured[SalesSegment_MP]'
-            Source: 'ApplicationMacroPlanner.DataHolderSalesSegment'
-            Taborder: 2
-            Transformation: 'Elements.SalesDemand'
-          ]
-        }
-      ]
-      Properties:
-      [
-        Taborder: 3
-      ]
-    }
-    Component dh_FOF_H_Forecast
+    Component dh_FOF_H_OrderForecastRealQty
     {
       #keys: '[414724.0.109053093]'
       BaseType: 'WebDataHolder'
-      Databinding: 'structured[H_Forecast]*'
+      Databinding: 'structured[H_OrderForecastRealQty]*'
       Children:
       [
         Component de_dh_FOF_H_Foecast
@@ -112,13 +24,13 @@
             DataType: 'MacroPlan'
             Source: 'MacroPlan'
             Taborder: 0
-            Transformation: 'H_Forecast'
+            Transformation: 'H_OrderForecastRealQty'
           ]
         }
       ]
       Properties:
       [
-        Taborder: 6
+        Taborder: 2
       ]
     }
     #child: liH_Forecast
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Frm_TEST/_ROOT_Component_Frm_TEST.def b/_Main/UI/MacroPlannerWebApp/Component_Frm_TEST/_ROOT_Component_Frm_TEST.def
index 55c933a..356e36c 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_Frm_TEST/_ROOT_Component_Frm_TEST.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_Frm_TEST/_ROOT_Component_Frm_TEST.def
@@ -44,13 +44,14 @@
         Taborder: 0
       ]
     }
-    Component ButtonERP璁㈠崟
+    Component Button687
     {
       #keys: '[414724.0.164341716]'
       BaseType: 'WebButton'
       Properties:
       [
-        Label: 'ERP璁㈠崟'
+        Image: 'HORSE'
+        Label: '璁㈠崟鍐插噺'
         Taborder: 3
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp b/_Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp
index cb94597..f99dc85 100644
--- a/_Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp
+++ b/_Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp
@@ -5,7 +5,7 @@
   ProjectProperties
   {
     ApplicationComponentName: 'ApplicationMacroPlanner'
-    BuildVersion: '2022.3.0.32'
+    BuildVersion: '2022.3.0.33'
     Description: 'Quintiq Macro Planner'
     ProjectKind: 'WebClient'
   }

--
Gitblit v1.9.3