| Quintiq file version 2.0 | 
| #parent: #root | 
| StaticMethod Package ( | 
|   MacroPlan macroPlan, | 
|   PackagingPlanRow ppr, | 
|   PackagingPlanColumn ppc, | 
|   output Number needPackagingQuantity | 
| ) | 
| { | 
|   TextBody: | 
|   [* | 
|     // 计划开始时间 | 
|     plannedStartDate := macroPlan.StartOfPlanning().Date(); | 
|      | 
|     traverse ( ppr, PackagingPlanCell, ppcell, ppcell.PackagingPlanColumn() = ppc ) { | 
|       // Product_MP | 
|       pmp                     := select( macroPlan, Product_MP, tempPMP, tempPMP.IsLeaf() and tempPMP.ID() = ppr.ProductID() ); | 
|       // 包装lotsize | 
|       ppls                    := select( macroPlan, PackagingPlanLotSize, tempPPLS, tempPPLS.Factory() = ppr.Factory() and  | 
|                                          tempPPLS.ProductID() = ifexpr( exists( macroPlan, PackagingPlanLotSize, tempPPLS1, tempPPLS1.ProductID() = pmp.ID() ), | 
|                                                                         pmp.ID(), | 
|                                                                         pmp.ParentID() ) ); | 
|       // 一日包装容量 | 
|       ppnc                    := select( macroPlan, PackagingPlanNewCapability, tempPPNC, tempPPNC.Factory() = ppr.Factory() and  | 
|                                          tempPPNC.ProductID() = ifexpr( exists( macroPlan, PackagingPlanNewCapability, tempPPNC1, tempPPNC1.ProductID() = pmp.ID() ), | 
|                                                                         pmp.ID(), | 
|                                                                         pmp.ParentID() ) ); | 
|       // Unit | 
|       us                      := selectset( macroPlan, Unit, tempU, tempU.ID().Regex( ppr.FactoryAbbreviation() + " " + ppr.Category() ) ); | 
|         | 
|       // 包装库存出现负值,需要设置包装量 | 
|       if ( not isnull( ppls ) and not isnull( ppnc ) ) { | 
|         // 包装开始的索引 | 
|         indexPPCell           := ppcell.Previous(); | 
|          | 
|     //      info( "产线个数:", us.Size(), "    开始时间:", ppcell.StartDate().Format( "Y-M2-D2" ), "    包装库存数量:", ppcell.PackagingInventory(), "    需要包装的数量:", needPackagingQuantity,  | 
|     //            "    包装lotsize:",guard( ppls.LotSize(), 0 ), "    最大包装容量:", ppnc.MaximumDailyPackagingQuantity() ); | 
|            | 
|         while ( not isnull( indexPPCell )                                                   and  | 
|                 indexPPCell.StartDate() >= plannedStartDate                                 and  | 
|                 exists( us, Elements.UnitPeriod.astype( UnitPeriodTime ).ShiftPlan, tempSP,  | 
|                         tempSP.UnitPeriodTime().StartDate() = indexPPCell.StartDate(), | 
|                         tempSP.Outcome() <> "" )                                            and | 
|                 needPackagingQuantity > 0 ) { | 
|           // 能包装的数量 | 
|           canPackagingQuantity  := ifexpr( ceil( needPackagingQuantity / ppls.LotSize() ) < floor( ppnc.MaximumDailyPackagingQuantity() / ppls.LotSize() ), | 
|                                            ceil( needPackagingQuantity / ppls.LotSize() ), | 
|                                            floor( ppnc.MaximumDailyPackagingQuantity() / ppls.LotSize() ) ) * ppls.LotSize(); | 
|           // 改类下其他产品包装总和 | 
|           categoryPackageQuantity := sum( indexPPCell, PackagingPlanColumn.PackagingPlanCell, tempPPCell,  | 
|                                           tempPPCell <> indexPPCell                                                            and | 
|                                           tempPPCell.PackagingPlanRow().Factory() = indexPPCell.PackagingPlanRow().Factory()   and | 
|                                           tempPPCell.PackagingPlanRow().Category() = indexPPCell.PackagingPlanRow().Category(), | 
|                                           tempPPCell.Package() ); | 
|           canPackagingQuantity    := minvalue( [Number] ( ppnc.MaximumDailyPackagingQuantity() - categoryPackageQuantity ), canPackagingQuantity ); | 
|     //        info( "开始包装的日期:", indexPPCell.StartDate().Format( "Y-M2-D2" ), "    能包装的数量:", canPackagingQuantity ); | 
|              | 
|           indexPPCell.Package( canPackagingQuantity ); | 
|           Transaction::Transaction().Propagate( attribute( PackagingPlanCell, PackagingInventory ) ); | 
|           Transaction::Transaction().Propagate( attribute( PackagingPlanCell, UnpackagedInventory ) ); | 
|              | 
|           needPackagingQuantity := needPackagingQuantity - canPackagingQuantity; | 
|           indexPPCell           := indexPPCell.Previous(); | 
|         } | 
|       } | 
|     } | 
|   *] | 
| } |