yanweiyuan3
2023-08-09 588bc7829387dfc761cc25f06f77d4c81818bd10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Quintiq file version 2.0
#parent: #root
Method CapacityPlanningAlgorithmHandleFeasibleOperationPeriodTask_SetPT (
  CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program,
  const RunContextForCapacityPlanning runcontext,
  PeriodTaskOperation pt,
  Real quantity
)
{
  Description: 'Assign the optimal quantity from optimizer for period task planned quantity'
  TextBody:
  [*
    operation := pt.Operation( ); 
    period := pt.UnitPeriod().Period_MP(); 
    campaignSequencingEnabled := runcontext.UseCampaignSequenceOptimizer()
    
    if( not pt.HasUserQuantity() )        // has user flag will retain, while has feedback flag will be reset to optimizer flag.
    {
      pt.SetOptimizerQuantity( quantity );     
    }
    
    // Assign optimizer fulfillment for dependent demand in input group.
    // The dependent demand not in group will be fulfilled by greedy after the optimizer run, by setting SystemFulfilledQuantity.
    this.CapacityPlanningAlgorithmHandleFeasibleOperationDependentDemandInputGroup( program, pt, runcontext );
      
    // Assign period task in campaign type quantity.
    // Period task in campaign type fulfillment
    if( runcontext.UseCampaign()
        and not campaignSequencingEnabled // for campaign sequencing already created the periodtask and their quantity
        and period.GetIsInCampaignTypeHorizonUnit( operation.Unit() ) )
    {
      if( operation.OperationInCampaignType( relsize ) > 0 )
      {
        pt.CreatePeriodTaskInCampaigns(); 
        
        traverse( pt, PeriodTaskInCampaign, ptct )
        {
          if ( exists( ptct, 
                       OperationInCampaign.Campaign_MP.PlanningCampaignPeriod, 
                       cperiod,
                       cperiod.UnitPeriod().Period_MP() = period ) )
          {                         
            ptct.Quantity( this.GetOptimalValue( program.PTCampaignQtyVariables().Get( ptct.OperationInCampaign(), period ) ) ); 
          }
        }
      } 
    
      if( operation.OperationInTransitionType( relsize ) > 0 and not campaignSequencingEnabled ) 
      {
        pt.CreatePeriodTaskInTransitions(); 
        
        traverse( pt, PeriodTaskInTransition, ptt )
        {
          ptt.Quantity( this.GetOptimalValue( program.PTTransitionQtyVariables().Get( ptt.OperationInTransition(), period ) ) );
        }
      }
    }
  *]
  InterfaceProperties { Accessibility: 'Module' }
}