From b8e189bb0717177f36b35b961e58c26470b5aceb Mon Sep 17 00:00:00 2001
From: lihongji <3117313295@qq.com>
Date: 星期二, 18 六月 2024 17:31:37 +0800
Subject: [PATCH] 产线整班
---
_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Method_OnOK.def | 14
_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsGreaterThanOneDay.qbl | 71 +++
_Main/BL/Type_WholeShift/StaticMethod_OnServerStartup.qbl | 23 +
_Main/BL/Type_WholeShift/_ROOT_Type_WholeShift.qbl | 9
_Main/BL/Type_MacroPlan/Attribute_CylinderBlock.qbl | 8
_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902#1.def | 22 +
_Main/BL/Dataset_WholeShift/_ROOT_Dataset_WholeShift.qbl | 9
_Main/BL/Type_MacroPlan/Attribute_Crankshaft.qbl | 8
_Main/BL/Type_TempDependentDemandInputGroup/Attribute_Divisor.qbl | 7
_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def | 4
_Main/Sys/ImgAttr/Entity.dme | 25 +
_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuWholeShift_OnClick.def | 16
_Main/BL/Type_TempDependentDemandInputGroup/Attribute_ProductInStockingName.qbl | 7
_Main/BL/Type_TempDependentDemandInputGroup/Attribute_id.qbl | 7
_Main/BL/Type_MacroPlan/Attribute_BalanceAxis.qbl | 8
_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnCancel_OnClick#836.def | 15
_Main/BL/Type_WholeShift/Method_ZeroCapacityReplenishment.qbl | 100 +++++
_Main/BL/Type_TempDependentDemandInputGroup/Attribute_UnitID.qbl | 7
_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlActions.def | 40 ++
_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsLeft_522_bTransferMinimumQuantity_OnClick.def | 22 +
_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def | 4
_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnOk_OnClick.def | 2
_Main/BL/Type_MacroPlan/Attribute_CylinderHead.qbl | 8
_Main/BL/Type_WholeShift/Method_CapacityRounding.qbl | 114 ++++++
_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnCancel_OnClick.def | 2
_Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl | 3
_Main/BL/Type_WholeShift/Method_PostProcessing2.qbl | 55 ++
_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mDisable_OnClick.def | 18
_Main/BL/Type_TempDependentDemandInputGroup/_ROOT_Type_TempDependentDemandInputGroup.qbl | 9
_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlContent.def | 69 +++
_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/_ROOT_Component_DialogTransferMinimumQuantity.def | 21 +
_Main/BL/Type_TempDependentDemandInputGroup/Attribute_PeriodTask.qbl | 7
_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsEqualToOneDay.qbl | 42 ++
_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def | 4
_Main/BL/Relations/Relation_TempDependentDemandInputGroup_MacroPlan_MacroPlan_TempDependentDema.qbl | 23 +
_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfRoundingLogic.qbl | 40 ++
_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfComplementZeroLogic.qbl | 40 ++
_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnOk_OnClick#393.def | 15
_Main/BL/Type_WholeShift/StaticMethod_GenerateDailyCapacity.qbl | 103 +++++
_Main/BL/Type_WholeShift/Method_IsRoundingOrZeroFilling3.qbl | 22 +
_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def | 23 -
_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgWholeShiftSystem_bWholeShiftSystem_OnClick.def | 4
_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsLeft#522.def | 24 +
_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mEnable_OnClick.def | 18
_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsRight#106.def | 36 +
_Main/BL/Type_MacroPlan/Attribute_ConnectingRod.qbl | 8
46 files changed, 1,109 insertions(+), 27 deletions(-)
diff --git a/_Main/BL/Dataset_WholeShift/_ROOT_Dataset_WholeShift.qbl b/_Main/BL/Dataset_WholeShift/_ROOT_Dataset_WholeShift.qbl
new file mode 100644
index 0000000..0d68045
--- /dev/null
+++ b/_Main/BL/Dataset_WholeShift/_ROOT_Dataset_WholeShift.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Dataset WholeShift
+{
+ #keys: '2[413988.0.1256611421][413988.0.1256611420]'
+ DefaultMDSName: 'WholeShift'
+ InstanceType: WholeShift
+}
diff --git a/_Main/BL/Relations/Relation_TempDependentDemandInputGroup_MacroPlan_MacroPlan_TempDependentDema.qbl b/_Main/BL/Relations/Relation_TempDependentDemandInputGroup_MacroPlan_MacroPlan_TempDependentDema.qbl
new file mode 100644
index 0000000..b7a175e
--- /dev/null
+++ b/_Main/BL/Relations/Relation_TempDependentDemandInputGroup_MacroPlan_MacroPlan_TempDependentDema.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation TempDependentDemandInputGroup_MacroPlan_MacroPlan_TempDependentDemandInputGroup
+{
+ #keys: '1[413988.0.1270630140]'
+ DefaultRelationStrategy
+ {
+ }
+ RelationSide.LeftSide MacroPlan
+ {
+ #keys: '3[413988.0.1270630142][413988.0.1270630141][413988.0.1270630143]'
+ Cardinality: '0to1'
+ ObjectDefinition: TempDependentDemandInputGroup
+ OwningSide: 'Reference'
+ }
+ RelationSide.RightSide TempDependentDemandInputGroup
+ {
+ #keys: '3[413988.0.1270630145][413988.0.1270630144][413988.0.1270630146]'
+ Cardinality: '1toN'
+ ObjectDefinition: MacroPlan
+ OwningSide: 'Owned'
+ }
+}
diff --git a/_Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl b/_Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl
index 2ef99c2..1a87719 100644
--- a/_Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl
+++ b/_Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl
@@ -21,6 +21,9 @@
// 鍒涘缓鎺ュ彛鏁版嵁闆�
InterfaceDataset::OnServerStartup();
+ // 鏁寸彮鏁版嵁闆�
+ WholeShift::OnServerStartup();
+
// Create MPDomainHandler
MPDomainHandler::OnServerStartup();
diff --git a/_Main/BL/Type_MacroPlan/Attribute_BalanceAxis.qbl b/_Main/BL/Type_MacroPlan/Attribute_BalanceAxis.qbl
new file mode 100644
index 0000000..da143c4
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_BalanceAxis.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BalanceAxis
+{
+ #keys: '3[413988.0.1273364842][413988.0.1273364841][413988.0.1273364843]'
+ Description: '骞宠 杞�'
+ ValueType: Number
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_ConnectingRod.qbl b/_Main/BL/Type_MacroPlan/Attribute_ConnectingRod.qbl
new file mode 100644
index 0000000..4c7e78b
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_ConnectingRod.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ConnectingRod
+{
+ #keys: '3[413988.0.1273364822][413988.0.1273364821][413988.0.1273364823]'
+ Description: '杩炴潌'
+ ValueType: Number
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_Crankshaft.qbl b/_Main/BL/Type_MacroPlan/Attribute_Crankshaft.qbl
new file mode 100644
index 0000000..2daaf0d
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_Crankshaft.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Crankshaft
+{
+ #keys: '3[413988.0.1273364832][413988.0.1273364831][413988.0.1273364833]'
+ Description: '鏇茶酱'
+ ValueType: Number
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_CylinderBlock.qbl b/_Main/BL/Type_MacroPlan/Attribute_CylinderBlock.qbl
new file mode 100644
index 0000000..5ab0fea
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_CylinderBlock.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CylinderBlock
+{
+ #keys: '3[413988.0.1273381359][413988.0.1273381358][413988.0.1273381360]'
+ Description: '缂镐綋'
+ ValueType: Number
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_CylinderHead.qbl b/_Main/BL/Type_MacroPlan/Attribute_CylinderHead.qbl
new file mode 100644
index 0000000..a820e46
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_CylinderHead.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CylinderHead
+{
+ #keys: '3[413988.0.1273364812][413988.0.1273364811][413988.0.1273364813]'
+ Description: '缂哥洊'
+ ValueType: Number
+}
diff --git a/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_Divisor.qbl b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_Divisor.qbl
new file mode 100644
index 0000000..e07f7b0
--- /dev/null
+++ b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_Divisor.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Divisor
+{
+ #keys: '3[413988.0.1270554768][413988.0.1270554767][413988.0.1270554769]'
+ ValueType: Real
+}
diff --git a/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_PeriodTask.qbl b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_PeriodTask.qbl
new file mode 100644
index 0000000..7ff3131
--- /dev/null
+++ b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_PeriodTask.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute PeriodTask
+{
+ #keys: '3[413988.0.1270554778][413988.0.1270554777][413988.0.1270554779]'
+ ValueType: String
+}
diff --git a/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_ProductInStockingName.qbl b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_ProductInStockingName.qbl
new file mode 100644
index 0000000..befbf6a
--- /dev/null
+++ b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_ProductInStockingName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductInStockingName
+{
+ #keys: '3[413988.0.1270630162][413988.0.1270630161][413988.0.1270630163]'
+ ValueType: String
+}
diff --git a/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_UnitID.qbl b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_UnitID.qbl
new file mode 100644
index 0000000..2c318be
--- /dev/null
+++ b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_UnitID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute UnitID
+{
+ #keys: '3[413988.0.1270630172][413988.0.1270630171][413988.0.1270630173]'
+ ValueType: String
+}
diff --git a/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_id.qbl b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_id.qbl
new file mode 100644
index 0000000..288e978
--- /dev/null
+++ b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_id.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ID
+{
+ #keys: '3[413988.0.1270554752][413988.0.1270554751][413988.0.1270554753]'
+ ValueType: String
+}
diff --git a/_Main/BL/Type_TempDependentDemandInputGroup/_ROOT_Type_TempDependentDemandInputGroup.qbl b/_Main/BL/Type_TempDependentDemandInputGroup/_ROOT_Type_TempDependentDemandInputGroup.qbl
new file mode 100644
index 0000000..c115f06
--- /dev/null
+++ b/_Main/BL/Type_TempDependentDemandInputGroup/_ROOT_Type_TempDependentDemandInputGroup.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type TempDependentDemandInputGroup
+{
+ #keys: '5[413988.0.1270630137][413988.0.1270630135][0.0.0][413988.0.1270630136][413988.0.1270630138]'
+ BaseType: Object
+ StructuredName: 'TempDependentDemandInputGroups'
+}
diff --git a/_Main/BL/Type_WholeShift/Method_CapacityRounding.qbl b/_Main/BL/Type_WholeShift/Method_CapacityRounding.qbl
new file mode 100644
index 0000000..a795b24
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_CapacityRounding.qbl
@@ -0,0 +1,114 @@
+Quintiq file version 2.0
+#parent: #root
+Method CapacityRounding (
+ MacroPlan macroPlan,
+ Real timeDifference,
+ UnitPeriodTimeBase uptb,
+ UnitPeriodTimeBases uptbs
+)
+{
+ TextBody:
+ [*
+ debuginfo( "闇�瑕佸渾鏁寸殑鏃堕棿锛堝崟浣嶏細灏忔椂锛�", timeDifference, " 闇�瑕佸渾鏁寸殑浜ц兘鍛ㄦ湡鐨勫紑濮嬫椂闂达細", uptb.StartDate().Format( "Y-M2-D2" ) );
+ nextUnitPeriodTimeBase := ifexpr( isnull( uptb.Next().astype( UnitPeriodTimeBase ) ), select( uptbs, Elements, tempUPTB, tempUPTB.Start() = uptb.End() ), uptb.Next().astype( UnitPeriodTimeBase ) );
+ //debuginfo( "鑰冭檻搴撳瓨鍜宭otsize" );
+ //while ( timeDifference > 0 and not isnull( nextUnitPeriodTimeBase ) ) {
+ // debuginfo( "寮�濮嬪悜鏃堕棿涓猴細", nextUnitPeriodTimeBase.StartDate().Format( "Y-M2-D2" ), "鐨勪骇鑳藉懆鏈熷��" );
+ //
+ // traverse ( nextUnitPeriodTimeBase, PeriodTaskOperation, pto, guard( pto.Operation().RoutingStep().Routing().Start(), uptb.StartDate() ) <= uptb.StartDate() and
+ // guard( pto.Operation().RoutingStep().Routing().End(), uptb.End().Date() ) >= uptb.End().Date() and
+ // timeDifference > 0 ) {
+ // minimumQuantityThatCanBeBorrowed := Real::MaxReal();
+ // minimumCapacityThatCanBeBorrowed := Real::MaxReal();
+ // traverse ( pto, NewSupply, ns, true ) {
+ // targetBorrowSplitShiftLotsizeLimit := select( scenarioManager, SplitShiftLotsizeLimit, tempSSLL, tempSSLL.unitID() = unitPeriodTimeBase.UnitID() and
+ // tempSSLL.productID() = ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID() and
+ // tempSSLL.startTime() <= ns.Start().Date() and
+ // tempSSLL.endTime() >= ns.End().Date() );
+ // minimumQuantityThatCanBeBorrowed := minvalue(
+ // minvalue( ifexpr( not isnull( targetBorrowSplitShiftLotsizeLimit ) and targetBorrowSplitShiftLotsizeLimit.lotsize() < ns.Quantity(),
+ // ns.Quantity() - targetBorrowSplitShiftLotsizeLimit.lotsize(),
+ // Real::MaxReal() ),
+ // minvalue(
+ // ifexpr( ( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ) > 0,
+ // ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel(),
+ // 0.0
+ // ),
+ // ns.Quantity()
+ // )
+ // ),
+ // minimumCapacityThatCanBeBorrowed
+ // );
+ // debuginfo( "nextUnitPeriodTimeBase鐨勫綋鍓嶅懆鏈熶换鍔′緵搴旂殑浜у搧鍚嶏細", ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID(), String::Tab(),
+ // "鏈�灏忓簱瀛橈細", ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel(), String::Tab(),
+ // "鐜版湁搴撳瓨锛�", ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd(), String::Tab(),
+ // "渚涘簲鏁伴噺锛�", ns.Quantity(), String::Tab(),
+ // "鏄惁瀛樺湪lotsize锛�", ifexpr( isnull( targetBorrowSplitShiftLotsizeLimit ), "涓嶅瓨鍦�", "瀛樺湪" ), String::Tab(),
+ // "lotsize鏁伴噺锛�", ifexpr( isnull( targetBorrowSplitShiftLotsizeLimit ), -1, targetBorrowSplitShiftLotsizeLimit.lotsize() )
+ // );
+ //
+ // sourceProductInStockingPointInPeriodPlanningLeaf := select( ns, ProductInStockingPointInPeriodPlanningLeaf.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), tempPISPIPPL, tempPISPIPPL.Start() = unitPeriodTimeBase.Start() );
+ // sourceNewSupply := select( sourceProductInStockingPointInPeriodPlanningLeaf, NewSupply, tempNS, tempNS.Process_MP().AsProcess_MP().ID() = unitPeriodTimeBase.UnitID() );
+ // targetReturnSplitShiftLotsizeLimit := select( scenarioManager, SplitShiftLotsizeLimit, tempSSLL, tempSSLL.unitID() = unitPeriodTimeBase.UnitID() and
+ // tempSSLL.productID() = sourceProductInStockingPointInPeriodPlanningLeaf.ProductInStockingPoint_MP().ProductID() and
+ // tempSSLL.startTime() <= sourceProductInStockingPointInPeriodPlanningLeaf.Start().Date() and
+ // tempSSLL.endTime() >= sourceProductInStockingPointInPeriodPlanningLeaf.End().Date() );
+ // minimumAcceptableQuantity := minvalue( ifexpr( not isnull( targetReturnSplitShiftLotsizeLimit ) and not isnull( sourceNewSupply ) and targetReturnSplitShiftLotsizeLimit.lotsize() > sourceNewSupply.Quantity(),
+ // targetReturnSplitShiftLotsizeLimit.lotsize() - sourceNewSupply.Quantity(),
+ // Real::MaxReal()
+ // ),
+ // ifexpr( ( sourceProductInStockingPointInPeriodPlanningLeaf.MaxInventoryLevel() - sourceProductInStockingPointInPeriodPlanningLeaf.InventoryLevelEnd() ) > 0,
+ // sourceProductInStockingPointInPeriodPlanningLeaf.MaxInventoryLevel() - sourceProductInStockingPointInPeriodPlanningLeaf.InventoryLevelEnd(),
+ // 0.0
+ // )
+ // );
+ // debuginfo( "瑕佸渾鏁寸殑鏃堕棿锛�", sourceProductInStockingPointInPeriodPlanningLeaf.Start().Date().Format( "Y-M2-D2" ), String::Tab(),
+ // "瑕佸渾鏁寸殑鏈�澶у簱瀛橈細", sourceProductInStockingPointInPeriodPlanningLeaf.MaxInventoryLevel(), String::Tab(),
+ // "瑕佸渾鏁寸殑鐜版湁搴撳瓨锛�", sourceProductInStockingPointInPeriodPlanningLeaf.InventoryLevelEnd(), String::Tab(),
+ // "瑕佸渾鏁寸殑渚涘簲鏁伴噺锛�", guard( sourceNewSupply.Quantity(), 0 ), String::Tab(),
+ // "鏄惁瀛樺湪lotsize锛�", ifexpr( isnull( targetReturnSplitShiftLotsizeLimit ), "涓嶅瓨鍦�", "瀛樺湪" ), String::Tab(),
+ // "lotsize鏁伴噺锛�", ifexpr( isnull( targetReturnSplitShiftLotsizeLimit ), -1, targetReturnSplitShiftLotsizeLimit.lotsize() ), String::Tab(),
+ // "瑕佸渾鏁寸殑鏈�灏忔帴绾虫暟閲忥細", minimumAcceptableQuantity
+ // );
+ //
+ // minimumQuantityThatCanBeBorrowed := minvalue( minimumQuantityThatCanBeBorrowed, minimumAcceptableQuantity );
+ // }
+ // debuginfo( "nextUnitPeriodTimeBase鐨勫綋鍓嶅懆鏈熶换鍔′緵搴旀暟閲忥細", pto.Quantity(), " 鍛ㄦ湡浠诲姟鑳藉�熺殑鏈�浣庢暟閲忥細", minimumQuantityThatCanBeBorrowed );
+ //
+ // minimumCapacityThatCanBeBorrowed := minimumQuantityThatCanBeBorrowed / pto.Operation().Throughput();
+ // unifiedProcessingTimeOfRounding := minvalue( timeDifference, minimumCapacityThatCanBeBorrowed );
+ // debuginfo( "鍓╀綑鍦嗘暣鐨勪骇鑳斤細", timeDifference, " nextUnitPeriodTimeBase鐨勫綋鍓嶅懆鏈熶换鍔′緵搴旀暟閲忥細", pto.Quantity(), " 鑳藉�熺殑浜ц兘锛�", minimumCapacityThatCanBeBorrowed, " 缁熶竴鍊熺殑浜ц兘锛�", unifiedProcessingTimeOfRounding );
+ // this.A_unifiedProcessingOfRoundingLogic( unifiedProcessingTimeOfRounding, unitPeriodTimeBase, pto, macroPlan );
+ // timeDifference := timeDifference - unifiedProcessingTimeOfRounding;
+ // }
+ //
+ // if ( isnull( nextUnitPeriodTimeBase.Next() ) ) {
+ // nextUnitPeriodTimeBase := select( unitPeriodTimeBases, Elements, tempUPTB, tempUPTB.Start() = nextUnitPeriodTimeBase.End() );
+ // } else {
+ // nextUnitPeriodTimeBase := nextUnitPeriodTimeBase.Next().astype( UnitPeriodTimeBase );
+ // }
+ // debuginfo( "銆傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘��" );
+ //}
+
+ debuginfo( "涓嶈�冭檻浠讳綍鏉′欢鍦嗘暣浣垮叾鍒拌揪鏁寸彮" );
+ nextUnitPeriodTimeBase := ifexpr( isnull( uptb.Next().astype( UnitPeriodTimeBase ) ), select( uptbs, Elements, tempUPTB, tempUPTB.Start() = uptb.End() ), uptb.Next().astype( UnitPeriodTimeBase ) );
+ while ( timeDifference > 0 and not isnull( nextUnitPeriodTimeBase ) ) {
+ debuginfo( "寮�濮嬪悜鏃堕棿涓猴細", nextUnitPeriodTimeBase.StartDate().Format( "Y-M2-D2" ), "鐨勪骇鑳藉懆鏈熷��" );
+ traverse ( nextUnitPeriodTimeBase, PeriodTaskOperation, pto, guard( pto.Operation().RoutingStep().Routing().Start(), uptb.StartDate() ) <= uptb.StartDate() and
+ guard( pto.Operation().RoutingStep().Routing().End(), uptb.End().Date() ) >= uptb.End().Date() and
+ timeDifference > 0 ) {
+ minimumCapacityThatCanBeBorrowed := pto.Quantity() / pto.Operation().Throughput();
+ unifiedProcessingTimeOfRounding := minvalue( timeDifference, minimumCapacityThatCanBeBorrowed );
+ debuginfo( "鍓╀綑鍦嗘暣鐨勪骇鑳斤細", timeDifference, " nextUnitPeriodTimeBase鐨勫綋鍓嶅懆鏈熶换鍔′緵搴旀暟閲忥細", pto.Quantity(), " 鑳藉�熺殑浜ц兘锛�", minimumCapacityThatCanBeBorrowed, " 缁熶竴鍊熺殑浜ц兘锛�", unifiedProcessingTimeOfRounding );
+ this.UnifiedProcessingOfRoundingLogic( unifiedProcessingTimeOfRounding, uptb, pto, macroPlan );
+ timeDifference := timeDifference - unifiedProcessingTimeOfRounding;
+ }
+
+ if ( isnull( nextUnitPeriodTimeBase.Next() ) ) {
+ nextUnitPeriodTimeBase := select( uptbs, Elements, tempUPTB, tempUPTB.Start() = nextUnitPeriodTimeBase.End() );
+ } else {
+ nextUnitPeriodTimeBase := nextUnitPeriodTimeBase.Next().astype( UnitPeriodTimeBase );
+ }
+ }
+ *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_IsRoundingOrZeroFilling3.qbl b/_Main/BL/Type_WholeShift/Method_IsRoundingOrZeroFilling3.qbl
new file mode 100644
index 0000000..54c3e30
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_IsRoundingOrZeroFilling3.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+Method IsRoundingOrZeroFilling3 (
+ MacroPlan macroPlan,
+ UnitPeriodTimeBases uptbs
+)
+{
+ TextBody:
+ [*
+ traverse ( uptbs, Elements, uptb, true ) {
+ if ( ( uptb.End().Date() - uptb.StartDate() ) > 1 ) {
+ debuginfo( "寮�濮嬫椂闂达細", uptb.StartDate().Format( "Y-M2-D2" ), " 缁撴潫鏃堕棿锛�", uptb.End().Date().Format( "Y-M2-D2" ), " 鏃堕棿鍖洪棿锛�", ( uptb.End().Date() - uptb.StartDate() ) );
+ this.ProcessingTimeIntervalIsGreaterThanOneDay( macroPlan, uptb, uptbs );
+ } else if ( ( uptb.End().Date() - uptb.StartDate() ) = 1 ) {
+ debuginfo( "寮�濮嬫椂闂达細", uptb.StartDate().Format( "Y-M2-D2" ), " 缁撴潫鏃堕棿锛�", uptb.End().Date().Format( "Y-M2-D2" ), " 鏃堕棿鍖洪棿锛�", ( uptb.End().Date() - uptb.StartDate() ) );
+ this.ProcessingTimeIntervalIsEqualToOneDay( macroPlan, uptb, uptbs );
+ }
+ debuginfo( "--------------------------------------------------------------------------------" );
+ Transaction::Transaction().Propagate();
+ }
+ *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_PostProcessing2.qbl b/_Main/BL/Type_WholeShift/Method_PostProcessing2.qbl
new file mode 100644
index 0000000..d1b5969
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_PostProcessing2.qbl
@@ -0,0 +1,55 @@
+Quintiq file version 2.0
+#parent: #root
+Method PostProcessing2 (
+ MacroPlan macroPlan
+)
+{
+ TextBody:
+ [*
+ // 浜х嚎鏁寸彮
+ traverse ( macroPlan, Unit, unit, unit.IsToFill() and unit.HasCapacityTypeTime() ) {
+ unitName := unit.Name();
+ debuginfo( "鏁寸彮浜х嚎: ", unitName );
+
+ // 鎸夋椂闂寸粰UnitPeriodTimeBase鎺掑簭
+ uptbs := selectsortedset( unit, UnitPeriod.astype( UnitPeriodTimeBase ), tempUPTB, not tempUPTB.IsPeriodFrozen() and tempUPTB.IsPlanning(), tempUPTB.Start() );
+
+ // 鍦嗘暣鎴栬ˉ闆跺綋鍓嶄骇绾夸笅鎵�鐢熶骇鐨勪骇鍝�
+ this.IsRoundingOrZeroFilling3( macroPlan, uptbs ); // 鍊熻繕閫昏緫
+ Transaction::Transaction().Propagate();
+
+ // // 骞宠 褰撳墠浜х嚎涓嬫墍鐢熶骇鐨勪骇鍝佸簱瀛橈紙搴撳瓨 < 鏈�澶у簱瀛橈級
+ // // this.A_balanceInventory( macroPlan, unitPeriodTimeBases );
+ // // Transaction::Transaction().Propagate();
+ //
+ // // 璁剧疆褰撳墠浜х嚎鍦ㄦ湡闂翠负鏃ョ殑璁″垝涓瘡澶╁彧鐢熶骇涓�绫讳骇鍝�
+ // // this.A_produceAProductForAPeriodOfTime( macroPlan, unitPeriodTimeBases );
+ //
+ // // Lotsize閫昏緫澶勭悊
+ // // this.A_lotsize( macroPlan, scenarioManager, unitPeriodTimeBases );
+ // info( "閫昏緫涓�==>鎷嗘垚鐝-----------------------------------------------------------------------------------------------------------------------" );
+ //
+ // // 鎷嗘垚鐝
+ // this.A_processingShift( macroPlan, unitPeriodTimeBases, unitPeriodTimeBases.Element( 0 ).StartDate(), true );
+ // Transaction::Transaction().Propagate();
+ //
+ // info( "閫昏緫鍥�=>澶勭悊鐝锛屽疄鐜颁竴涓彮娆″彧鐢熶骇涓�绫讳骇鍝�-----------------------------------------------------------------------------------------------------------------------" );
+ //
+ // // 澶勭悊鐝锛屽疄鐜颁竴涓彮娆″彧鐢熶骇涓�绫讳骇鍝�
+ // // this.A_processingShiftToProduceClassProducts( macroPlan, unitPeriodTimeBases, unitName );
+ // this.A_processingShiftToProduceClassProducts2( macroPlan, unitPeriodTimeBases, unitName );
+ // Transaction::Transaction().Propagate();
+ //
+ // // 閲嶇疆闇�姹�
+ // this.A_generateRequirements( macroPlan, unit.ID() );
+ // Transaction::Transaction().Propagate();
+ // }
+ }
+
+ // 杞﹂亾鏁寸彮
+ traverse ( macroPlan, Unit, unit, unit.IsToFill() and unit.HasCapacityTypeTransportQuantity() ) {
+ unitName := unit.Name();
+ debuginfo( "杞﹂亾浜х嚎: ", unitName );
+ }
+ *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsEqualToOneDay.qbl b/_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsEqualToOneDay.qbl
new file mode 100644
index 0000000..f1d0a8c
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsEqualToOneDay.qbl
@@ -0,0 +1,42 @@
+Quintiq file version 2.0
+#parent: #root
+Method ProcessingTimeIntervalIsEqualToOneDay (
+ MacroPlan macroPlan,
+ UnitPeriodTimeBase uptb,
+ UnitPeriodTimeBases uptbs
+)
+{
+ Description: '澶勭悊鏃堕棿鍖洪棿绛変簬1澶�'
+ TextBody:
+ [*
+ if ( uptb.UsedCapacity() = uptb.TotalAvailableCapacity() ) {
+ debuginfo( "澶╁凡缁忔槸鏁寸彮锛屾棤闇�澶勭悊锛堜娇鐢ㄤ骇鑳界瓑浜庡彲鐢ㄤ骇鑳斤級" );
+ } else if ( uptb.UsedCapacity().HoursAsReal() = 0 ) {
+ debuginfo( "澶╁凡缁忔槸鏁寸彮锛屾棤闇�澶勭悊锛堜娇鐢ㄤ骇鑳界瓑浜�0锛�" );
+ } else if ( uptb.UsedCapacity() < uptb.TotalAvailableCapacity() and uptb.UsedCapacity().HoursAsReal() > 0 ) {
+ whetherToFillInZero := true; // 鍒濆鍖栭粯璁よˉ闆舵潯浠�
+ debuginfo( "澶╀笉鏄暣鐝紝闇�瑕佸鐞�" );
+ traverse ( uptb, PeriodTaskOperation, pto, whetherToFillInZero ) {
+ debuginfo( "褰撳墠鍛ㄦ湡浠诲姟杈撳嚭鐨勪骇鍝佷釜鏁帮細", pto.NewSupply( relsize ) );
+ traverse( pto, NewSupply, ns, whetherToFillInZero ) {
+ debuginfo( "褰撳墠渚涘簲鐨勪骇鍝侊細", ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID(), " 褰撳墠渚涘簲鐨勪骇鍝佺殑鍓╀綑搴撳瓨锛�", ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd(), " 褰撳墠渚涘簲鐨勪骇鍝佺殑鏈�灏忓簱瀛橈細", ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel(), " 褰撳墠渚涘簲鐨勪骇鍝佺殑鏈�澶у簱瀛橈細", ns.ProductInStockingPointInPeriodPlanningLeaf().MaxInventoryLevel()," 褰撳墠浜у搧鍦ㄨ鍛ㄦ湡浠诲姟鐨勪緵搴旈噺锛�", ns.Quantity() );
+ if ( ( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.Quantity() ) < ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ) {
+ debuginfo( "褰撳墠鍛ㄦ湡浠诲姟涓嶈兘琛ラ浂" );
+ whetherToFillInZero := false;
+ }
+ }
+ debuginfo( ".........." );
+ }
+ // whetherToFillInZero := false;
+ if ( whetherToFillInZero ) {
+ debuginfo( "鎵ц琛ラ浂" );
+ this.ZeroCapacityReplenishment( macroPlan, uptb.UsedCapacity().HoursAsReal(), uptb, uptbs );
+ } else {
+ debuginfo( "鎵ц鍦嗘暣" );
+ this.CapacityRounding( macroPlan, uptb.TotalAvailableCapacity().HoursAsReal() - uptb.UsedCapacity().HoursAsReal(), uptb, uptbs );
+ }
+ } else {
+ debuginfo( "澶╁嚭鐜板紓甯�" );
+ }
+ *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsGreaterThanOneDay.qbl b/_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsGreaterThanOneDay.qbl
new file mode 100644
index 0000000..64c9e94
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsGreaterThanOneDay.qbl
@@ -0,0 +1,71 @@
+Quintiq file version 2.0
+#parent: #root
+Method ProcessingTimeIntervalIsGreaterThanOneDay (
+ MacroPlan macroPlan,
+ UnitPeriodTimeBase uptb,
+ UnitPeriodTimeBases uptbs
+)
+{
+ Description: '澶勭悊鏃堕棿鍖洪棿澶т簬1澶�'
+ TextBody:
+ [*
+ if ( uptb.UsedCapacity() = uptb.TotalAvailableCapacity() ) {
+ debuginfo( "鍛ㄥ凡缁忔槸鏁寸彮锛屾棤闇�澶勭悊" );
+ } else if ( uptb.UsedCapacity() < uptb.TotalAvailableCapacity() and uptb.UsedCapacity().HoursAsReal() > 0 ) {
+ roundedCapacity := 0.0;
+ capacityForZeroCompensation := 0.0;
+ indexStartTime := uptb.StartDate();
+ indexEndTime := uptb.End().Date();
+ remainingCapacity := uptb.UsedCapacity().HoursAsReal();
+ debuginfo( "浣跨敤鐨勪骇鑳斤細", remainingCapacity );
+ while ( indexStartTime < indexEndTime and roundedCapacity = 0 and capacityForZeroCompensation = 0 ) {
+ indexStartTimeAvailableCapacity := WholeShift::GenerateDailyCapacity( macroPlan, indexStartTime, uptb.UnitID() ).HoursAsReal();
+ if ( ( remainingCapacity - indexStartTimeAvailableCapacity ) < 0 ) {
+ roundedCapacity := abs( remainingCapacity - indexStartTimeAvailableCapacity );
+ capacityForZeroCompensation := remainingCapacity;
+ remainingCapacity := remainingCapacity - indexStartTimeAvailableCapacity;
+ } else {
+ remainingCapacity := remainingCapacity - indexStartTimeAvailableCapacity;
+ }
+ debuginfo( "绱㈠紩寮�濮嬫椂闂达細", indexStartTime, " 鍙敤浜ц兘锛�", indexStartTimeAvailableCapacity, " 浣跨敤鐨勪骇鑳�-鍙敤浜ц兘锛堝墿浣欎骇鑳斤級锛�", remainingCapacity );
+ indexStartTime := indexStartTime + 1;
+ }
+
+ debuginfo( "鍦嗘暣浜ц兘锛�", roundedCapacity, " 琛ラ浂浜ц兘锛�", capacityForZeroCompensation );
+
+ if ( roundedCapacity = 0 and capacityForZeroCompensation = 0 ) {
+ debuginfo( "宸插埌杈炬暣鐝晥鏋�" );
+ } else {
+ whetherToFillInZero := true;
+ tempCapacityForZeroCompensation := capacityForZeroCompensation;
+ traverse ( uptb, PeriodTaskOperation, pto, whetherToFillInZero ) {
+ quantityOfMinimumSupplyRound := Real::MaxReal();
+ traverse ( pto, NewSupply, ns, whetherToFillInZero ) {
+ quantityOfMinimumSupplyRound := minvalue( minvalue( ifexpr( ( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ) > 0, ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel(), 0.0 ),
+ ns.Quantity()
+ ) / pto.Operation().Throughput(),
+ quantityOfMinimumSupplyRound
+ );
+ }
+ tempCapacityForZeroCompensation := tempCapacityForZeroCompensation - quantityOfMinimumSupplyRound;
+ if ( tempCapacityForZeroCompensation < 0 ) {
+ whetherToFillInZero := false;
+ }
+ debuginfo( "褰撳墠鍛ㄦ湡浠诲姟渚涘簲鏁伴噺锛�", pto.Quantity(), " 鏈�灏忚ˉ闆朵骇鑳斤細", quantityOfMinimumSupplyRound, " 琛ラ浂鍚庤繕鍓╋細", tempCapacityForZeroCompensation );
+ }
+
+ // whetherToFillInZero := true;
+
+ if ( not whetherToFillInZero ) {
+ debuginfo( "鎵ц琛ラ浂" );
+ this.ZeroCapacityReplenishment( macroPlan, capacityForZeroCompensation, uptb, uptbs );
+ } else {
+ debuginfo( "鎵ц鍦嗘暣" );
+ this.CapacityRounding( macroPlan, roundedCapacity, uptb, uptbs );
+ }
+ }
+ } else {
+ debuginfo( "鍛ㄥ嚭鐜板紓甯�" );
+ }
+ *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfComplementZeroLogic.qbl b/_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfComplementZeroLogic.qbl
new file mode 100644
index 0000000..14f7911
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfComplementZeroLogic.qbl
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+#parent: #root
+Method UnifiedProcessingOfComplementZeroLogic (
+ Real unifiedProcessingTimeOfRounding,
+ PeriodTaskOperation sourcePeriodTaskOperation,
+ UnitPeriodTimeBase targetUnitPeriodTimeBase,
+ MacroPlan macroPlan
+)
+{
+ TextBody:
+ [*
+ targetPeriodTaskOperation := select( targetUnitPeriodTimeBase, PeriodTaskOperation, tempOTO, tempOTO.Operation() = sourcePeriodTaskOperation.Operation() );
+
+ if ( isnull( targetPeriodTaskOperation ) ) {
+ debuginfo( "鐩爣浜ц兘鍛ㄦ湡涓嶅瓨鍦ㄧ洰鏍囧懆鏈熶换鍔�" );
+ sourcePeriodTaskOperation.Update( sourcePeriodTaskOperation.Quantity() - ( sourcePeriodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding ), false );
+ targetPeriodTaskOperation := PeriodTaskOperation::Create( sourcePeriodTaskOperation.Operation(), targetUnitPeriodTimeBase, sourcePeriodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding, false );
+ Transaction::Transaction().Propagate();
+
+ // info( "鏂板垱寤虹殑鍛ㄦ湡浠诲姟鏈夊嚑涓渶姹傦細", targetPeriodTaskOperation.DependentDemand( relsize ), " 鍛ㄦ湡浠诲姟ID涓猴細", targetPeriodTaskOperation.Key().AsQUILL() );
+ traverse ( targetPeriodTaskOperation, DependentDemand, dd, true ) {
+ targetDependentDemand := select( sourcePeriodTaskOperation, DependentDemand, tempDD, tempDD.ProcessInput().astype( OperationInput ).Name() = dd.ProcessInput().astype( OperationInput ).Name() );
+ targetTempDependentDemandInputGroup := select( macroPlan, TempDependentDemandInputGroup, tempTDDIG, tempTDDIG.ID() = guard( targetDependentDemand.Key().AsQUILL(), "" ) );
+ if ( not isnull( targetTempDependentDemandInputGroup ) ) {
+ // info( "鍒涘缓浜嗕緷璧栭渶姹傦紝ID涓猴細", dd.Key().AsQUILL() );
+ macroPlan.TempDependentDemandInputGroup( relnew, ID := dd.Key().AsQUILL(),
+ Divisor := targetTempDependentDemandInputGroup.Divisor(),
+ UnitID := targetTempDependentDemandInputGroup.UnitID(),
+ ProductInStockingName := targetTempDependentDemandInputGroup.ProductInStockingName() );
+ }
+ }
+ Transaction::Transaction().Propagate();
+ } else {
+ debuginfo( "鐩爣浜ц兘鍛ㄦ湡瀛樺湪鐩爣鍛ㄦ湡浠诲姟" );
+ sourcePeriodTaskOperation.Update( sourcePeriodTaskOperation.Quantity() - ( sourcePeriodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding ), false );
+ targetPeriodTaskOperation.Update( targetPeriodTaskOperation.Quantity() + ( targetPeriodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding ), false );
+ Transaction::Transaction().Propagate();
+ }
+ *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfRoundingLogic.qbl b/_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfRoundingLogic.qbl
new file mode 100644
index 0000000..1924b71
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfRoundingLogic.qbl
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+#parent: #root
+Method UnifiedProcessingOfRoundingLogic (
+ Real unifiedProcessingTimeOfRounding,
+ UnitPeriodTimeBase sourceUnitPeriodTimeBase,
+ PeriodTaskOperation periodTaskOperation,
+ MacroPlan macroPlan
+)
+{
+ TextBody:
+ [*
+ sourcePeriodTaskOperation := select( sourceUnitPeriodTimeBase, PeriodTaskOperation, tempOTO, tempOTO.Operation() = periodTaskOperation.Operation() );
+
+ if ( isnull( sourcePeriodTaskOperation ) ) {
+ debuginfo( "婧愪骇鑳藉懆鏈熶笉瀛樺湪鐩爣鍛ㄦ湡浠诲姟" );
+ periodTaskOperation.Update( periodTaskOperation.Quantity() - ( periodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding ), false );
+ sourcePeriodTaskOperation := PeriodTaskOperation::Create( periodTaskOperation.Operation(), sourceUnitPeriodTimeBase, periodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding, false );
+ Transaction::Transaction().Propagate();
+
+ // info( "鏂板垱寤虹殑鍛ㄦ湡浠诲姟鏈夊嚑涓渶姹傦細", sourcePeriodTaskOperation.DependentDemand( relsize ), " 鍛ㄦ湡浠诲姟ID涓猴細", sourcePeriodTaskOperation.Key().AsQUILL() );
+ traverse ( sourcePeriodTaskOperation, DependentDemand, dd, true ) {
+ targetDependentDemand := select( periodTaskOperation, DependentDemand, tempDD, tempDD.ProcessInput().astype( OperationInput ).Name() = dd.ProcessInput().astype( OperationInput ).Name() );
+ targetTempDependentDemandInputGroup := select( macroPlan, TempDependentDemandInputGroup, tempTDDIG, tempTDDIG.ID() = guard( targetDependentDemand.Key().AsQUILL(), "" ) );
+ if ( not isnull( targetTempDependentDemandInputGroup ) ) {
+ // info( "鍒涘缓浜嗕緷璧栭渶姹傦紝ID涓猴細", dd.Key().AsQUILL() );
+ macroPlan.TempDependentDemandInputGroup( relnew, ID := dd.Key().AsQUILL(),
+ Divisor := targetTempDependentDemandInputGroup.Divisor(),
+ UnitID := targetTempDependentDemandInputGroup.UnitID(),
+ ProductInStockingName := targetTempDependentDemandInputGroup.ProductInStockingName() );
+ }
+ }
+ Transaction::Transaction().Propagate();
+ } else {
+ debuginfo( "婧愪骇鑳藉懆鏈熷瓨鍦ㄧ洰鏍囧懆鏈熶换鍔�" );
+ periodTaskOperation.Update( periodTaskOperation.Quantity() - ( periodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding ), false );
+ sourcePeriodTaskOperation.Update( sourcePeriodTaskOperation.Quantity() + ( sourcePeriodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding ), false );
+ Transaction::Transaction().Propagate();
+ }
+ *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_ZeroCapacityReplenishment.qbl b/_Main/BL/Type_WholeShift/Method_ZeroCapacityReplenishment.qbl
new file mode 100644
index 0000000..e0b7ee9
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_ZeroCapacityReplenishment.qbl
@@ -0,0 +1,100 @@
+Quintiq file version 2.0
+#parent: #root
+Method ZeroCapacityReplenishment (
+ MacroPlan macroPlan,
+ Real timeDifference,
+ UnitPeriodTimeBase uptb,
+ UnitPeriodTimeBases uptbs
+)
+{
+ TextBody:
+ [*
+ debuginfo( "闇�瑕佽ˉ闆剁殑鏃堕棿锛堝崟浣嶏細灏忔椂锛�", timeDifference, " 闇�瑕佽ˉ闆剁殑浜ц兘鍛ㄦ湡鐨勫紑濮嬫椂闂达細", uptb.StartDate().Format( "Y-M2-D2" ) );
+
+ //debuginfo( "鑰冭檻搴撳瓨銆乴otsize" );
+ //traverse ( unitPeriodTimeBase, PeriodTaskOperation, pto, timeDifference > 0 ) {
+ // minimumQuantityThatCanBeBorrowed := Real::MaxReal();
+ // minimumCapacityThatCanBeBorrowed := Real::MaxReal();
+ // traverse ( pto, NewSupply, ns, true ) {
+ // targetBorrowSplitShiftLotsizeLimit := select( scenarioManager, SplitShiftLotsizeLimit, tempSSLL, tempSSLL.unitID() = unitPeriodTimeBase.UnitID() and
+ // tempSSLL.productID() = ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID() and
+ // tempSSLL.startTime() <= ns.Start().Date() and
+ // tempSSLL.endTime() >= ns.End().Date() );
+ // minimumQuantityThatCanBeBorrowed := minvalue(
+ // minvalue( ifexpr( not isnull( targetBorrowSplitShiftLotsizeLimit ) and targetBorrowSplitShiftLotsizeLimit.lotsize() < ns.Quantity(),
+ // ns.Quantity() - targetBorrowSplitShiftLotsizeLimit.lotsize(),
+ // Real::MaxReal() ),
+ // minvalue(
+ // ifexpr( ( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ) > 0,
+ // ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel(),
+ // 0.0
+ // ),
+ // ns.Quantity()
+ // )
+ // ),
+ // minimumQuantityThatCanBeBorrowed
+ // );
+ // }
+ // minimumCapacityThatCanBeBorrowed := minimumQuantityThatCanBeBorrowed / pto.Operation().Throughput();
+ // nextUnitPeriodTimeBase := ifexpr( isnull( unitPeriodTimeBase.Next().astype( UnitPeriodTimeBase ) ), select( unitPeriodTimeBases, Elements, tempUPTB, tempUPTB.Start() = unitPeriodTimeBase.End() ), unitPeriodTimeBase.Next().astype( UnitPeriodTimeBase ) );
+ // while ( timeDifference > 0 and not isnull( nextUnitPeriodTimeBase ) and minimumCapacityThatCanBeBorrowed > 0 ) {
+ // acceptableCapacity := ifexpr( ( nextUnitPeriodTimeBase.TotalAvailableCapacity().HoursAsReal() - nextUnitPeriodTimeBase.UsedCapacity().HoursAsReal() ) > 0,
+ // nextUnitPeriodTimeBase.TotalAvailableCapacity().HoursAsReal() - nextUnitPeriodTimeBase.UsedCapacity().HoursAsReal(),
+ // 0.0 );
+ // unifiedProcessingTimeOfComplementZero := minvalue( timeDifference, minimumCapacityThatCanBeBorrowed, acceptableCapacity );
+ // debuginfo( "鎺ョ撼鐨勫懆鏈熸椂闂达細", nextUnitPeriodTimeBase.StartDate().Format( "Y-M2-D2" ), String::Tab(),
+ // "鎺ョ撼鐨勫懆鏈熻兘鎺ュ彈鐨勪骇鑳斤細", acceptableCapacity, String::Tab(),
+ // "鍓╀綑琛ラ浂鐨勪骇鑳斤細", timeDifference, String::Tab(),
+ // "缁熶竴杞Щ鐨勪骇鑳斤細", unifiedProcessingTimeOfComplementZero, String::Tab()
+ // );
+ // this.A_unifiedProcessingOfComplementZeroLogic( unifiedProcessingTimeOfComplementZero, pto, nextUnitPeriodTimeBase, macroPlan );
+ // minimumCapacityThatCanBeBorrowed := minimumCapacityThatCanBeBorrowed - unifiedProcessingTimeOfComplementZero;
+ // timeDifference := timeDifference - unifiedProcessingTimeOfComplementZero;
+ // if ( isnull( nextUnitPeriodTimeBase.Next() ) ) {
+ // nextUnitPeriodTimeBase := select( unitPeriodTimeBases, Elements, tempUPTB, tempUPTB.Start() = nextUnitPeriodTimeBase.End() );
+ // } else {
+ // nextUnitPeriodTimeBase := nextUnitPeriodTimeBase.Next().astype( UnitPeriodTimeBase );
+ // }
+ // }
+ //}
+
+ debuginfo( "涓嶈�冭檻搴撳瓨銆乴otsize浣垮叾杈惧埌鏁寸彮" );
+ traverse ( uptb, PeriodTaskOperation, pto, timeDifference > 0 ) {
+ minimumQuantityThatCanBeBorrowed := Real::MaxReal();
+ minimumCapacityThatCanBeBorrowed := Real::MaxReal();
+ traverse ( pto, NewSupply, ns, true ) {
+ minimumQuantityThatCanBeBorrowed := minvalue(
+ minvalue(
+ ifexpr( ( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ) > 0,
+ ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel(),
+ 0.0
+ ),
+ ns.Quantity()
+ ),
+ minimumQuantityThatCanBeBorrowed
+ );
+ }
+ minimumCapacityThatCanBeBorrowed := minimumQuantityThatCanBeBorrowed / pto.Operation().Throughput();
+ nextUnitPeriodTimeBase := ifexpr( isnull( uptb.Next().astype( UnitPeriodTimeBase ) ), select( uptbs, Elements, tempUPTB, tempUPTB.Start() = uptb.End() ), uptb.Next().astype( UnitPeriodTimeBase ) );
+ while ( timeDifference > 0 and not isnull( nextUnitPeriodTimeBase ) and minimumCapacityThatCanBeBorrowed > 0 ) {
+ acceptableCapacity := ifexpr( ( nextUnitPeriodTimeBase.TotalAvailableCapacity().HoursAsReal() - nextUnitPeriodTimeBase.UsedCapacity().HoursAsReal() ) > 0,
+ nextUnitPeriodTimeBase.TotalAvailableCapacity().HoursAsReal() - nextUnitPeriodTimeBase.UsedCapacity().HoursAsReal(),
+ 0.0 );
+ unifiedProcessingTimeOfComplementZero := minvalue( timeDifference, minimumCapacityThatCanBeBorrowed, acceptableCapacity );
+ debuginfo( "鎺ョ撼鐨勫懆鏈熸椂闂达細", nextUnitPeriodTimeBase.StartDate().Format( "Y-M2-D2" ), String::Tab(),
+ "鎺ョ撼鐨勫懆鏈熻兘鎺ュ彈鐨勪骇鑳斤細", acceptableCapacity, String::Tab(),
+ "鍓╀綑琛ラ浂鐨勪骇鑳斤細", timeDifference, String::Tab(),
+ "缁熶竴杞Щ鐨勪骇鑳斤細", unifiedProcessingTimeOfComplementZero, String::Tab()
+ );
+ this.UnifiedProcessingOfComplementZeroLogic( unifiedProcessingTimeOfComplementZero, pto, uptb, macroPlan );
+ minimumCapacityThatCanBeBorrowed := minimumCapacityThatCanBeBorrowed - unifiedProcessingTimeOfComplementZero;
+ timeDifference := timeDifference - unifiedProcessingTimeOfComplementZero;
+ if ( isnull( nextUnitPeriodTimeBase.Next() ) ) {
+ nextUnitPeriodTimeBase := select( uptbs, Elements, tempUPTB, tempUPTB.Start() = nextUnitPeriodTimeBase.End() );
+ } else {
+ nextUnitPeriodTimeBase := nextUnitPeriodTimeBase.Next().astype( UnitPeriodTimeBase );
+ }
+ }
+ }
+ *]
+}
diff --git a/_Main/BL/Type_WholeShift/StaticMethod_GenerateDailyCapacity.qbl b/_Main/BL/Type_WholeShift/StaticMethod_GenerateDailyCapacity.qbl
new file mode 100644
index 0000000..6354ee7
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/StaticMethod_GenerateDailyCapacity.qbl
@@ -0,0 +1,103 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateDailyCapacity (
+ MacroPlan macroPlan,
+ Date indexDate,
+ String unitID
+) as Duration
+{
+ TextBody:
+ [*
+ returnCapacity := Duration::Zero();
+
+ traverse ( macroPlan, Unit.UnitPeriod.astype( UnitPeriodTimeBase ), this, this.UnitID() = unitID and
+ this.StartDate() <= indexDate and
+ this.End().Date() > indexDate and
+ /*this.IsBase() and*/
+ this.IsPlanning() ) {
+ // Determined by the used shift pattern, the efficiency rate, maintenance considering its maintenance factor, allocation, max load percentage and calendar elements.
+ // debuginfo( "閬嶅巻鐨勬椂闂磋妭鐐癸紙寮�濮嬫椂闂达級锛�", this.StartDate(), " 缁撴潫鏃堕棿锛�", this.End() );
+ value := Duration::Zero();
+
+ datetimevector := DateTimeVector::Construct();
+ durationvector := RealVector::Construct();
+
+ if( this.IsPlanning() or this.IsBase() )
+ {
+ planningup := ifexpr( this.IsPlanning(),
+ this, // Case 1: planning UnitPeriod: aggregate values from associated period tasks
+ this.PlanningUP().astype( UnitPeriodTimeBase ) ); // Case 2: base, non planning UnitPeriod: disaggregate value from planning UnitPeriod
+
+ if( not isnull( planningup ) )
+ {
+ if( not isnull( planningup.Period_MP() )
+ and not isnull( planningup.ShiftPattern() )
+ and not planningup.Period_MP().IsInHour() ) //gdn1 HourlyPeriod is not applicable for ShiftPattern
+ {
+ lastshiftday := planningup.StartDate() - planningup.Period_MP().Start().StartOfWeek().Date() + 1
+
+ nrdaysinthisperiod := planningup.Duration().DaysAsReal();
+
+ firstday := planningup.Period_MP().Start();
+ numberofshiftday := planningup.ShiftPattern().ShiftDay( relsize );
+
+ if( not isnull( planningup.Previous() ) )
+ {
+ lastshiftday := planningup.Previous().astype( UnitPeriodTimeBase ).PreviousPeriodLastShiftDay() + 1;
+
+ }
+
+ for( i := 0; i < nrdaysinthisperiod and firstday + Duration::Days( i ) >= planningup.Unit().StartDate().DateTime() ; i++ )
+ {
+ shiftday := lastshiftday + i;
+
+ if( shiftday > numberofshiftday )
+ {
+ shiftday := shiftday mod numberofshiftday;
+
+ if( shiftday = 0 )
+ {
+ shiftday := numberofshiftday;
+ }
+ }
+
+ shift := select( planningup.ShiftPattern(), ShiftDay, shift, shift.Day() = shiftday, true );
+ unavailable := planningup.Unit().UnavailableTime( firstday + Duration::Days( i ), firstday + Duration::Days( i + 1 ) );
+
+ if( not isnull( shift ) )
+ {
+ shiftduration := maxvalue( ( shift.Capacity() - unavailable ), Duration::Zero() );
+ //value := value + shiftduration;
+ datetimevector.Append( firstday + Duration ::Days( i ) );
+ durationvector.Append( shiftduration.HoursAsReal() );
+ }
+ if ( /*this.UnitID() = unitID and this.IsBase() and this.IsPlanning() and*/ ( this.StartDate() + i ) = indexDate ) {
+ // debuginfo( "褰撳墠寮�濮嬫椂闂达細", this.StartDate() + i, " 褰撳墠浜ц兘锛�", maxvalue( ( shift.Capacity() - unavailable ), Duration::Zero() ) );
+ // this.MacroPlan().UnitPeriodTimeBaseDailyCapacity( relnew, startDate := this.StartDate() + i,
+ // capacity := maxvalue( ( shift.Capacity() - unavailable ), Duration::Zero() ) );
+ returnCapacity := maxvalue( ( shift.Capacity() - unavailable ), Duration::Zero() );
+ }
+ } // for
+
+ value := this.GetPlanningCapacity( datetimevector, durationvector );
+ }// if planning period not in hour
+ else if ( planningup.Period_MP().DurationInDays() < 1 ) //gdn1 HourlyPeriod is always same as PeriodDuration
+ {
+ value := planningup.Unit().UnitCalendar().AvailableTime( planningup.Start(), planningup.End(), 0.00000001 ); // Check calendar to make hourly period work with the calendar
+ }
+
+ value := maxvalue( ( value * planningup.Efficiency() * planningup.Allocation() - ( planningup.Maintenance() * this.PlanningSystemRatio() ) )* planningup.NrOfOpen(), Duration::Zero() );
+ }
+ }
+ else
+ {
+
+ value := sum( this.GetChildrenOfPeriodDimension(), Elements.astype( UnitPeriodTimeBase ), e, e.BaseAvailableCapacity() );
+ }
+
+ // this.BaseAvailableCapacity( value );
+ }
+
+ return returnCapacity;
+ *]
+}
diff --git a/_Main/BL/Type_WholeShift/StaticMethod_OnServerStartup.qbl b/_Main/BL/Type_WholeShift/StaticMethod_OnServerStartup.qbl
new file mode 100644
index 0000000..a93edca
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/StaticMethod_OnServerStartup.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod OnServerStartup
+{
+ TextBody:
+ [*
+ // lihongji May-15-2024 (created)
+ folder := DomainModel::Domain().MDSFolderDefinitions().FindFolder( "/root" );
+
+ datasetName := typeof( WholeShift ).Name();
+
+ oinfo := MDSEditor::Editor().ObjectInfos( datasetName, folder.FolderID(), datasetName );
+
+ o := select( oinfo, Elements, o, not o.IsLoaded() );
+ emptydataset := isnull( o );
+
+ if ( emptydataset ) {
+ MDSWholeShift::CreateMDS( datasetName, DMF_Utility::GetStorageState() );
+ } else {
+ MDSWholeShift::LoadMDSAndConvert( o.MDSID(), DMF_Utility::GetStorageState() );
+ }
+ *]
+}
diff --git a/_Main/BL/Type_WholeShift/_ROOT_Type_WholeShift.qbl b/_Main/BL/Type_WholeShift/_ROOT_Type_WholeShift.qbl
new file mode 100644
index 0000000..ffcf9a2
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/_ROOT_Type_WholeShift.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type WholeShift
+{
+ #keys: '5[413988.0.1256611417][413988.0.1256611415][0.0.0][413988.0.1256611416][413988.0.1256611418]'
+ BaseType: Object
+ StructuredName: 'WholeShifts'
+}
diff --git a/_Main/Sys/ImgAttr/Entity.dme b/_Main/Sys/ImgAttr/Entity.dme
new file mode 100644
index 0000000..48992f1
--- /dev/null
+++ b/_Main/Sys/ImgAttr/Entity.dme
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+#parent: #root
+TypeDataInterface Entity
+{
+ TypeKey: '[127710.1.1013709077]'
+ ImageDataMember ImgIsToFill
+ {
+ #keys: '1[413988.0.1254350815]'
+ ImageSpecifications:
+ [
+ ImageDataMemberImageSpecification
+ {
+ Image: 'CHECKEDCHECKBOX'
+ Quill: "( object.DisplayCapacityType() = 'Time' or object.DisplayCapacityType() = 'Transport quantity' ) and object.IsToFill()"
+ Value: 'Fill'
+ }
+ ImageDataMemberImageSpecification
+ {
+ Image: 'EMPTYCHECKBOX'
+ Quill: "( object.DisplayCapacityType() = 'Time' or object.DisplayCapacityType() = 'Transport quantity' ) and not object.IsToFill()"
+ Value: 'NotFill'
+ }
+ ]
+ }
+}
diff --git a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
index 899ebeb..07043ad 100644
--- a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
+++ b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
@@ -83,6 +83,8 @@
Component ComponentMenu347 { #keys: '[413988.0.1172464302]' BaseType: 'ComponentMenu' Properties: [ ComponentType: 'FormTest1' Text: '' ] }
Component ComponentMenu357 { #keys: '[414996.0.395684386]' BaseType: 'ComponentMenu' Properties: [ ComponentType: 'frmStandardAnalysis589' Text: 'Archive Execution Status' ] }
Component ComponentMenu702 { #keys: '[413988.0.1234424010]' BaseType: 'ComponentMenu' Properties: [ ComponentType: 'frmStandardAnalysis822' Text: 'Interface Dataset' ] }
+ Component menuSeparator891 { #keys: '[413988.0.1263894630]' BaseType: 'Menu' Properties: [ Separator: true ] }
+ Component MenuWholeShift { #keys: '[413988.0.1263894682]' BaseType: 'Menu' Properties: [ Image: 'FISH_BOWL' Text: '娴嬭瘯鏁寸彮' ] }
]
Properties:
[
@@ -104,6 +106,8 @@
c: ComponentMenu702
c: menuSeparator222
c: ComponentMenu347
+ c: menuSeparator891
+ c: MenuWholeShift
}
]
}
diff --git a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuWholeShift_OnClick.def b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuWholeShift_OnClick.def
new file mode 100644
index 0000000..565378a
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuWholeShift_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: mbMainMenu/MenuWholeShift
+Response OnClick () id:Response_MacroPlanner_mbMainMenu_MenuWholeShift_OnClick
+{
+ #keys: '[413988.0.1263894734]'
+ Body:
+ [*
+ WholeShift.PostProcessing2( MacroPlan );
+ *]
+ CanBindMultiple: false
+ DefinitionID: 'Responsedef_Menu_OnClick'
+ Precondition:
+ [*
+ return not isnull( MacroPlan ) and not isnull( WholeShift );
+ *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgWholeShiftSystem_bWholeShiftSystem_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgWholeShiftSystem_bWholeShiftSystem_OnClick.def
index 520564f..9c15e93 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgWholeShiftSystem_bWholeShiftSystem_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgWholeShiftSystem_bWholeShiftSystem_OnClick.def
@@ -5,6 +5,10 @@
#keys: '[414702.2.1843141002]'
CanBindMultiple: false
DefinitionID: 'Responsedef_WebButton_OnClick'
+ Precondition:
+ [*
+ return not isnull( MacroPlan ) and not isnull( WholeShift );
+ *]
QuillAction
{
Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlActions.def
new file mode 100644
index 0000000..65e113f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+ #keys: '[413988.0.1274023099]'
+ BaseType: 'WebPanel'
+ Children:
+ [
+ Component btnOk
+ {
+ #keys: '[413988.0.1274023103]'
+ BaseType: 'WebButton'
+ Properties:
+ [
+ Label: 'OK'
+ Taborder: 0
+ ]
+ }
+ Component btnCancel
+ {
+ #keys: '[413988.0.1274023105]'
+ BaseType: 'WebButton'
+ Properties:
+ [
+ Label: 'Cancel'
+ Taborder: 1
+ ]
+ }
+ ]
+ Properties:
+ [
+ Alignment: 'trailing'
+ Border: true
+ ExcludeFromActiveComponent: true
+ FixedSize: true
+ Orientation: 'horizontal'
+ Padding: 'true'
+ Style: 'footer'
+ Taborder: 1
+ ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlContent.def
new file mode 100644
index 0000000..3ff0626
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlContent.def
@@ -0,0 +1,69 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+ #keys: '[413988.0.1274023097]'
+ BaseType: 'WebPanel'
+ Children:
+ [
+ Component npCylinderBlock
+ {
+ #keys: '[413988.0.1273522242]'
+ BaseType: 'WebNumberPicker'
+ Properties:
+ [
+ DataBinding: 'MacroPlan.CylinderBlock'
+ Label: '缂镐綋(pcs)'
+ Taborder: 0
+ ]
+ }
+ Component npCylinderHead
+ {
+ #keys: '[413988.0.1273522255]'
+ BaseType: 'WebNumberPicker'
+ Properties:
+ [
+ DataBinding: 'MacroPlan.CylinderHead'
+ Label: '缂哥洊(pcs)'
+ Taborder: 1
+ ]
+ }
+ Component npConnectingRod
+ {
+ #keys: '[413988.0.1273522267]'
+ BaseType: 'WebNumberPicker'
+ Properties:
+ [
+ DataBinding: 'MacroPlan.ConnectingRod'
+ Label: '杩炴潌(pcs)'
+ Taborder: 2
+ ]
+ }
+ Component npCrankshaft
+ {
+ #keys: '[413988.0.1273522280]'
+ BaseType: 'WebNumberPicker'
+ Properties:
+ [
+ DataBinding: 'MacroPlan.Crankshaft'
+ Label: '鏇茶酱(pcs)'
+ Taborder: 3
+ ]
+ }
+ Component npBalanceAxis
+ {
+ #keys: '[413988.0.1273522292]'
+ BaseType: 'WebNumberPicker'
+ Properties:
+ [
+ DataBinding: 'MacroPlan.BalanceAxis'
+ Label: '骞宠 杞�(pcs)'
+ Taborder: 4
+ ]
+ }
+ ]
+ Properties:
+ [
+ Padding: 'true'
+ Taborder: 0
+ ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnCancel_OnClick.def
similarity index 88%
rename from _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnCancel_OnClick.def
rename to _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnCancel_OnClick.def
index ac96ffa..fc240d4 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnCancel_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnCancel_OnClick.def
@@ -2,7 +2,7 @@
#parent: pnlActions/btnCancel
Response OnClick () id:Response_pnlActions_btnCancel_OnClick
{
- #keys: '[414702.2.1844994368]'
+ #keys: '[413988.0.1274023109]'
DefinitionID: 'Responsedef_WebButton_OnClick'
GroupServerCalls: true
QuillAction
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnOk_OnClick.def
similarity index 89%
rename from _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnOk_OnClick.def
rename to _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnOk_OnClick.def
index f6a3c38..c62760b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnOk_OnClick.def
@@ -2,7 +2,7 @@
#parent: pnlActions/btnOk
Response OnClick () id:Response_pnlActions_btnOk_OnClick
{
- #keys: '[414702.2.1844994367]'
+ #keys: '[413988.0.1274023108]'
DefinitionID: 'Responsedef_WebButton_OnClick'
GroupServerCalls: true
QuillAction
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/_ROOT_Component_DialogTransferMinimumQuantity.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/_ROOT_Component_DialogTransferMinimumQuantity.def
new file mode 100644
index 0000000..b2f9f0d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/_ROOT_Component_DialogTransferMinimumQuantity.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogTransferMinimumQuantity
+{
+ #keys: '[413988.0.1274023095]'
+ BaseType: 'WebForm'
+ Children:
+ [
+ #child: pnlContent
+ #child: pnlActions
+ ]
+ Properties:
+ [
+ Alignment: 'trailing'
+ EnterButton: 'btnOk'
+ EscapeButton: 'btnCancel'
+ ExcludeFromActiveComponent: true
+ Padding: 'false'
+ ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def
index 650c732..9993e10 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def
@@ -31,7 +31,7 @@
BaseType: 'WebDataSetLevel'
Properties:
[
- Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":-1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayName","title":"Name","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayCapacityType","title":"Capacity type","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayCapacityType"}}]'
+ Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":-1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayName","title":"Name","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayCapacityType","title":"Capacity type","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayCapacityType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsToFill","title":"ImgIsToFill","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsToFill"}}]'
ContextMenu: 'listContextMenu902'
FixedFilter: 'not object.GetIsSystem() and object.IsUnit();'
RelationFromParent: 'ChildEntity'
@@ -43,7 +43,7 @@
]
Properties:
[
- Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":-1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayName","title":"Name","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayCapacityType","title":"Capacity type","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayCapacityType"}}]'
+ Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":-1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayName","title":"Name","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayCapacityType","title":"Capacity type","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayCapacityType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsToFill","title":"ImgIsToFill","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsToFill"}}]'
ContextMenu: 'listContextMenu902'
RelationFromParent: 'ChildEntity'
SortCriteria: 'DisplayIndex'
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def"
index 7874133..b97df8e 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def"
@@ -27,6 +27,28 @@
Title: 'Select all'
]
}
+ Component mEnable
+ {
+ #keys: '[413988.0.1257262758]'
+ BaseType: 'WebMenu'
+ Properties:
+ [
+ Image: 'CHECKEDCHECKBOX'
+ Taborder: 4
+ Title: 'Enable'
+ ]
+ }
+ Component mDisable
+ {
+ #keys: '[413988.0.1254331512]'
+ BaseType: 'WebMenu'
+ Properties:
+ [
+ Image: 'EMPTYCHECKBOX'
+ Taborder: 5
+ Title: 'Disable'
+ ]
+ }
]
Properties:
[
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def
index 42d8211..f12a696 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def
@@ -5,30 +5,11 @@
BaseType: 'WebPanel'
Children:
[
- Component btnOk
- {
- #keys: '[414702.2.1844994362]'
- BaseType: 'WebButton'
- Properties:
- [
- Label: 'OK'
- Taborder: 0
- ]
- }
- Component btnCancel
- {
- #keys: '[414702.2.1844994364]'
- BaseType: 'WebButton'
- Properties:
- [
- Label: 'Cancel'
- Taborder: 1
- ]
- }
+ #child: pnlActionsRight_106
+ #child: pnlActionsLeft_522
]
Properties:
[
- Alignment: 'trailing'
Border: true
ExcludeFromActiveComponent: true
FixedSize: true
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsLeft\043522.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsLeft\043522.def"
new file mode 100644
index 0000000..3355e3f
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsLeft\043522.def"
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component pnlActionsLeft id:pnlActionsLeft_522
+{
+ #keys: '[413988.0.1271132689]'
+ BaseType: 'WebPanel'
+ Children:
+ [
+ Component bTransferMinimumQuantity
+ {
+ #keys: '[413988.0.1271132690]'
+ BaseType: 'WebButton'
+ Properties:
+ [
+ Label: '璋冩嫧鏈�灏忓寘瑁呮暟閲�'
+ Taborder: 0
+ ]
+ }
+ ]
+ Properties:
+ [
+ Orientation: 'horizontal'
+ Taborder: 0
+ ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsRight\043106.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsRight\043106.def"
new file mode 100644
index 0000000..452bc14
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsRight\043106.def"
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+Component pnlActionsRight id:pnlActionsRight_106
+{
+ #keys: '[413988.0.1271132759]'
+ BaseType: 'WebPanel'
+ Children:
+ [
+ Component btnOk id:btnOk_568
+ {
+ #keys: '[413988.0.1273560747]'
+ BaseType: 'WebButton'
+ Properties:
+ [
+ Label: 'OK'
+ Taborder: 0
+ ]
+ }
+ Component btnCancel id:btnCancel_925
+ {
+ #keys: '[413988.0.1273560814]'
+ BaseType: 'WebButton'
+ Properties:
+ [
+ Label: 'Cancel'
+ Taborder: 1
+ ]
+ }
+ ]
+ Properties:
+ [
+ Alignment: 'trailing'
+ FixedSize: true
+ Orientation: 'horizontal'
+ Taborder: 1
+ ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Method_OnOK.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Method_OnOK.def
new file mode 100644
index 0000000..0d98356
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Method_OnOK.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnOK () id:Method_DialogWholeShiftSystem_OnOK
+{
+ #keys: '[413988.0.1261831139]'
+ Body:
+ [*
+ Form.ApplyChanges();
+
+ WholeShift.PostProcessing2( MacroPlan );
+
+ Form.Close();
+ *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mDisable_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mDisable_OnClick.def
new file mode 100644
index 0000000..b8c335a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mDisable_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: ListEntity
+Response OnClick (
+ Entity selection
+) id:Response_ListEntity_mDisable_OnClick
+{
+ #keys: '[413988.0.1254381266]'
+ DefinitionID => /ListEntity/Responsedef_ListEntity_WebMenu_OnClick
+ Initiator: 'mDisable'
+ QuillAction
+ {
+ Body:
+ [*
+ selection.IsToFill( false );
+ *]
+ GroupServerCalls: false
+ }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mEnable_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mEnable_OnClick.def
new file mode 100644
index 0000000..01c4b2e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mEnable_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: ListEntity
+Response OnClick (
+ Entity selection
+) id:Response_ListEntity_mEnable_OnClick
+{
+ #keys: '[413988.0.1256872893]'
+ DefinitionID => /ListEntity/Responsedef_ListEntity_WebMenu_OnClick
+ Initiator: 'mEnable'
+ QuillAction
+ {
+ Body:
+ [*
+ selection.IsToFill( true );
+ *]
+ GroupServerCalls: false
+ }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsLeft_522_bTransferMinimumQuantity_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsLeft_522_bTransferMinimumQuantity_OnClick.def
new file mode 100644
index 0000000..e0b4a75
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsLeft_522_bTransferMinimumQuantity_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pnlActionsLeft_522/bTransferMinimumQuantity
+Response OnClick () id:Response_pnlActionsLeft_522_bTransferMinimumQuantity_OnClick
+{
+ #keys: '[413988.0.1271132688]'
+ CanBindMultiple: false
+ DefinitionID: 'Responsedef_WebButton_OnClick'
+ Precondition:
+ [*
+ return not isnull( MacroPlan );
+ *]
+ QuillAction
+ {
+ Body:
+ [*
+ dlg := construct( DialogTransferMinimumQuantity );
+
+ ApplicationMacroPlanner.ShowFormModal( dlg );
+ *]
+ GroupServerCalls: false
+ }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnCancel_OnClick\043836.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnCancel_OnClick\043836.def"
new file mode 100644
index 0000000..c4f0249
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnCancel_OnClick\043836.def"
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActionsRight_106/btnCancel_925
+Response OnClick () id:Response_pnlActions_btnCancel_OnClick_836
+{
+ #keys: '[413988.0.1273560813]'
+ DefinitionID: 'Responsedef_WebButton_OnClick'
+ GroupServerCalls: true
+ QuillAction
+ {
+ Body:
+ [*
+ Form.Close();
+ *]
+ }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnOk_OnClick\043393.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnOk_OnClick\043393.def"
new file mode 100644
index 0000000..74cc4c6
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnOk_OnClick\043393.def"
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActionsRight_106/btnOk_568
+Response OnClick () id:Response_pnlActions_btnOk_OnClick_393
+{
+ #keys: '[413988.0.1273560746]'
+ DefinitionID: 'Responsedef_WebButton_OnClick'
+ QuillAction
+ {
+ Body:
+ [*
+ Form.OnOK();
+ *]
+ GroupServerCalls: false
+ }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def
index e89d0ad..2f27cb6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def
@@ -16,8 +16,8 @@
EnterButton: 'btnOk'
EscapeButton: 'btnCancel'
ExcludeFromActiveComponent: true
- MinimumColumns: 100
- MinimumRows: 100
+ MinimumColumns: 110
+ MinimumRows: 35
Padding: 'false'
Title: 'WholeShiftSystem'
]
--
Gitblit v1.9.3