lihongji
2024-07-09 5ed2c2076e3b8a907ac2d271ea627cc9f9c9b3f4
_Main/BL/Type_OfflinePlanCell/StaticMethod_RefreshOfflinePlan.qbl
@@ -6,48 +6,51 @@
{
  TextBody:
  [*
    macroPlan.OfflinePlanRow( relflush );
    macroPlan.OfflinePlanColumn( relflush );
    macroPlan.OfflinePlanTable( relflush );
    opt := macroPlan.OfflinePlanTable( relnew, SaveDateTime := DateTime::ActualTime() );
    
    // 生成下线计划表
    traverse ( macroPlan, Unit, u, u.HasCapacityTypeTime() and u.Name() = "ZP4-M3" ) {
    traverse ( macroPlan, Unit, u, u.HasCapacityTypeTime() /*and u.Name() = "Spider Assy Line 1"*/ ) {
      // 创建产线行
      macroPlan.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := "", Type := "0" );
      opt.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := "", Type := "0" );
      
      traverse ( u, Operation, o ) {
        traverse ( o, PeriodTaskOperation.NewSupply, ns ) {
          // 找行
          oprQuantity := OfflinePlanRow::FindOfflinePlanRowTypeIndex( u.ID(), ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID(), "1" );
          oprOrder    := OfflinePlanRow::FindOfflinePlanRowTypeIndex( u.ID(), ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID(), "2" );
          oprQuantity := select( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = u.ID() and tempOPR.ProductID() = ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID() and tempOPR.Type() = "1" );
          oprOrder    := select( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = u.ID() and tempOPR.ProductID() = ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID() and tempOPR.Type() = "2" );
          if ( isnull( oprQuantity ) and isnull( oprOrder ) ) {
            oprQuantity := macroPlan.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID(), Type := "1" );
            oprOrder    := macroPlan.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID(), Type := "2" );
            oprQuantity := opt.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID(), Type := "1" );
            oprOrder    := opt.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := ns.AsProductionSupply().ProductInStockingPoint_MP().ProductID(), Type := "2" );
          }
          
          // 找列
          opc := OfflinePlanColumn::FindOfflinePlanColumnTypeIndex( ns.Start().Date() );
          opc := select( opt, OfflinePlanColumn, tempOPC, tempOPC.ColumnDate() = ns.Start().Date() );
          if ( isnull( opc ) ) {
            opc := macroPlan.OfflinePlanColumn( relnew, ColumnDate := ns.Start().Date() );
            opc := opt.OfflinePlanColumn( relnew, ColumnDate := ns.Start().Date() );
          }
          
          // 赋值单元格
          cellQuantity := opc.OfflinePlanCell( relnew, Value := [String]ns.Quantity().Round( 0 ), Shift := ns.PeriodTask_MP().UnitPeriod().astype( UnitPeriodTimeBase ).ShiftPattern().Name() );
          cellQuantity := opc.OfflinePlanCell( relnew, Value := [String]ns.Quantity().Round( 0 ), Shift := ns.PeriodTask_MP().UnitPeriod().astype( UnitPeriodTimeBase ).ShiftPattern().Name(), Quantity := ns.Quantity() );
          cellQuantity.OfflinePlanRow( relset, oprQuantity );
          cellOrder := opc.OfflinePlanCell( relnew, Value := "单号" );
          cellOrder := opc.OfflinePlanCell( relnew, Value := "单号" + [String]ns.Quantity().Round( 0 ) + "_" + [String]( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ),
                                            Quantity := ns.Quantity(),
                                            InventoryWeight := ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() );
          cellOrder.OfflinePlanRow( relset, oprOrder );
        }
      }
      
      // 创建总量行
      macroPlan.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := "Z", Type := "3" );
      opt.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := "Z", Type := "3" );
      // 创建班次行
      macroPlan.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := "Z", Type := "4" );
      opt.OfflinePlanRow( relnew, ProductionLine := u.ID(), ProductID := "Z", Type := "4" );
    }
    
    // 创建产品列&类型列
    productOPC := macroPlan.OfflinePlanColumn( relnew, ColumnDate := macroPlan.StartOfPlanning().Date() - 2 );
    typeOPC    := macroPlan.OfflinePlanColumn( relnew, ColumnDate := macroPlan.StartOfPlanning().Date() - 1 );
    traverse ( macroPlan, OfflinePlanRow, opr ) {
    productOPC := opt.OfflinePlanColumn( relnew, ColumnDate := macroPlan.StartOfPlanning().Date() - 2 );
    typeOPC    := opt.OfflinePlanColumn( relnew, ColumnDate := macroPlan.StartOfPlanning().Date() - 1 );
    traverse ( opt, OfflinePlanRow, opr ) {
      if ( opr.Type() = "0" ) {
        productLineCell := productOPC.OfflinePlanCell( relnew, Value := opr.ProductionLine() );
        productLineCell.OfflinePlanRow( relset, opr );
@@ -71,9 +74,9 @@
    }
    
    // 补全总量和班次
    totalOPRs := selectset( macroPlan, OfflinePlanRow, tempOPR, tempOPR.Type() = "3" );
    shiftOPRs := selectset( macroPlan, OfflinePlanRow, tempOPR, tempOPR.Type() = "4" );
    traverse ( macroPlan, OfflinePlanColumn, opc, opc.OfflinePlanCell( relsize ) > 0 and opc.ColumnDate() >= macroPlan.StartOfPlanning().Date() ) {
    totalOPRs := selectset( opt, OfflinePlanRow, tempOPR, tempOPR.Type() = "3" );
    shiftOPRs := selectset( opt, OfflinePlanRow, tempOPR, tempOPR.Type() = "4" );
    traverse ( opt, OfflinePlanColumn, opc, opc.OfflinePlanCell( relsize ) > 0 and opc.ColumnDate() >= macroPlan.StartOfPlanning().Date() ) {
      traverse ( totalOPRs, Elements, totalOPR ) {
        total     := sum( opc, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanRow().ProductionLine() = totalOPR.ProductionLine() and tempOPC.OfflinePlanRow().Type() = "1", [Real]tempOPC.Value() );
        totalCell := opc.OfflinePlanCell( relnew, Value := [String]total );
@@ -93,11 +96,67 @@
    indexDate := macroPlan.StartOfPlanning().Date();
    endDate   := Date::Construct( indexDate.Year(), 12, 31 );
    while ( indexDate <= endDate ) {
      opc := OfflinePlanColumn::FindOfflinePlanColumnTypeIndex( indexDate );
      opc := select( opt, OfflinePlanColumn, tempOPC, tempOPC.ColumnDate() = indexDate );
      if ( isnull( opc ) ) {
        opc := macroPlan.OfflinePlanColumn( relnew, ColumnDate := indexDate );
        opc := opt.OfflinePlanColumn( relnew, ColumnDate := indexDate );
      }
      indexDate := indexDate + 1;
    }
    Transaction::Transaction().PropagateAll();
    // 设置生产顺序
    productionLines := selectuniquevalues( opt, OfflinePlanRow, tempOPR, true, tempOPR.ProductionLine() );
    traverse ( productionLines, Elements, pl ) {
      indexColumn    := select( opt, OfflinePlanColumn, tempOPC, tempOPC.ColumnDate() = macroPlan.StartOfPlanning().Date() );
      previousColumn := indexColumn.PreviousColumn();
      nextColumn     := indexColumn.NextColumn();
      while ( not isnull( indexColumn.NextColumn() ) ) {
        productionSerialNumber := 1;
        opcs                   := selectsortedset( indexColumn, OfflinePlanCell, tempOPC, tempOPC.FindType( "2", pl ), tempOPC.InventoryWeight() );
        if ( opcs.Size() > 0 ) {
          // 判定1
          previousOPC := maxselect( previousColumn, OfflinePlanCell, tempOPC, tempOPC.FindType( "2", pl ), tempOPC.ProductionSerialNumber() );
          if ( isnull( previousOPC ) or indexColumn.ColumnDate() = macroPlan.StartOfPlanning().Date() ) {
            opc := opcs.Element( 0 );
            opc.Value( "#" + productionSerialNumber.Format( "N(LPad0(2))" ) );
            opc.ProductionSerialNumber( productionSerialNumber );
            productionSerialNumber++;
            opcs.Remove( opc );
          } else {
            opc := select( opcs, Elements, tempOPC, tempOPC.OfflinePlanRow().ProductID() = previousOPC.OfflinePlanRow().ProductID() );
            if ( not isnull( opc ) ) {
              opc.Value( "#" + productionSerialNumber.Format( "N(LPad0(2))" ) );
              opc.ProductionSerialNumber( productionSerialNumber );
              productionSerialNumber++;
              opcs.Remove( opc );
            }
          }
          // 判定2
          nextOPCs := selectset( opcs, Elements, tempOPC,
                                 exists( nextColumn, OfflinePlanCell, nextOPC, nextOPC.FindType( "2", pl ) and nextOPC.OfflinePlanRow().ProductID() = tempOPC.OfflinePlanRow().ProductID() ) );
          if ( nextOPCs.Size() = 1 ) {
            opc := nextOPCs.Element( 0 );
            opc.Value( "#" + opcs.Size().Format( "N(LPad0(2))" ) );
            opc.ProductionSerialNumber( opcs.Size() );
            opcs.Remove( opc );
          }
          // 判定3
          traverse ( opcs, Elements, opc ) {
            opc.Value( "#" + productionSerialNumber.Format( "N(LPad0(2))" ) );
            opc.ProductionSerialNumber( productionSerialNumber );
            productionSerialNumber++;
            opcs.Remove( opc );
          }
        }
        indexColumn    := indexColumn.NextColumn();
        previousColumn := indexColumn.PreviousColumn();
        nextColumn     := indexColumn.NextColumn();
      }
    }
  *]
}