📄 processcapability.java
字号:
package com.power.pipeengine.DispatchReportMap;
/**
* <p>Title: PIPE Engine</p>
* <p>Description: Global Planning Optimization Engine</p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: Paraster, Inc.</p>
* @author unascribed
* @version 1.0
*/
import com.power.pipeengine.InputData.*;
import com.power.pipeengine.DispatchReport.*;
import java.util.*;
public class ProcessCapability {
private int employeeID;
private Hashtable capTable = new Hashtable();
private double[] capInBuckets;
private double[] usedCapInBuckets = new double[DataModel.getInstance().getCalendar().getTotalNumOfBuckets()];
private int[] assignedPeriods = new int[DataModel.getInstance().getCalendar().getTotalNumOfBuckets()];
boolean assigned = false;
double assignedPercentage = 0;
int assignedPID = 0;
//stores capacity used by date
Hashtable usedCap = new Hashtable();
public ProcessCapability( int employID ) {
employeeID = employID;
//initialize usedCap
Calendar cal = Calendar.getInstance();
Double zero = new Double(0);
for( int i=0; i<60; i++ ) {
Date aDate = cal.getTime();
usedCap.put( aDate.toString(), zero );
cal.add(Calendar.DAY_OF_MONTH, 1);
}
}
public void addCapability( Integer pid, Double capIdx ) {
capTable.put( pid, capIdx );
}
public double getAssignedPercentage() {
return assignedPercentage;
}
public double getAvailPercentage() {
return 1 - assignedPercentage;
}
public void setAssignedPercentage( double percent ) {
if( employeeID == 1320 ) {
System.out.println( "zhangyin assigned percent" + percent);
}
assignedPercentage = percent;
if( assignedPercentage >= 1 ) {
assigned = true;
}
}
public void setAssignedPID( int pid ) {
assignedPID = pid;
}
public int getAssignedPID() {
return assignedPID;
}
public void turnOffBucket( int bucketID ) {
capInBuckets[bucketID-1] = 0;
}
public Hashtable getCapTable() {
return capTable;
}
public int getEmployeeID() {
return employeeID;
}
public void setAssigned() {
if( employeeID == 1320 ) {
System.out.println( "zhangyin assigned");
}
assigned = true;
}
public boolean isAssigned() {
return assigned;
}
public double getCapability( int procID ) {
if( employeeID < 0 ) {
return 1.0;
}
return ((Double) capTable.get( new Integer( procID ) )).doubleValue();
}
public boolean mayAssignToBucket( int bucketID ) {
if( assignedPeriods[bucketID-1] >= bucketID ) {
return false;
}
return true;
}
public boolean mayAssignToSchedule( StartsSchedule aSchedule ) {
int pid = aSchedule.getProcessID();
Double capIdx = (Double) capTable.get( new Integer( pid ) );
if( null == capIdx ) return false;
double requiredHoursForOneItem = aSchedule.getStandardProcessingTime() /
capIdx.doubleValue() / 60.0;
int bucketID = aSchedule.getBucketID();
if( capInBuckets[aSchedule.getBucketID()-1] * 60 < 2 ) {
return false;
}
boolean isLastBucketInDate = PeriodDateMap.getInstance().isLastBucketInDate(
PeriodDateMap.getInstance().getDateBucketBelongsTo( bucketID),
bucketID );
//should be able to process half piece
double capInNextTwoBuckets = capInBuckets[aSchedule.getBucketID()-1];
if( !isLastBucketInDate && aSchedule.getBucketID() < capInBuckets.length ) {
capInNextTwoBuckets += capInBuckets[aSchedule.getBucketID()];
}
if( isLastBucketInDate && aSchedule.getStandardProcessingTime() >= 120 &&
capInBuckets[aSchedule.getBucketID()-1] >= 1.95 ) {
capInNextTwoBuckets += capInBuckets[aSchedule.getBucketID()];
}
if( ( requiredHoursForOneItem <= capInNextTwoBuckets ) ) {
return true;
}
if( isLastBucketInDate &&
( requiredHoursForOneItem - capInBuckets[aSchedule.getBucketID()-1] ) < 1.5 ) {
return true;
}
return false;
}
public int assignToSchedule( StartsSchedule aSchedule ) {
int pid = aSchedule.getProcessID();
Double capIdx = (Double) capTable.get( new Integer( pid ) );
boolean useNextBucket = false;
int qtyToProcess = (int) Math.floor( capInBuckets[aSchedule.getBucketID()-1] * 60
* capIdx.doubleValue()
/ aSchedule.getStandardProcessingTime() );
if( qtyToProcess == 0 &&
aSchedule.getBucketID() == DataModel.getInstance().getCalendar().getTotalNumOfBuckets() ) {
return -10000;
}
if( qtyToProcess == 0 ) {
qtyToProcess = (int) Math.floor(
( capInBuckets[aSchedule.getBucketID()-1] + capInBuckets[aSchedule.getBucketID()] ) * 60
* capIdx.doubleValue()
/ aSchedule.getStandardProcessingTime() );
useNextBucket = true;
}
if( qtyToProcess == 0 && capInBuckets[aSchedule.getBucketID()] == 0 ) {
qtyToProcess = 1;
}
qtyToProcess = Math.min( qtyToProcess, aSchedule.getQuantity() );
double requiredHours = qtyToProcess *
aSchedule.getStandardProcessingTime() /
capIdx.doubleValue() / 60.0;
int bucketID = aSchedule.getBucketID();
boolean isLastBucketInDate = PeriodDateMap.getInstance().isLastBucketInDate(
PeriodDateMap.getInstance().getDateBucketBelongsTo( bucketID),
bucketID );
aSchedule.setActualStartTime( (int) Math.ceil( 60*usedCapInBuckets[bucketID-1]) ); //in minutes
if( useNextBucket == false ) {
usedCapInBuckets[aSchedule.getBucketID()-1] += requiredHours;
capInBuckets[aSchedule.getBucketID()-1] -= requiredHours;
if( capInBuckets[aSchedule.getBucketID()-1] < 0 ) {
capInBuckets[aSchedule.getBucketID()-1] = 0;
}
} else {
double advancedHours = requiredHours - capInBuckets[aSchedule.getBucketID()-1];
usedCapInBuckets[aSchedule.getBucketID()-1] += capInBuckets[aSchedule.getBucketID()-1];
capInBuckets[aSchedule.getBucketID()-1] = 0;
usedCapInBuckets[aSchedule.getBucketID()] += advancedHours;
capInBuckets[aSchedule.getBucketID()] -= advancedHours;
if( capInBuckets[aSchedule.getBucketID()] < 0 ) {
capInBuckets[aSchedule.getBucketID()] = 0;
}
if( useNextBucket && isLastBucketInDate ) {
aSchedule.setNextDayCapUseFlag( true );
aSchedule.setNextDayCapUsed( advancedHours );
}
}
aSchedule.setDuration( (int) Math.ceil( requiredHours * 60) );
aSchedule.setEmployee( employeeID, capIdx.doubleValue() );
ProcessCapabilityTable.getInstance().resortRouteCap( pid, this );
return aSchedule.getQuantity() - qtyToProcess; //leftover order
}
public void setCapInBuckets( double[] aDblArray ) {
capInBuckets = aDblArray;
}
public void print( int pid ) {
System.out.println( pid + "," + employeeID + "," + getCapability( pid) );
}
boolean assignedTest = false;
double assignedPercentageTest = 0;
int assignedPIDTest = 0;
public void initTestParameters() {
assignedTest = assigned;
assignedPercentageTest = assignedPercentage;
assignedPIDTest = assignedPID;
}
public double getAssignedPercentageTest() {
return assignedPercentageTest;
}
public double getAvailPercentageTest() {
return 1 - assignedPercentageTest;
}
public void setAssignedPercentageTest( double percent ) {
assignedPercentageTest = percent;
if( assignedPercentageTest >= 1 ) {
assignedTest = true;
}
}
public void setAssignedPIDTest( int pid ) {
assignedPIDTest = pid;
}
public int getAssignedPIDTest() {
return assignedPIDTest;
}
public void setAssignedTest() {
assignedTest = true;
}
public boolean isAssignedTest() {
return assignedTest;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -