lihongji
2024-09-27 46ddfed5009f83c7238e11254154c03aa8260774
_Main/BL/Type_OfflinePlanCell/StaticMethod_RefreshOfflinePlan.qbl
@@ -35,12 +35,13 @@
          }
          
          // 赋值单元格
          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 := "单号" + [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 );
          cellQuantity := oprQuantity.OfflinePlanCell( relnew, Value := [String]ns.Quantity().Round( 0 ), Shift := ns.PeriodTask_MP().UnitPeriod().astype( UnitPeriodTimeBase ).ShiftPattern().Name() );
          cellQuantity.OfflinePlanColumn( relset, opc );
          cellOrder := oprOrder.OfflinePlanCell( relnew,
    //                                             Value := "单号" + [String]ns.Quantity().Round( 0 ) + "_" + [String]( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ),
                                                 Value := [String]ns.Quantity().Round( 0 ),
                                                 InventoryWeight := ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() );
          cellOrder.OfflinePlanColumn( relset, opc );
        }
      }
      
@@ -59,30 +60,30 @@
    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 );
        productLineCell := opr.OfflinePlanCell( relnew, Value := opr.ProductionLine() );
        productLineCell.OfflinePlanColumn( relset, productOPC );
      } else if( opr.Type() = "1" ) {
        productCell := productOPC.OfflinePlanCell( relnew, Value := opr.ProductID() + ifexpr( opr.Notes() = "", "", "-" + opr.Notes() ) );
        productCell.OfflinePlanRow( relset, opr );
        typeCell    := typeOPC.OfflinePlanCell( relnew, Value :=  "Quantity" );
        typeCell.OfflinePlanRow( relset, opr );
        productCell := opr.OfflinePlanCell( relnew, Value := opr.ProductID() + ifexpr( opr.Notes() = "", "", "-" + opr.Notes() ) );
        productCell.OfflinePlanColumn( relset, productOPC );
        typeCell    := opr.OfflinePlanCell( relnew, Value :=  "Quantity" );
        typeCell.OfflinePlanColumn( relset, typeOPC );
      } else if ( opr.Type() = "2" ) {
        typeCell    := typeOPC.OfflinePlanCell( relnew, Value :=  "Order" );
        typeCell.OfflinePlanRow( relset, opr );
        typeCell    := opr.OfflinePlanCell( relnew, Value :=  "Order" );
        typeCell.OfflinePlanColumn( relset, typeOPC );
      } else if ( opr.Type() = "3" ) {
        totalCell := productOPC.OfflinePlanCell( relnew, Value := "合计" );
        totalCell.OfflinePlanRow( relset, opr );
        totalCell := typeOPC.OfflinePlanCell( relnew, Value :=  "总量" );
        totalCell.OfflinePlanRow( relset, opr );
        totalCell := opr.OfflinePlanCell( relnew, Value := "合计" );
        totalCell.OfflinePlanColumn( relset, productOPC );
        totalCell := opr.OfflinePlanCell( relnew, Value :=  "总量" );
        totalCell.OfflinePlanColumn( relset, typeOPC );
      } else if ( opr.Type() = "4" ) {
        shiftCell := typeOPC.OfflinePlanCell( relnew, Value :=  "班次" );
        shiftCell.OfflinePlanRow( relset, opr );
        shiftCell := opr.OfflinePlanCell( relnew, Value :=  "班次" );
        shiftCell.OfflinePlanColumn( relset, typeOPC );
      } else if ( opr.Type() = "5" ) {
        shiftStartDateCell := typeOPC.OfflinePlanCell( relnew, Value :=  "班次开始时间" );
        shiftStartDateCell.OfflinePlanRow( relset, opr );
        shiftStartDateCell := opr.OfflinePlanCell( relnew, Value :=  "班次开始时间" );
        shiftStartDateCell.OfflinePlanColumn( relset, typeOPC );
      } else if ( opr.Type() = "6" ) {
        shiftEndDateCell := typeOPC.OfflinePlanCell( relnew, Value :=  "班次结束时间" );
        shiftEndDateCell.OfflinePlanRow( relset, opr );
        shiftEndDateCell := opr.OfflinePlanCell( relnew, Value :=  "班次结束时间" );
        shiftEndDateCell.OfflinePlanColumn( relset, typeOPC );
      }
    }
    
@@ -95,16 +96,16 @@
      // 补全总量
      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 );
        totalCell.OfflinePlanRow( relset, totalOPR );
        totalCell := totalOPR.OfflinePlanCell( relnew, Value := [String]total );
        totalCell.OfflinePlanColumn( relset, opc );
      }
      
      // &班次
      traverse ( shiftOPRs, Elements, shiftOPR ) {
        shift := select( opc, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanRow().ProductionLine() = shiftOPR.ProductionLine() and tempOPC.OfflinePlanRow().Type() = "1" ); 
        if ( not isnull( shift ) ) {
          shiftCell := opc.OfflinePlanCell( relnew, Value := shift.Shift() );
          shiftCell.OfflinePlanRow( relset, shiftOPR );
          shiftCell := shiftOPR.OfflinePlanCell( relnew, Value := shift.Shift() );
          shiftCell.OfflinePlanColumn( relset, opc );
        }
      }
      
@@ -113,8 +114,8 @@
        shift := select( opc, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanRow().ProductionLine() = ssdOPR.ProductionLine() and tempOPC.OfflinePlanRow().Type() = "1" ); 
        if ( not isnull( shift ) ) {
          startDate     := guard( minselect( macroPlan, ShiftPattern.ShiftDayTime, tempSDT, tempSDT.ShiftPattern().Name() = shift.Shift(), tempSDT.Sequence() ).StartDateTime().Format( "H:m" ), "" );
          startDateCell := opc.OfflinePlanCell( relnew, Value := startDate );
          startDateCell.OfflinePlanRow( relset, ssdOPR );
          startDateCell := ssdOPR.OfflinePlanCell( relnew, Value := startDate );
          startDateCell.OfflinePlanColumn( relset, opc );
        }
      }
      
@@ -123,8 +124,8 @@
        shift := select( opc, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanRow().ProductionLine() = sedOPR.ProductionLine() and tempOPC.OfflinePlanRow().Type() = "1" ); 
        if ( not isnull( shift ) ) {
          endDate     := guard( maxselect( macroPlan, ShiftPattern.ShiftDayTime, tempSDT, tempSDT.ShiftPattern().Name() = shift.Shift(), tempSDT.Sequence() ).EndDateTIme().Format( "H:m" ), "" );
          endDateCell := opc.OfflinePlanCell( relnew, Value := endDate );
          endDateCell.OfflinePlanRow( relset, sedOPR );
          endDateCell := sedOPR.OfflinePlanCell( relnew, Value := endDate );
          endDateCell.OfflinePlanColumn( relset, opc );
        }
      }
    }
@@ -145,12 +146,13 @@
      traverse ( opt, OfflinePlanColumn, opc ) {
        cell := select( opr, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanColumn() = opc );
        if ( isnull( cell ) ) {
          cell := opc.OfflinePlanCell( relnew, Value := "" );
          cell.OfflinePlanRow( relset, opr );
          cell := opr.OfflinePlanCell( relnew, Value := "" );
          cell.OfflinePlanColumn( relset, opc );
        }
      }
    }
    
    Transaction::Transaction().Propagate( attribute( OfflinePlanCell, Quantity ) );
    Transaction::Transaction().PropagateAll();
    
    // 设置生产顺序
@@ -161,12 +163,13 @@
      nextColumn     := indexColumn.NextColumn();
      
      while ( not isnull( indexColumn.NextColumn() ) 
    //          and indexColumn.ColumnDate() <= Date::Construct( 2024, 4, 16 ) // 测试实际场景时可以过滤
    //          and indexColumn.ColumnDate() <= Date::Construct( 2020, 4, 1 ) // 测试实际场景时可以过滤
             ) {
        productionSerialNumber := 1;
        opcs                   := selectsortedset( indexColumn, OfflinePlanCell, tempOPC, tempOPC.FindType( "2", pl ), tempOPC.InventoryWeight() );
        initialSize            := opcs.Size();
        if ( opcs.Size() > 0 ) {
        info( "计划开始时间:", macroPlan.StartOfPlanning().Date().Format( "Y-M2-D2" ), "    索引时间:", indexDate.Format( "Y-M2-D2" ), "    个数:", opcs.Size() );
        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() ) {