xiaoding721
2024-10-28 52bd9a90e6e31eb2c458447fd7fec4e8f99a0fe7
_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_Dispatch.qbl
@@ -10,7 +10,7 @@
  TextBody:
  [*
    // Akari Sep-4-2024 (created)
    owner.DispatchShiftSchedulingInformation( relflush );
    owner.DispatchShiftSchedulingLine( relflush );
    macroPlan := offlinePlan.MacroPlan();
    now := DateTime::Now();
    
@@ -30,26 +30,19 @@
      unitIndexTree.Root().AddChild( unitHandle,i );
    }
    
    // productLines := selectuniquevalues( offlinePlan,NewOfflinePlanRow,row,row.ProductionLine() );
    productLinesQuantityNameValueTree := NamedValueTree::Create();
    traverse( offlinePlan,NewOfflinePlanRow,row ){
      traverse( row,NewOfflinePlanCell,cell, startDate <= cell.NewOfflinePlanColumn().StartDate() and endDate >= cell.NewOfflinePlanColumn().EndDate()){
        productLinesQuantityHandle := productLinesQuantityNameValueTree.GetHandle( row.ProductionLine() + cell.NewOfflinePlanColumn().StartDate().AsQUILL() );
        productLinesQuantity := guard( productLinesQuantityNameValueTree.Root().Child( productLinesQuantityHandle ),null( NamedValue ));
        if( not isnull( productLinesQuantity )){
          productLinesQuantity.SetValue( productLinesQuantity.GetValueAsReal() + cell.Quantity() );
        }else{
          productLinesQuantityNameValueTree.Root().AddChild( productLinesQuantityHandle, cell.Quantity() );
        }
      }
    }
    lines := construct( DispatchShiftSchedulingLines );
    lineIndexTree := NamedValueTree::Create();
    
    products := construct( DispatchShiftSchedulingProducts );
    productIndexTree := NamedValueTree::Create();
    //productionDetails := construct( DispatchShiftSchedulingDetails );
    //productionDetailIndexTree := NamedValueTree::Create();
    traverse( offlinePlan,NewOfflinePlanRow,row ){
      productID := row.ProductID();
      productLine := row.ProductionLine();
      line := null( DispatchShiftSchedulingLine );
      factory := constnull( Unit );
      {
        unitHandle := unitIndexTree.GetHandle( productLine );
        unitHandle := unitIndexTree.GetHandle( row.ProductionLine() );
        unitIndex := guard( unitIndexTree.Root().Child( unitHandle ), null( NamedValue ));
        if( not isnull( unitIndex )){
          unit := units.Element( unitIndex.GetValueAsNumber() );
@@ -61,48 +54,169 @@
          }
          factory := temp2;
        }
        lineHandle := lineIndexTree.GetHandle( row.ProductionLine() );
        lineIndex := guard( lineIndexTree.Root().Child( lineHandle ),null( NamedValue ));
        if( isnull( lineIndex )){
          line := owner.DispatchShiftSchedulingLine( relnew,ID := IDHolder::GetGUID(),LineID := row.ProductionLine() );
          line.FactoryName( factory.Name() );
          line.InterfaceTime( now );
          line.VersionName( macroPlan.MDSMacroPlan().Description() );
          lines.Add( line );
          lineIndexTree.Root().AddChild( lineHandle,lines.Size() - 1 );
        }else{
          line := lines.Element( lineIndex.GetValueAsNumber() );
        }
      }
      traverse( row,NewOfflinePlanCell,cell, startDate <= cell.NewOfflinePlanColumn().StartDate() and endDate >= cell.NewOfflinePlanColumn().EndDate()){
        productLinesQuantityHandle := productLinesQuantityNameValueTree.GetHandle( row.ProductionLine() + cell.NewOfflinePlanColumn().StartDate().AsQUILL() );
        productLinesQuantity := guard( productLinesQuantityNameValueTree.Root().Child( productLinesQuantityHandle ).GetValueAsReal(),0.0 );
        shiftDate := cell.NewOfflinePlanColumn().StartDate();
        shiftName := cell.ShiftPatternName();
        shiftVolume := cell.Quantity();
        shiftDayTime := constnull( ShiftDayTime );
        product := null( DispatchShiftSchedulingProduct );
        {
          shiftPatternHandle := shiftPatternIndexTree.GetHandle( shiftName );
          shiftPatternIndex := guard( shiftPatternIndexTree.Root().Child( shiftPatternHandle ),null( NamedValue ));
          if( not isnull( shiftPatternIndex )){
            shiftPattern := shiftPatterns.Element( shiftPatternIndex.GetValueAsNumber() );
            shiftDayTime := select( shiftPattern,ShiftDayTime,object,true );
          productHandle := productIndexTree.GetHandle( row.ProductionLine() + row.ProductID() + cell.NewOfflinePlanColumn().StartDate().AsQUILL() );
          productIndex := guard( productIndexTree.Root().Child( productHandle ),null( NamedValue ));
          if( isnull( productIndex )){
            product := line.DispatchShiftSchedulingProduct( relnew,ProductID := row.ProductID() );
            product.ProductionQuantity( cell.Quantity() );
            line.ShiftDate( cell.NewOfflinePlanColumn().StartDate() );
            line.ShiftName( cell.ShiftPatternName() );
            products.Add( product );
            productIndexTree.Root().AddChild( productHandle,products.Size() - 1 );
          }else{
            product := products.Element( productIndex.GetValueAsNumber() );
          }
        }
        if( shiftVolume <> 0 ){
          shiftSchedulingInformations := DispatchShiftSchedulingInformation::SplitShifts( owner,shiftName,shiftVolume,productLinesQuantity );
        traverse( shiftSchedulingInformations,Elements,shiftSchedulingInformation ){
          shiftSchedulingInformation.InterfaceTime( now );
          shiftSchedulingInformation.VersionName( macroPlan.MDSMacroPlan().Description() );
          shiftSchedulingInformation.Product( productID );
          shiftSchedulingInformation.ProductLine( productLine );
          shiftSchedulingInformation.ShiftDate( shiftDate );
    //      shiftSchedulingInformation.InterfaceTime( now );
    //      shiftSchedulingInformation.InterfaceTime( now );
    //      shiftSchedulingInformation.InterfaceTime( now );
    //      shiftSchedulingInformation.InterfaceTime( now );
          if( not isnull( shiftDayTime )){
            shiftSchedulingInformation.ShiftStartDate( shiftDayTime.StartDateTime() );
            shiftSchedulingInformation.ShiftEndDate( shiftDayTime.EndDateTIme() );
          }
          if( not isnull( factory )){
            shiftSchedulingInformation.FactoryName( factory.Name() );
          }
        }
        }
      }
    }
    traverse( lines,Elements,line ){
      line.CalculateLineQuantity();
      // 1000
      lineQuantity := line.LineQuantity();
      tempProducts := selectsortedset( line,DispatchShiftSchedulingProduct,object,object.ProductionQuantity() );
      if( line.ShiftName() = "3" ){
        singleShiftVolume1 := lineQuantity / 3;
        singleShiftVolume2 := lineQuantity / 3;
        singleShiftVolume3 := lineQuantity / 3;
        traverse( tempProducts,Elements,product ){
          productionQuantity := product.ProductionQuantity();
          if( singleShiftVolume1 > 0 and productionQuantity > 0){
            tempProductQuantity := singleShiftVolume1 - productionQuantity;
            detail := product.DispatchShiftSchedulingDetail( relnew,ShiftVolume := ifexpr( tempProductQuantity > 0 ,productionQuantity,singleShiftVolume1 ) ,SingleShiftName := "白班");
            singleShiftVolume1 := singleShiftVolume1 - productionQuantity;
            productionQuantity := productionQuantity - detail.ShiftVolume();
          }else if(singleShiftVolume2 > 0 and productionQuantity > 0){
            tempProductQuantity := singleShiftVolume2 - productionQuantity;
            detail := product.DispatchShiftSchedulingDetail( relnew,ShiftVolume := ifexpr( tempProductQuantity > 0 ,productionQuantity,singleShiftVolume2 ) ,SingleShiftName := "二班");
            singleShiftVolume2 := singleShiftVolume2 - productionQuantity;
            productionQuantity := productionQuantity - detail.ShiftVolume();
          }else if(singleShiftVolume3 > 0 and productionQuantity > 0){
            tempProductQuantity := singleShiftVolume3 - productionQuantity;
            detail := product.DispatchShiftSchedulingDetail( relnew,ShiftVolume := ifexpr( tempProductQuantity > 0 ,productionQuantity,singleShiftVolume3 ) ,SingleShiftName := "二班");
            singleShiftVolume3 := singleShiftVolume3 - productionQuantity;
            productionQuantity := productionQuantity - detail.ShiftVolume();
          }
        }
      }else if( line.ShiftName() = "2" ){
        // 500
        singleShiftVolume1 := lineQuantity / 2;
        singleShiftVolume2 := lineQuantity / 2;
        traverse( tempProducts,Elements,product ){
          productionQuantity := product.ProductionQuantity();
          if( singleShiftVolume1 > 0 and productionQuantity > 0){
            tempProductQuantity := singleShiftVolume1 - productionQuantity;
            detail := product.DispatchShiftSchedulingDetail( relnew,ShiftVolume := ifexpr( tempProductQuantity > 0 ,productionQuantity,singleShiftVolume1 ) ,SingleShiftName := "白班");
            singleShiftVolume1 := singleShiftVolume1 - productionQuantity;
            productionQuantity := productionQuantity - detail.ShiftVolume();
          }else if(singleShiftVolume2 > 0 and productionQuantity > 0){
            tempProductQuantity := singleShiftVolume2 - productionQuantity;
            detail := product.DispatchShiftSchedulingDetail( relnew,ShiftVolume := ifexpr( tempProductQuantity > 0 ,productionQuantity,singleShiftVolume1 ) ,SingleShiftName := "二班");
            singleShiftVolume2 := singleShiftVolume2 - productionQuantity;
            productionQuantity := productionQuantity - detail.ShiftVolume();
          }
        }
      }else if( line.ShiftName() = "1" ){
        singleShiftVolume1 := lineQuantity / 1;
        traverse( tempProducts,Elements,product ){
          productionQuantity := product.ProductionQuantity();
          if( singleShiftVolume1 > 0 and productionQuantity > 0){
            tempProductQuantity := singleShiftVolume1 - productionQuantity;
            detail := product.DispatchShiftSchedulingDetail( relnew,ShiftVolume := ifexpr( tempProductQuantity > 0 ,productionQuantity,singleShiftVolume1 ) ,SingleShiftName := "白班");
            singleShiftVolume1 := singleShiftVolume1 - productionQuantity;
            productionQuantity := productionQuantity - detail.ShiftVolume();
          }
        }
      }else{
        // singleShiftVolume := lineQuantity / 1;
      }
    }
    //traverse( offlinePlan,NewOfflinePlanRow,row ){
    //  productID := row.ProductID();
    //  productLine := row.ProductionLine();
    //  factory := constnull( Unit );
    //  {
    //    unitHandle := unitIndexTree.GetHandle( productLine );
    //    unitIndex := guard( unitIndexTree.Root().Child( unitHandle ), null( NamedValue ));
    //    if( not isnull( unitIndex )){
    //      unit := units.Element( unitIndex.GetValueAsNumber() );
    //      temp1 := unit;
    //      temp2 := unit.Parent();
    //      while( not isnull( temp1.Parent())){
    //        temp2 := temp1;
    //        temp1 := temp1.Parent();
    //      }
    //      factory := temp2;
    //    }
    //  }
    //  traverse( row,NewOfflinePlanCell,cell, startDate <= cell.NewOfflinePlanColumn().StartDate() and endDate >= cell.NewOfflinePlanColumn().EndDate()){
    //    productLinesQuantityHandle := productLinesQuantityNameValueTree.GetHandle( row.ProductionLine() + cell.NewOfflinePlanColumn().StartDate().AsQUILL() );
    //    productLinesQuantity := guard( productLinesQuantityNameValueTree.Root().Child( productLinesQuantityHandle ).GetValueAsReal(),0.0 );
    //
    //    shiftDate := cell.NewOfflinePlanColumn().StartDate();
    //    shiftName := cell.ShiftPatternName();
    //    shiftVolume := cell.Quantity();
    //    shiftDayTime := constnull( ShiftDayTime );
    //    {
    //      shiftPatternHandle := shiftPatternIndexTree.GetHandle( shiftName );
    //      shiftPatternIndex := guard( shiftPatternIndexTree.Root().Child( shiftPatternHandle ),null( NamedValue ));
    //      if( not isnull( shiftPatternIndex )){
    //        shiftPattern := shiftPatterns.Element( shiftPatternIndex.GetValueAsNumber() );
    //        shiftDayTime := select( shiftPattern,ShiftDayTime,object,true );
    //      }
    //    }
    //    if( shiftVolume <> 0 ){
    //      shiftSchedulingInformations := DispatchShiftSchedulingLine::SplitShifts( owner,shiftName,shiftVolume,productLinesQuantity );
    //
    //    traverse( shiftSchedulingInformations,Elements,shiftSchedulingInformation ){
    //      shiftSchedulingInformation.InterfaceTime( now );
    //      shiftSchedulingInformation.VersionName( macroPlan.MDSMacroPlan().Description() );
    //      shiftSchedulingInformation.Product( productID );
    //      shiftSchedulingInformation.ProductLine( productLine );
    //      shiftSchedulingInformation.ShiftDate( shiftDate );
    ////      shiftSchedulingInformation.InterfaceTime( now );
    ////      shiftSchedulingInformation.InterfaceTime( now );
    ////      shiftSchedulingInformation.InterfaceTime( now );
    ////      shiftSchedulingInformation.InterfaceTime( now );
    //
    //
    //      if( not isnull( shiftDayTime )){
    //        shiftSchedulingInformation.ShiftStartDate( shiftDayTime.StartDateTime() );
    //        shiftSchedulingInformation.ShiftEndDate( shiftDayTime.EndDateTIme() );
    //      }
    //      if( not isnull( factory )){
    //        shiftSchedulingInformation.FactoryName( factory.Name() );
    //      }
    //    }
    //    }
    //  }
    //}
  *]
}