From 42f46304bc28d9fb2bee770668b70204d877db93 Mon Sep 17 00:00:00 2001
From: yanweiyuan3 <yanweiyuan3@gmail.com>
Date: 星期五, 22 九月 2023 17:24:31 +0800
Subject: [PATCH] Merge branch 'dev_yy' into dev

---
 _Main/BL/Type_CustomerOrder/StaticMethod_LockUnlock.qbl                                                                              |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_PanelOrderLockHeader#545.def                                           |   16 +
 _var/_Main/ProjSettings/MacroPlannerWebApp/TypeConfigs/CustomerOrder.qtc                                                             |   20 ++
 _Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_ButtonOrderLockHeaderFresh_OnClick.def         |   18 +
 _Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderCustomerOrder_O.def |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_ListOrderLock#844.def                                                  |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderPlanDeliver_OnC.def |    2 
 _Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp                                                                      |    2 
 _Main/BL/Type_CustomerOrder/StaticMethod_CreateOrUpdate.qbl                                                                          |   31 ++
 _Main/UI/MacroPlannerWebApp/Views/OrderLock.vw                                                                                       |  451 ++++++++++++++++++++++++++++++++------------
 10 files changed, 415 insertions(+), 141 deletions(-)

diff --git a/_Main/BL/Type_CustomerOrder/StaticMethod_CreateOrUpdate.qbl b/_Main/BL/Type_CustomerOrder/StaticMethod_CreateOrUpdate.qbl
index e885859..3ec5f41 100644
--- a/_Main/BL/Type_CustomerOrder/StaticMethod_CreateOrUpdate.qbl
+++ b/_Main/BL/Type_CustomerOrder/StaticMethod_CreateOrUpdate.qbl
@@ -62,9 +62,34 @@
                                priorityName, salesSegmentName, currencyId, unitOfMeasureName, 
                                false, customerName, customerId, orderId, orderLineId, true, true, true );
     } else {
-        result.Update( product, stockingPoint, orderDate, quantity, price, 
-                       priorityName, salesSegmentName, currencyId, unitOfMeasureName, 
-                       false, customerName, customerId, orderId, orderLineId, true, true, true );
+        if( result.ProductID() = productId 
+            and result.StockingPointID() = stockingPointId 
+            and result.StartDate() = orderDate 
+            and result.Quantity() = quantity 
+            and result.Price() = price 
+            and result.PriorityName() = priorityName 
+            and result.SalesSegmentName() = salesSegmentName 
+            and result.CurrencyID() = currencyId 
+            and result.UnitOfMeasureName() = unitOfMeasureName 
+            and result.CustomerName() = customerName 
+            and result.CustomerID() = customerId 
+            and result.OrderID() = orderId 
+            and result.OrderLineID() = orderLineId ){
+              info( "No need to update this order: " + id );
+              }else{
+                if( result.IsLocked() = true ){
+                  pispips := selectset( result, ProductInStockingPoint_MP.ProductInStockingPointInPeriod, pispip, true );
+                  pispipLeafs := selectset( pispips, 
+                                            Elements.astype( ProductInStockingPointInPeriodPlanningLeaf ), 
+                                            pispip, 
+                                            true );
+                  ProductInStockingPointInPeriod::LockUnlockPlanning( pispipLeafs, false, true );
+                }
+                result.Update( product, stockingPoint, orderDate, quantity, price, 
+                               priorityName, salesSegmentName, currencyId, unitOfMeasureName, 
+                               false, customerName, customerId, orderId, orderLineId, true, true, true );
+                result.IsLocked( false );
+                }
     }
     return result;
   *]
