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