Quintiq file version 2.0 
 | 
#parent: #root 
 | 
StaticMethod GenerateReport ( 
 | 
  MacroPlan macroPlan 
 | 
) 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    macroPlan.PackagingPlanRow( relflush ); 
 | 
    macroPlan.PackagingPlanColumn( relflush ); 
 | 
     
 | 
    // 创建计划前一天列 
 | 
    planPre     := macroPlan.PackagingPlanColumn( relnew, StartDate := macroPlan.StartOfPlanning().Date() - 1 ); 
 | 
     
 | 
    // 生成报表 
 | 
    traverse ( macroPlan, Product_MP.ProductInStockingPoint_MP, pisp, pisp.IsLeaf() and not pisp.IsSystem() and  
 | 
               ( pisp.StockingPointID().Regex( "CC" ) or pisp.StockingPointID().Regex( "DL" ) or pisp.StockingPointID().Regex( "大连" ) or pisp.StockingPointID().Regex( "长春" ) ) ) { 
 | 
      // 当前pisp所处地点 
 | 
      factory             := ifexpr( pisp.StockingPointID().Regex( "CC" ) or pisp.StockingPointID().Regex( "长春" ), "长春工厂", "大连工厂" ); 
 | 
      factoryAbbreviation := ifexpr( pisp.StockingPointID().Regex( "CC" ) or pisp.StockingPointID().Regex( "长春" ), "CC", "DL" ); 
 | 
       
 | 
      // 创建行 
 | 
      ppr := select( macroPlan, PackagingPlanRow, tempPPR, tempPPR.ProductID() = pisp.ProductID() and tempPPR.Factory() = factory ); 
 | 
      if ( isnull( ppr ) ) { 
 | 
        ppr := macroPlan.PackagingPlanRow( relnew, ProductID := pisp.ProductID(), Factory := factory, Category := guard( pisp.Product_MP().ParentID(), "" ) ); 
 | 
      } 
 | 
       
 | 
      // 循环pispippl 
 | 
      traverse ( pisp, ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), pispipl, not pispipl.IsPeriodFrozen() ) { 
 | 
        // 创建列 
 | 
        ppc := select( macroPlan, PackagingPlanColumn, tempPPC, tempPPC.StartDate() = pispipl.Start().Date() ); 
 | 
        if ( isnull( ppc ) ) { 
 | 
          ppc := macroPlan.PackagingPlanColumn( relnew, StartDate := pispipl.Start().Date() ); 
 | 
        } 
 | 
         
 | 
        // 创建单元格 
 | 
        cell := select( ppr, PackagingPlanCell, tempPPCell, tempPPCell.PackagingPlanColumn() = ppc ); 
 | 
        if ( isnull( cell ) ) { 
 | 
          cell := ppr.PackagingPlanCell( relnew );  
 | 
          cell.PackagingPlanColumn( relset, ppc ); 
 | 
        } 
 | 
         
 | 
        // 设置调出 
 | 
        traverse ( pispipl, AsDeparturePISPIP, pit, 
 | 
                   pit.Quantity()                > 0                                                                         and 
 | 
                   pit.Trip().LaneLeg().AsOriginStockingPointLeg().StockingPoint_MP().ID().Regex( factoryAbbreviation )      and 
 | 
                   TransferPlanRow::IdentifyTheFactory( pit.Trip().LaneLeg().AsOriginStockingPointLeg().StockingPoint_MP() ) <> TransferPlanRow::IdentifyTheFactory( pit.Trip().LaneLeg().AsDestinationStockingPointLeg().StockingPoint_MP() ) 
 | 
                  )  
 | 
        { 
 | 
          cell.Out( cell.Out() + pit.Quantity() ); 
 | 
        } 
 | 
         
 | 
        // 设置调进 
 | 
        traverse ( pispipl, AsArrivalPISPIP, pit, 
 | 
                   pit.Quantity()              > 0                                                                           and 
 | 
                   pit.Trip().LaneLeg().AsDestinationStockingPointLeg().StockingPoint_MP().ID().Regex( factoryAbbreviation ) and 
 | 
                   TransferPlanRow::IdentifyTheFactory( pit.Trip().LaneLeg().AsOriginStockingPointLeg().StockingPoint_MP() ) <> TransferPlanRow::IdentifyTheFactory( pit.Trip().LaneLeg().AsDestinationStockingPointLeg().StockingPoint_MP() ) 
 | 
                  )  
 | 
        { 
 | 
          cell.TransferIn( cell.TransferIn() + pit.Quantity() ); 
 | 
        } 
 | 
         
 | 
        // 大连工厂设置值 
 | 
        if ( factory = "大连工厂" ) { 
 | 
          // 净需求&剩余库存&供应量 
 | 
          cell.NetDemand( cell.NetDemand() + pispipl.DependentDemandAndSalesDemandQuantity() ); 
 | 
          cell.EndingInventory( cell.EndingInventory() + pispipl.InventoryLevelEnd() ); 
 | 
        } 
 | 
         
 | 
        // 长春工厂设置值 
 | 
        if ( factory = "长春工厂" ) { 
 | 
          // 剩余库存&供应量 
 | 
          cell.EndingInventory( cell.EndingInventory() + pispipl.InventoryLevelEnd() ); 
 | 
           
 | 
          // 净需求【只取线边库】&包装库存&非包装库存 
 | 
          if ( pisp.StockingPointID().Regex( "外租库" ) ) { 
 | 
            cell.CC_PackagingInventory( pispipl.InventoryLevelEnd() ); 
 | 
          } else if ( pisp.StockingPointID().Regex( "线边库" ) ) { 
 | 
            cell.CC_UnpackagedInventory( pispipl.InventoryLevelEnd() ); 
 | 
            cell.NetDemand( cell.NetDemand() + pispipl.DependentDemandAndSalesDemandQuantity() ); 
 | 
          } 
 | 
        } 
 | 
         
 | 
        // 设置New Supply,纯生产值 
 | 
        traverse ( pispipl, NewSupply, ns, ns.PeriodTask_MP().istype( PeriodTaskOperation ) ) { 
 | 
          cell.NewSupply( cell.NewSupply() + ns.Quantity() ); 
 | 
        } 
 | 
         
 | 
        // 设置前一天库存 
 | 
        if ( pispipl.Start().Date() = macroPlan.StartOfPlanning().Date() ) { 
 | 
          prePISPIPL  := pispipl.PreviousPlanningPISPIP().astype( ProductInStockingPointInPeriodPlanningLeaf ); // 前一个pispippl 
 | 
          // 创建计划前一天格子 
 | 
          preCell := select( ppr, PackagingPlanCell, tempPPCell, tempPPCell.PackagingPlanColumn() = planPre ); 
 | 
          if ( isnull( preCell ) ) { 
 | 
            preCell := ppr.PackagingPlanCell( relnew ); 
 | 
            preCell.EndingInventory( prePISPIPL.InventoryLevelEnd() ); 
 | 
            preCell.PackagingPlanColumn( relset, planPre ); 
 | 
          } else { 
 | 
            preCell.EndingInventory( preCell.EndingInventory() + prePISPIPL.InventoryLevelEnd() ); 
 | 
          } 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
     
 | 
    Transaction::Transaction().Propagate( attribute( PackagingPlanRow, FactoryAbbreviation ) ); 
 | 
    PackagingPlanCell::CalculationPackagingPlanProperties(); 
 | 
    Transaction::Transaction().Propagate( relation( PackagingPlanCell, Next ) ); 
 | 
     
 | 
    // 设置包装&拆包-数量(大连工厂) 
 | 
    PackagingPlanCell::SetPackagingAndUnpackingValuesDL( macroPlan ); 
 | 
    // 设置包装&拆包-数量(长春工厂) 
 | 
    PackagingPlanCell::SetPackagingAndUnpackingValuesCC( macroPlan ); 
 | 
    //traverse ( macroPlan, PackagingPlanRow, ppr, ( ppr.ProductID() = "Windshield" and ppr.StockingPointID() = "Bosch" ) or ( ppr.ProductID() = "Windshield" and ppr.StockingPointID() = "Components (Spain)" ) ) { 
 | 
    //  traverse ( ppr, PackagingPlanCell, ppc/*, ppc.StartDate() = Date::Construct( 2020, 4, 1 )*/ ) { 
 | 
    //    // 设置包装数量 
 | 
    //    if ( ppc.PackagingInventory() < ppc.Out() ) { // 包装库存是否小于调出 
 | 
    //      prePPC                := ppc.Previous(); 
 | 
    //      needPackagingQuantity := ppc.Out() - prePPC.PackagingInventory(); 
 | 
    //      while ( not isnull( prePPC ) and needPackagingQuantity > 0.0 ) { 
 | 
    //        // 获取包装lotsize 
 | 
    //        ppls                   := select( macroPlan, PackagingPlanLotSize, tempPPLS, tempPPLS.Factory() =  ppc.PackagingPlanRow().Factory()    and  
 | 
    //                                                                                    tempPPLS.ProductID() = ppc.PackagingPlanRow().ProductID() ); 
 | 
    //         
 | 
    //        // 获取最大包装数量 
 | 
    //        maxPackageReflection   := Reflection::FindAttribute( "PackagingPlanCapability", ppc.PackagingPlanRow().FactoryAbbreviation() + "_" + ppc.PackagingPlanRow().Category() + "_Package" ); 
 | 
    ////        maxPackageQuantity     := maxPackageReflection.GetNumber( macroPlan.PackagingPlanCapability() ); // 此处需要修改 
 | 
    //        maxPackageQuantity     := 100000; 
 | 
    //         
 | 
    //        // 获取最终包装数量 
 | 
    //        finalPackagingQuantity := minvalue( ceil( needPackagingQuantity / ppls.LotSize() ), ceil( ( maxPackageQuantity - prePPC.Package() ) / ppls.LotSize() ) ) * ppls.LotSize(); 
 | 
    //        needPackagingQuantity  := needPackagingQuantity - finalPackagingQuantity; 
 | 
    //         
 | 
    //        // 设置包装值 
 | 
    //        prePPC.Package( prePPC.Package() + finalPackagingQuantity ); 
 | 
    //         
 | 
    //        //debuginfo( "需要包装数量:", needPackagingQuantity, "    lotsize: ", ppls.LotSize(), "    最大包装数量:", maxPackageQuantity, "    最终补的数量:", finalPackagingQuantity ); 
 | 
    //        PackagingPlanCell::CalculationPackagingPlanProperties(); 
 | 
    //       
 | 
    //        prePPC := prePPC.Previous(); 
 | 
    //      } 
 | 
    //    } 
 | 
    //     
 | 
    //    // 设置拆包数量 
 | 
    //    if ( ppc.TransferIn() > 0.0 ) { // 有调入数量 
 | 
    //      // 获取包装lotsize 
 | 
    //      ppls                 := select( macroPlan, PackagingPlanLotSize, tempPPLS, tempPPLS.Factory() =  ppc.PackagingPlanRow().Factory()    and  
 | 
    //                                                                                 tempPPLS.ProductID() = ppc.PackagingPlanRow().ProductID() ); 
 | 
    //     
 | 
    //      // 设置拆包值 
 | 
    //      ppc.Unpacking( ppc.TransferIn() ); 
 | 
    //    } 
 | 
    //  } 
 | 
    //} 
 | 
  *] 
 | 
} 
 |