| Quintiq file version 2.0 | 
| #parent: #root | 
| StaticMethod IterativeGeneration2 ( | 
|   GlobalOTDTable globalOTDTable, | 
|   ProductInStockingPoint_MP pisp, | 
|   Date targetDate, | 
|   CapacityAllocationResultsRuleConfigurations carrcs, | 
|   Number numberOfLayers, | 
|   NewSupply firstLevelSupply, | 
|   Real currentLayerDependentDemandQuantity | 
| ) | 
| { | 
|   TextBody: | 
|   [* | 
|     numberOfLayers++; | 
|     //info( "目标时间:", targetDate.Format( "Y-M2-D2" ) ); | 
|     info( pisp.Name() ); | 
|     traverse ( pisp, ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), pispippl, pispippl.Start().Date() = targetDate ) { | 
|       traverse ( pispippl, NewSupply, ns, ns.Quantity() > 0 ) { | 
|         if ( numberOfLayers = 1 ) { | 
|           firstLevelSupply := ns; | 
|         } | 
|          | 
|         ontype( ns.PeriodTask_MP() ) { | 
|           PeriodTaskOperation as pto : { | 
|     //        info( "Operation周期任务..." );      | 
|             traverse ( ns, PeriodTask_MP.astype( PeriodTaskOperation ).DependentDemand, dd ) { | 
|               if ( numberOfLayers = 1 ) { | 
|                 currentLayerDependentDemandQuantity := ns.Quantity(); | 
|               } | 
|               currentLayerDependentDemandQuantity := currentLayerDependentDemandQuantity                     *  | 
|                                                      ns.ProcessOutput().astype( OperationOutput ).Quantity() * | 
|                                                      dd.ProcessInput().astype( OperationInput ).Quantity(); | 
|     //          info( "层数:", numberOfLayers, "    当前供应的pisp:", ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().Name(), "    总供应值:", ns.Quantity(), "    需要供应值:", currentLayerDependentDemandQuantity, | 
|     //                "    当前需求pisp:", dd.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().Name(), "    需求值:", currentLayerDependentDemandQuantity ); | 
|     //          info( "-----------------------------------------------------------------------------------------------------------------" ); | 
|               CapacityAllocationResults::IterativeGeneration2( globalOTDTable, | 
|                                                                dd.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP(), | 
|                                                                targetDate, | 
|                                                                carrcs, | 
|                                                                numberOfLayers, | 
|                                                                firstLevelSupply, | 
|                                                                currentLayerDependentDemandQuantity | 
|                                                               ); | 
|             } | 
|             carrc := select( carrcs, Elements, carrc, carrc.PanelMaterialCode() = ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID() ); | 
|             if ( not isnull( carrc ) ) { | 
|     //          info( "找到面板物料..." ); | 
|               globalOTDTable.CapacityAllocationResults( relnew, | 
|                                                         PanelBase             := pto.Operation().UnitID(), | 
|                                                         PanelMaterialCode     := ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID(), | 
|                                                         NumberOfPanels        := currentLayerDependentDemandQuantity, | 
|                                                         PanelMeasurementUnit  := ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().UnitOfMeasureName(), | 
|                                                         ModuleMaterialCode    := firstLevelSupply.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID(), | 
|                                                         NumberOfModules       := firstLevelSupply.Quantity(), | 
|                                                         ModuleMeasurementUnit := firstLevelSupply.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().UnitOfMeasureName(), | 
|                                                         ModuleBase            := guard( firstLevelSupply.PeriodTask_MP().astype( PeriodTaskOperation ).Operation().UnitID(), "车道运输" ), | 
|                                                         Division              := carrc.Division(), | 
|                                                         RequirementDate       := ns.Start().Date(), | 
|                                                         Date                  := ns.Start().Date(), | 
|                                                         Description           := "", | 
|                                                         ID                    := OS::GenerateGUIDAsString(), | 
|                                                         ProductID             := ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID(), | 
|                                                         StockingPointID       := ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().StockingPointID(), | 
|                                                         UserQuantity          := currentLayerDependentDemandQuantity, | 
|                                                         ManufacturedDate      := Date::MinDate() | 
|                                                        ); | 
|                                                          | 
|             } | 
|             info( "-----------------------------------------------------------------------------------------------------------------" ); | 
|           } | 
|            | 
|           PeriodTaskLaneLeg as ptll : { | 
|             targetDependentDemand := select( ptll, DependentDemand, dd, dd.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID() = ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID() ); | 
|             currentLayerDependentDemandQuantity := ifexpr( numberOfLayers = 1, targetDependentDemand.Quantity(), currentLayerDependentDemandQuantity ); | 
|     //        info( "层数:", numberOfLayers,"    当前供应的pisp:", ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().Name(), "    总供应值:", ns.Quantity(), "    需要供应值:", currentLayerDependentDemandQuantity, | 
|     //              "    当前需求pisp:", targetDependentDemand.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().Name(), "    需求值:", currentLayerDependentDemandQuantity ); | 
|     //        info( "LaneLeg周期任务..." ); | 
|             info( "-----------------------------------------------------------------------------------------------------------------" ); | 
|             CapacityAllocationResults::IterativeGeneration2( globalOTDTable, | 
|                                                              targetDependentDemand.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP(), | 
|                                                              targetDate, | 
|                                                              carrcs, | 
|                                                              numberOfLayers, | 
|                                                              firstLevelSupply, | 
|                                                              currentLayerDependentDemandQuantity | 
|                                                             ); | 
|           } | 
|         } | 
|          | 
|         if ( numberOfLayers = 1 ) { | 
|           firstLevelSupply := null( NewSupply ); | 
|         } | 
|       } | 
|     } | 
|   *] | 
| } |