Quintiq file version 2.0
|
#parent: #root
|
Method ProcessingTimeIntervalIsGreaterThanOneDay (
|
MacroPlan macroPlan,
|
UnitPeriodTimeBase uptb,
|
UnitPeriodTimeBases uptbs
|
)
|
{
|
Description: '处理时间区间大于1天'
|
TextBody:
|
[*
|
if ( uptb.UsedCapacity() = uptb.TotalAvailableCapacity() ) {
|
debuginfo( "周已经是整班,无需处理" );
|
} else if ( uptb.UsedCapacity() < uptb.TotalAvailableCapacity() and uptb.UsedCapacity().HoursAsReal() > 0 ) {
|
roundedCapacity := 0.0;
|
capacityForZeroCompensation := 0.0;
|
indexStartTime := uptb.StartDate();
|
indexEndTime := uptb.End().Date();
|
remainingCapacity := uptb.UsedCapacity().HoursAsReal();
|
debuginfo( "使用的产能:", remainingCapacity );
|
while ( indexStartTime < indexEndTime and roundedCapacity = 0 and capacityForZeroCompensation = 0 ) {
|
indexStartTimeAvailableCapacity := WholeShift::GenerateDailyCapacity( macroPlan, indexStartTime, uptb.UnitID() ).HoursAsReal();
|
if ( ( remainingCapacity - indexStartTimeAvailableCapacity ) < 0 ) {
|
roundedCapacity := abs( remainingCapacity - indexStartTimeAvailableCapacity );
|
capacityForZeroCompensation := remainingCapacity;
|
remainingCapacity := remainingCapacity - indexStartTimeAvailableCapacity;
|
} else {
|
remainingCapacity := remainingCapacity - indexStartTimeAvailableCapacity;
|
}
|
debuginfo( "索引开始时间:", indexStartTime, " 可用产能:", indexStartTimeAvailableCapacity, " 使用的产能-可用产能(剩余产能):", remainingCapacity );
|
indexStartTime := indexStartTime + 1;
|
}
|
|
debuginfo( "圆整产能:", roundedCapacity, " 补零产能:", capacityForZeroCompensation );
|
|
if ( roundedCapacity = 0 and capacityForZeroCompensation = 0 ) {
|
debuginfo( "已到达整班效果" );
|
} else {
|
whetherToFillInZero := true;
|
tempCapacityForZeroCompensation := capacityForZeroCompensation;
|
traverse ( uptb, PeriodTaskOperation, pto, whetherToFillInZero ) {
|
quantityOfMinimumSupplyRound := Real::MaxReal();
|
traverse ( pto, NewSupply, ns, whetherToFillInZero ) {
|
quantityOfMinimumSupplyRound := minvalue( minvalue( ifexpr( ( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ) > 0, ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel(), 0.0 ),
|
ns.Quantity()
|
) / pto.Operation().Throughput(),
|
quantityOfMinimumSupplyRound
|
);
|
}
|
tempCapacityForZeroCompensation := tempCapacityForZeroCompensation - quantityOfMinimumSupplyRound;
|
if ( tempCapacityForZeroCompensation < 0 ) {
|
whetherToFillInZero := false;
|
}
|
debuginfo( "当前周期任务供应数量:", pto.Quantity(), " 最小补零产能:", quantityOfMinimumSupplyRound, " 补零后还剩:", tempCapacityForZeroCompensation );
|
}
|
|
// whetherToFillInZero := true;
|
|
if ( not whetherToFillInZero ) {
|
debuginfo( "执行补零" );
|
this.ZeroCapacityReplenishment( macroPlan, capacityForZeroCompensation, uptb, uptbs );
|
} else {
|
debuginfo( "执行圆整" );
|
this.CapacityRounding( macroPlan, roundedCapacity, uptb, uptbs );
|
}
|
}
|
} else {
|
debuginfo( "周出现异常" );
|
}
|
*]
|
}
|