diff --git a/_Main/BL/Type_CustomerOrder/StaticMethod_LockUnlock.qbl b/_Main/BL/Type_CustomerOrder/StaticMethod_LockUnlock.qbl
index 755761e..3126a57 100644
--- a/_Main/BL/Type_CustomerOrder/StaticMethod_LockUnlock.qbl
+++ b/_Main/BL/Type_CustomerOrder/StaticMethod_LockUnlock.qbl
@@ -20,7 +20,7 @@
         owner.OrderLockLog( relnew, 
                             CustomerName := order.CustomerName(), 
                             End := order.First().AsPlanningBaseSalesDemandInPeriod().End().Date(), 
-                            EndDate := order.EndDate(), 
+                            EndDate := order.StartDate(), 
                             IsLocked := order.IsLocked(), 
                             LastModify := order.LastModify(), 
                             LastModifyTime := order.LastModifyTime(), 
@@ -41,7 +41,7 @@
           owner.OrderLockLog( relnew, 
                               CustomerName := order.CustomerName(), 
                               End := order.First().AsPlanningBaseSalesDemandInPeriod().End().Date(), 
-                              EndDate := order.EndDate(), 
+                              EndDate := order.StartDate(), 
                               IsLocked := order.IsLocked(), 
                               LastModify := order.LastModify(), 
                               LastModifyTime := order.LastModifyTime(), 
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_ListOrderLock\043844.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_ListOrderLock\043844.def"
index 899294d..4aa7065 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_ListOrderLock\043844.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_ListOrderLock\043844.def"
@@ -29,7 +29,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderID","title":"OrderID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"ProductID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SalesSegmentName","title":"SalesSegmentName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SalesSegmentName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPointID","title":"StockingPointID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StockingPointID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerName","title":"CustomerName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Quantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UnitOfMeasureName","title":"UnitOfMeasureName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"UnitOfMeasureName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Price","title":"Price","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Price"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EndDate","title":"EndDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EndDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IsLocked","title":"IsLocked","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IsLocked"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"First.AsPlanningBaseSalesDemandInPeriod.End","title":"End","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"First.AsPlanningBaseSalesDemandInPeriod.End"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"LastModify","title":"LastModify","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"LastModify"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"LastModifyTime","title":"LastModifyTime","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"LastModifyTime"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderID","title":"OrderID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"ProductID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SalesSegmentName","title":"SalesSegmentName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SalesSegmentName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPointID","title":"StockingPointID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StockingPointID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerName","title":"CustomerName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Quantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UnitOfMeasureName","title":"UnitOfMeasureName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"UnitOfMeasureName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Price","title":"Price","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Price"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"StartDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IsLocked","title":"IsLocked","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IsLocked"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"First.AsPlanningBaseSalesDemandInPeriod.End","title":"End","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"First.AsPlanningBaseSalesDemandInPeriod.End"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"LastModify","title":"LastModify","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"LastModify"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"LastModifyTime","title":"LastModifyTime","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"LastModifyTime"}}]'
         ContextMenu: 'listContextMenuOrderLock'
         Taborder: 2
       ]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_PanelOrderLockHeader\043545.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_PanelOrderLockHeader\043545.def"
index 4ff0600..26dee9c 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_PanelOrderLockHeader\043545.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_PanelOrderLockHeader\043545.def"
@@ -87,7 +87,7 @@
         ButtonSize: 'compact'
         Description: '璁㈠崟閿佸畾'
         Label: '閿佸畾'
-        Taborder: 7
+        Taborder: 8
       ]
     }
     Component ButtonOrderLockHeaderUnlock
@@ -99,7 +99,7 @@
         ButtonSize: 'compact'
         Description: '璁㈠崟瑙i攣'
         Label: '瑙i攣'
-        Taborder: 8
+        Taborder: 9
       ]
     }
     Component ButtonOrderLockHeaderClear
@@ -114,6 +114,18 @@
         Taborder: 6
       ]
     }
+    Component ButtonOrderLockHeaderFresh
+    {
+      #keys: '[412960.0.259721852]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        ButtonSize: 'compact'
+        Description: '浠庢暟鎹簮鍒锋柊璁㈠崟鏁版嵁'
+        Label: '閲嶆柊鑾峰彇璁㈠崟'
+        Taborder: 7
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_ButtonOrderLockHeaderFresh_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_ButtonOrderLockHeaderFresh_OnClick.def
new file mode 100644
index 0000000..b6057a9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_ButtonOrderLockHeaderFresh_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: PanelOrderLockHeader_545/ButtonOrderLockHeaderFresh
+Response OnClick () id:Response_PanelOrderLockHeader_545_ButtonOrderLockHeaderFresh_OnClick
+{
+  #keys: '[412960.0.259721886]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      macroplan := MacroPlan;
+      businesstypes := DataHolderOrderLockGlobal.Data().BusinessType().Tokenize( ',' );
+      CustomerOrder::DoSync( macroplan, businesstypes );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderCustomerOrder_O.def b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderCustomerOrder_O.def
index 5fa0f71..bef1aa1 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderCustomerOrder_O.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderCustomerOrder_O.def
@@ -19,11 +19,11 @@
       newfilter := "";
       findcount := 0;
       traverse( existfilterlist, Elements, filter ){
-        if( filter.FindString( "EndDate()", 0 ) >= 0 ){
+        if( filter.FindString( "StartDate()", 0 ) >= 0 ){
           if( newfilter = "" ){
-            newfilter := "( object.EndDate() = " + this.Date().AsQUILL() + " )";
+            newfilter := "( object.StartDate() = " + this.Date().AsQUILL() + " )";
             }else{
-              newfilter := newfilter + " and " + "( object.EndDate() = " + this.Date().AsQUILL() + " )";
+              newfilter := newfilter + " and " + "( object.StartDate() = " + this.Date().AsQUILL() + " )";
               }
           findcount := 1;
           }else{
@@ -37,9 +37,9 @@
       
       if( findcount = 0 ){
         if( newfilter = "" ){
-          newfilter := "( object.EndDate() = " + this.Date().AsQUILL() + " )";
+          newfilter := "( object.StartDate() = " + this.Date().AsQUILL() + " )";
           }else{
-            newfilter := newfilter + " and " + "( object.EndDate() = " + this.Date().AsQUILL() + " )";
+            newfilter := newfilter + " and " + "( object.StartDate() = " + this.Date().AsQUILL() + " )";
             }
         }
       
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderPlanDeliver_OnC.def b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderPlanDeliver_OnC.def
index a5fda9c..4680617 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderPlanDeliver_OnC.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderPlanDeliver_OnC.def
@@ -19,7 +19,7 @@
       newfilter := "";
       findcount := 0;
       traverse( existfilterlist, Elements, filter ){
-        if( filter.FindString( "End()", 0 ) >= 0 and filter.FindString( "EndDate()", 0 ) < 0 ){
+        if( filter.FindString( "End()", 0 ) >= 0 ){
           if( newfilter = "" ){
             newfilter := "( object.First().AsPlanningBaseSalesDemandInPeriod().End().Date() = " + this.Date().AsQUILL() + " )";
             }else{
diff --git a/_Main/UI/MacroPlannerWebApp/Views/OrderLock.vw b/_Main/UI/MacroPlannerWebApp/Views/OrderLock.vw
index 0cae0ba..a309668 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/OrderLock.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/OrderLock.vw
@@ -4,204 +4,403 @@
   {
     forms
     {
-      form_legacy_1
+      form_FormOrderLockLog
       {
-        title: 'Scenario manager'
+        title: 'QTIANMA_JITUAN::FormOrderLockLog'
         shown: true
-        componentID: 'FormScenarioManager'
+        componentID: 'QTIANMA_JITUAN::FormOrderLockLog'
         layout
         {
           mode: 'open'
-          rowPosition: 1
+          rowPosition: 14
           rowSpan: 8
           columnPosition: 1
-          columnSpan: 5
+          columnSpan: 12
         }
         components
         {
-          FormScenarioManager_ListScenario
+          FormOrderLockLog_PanelOrderLockLog
+          {
+            sizeRatio: 1
+          }
+          FormOrderLockLog_ListOrderLockLog
           {
           }
-          FormScenarioManager_DataSetLevelScenario
+          FormOrderLockLog_DataSetLevelOrderLockLog
           {
             groupDepth: -1
-            column_All_constraints
+            sort: 'DESC:Notes'
+            column_OrderID
             {
-              columnId: 'All constraints'
-              dataPath: 'All constraints'
+              columnId: 'OrderID'
+              dataPath: 'OrderID'
               dataType: 'string'
-              title: 'All constraints'
+              title: '璁㈠崟鍙�'
               index: 0
               subtotals: ''
-              width: 90
+              width: 150
             }
-            column_Name
+            column_ProductID
             {
-              columnId: 'Name'
-              dataPath: 'Name'
+              columnId: 'ProductID'
+              dataPath: 'ProductID'
               dataType: 'string'
-              title: '鍚嶇О'
+              title: '鐗╂枡鍙�'
               index: 1
               subtotals: ''
-              width: 277
+              width: 150
             }
-            column_ChangedBy
+            column_SalesSegmentName
             {
-              columnId: 'ChangedBy'
-              dataPath: 'ChangedBy'
+              columnId: 'SalesSegmentName'
+              dataPath: 'SalesSegmentName'
               dataType: 'string'
-              title: 'Changed by'
+              title: '閿�鍞儴闂�'
               index: 2
               subtotals: ''
-              width: 106
+              width: 150
             }
-            column_ChangedOn
+            column_StockingPointID
             {
-              columnId: 'ChangedOn'
-              dataPath: 'ChangedOn'
-              dataType: 'datetime'
-              title: 'Changed on'
-              index: 3
-              subtotals: ''
-              width: 99
-            }
-            column_StorageMode
-            {
-              columnId: 'StorageMode'
-              dataPath: 'StorageMode'
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
               dataType: 'string'
-              title: 'StorageMode'
-              index: 4
-              subtotals: ''
-              width: 40
-            }
-          }
-        }
-      }
-      form_legacy_2
-      {
-        title: 'Assumptions'
-        shown: true
-        componentID: 'FormAssumptions'
-        layout
-        {
-          mode: 'open'
-          rowPosition: 9
-          rowSpan: 8
-          columnPosition: 1
-          columnSpan: 5
-        }
-        components
-        {
-          FormAssumptions_ListAssumptions
-          {
-          }
-          FormAssumptions_DataSetLevelAssumptions
-          {
-            groupDepth: -1
-            column_All_constraints
-            {
-              columnId: 'All constraints'
-              dataPath: 'All constraints'
-              dataType: 'string'
-              title: 'All constraints'
-              index: 0
-              subtotals: ''
-              width: 32
-            }
-            column_Category
-            {
-              columnId: 'Category'
-              dataPath: 'Category'
-              dataType: 'string'
-              title: '绫诲埆'
-              index: 1
-              subtotals: ''
-              width: 108
-            }
-            column_Importance
-            {
-              columnId: 'Importance'
-              dataPath: 'Importance'
-              dataType: 'string'
-              title: '閲嶈鎬�'
-              index: 2
-              subtotals: ''
-              width: 110
-            }
-            column_Title
-            {
-              columnId: 'Title'
-              dataPath: 'Title'
-              dataType: 'string'
-              title: '鏍囬'
+              title: '搴撳瓨鐐�'
               index: 3
               subtotals: ''
               width: 150
             }
-            column_ChangedBy
+            column_CustomerName
             {
-              columnId: 'ChangedBy'
-              dataPath: 'ChangedBy'
+              columnId: 'CustomerName'
+              dataPath: 'CustomerName'
               dataType: 'string'
-              title: 'Changed by'
+              title: '瀹㈡埛鍚嶇О'
               index: 4
               subtotals: ''
               width: 150
             }
-            column_CreatedOn
+            column_Quantity
             {
-              columnId: 'CreatedOn'
-              dataPath: 'CreatedOn'
-              dataType: 'datetime'
-              title: 'Created on'
+              columnId: 'Quantity'
+              dataPath: 'Quantity'
+              dataType: 'real'
               index: 5
               subtotals: ''
               width: 150
             }
+            column_UnitOfMeasureName
+            {
+              columnId: 'UnitOfMeasureName'
+              dataPath: 'UnitOfMeasureName'
+              dataType: 'string'
+              title: '鍗曚綅'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_Price
+            {
+              columnId: 'Price'
+              dataPath: 'Price'
+              dataType: 'real'
+              title: '閿�鍞'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_EndDate
+            {
+              columnId: 'EndDate'
+              dataPath: 'EndDate'
+              dataType: 'date'
+              title: '瀹㈡埛闇�姹傛椂闂�'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_IsLocked
+            {
+              columnId: 'IsLocked'
+              dataPath: 'IsLocked'
+              dataType: 'boolean'
+              title: '鐘舵��'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+            column_End
+            {
+              columnId: 'End'
+              dataPath: 'End'
+              dataType: 'date'
+              title: '璁″垝浜や粯鏃堕棿'
+              index: 10
+              subtotals: ''
+              width: 150
+            }
+            column_LastModify
+            {
+              columnId: 'LastModify'
+              dataPath: 'LastModify'
+              dataType: 'string'
+              title: '鏈�鍚庢搷浣滀汉'
+              index: 11
+              subtotals: ''
+              width: 150
+            }
+            column_LastModifyTime
+            {
+              columnId: 'LastModifyTime'
+              dataPath: 'LastModifyTime'
+              dataType: 'datetime'
+              title: '鏈�鍚庢搷浣滄椂闂�'
+              index: 12
+              subtotals: ''
+              width: 145
+            }
+            column_Notes
+            {
+              columnId: 'Notes'
+              dataPath: 'Notes'
+              dataType: 'string'
+              title: '鎿嶄綔璇︽儏'
+              index: 13
+              subtotals: ''
+              width: 150
+            }
           }
         }
       }
-      form_FormScenariosKPIsComparison
+      form_FormOrderLock
       {
-        title: 'QLibMacroPlannerWebUI::FormScenariosKPIsComparison'
+        title: 'QTIANMA_JITUAN::FormOrderLock'
         shown: true
-        componentID: 'QLibMacroPlannerWebUI::FormScenariosKPIsComparison'
+        componentID: 'QTIANMA_JITUAN::FormOrderLock'
         layout
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 16
-          columnPosition: 6
-          columnSpan: 7
+          rowSpan: 13
+          columnPosition: 1
+          columnSpan: 12
         }
         components
         {
-          FormScenariosKPIsComparison_MatrixEditorFinancialKPIs
+          FormOrderLock_PanelOrderLock
+          {
+            sizeRatio: 1
+          }
+          FormOrderLock_PanelOrderLockHeader
+          {
+            sizeRatio: 1
+          }
+          FormOrderLock_PanelOrderLockOrder
+          {
+            sizeRatio: 1
+          }
+          FormOrderLock_ListOrderLock
+          {
+          }
+          FormOrderLock_DataSetLevelOrderLock
+          {
+            groupDepth: -1
+            sort: 'StartDate'
+            column_OrderID
+            {
+              columnId: 'OrderID'
+              dataPath: 'OrderID'
+              dataType: 'string'
+              title: '璁㈠崟鍙�'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_ProductID
+            {
+              columnId: 'ProductID'
+              dataPath: 'ProductID'
+              dataType: 'string'
+              title: '鐗╂枡鍙�'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_SalesSegmentName
+            {
+              columnId: 'SalesSegmentName'
+              dataPath: 'SalesSegmentName'
+              dataType: 'string'
+              title: '閿�鍞儴闂�'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_StockingPointID
+            {
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
+              dataType: 'string'
+              title: '搴撳瓨鐐�'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_CustomerName
+            {
+              columnId: 'CustomerName'
+              dataPath: 'CustomerName'
+              dataType: 'string'
+              title: '瀹㈡埛鍚嶇О'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_Quantity
+            {
+              columnId: 'Quantity'
+              dataPath: 'Quantity'
+              dataType: 'real'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_UnitOfMeasureName
+            {
+              columnId: 'UnitOfMeasureName'
+              dataPath: 'UnitOfMeasureName'
+              dataType: 'string'
+              title: '鍗曚綅'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_Price
+            {
+              columnId: 'Price'
+              dataPath: 'Price'
+              dataType: 'real'
+              title: '閿�鍞'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_StartDate
+            {
+              columnId: 'StartDate'
+              dataPath: 'StartDate'
+              dataType: 'date'
+              title: '瀹㈡埛闇�姹傛椂闂�'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_IsLocked
+            {
+              columnId: 'IsLocked'
+              dataPath: 'IsLocked'
+              dataType: 'boolean'
+              title: '鐘舵��'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+            column_First_AsPlanningBaseSalesDemandInPeriod_End
+            {
+              columnId: 'First.AsPlanningBaseSalesDemandInPeriod.End'
+              dataPath: 'First.AsPlanningBaseSalesDemandInPeriod.End'
+              dataType: 'datetime'
+              title: '璁″垝浜や粯鏃堕棿'
+              index: 10
+              subtotals: ''
+              width: 150
+            }
+            column_LastModify
+            {
+              columnId: 'LastModify'
+              dataPath: 'LastModify'
+              dataType: 'string'
+              title: '鏈�鍚庢搷浣滀汉'
+              index: 11
+              subtotals: ''
+              width: 150
+            }
+            column_LastModifyTime
+            {
+              columnId: 'LastModifyTime'
+              dataPath: 'LastModifyTime'
+              dataType: 'datetime'
+              title: '鏈�鍚庢搷浣滄椂闂�'
+              index: 12
+              subtotals: ''
+              width: 150
+            }
+          }
+          FormOrderLock_PanelOrderLockPlanning
+          {
+            sizeRatio: 1
+          }
+          FormOrderLock_PanelMatrix
+          {
+            sizeRatio: 1
+          }
+          FormOrderLock_MatrixEditorProductPlanning
           {
             gridColor: '#c4c4c4'
-            totalHeaderWidth: 200
-            attributeHeaderWidthRatio: 0.6
-            nameHeaderWidthRatio: 0.4
+            totalHeaderWidth: 427
+            attributeHeaderWidthRatio: 0.325989701966572
+            nameHeaderWidthRatio: 0.674010298033429
             columnWidth: 100
             horizontalGrid: true
             verticalGrid: true
             backendState
             {
-              componentId: 'QLibMacroPlannerWebUI::FormScenariosKPIsComparison.MatrixEditorFinancialKPIs'
+              componentId: 'QTIANMA_JITUAN::FormOrderLock.MatrixEditorProductPlanning'
               state
               {
                 cells
                 {
                   attributes
                   {
-                    attribute_DisplayValue
+                    attribute_DisplaySupplyQuantity
                     {
                       type: 'MatrixEditorWebApiCellDataModelInterest'
                       index: 0
                       rowsubtotal: ''
                       columnsubtotal: ''
-                      attribute: 'DisplayValue'
+                      attribute: 'DisplaySupplyQuantity'
+                    }
+                    attribute_DependentDemandAndSalesDemandQuantity
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 1
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'DependentDemandAndSalesDemandQuantity'
+                    }
+                    attribute_TargetInventoryLevel
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 2
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'TargetInventoryLevel'
+                    }
+                    attribute_InventoryLevelEnd
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 3
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'InventoryLevelEnd'
+                    }
+                    attribute_StockLevelInDays
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 4
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'StockLevelInDays'
                     }
                   }
                 }
@@ -209,14 +408,14 @@
                 {
                   sorting
                   {
-                    criteria: ''
+                    criteria: "datamember:'Start'"
                   }
                 }
                 rows
                 {
                   sorting
                   {
-                    criteria: "datamember:'KPISetting.DisplayIndex'"
+                    criteria: "datamember:'Product_MP.DisplayIndex';datamember:'Name'"
                   }
                 }
               }
@@ -337,10 +536,10 @@
     userconfigurableinformation
     {
     }
-    index: 2
-    image: 'DOCUMENT_LOCK'
     page: 'applicationDevelopmentActionBarPageDef'
     group: ''
+    index: 2
+    image: 'DOCUMENT_LOCK'
     description: ''
   }
   formatversion: 2
diff --git a/_Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp b/_Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp
index cb94597..8c974b9 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.250'
     Description: 'Quintiq Macro Planner'
     ProjectKind: 'WebClient'
   }
diff --git a/_var/_Main/ProjSettings/MacroPlannerWebApp/TypeConfigs/CustomerOrder.qtc b/_var/_Main/ProjSettings/MacroPlannerWebApp/TypeConfigs/CustomerOrder.qtc
new file mode 100644
index 0000000..9fe1031
--- /dev/null
+++ b/_var/_Main/ProjSettings/MacroPlannerWebApp/TypeConfigs/CustomerOrder.qtc
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+{
+  SelectableAttributes
+  {
+    ID
+    {
+      attribute: 'ID'
+      isactive: true
+    }
+    IsLocked
+    {
+      attribute: 'IsLocked'
+      isactive: true
+    }
+  }
+  meta_
+  {
+    type: 'CustomerOrder'
+  }
+}

--
Gitblit v1.9.3