Quintiq file version 2.0
|
#parent: #root
|
StaticMethod GenerateDailyCapacity (
|
MacroPlan macroPlan,
|
Date indexDate,
|
String unitID
|
) as Duration
|
{
|
TextBody:
|
[*
|
returnCapacity := Duration::Zero();
|
|
traverse ( macroPlan, Unit.UnitPeriod.astype( UnitPeriodTimeBase ), this, this.UnitID() = unitID and
|
this.StartDate() <= indexDate and
|
this.End().Date() > indexDate and
|
/*this.IsBase() and*/
|
this.IsPlanning() ) {
|
// Determined by the used shift pattern, the efficiency rate, maintenance considering its maintenance factor, allocation, max load percentage and calendar elements.
|
// debuginfo( "遍历的时间节点(开始时间):", this.StartDate(), " 结束时间:", this.End() );
|
value := Duration::Zero();
|
|
datetimevector := DateTimeVector::Construct();
|
durationvector := RealVector::Construct();
|
|
if( this.IsPlanning() or this.IsBase() )
|
{
|
planningup := ifexpr( this.IsPlanning(),
|
this, // Case 1: planning UnitPeriod: aggregate values from associated period tasks
|
this.PlanningUP().astype( UnitPeriodTimeBase ) ); // Case 2: base, non planning UnitPeriod: disaggregate value from planning UnitPeriod
|
|
if( not isnull( planningup ) )
|
{
|
if( not isnull( planningup.Period_MP() )
|
and not isnull( planningup.ShiftPattern() )
|
and not planningup.Period_MP().IsInHour() ) //gdn1 HourlyPeriod is not applicable for ShiftPattern
|
{
|
lastshiftday := planningup.StartDate() - planningup.Period_MP().Start().StartOfWeek().Date() + 1
|
|
nrdaysinthisperiod := planningup.Duration().DaysAsReal();
|
|
firstday := planningup.Period_MP().Start();
|
numberofshiftday := planningup.ShiftPattern().ShiftDay( relsize );
|
|
if( not isnull( planningup.Previous() ) )
|
{
|
lastshiftday := planningup.Previous().astype( UnitPeriodTimeBase ).PreviousPeriodLastShiftDay() + 1;
|
|
}
|
|
for( i := 0; i < nrdaysinthisperiod and firstday + Duration::Days( i ) >= planningup.Unit().StartDate().DateTime() ; i++ )
|
{
|
shiftday := lastshiftday + i;
|
|
if( shiftday > numberofshiftday )
|
{
|
shiftday := shiftday mod numberofshiftday;
|
|
if( shiftday = 0 )
|
{
|
shiftday := numberofshiftday;
|
}
|
}
|
|
shift := select( planningup.ShiftPattern(), ShiftDay, shift, shift.Day() = shiftday, true );
|
unavailable := planningup.Unit().UnavailableTime( firstday + Duration::Days( i ), firstday + Duration::Days( i + 1 ) );
|
|
if( not isnull( shift ) )
|
{
|
shiftduration := maxvalue( ( shift.Capacity() - unavailable ), Duration::Zero() );
|
//value := value + shiftduration;
|
datetimevector.Append( firstday + Duration ::Days( i ) );
|
durationvector.Append( shiftduration.HoursAsReal() );
|
}
|
if ( /*this.UnitID() = unitID and this.IsBase() and this.IsPlanning() and*/ ( this.StartDate() + i ) = indexDate ) {
|
// debuginfo( "当前开始时间:", this.StartDate() + i, " 当前产能:", maxvalue( ( shift.Capacity() - unavailable ), Duration::Zero() ) );
|
// this.MacroPlan().UnitPeriodTimeBaseDailyCapacity( relnew, startDate := this.StartDate() + i,
|
// capacity := maxvalue( ( shift.Capacity() - unavailable ), Duration::Zero() ) );
|
returnCapacity := maxvalue( ( shift.Capacity() - unavailable ), Duration::Zero() );
|
}
|
} // for
|
|
value := this.GetPlanningCapacity( datetimevector, durationvector );
|
}// if planning period not in hour
|
else if ( planningup.Period_MP().DurationInDays() < 1 ) //gdn1 HourlyPeriod is always same as PeriodDuration
|
{
|
value := planningup.Unit().UnitCalendar().AvailableTime( planningup.Start(), planningup.End(), 0.00000001 ); // Check calendar to make hourly period work with the calendar
|
}
|
|
value := maxvalue( ( value * planningup.Efficiency() * planningup.Allocation() - ( planningup.Maintenance() * this.PlanningSystemRatio() ) )* planningup.NrOfOpen(), Duration::Zero() );
|
}
|
}
|
else
|
{
|
|
value := sum( this.GetChildrenOfPeriodDimension(), Elements.astype( UnitPeriodTimeBase ), e, e.BaseAvailableCapacity() );
|
}
|
|
// this.BaseAvailableCapacity( value );
|
}
|
|
return returnCapacity;
|
*]
|
}
|