| Quintiq file version 2.0 | 
| #parent: #root | 
| StaticMethod GenerateDispatchData ( | 
|   Date startDate, | 
|   Date endDate, | 
|   const NewOfflinePlanTable offlinePlan, | 
|   RecycleBin owner | 
| ) | 
| { | 
|   TextBody: | 
|   [* | 
|     // Akari Sep-4-2024 (created) | 
|     owner.DispatchShiftSchedulingLine( relflush ); | 
|     macroPlan := offlinePlan.MacroPlan(); | 
|     now := DateTime::Now(); | 
|      | 
|     shiftPatterns := selectset( macroPlan,ShiftPattern,object,true ); | 
|     shiftPatternIndexTree := NamedValueTree::Create(); | 
|     for( i := 0; i < shiftPatterns.Size(); i++){ | 
|       shiftPattern := shiftPatterns.Element( i ); | 
|       shiftPatternHandle := shiftPatternIndexTree.GetHandle( shiftPattern.Name() ); | 
|       shiftPatternIndexTree.Root().AddChild( shiftPatternHandle,i ); | 
|     } | 
|      | 
|     units := selectset( macroPlan,Unit,object, true ); | 
|     unitIndexTree := NamedValueTree::Create(); | 
|     for( i := 0; i < units.Size(); i++){ | 
|       unit := units.Element( i ); | 
|       unitHandle := unitIndexTree.GetHandle( unit.Name() ); | 
|       unitIndexTree.Root().AddChild( unitHandle,i ); | 
|     } | 
|      | 
|     lines := construct( DispatchShiftSchedulingLines ); | 
|     lineIndexTree := NamedValueTree::Create(); | 
|      | 
|     products := construct( DispatchShiftSchedulingProducts ); | 
|     productIndexTree := NamedValueTree::Create(); | 
|      | 
|     //productionDetails := construct( DispatchShiftSchedulingDetails ); | 
|     //productionDetailIndexTree := NamedValueTree::Create(); | 
|     traverse( offlinePlan,NewOfflinePlanRow,row ,not row.ProductionLine().ToUpper().LikeUserLocale( "MOMO" )){ | 
|       line := null( DispatchShiftSchedulingLine ); | 
|       factory := constnull( Unit ); | 
|       { | 
|         unitHandle := unitIndexTree.GetHandle( row.ProductionLine() ); | 
|         unitIndex := guard( unitIndexTree.Root().Child( unitHandle ), null( NamedValue )); | 
|         if( not isnull( unitIndex )){ | 
|           unit := units.Element( unitIndex.GetValueAsNumber() ); | 
|           factory := LocalTool::GetFactoryByUnit( unit ); | 
|         } | 
|       } | 
|        | 
|       traverse( row,NewOfflinePlanCell,cell, startDate <= cell.NewOfflinePlanColumn().StartDate() and endDate >= cell.NewOfflinePlanColumn().EndDate()){ | 
|         product := null( DispatchShiftSchedulingProduct ); | 
|         { | 
|           lineKey := row.ProductionLine() + cell.NewOfflinePlanColumn().StartDate().AsQUILL(); | 
|           lineHandle := lineIndexTree.GetHandle( lineKey ); | 
|           lineIndex := guard( lineIndexTree.Root().Child( lineHandle ),null( NamedValue )); | 
|           if( isnull( lineIndex )){ | 
|             line := owner.DispatchShiftSchedulingLine( relnew,ID := IDHolder::GetGUID(),LineName := row.ProductionLine(),ShiftDate := cell.NewOfflinePlanColumn().StartDate() ); | 
|             line.FactoryName( factory.Name() ); | 
|             line.InterfaceTime( now ); | 
|             line.VersionName( macroPlan.MDSMacroPlan().Description() ); | 
|             line.ShiftName( cell.ShiftPatternName() ); | 
|             lines.Add( line ); | 
|             lineIndexTree.Root().AddChild( lineHandle,lines.Size() - 1 ); | 
|           }else{ | 
|             line := lines.Element( lineIndex.GetValueAsNumber() );  | 
|           } | 
|            | 
|           productHandle := productIndexTree.GetHandle( lineKey + row.ProductID() ); | 
|           productIndex := guard( productIndexTree.Root().Child( productHandle ),null( NamedValue )); | 
|           if( isnull( productIndex )){ | 
|             product := line.DispatchShiftSchedulingProduct( relnew,ProductID := row.ProductID() ); | 
|             product.ProductionQuantity( cell.Quantity() ); | 
|             products.Add( product ); | 
|             productIndexTree.Root().AddChild( productHandle,products.Size() - 1 ); | 
|           }else{ | 
|             product := products.Element( productIndex.GetValueAsNumber() );  | 
|           } | 
|         } | 
|       } | 
|     } | 
|      | 
|     traverse( macroPlan,NewAssemblyOnlinePlanRow,row , row.ProductionLine().ToUpper().LikeUserLocale( "MOMO" )){ | 
|       line := null( DispatchShiftSchedulingLine ); | 
|       factory := constnull( Unit ); | 
|       { | 
|         unitHandle := unitIndexTree.GetHandle( row.ProductionLine() ); | 
|         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,NewAssemblyOnlinePlanCell,cell, startDate <= cell.NewAssemblyOnlinePlanColumn().StartDate() and endDate >= cell.NewAssemblyOnlinePlanColumn().EndDate()){ | 
|         product := null( DispatchShiftSchedulingProduct ); | 
|         { | 
|           lineKey := row.ProductionLine() + cell.NewAssemblyOnlinePlanColumn().StartDate().AsQUILL(); | 
|           lineHandle := lineIndexTree.GetHandle( lineKey ); | 
|           lineIndex := guard( lineIndexTree.Root().Child( lineHandle ),null( NamedValue )); | 
|           if( isnull( lineIndex )){ | 
|             line := owner.DispatchShiftSchedulingLine( relnew,ID := IDHolder::GetGUID(),LineName := row.ProductionLine(),ShiftDate := cell.NewAssemblyOnlinePlanColumn().StartDate() ); | 
|             line.FactoryName( factory.Name() ); | 
|             line.InterfaceTime( now ); | 
|             line.VersionName( macroPlan.MDSMacroPlan().Description() ); | 
|             line.ShiftName( cell.ShiftPatternName() ); | 
|             lines.Add( line ); | 
|             lineIndexTree.Root().AddChild( lineHandle,lines.Size() - 1 ); | 
|           }else{ | 
|             line := lines.Element( lineIndex.GetValueAsNumber() );  | 
|           } | 
|            | 
|           productHandle := productIndexTree.GetHandle( lineKey + row.ProductID() ); | 
|           productIndex := guard( productIndexTree.Root().Child( productHandle ),null( NamedValue )); | 
|           if( isnull( productIndex )){ | 
|             product := line.DispatchShiftSchedulingProduct( relnew,ProductID := row.ProductID() ); | 
|             product.ProductionQuantity( cell.Quantity() ); | 
|             products.Add( product ); | 
|             productIndexTree.Root().AddChild( productHandle,products.Size() - 1 ); | 
|           }else{ | 
|             product := products.Element( productIndex.GetValueAsNumber() );  | 
|           } | 
|         } | 
|       } | 
|     } | 
|      | 
|     traverse( lines,Elements,line ){ | 
|       line.CalcLineQuantity(); | 
|        | 
|       // 481 | 
|       lineQuantity := line.LineQuantity(); | 
|        | 
|       tempProducts := selectsortedset( line,DispatchShiftSchedulingProduct,object,object.ProductionQuantity() ); | 
|        | 
|       if( line.ShiftName() = "3" ){ | 
|         singleShiftVolume1 := lineQuantity / 3; | 
|         singleShiftVolume2 := lineQuantity / 3; | 
|         singleShiftVolume3 := lineQuantity / 3; | 
|         for( i := tempProducts.Size() - 1;i >= 0; i-- ){ | 
|           product := tempProducts.Element( i ); | 
|           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" ){     | 
|         // 240.5 | 
|         singleShiftVolume1 := lineQuantity / 2; | 
|         singleShiftVolume2 := lineQuantity / 2; | 
|         for( i := tempProducts.Size() - 1;i >= 0; i-- ){ | 
|           product := tempProducts.Element( i ); | 
|           // 288 | 
|           productionQuantity := product.ProductionQuantity(); | 
|            | 
|           if( singleShiftVolume1 > 0 and productionQuantity > 0){ | 
|             // -47.5 | 
|             tempProductQuantity := singleShiftVolume1 - productionQuantity; | 
|             detail := product.DispatchShiftSchedulingDetail( relnew,ShiftVolume := ifexpr( tempProductQuantity > 0 ,productionQuantity,singleShiftVolume1 ) ,SingleShiftName := "白班"); | 
|             singleShiftVolume1 := singleShiftVolume1 - productionQuantity; | 
|             productionQuantity := productionQuantity - detail.ShiftVolume(); | 
|           } | 
|           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( line.ShiftName() = "1" ){ | 
|         singleShiftVolume1 := lineQuantity / 1; | 
|         for( i := tempProducts.Size() - 1;i >= 0; i-- ){ | 
|           product := tempProducts.Element( i ); | 
|           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( lines,Elements.DispatchShiftSchedulingProduct.DispatchShiftSchedulingDetail,detail ){ | 
|       detail.ShiftVolume( detail.ShiftVolume() );  | 
|     } | 
|      | 
|     info( "Success" ); | 
|   *] | 
| } |