CollectionRuleAbstract.java
package com.mycim.valueobject.edcspc.rule;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.valueobject.edcspc.DataCollectionRule;
import com.mycim.valueobject.wip.Unit;
import java.util.ArrayList;
import java.util.List;
/**
* 采集规则可用性计算判断的模板类<br> 默认通过Position判断<br> 默认匹配结果数量与选片数量相等
*
* @author Qiansheng.Wang
*/
public abstract class CollectionRuleAbstract implements CollectionRule {
protected static final String FIRST_KEY = "FIRST";
protected static final String LAST_KEY = "LAST";
protected static final String MIDDLE_KEY = "MIDDLE";
private String[] waferSamples;
private String[] unitPositions;
private int availableSample;
private List<Unit> unitList;
// Results
private List<String> selectedUnitIdList;
private List<String> selectedUnitPositionList;
protected DataCollectionRule dataCollectionRule;
protected CollectionRuleAbstract(DataCollectionRule dataCollectionRule, List<Unit> unitList) {
setDataCollectionRule(dataCollectionRule);
setWaferSamples(StringUtils.split(dataCollectionRule.getWaferSample(), ','));
setUnitList(unitList);
setSelectedUnitIdList(new ArrayList<String>());
setSelectedUnitPositionList(new ArrayList<String>());
}
protected CollectionRuleAbstract() {
}
/**
* 是否是可用的数据采集规则
*
* @return
*/
public Boolean isAvailableDataCollectionRule() {
int sampleSize = getWaferSamples().length;
int specialSampleSize = getSpecialSampleSize();
if (isNotAvailable(sampleSize, specialSampleSize)) {
return false;
}
for (int i = 0; i < sampleSize; i++) {
String sample = getWaferSamples()[i];
setAndCheckAvailableUnit(sample);
}
return checkResult(sampleSize, specialSampleSize);
}
@Override
public DataCollectionRule getAvailableDataCollectionRule() {
return getDataCollectionRule();
}
@Override
public String[] getSelectedUnitIds() {
return getSelectedUnitIdList().toArray(new String[availableSample]);
}
@Override
public String[] getSelectedUnitPositions() {
return getSelectedUnitPositionList().toArray(new String[availableSample]);
}
protected String[] getWaferSamples() {
return waferSamples;
}
protected void setWaferSamples(String[] waferSamples) {
this.waferSamples = waferSamples;
}
protected String[] getUnitPositions() {
return unitPositions;
}
protected void setUnitPositions(String[] unitPositions) {
this.unitPositions = unitPositions;
}
protected int getAvailableSample() {
return availableSample;
}
protected void setAvailableSample(int availableSample) {
this.availableSample = availableSample;
}
protected List<Unit> getUnitList() {
return unitList;
}
protected void setUnitList(List<Unit> unitList) {
this.unitList = unitList;
}
protected List<String> getSelectedUnitIdList() {
return selectedUnitIdList;
}
protected void setSelectedUnitIdList(List<String> selectedUnitIdList) {
this.selectedUnitIdList = selectedUnitIdList;
}
protected List<String> getSelectedUnitPositionList() {
return selectedUnitPositionList;
}
protected void setSelectedUnitPositionList(List<String> selectedUnitPositionList) {
this.selectedUnitPositionList = selectedUnitPositionList;
}
protected DataCollectionRule getDataCollectionRule() {
return dataCollectionRule;
}
protected void setDataCollectionRule(DataCollectionRule dataCollectionRule) {
this.dataCollectionRule = dataCollectionRule;
}
protected boolean isFirst(String string) {
return FIRST_KEY.equals(string) ? true : false;
}
protected boolean isMiddle(String string) {
return MIDDLE_KEY.equals(string) ? true : false;
}
protected boolean isLast(String string) {
return LAST_KEY.equals(string) ? true : false;
}
protected int getSpecialSampleSize() {
int specialSampleSize = 0;
int sampleSize = getWaferSamples().length;
for (int i = 0; i < sampleSize; i++) {// 选择
String sample = getWaferSamples()[i];
Boolean isFirstLast = isFirst(sample) || isLast(sample);
specialSampleSize = isFirstLast ? specialSampleSize + 1 : specialSampleSize;
}
return specialSampleSize;
}
/**
* 检查传入参数和设置的选片数量
*
* @param sampleSize
* @return
*/
protected Boolean isNotAvailable(int sampleSize, int specialSampleSize) {
return sampleSize == 0 || getUnitList() == null ||
(getUnitList().size() < sampleSize && getUnitList().size() < sampleSize - specialSampleSize);
}
/**
* 判断是否为可用的Unit并放置结果<br> 默认通过Position判断
*
* @param sample
*/
protected void setAndCheckAvailableUnit(String sample) {
int index = getAndCheckSpecialIndex(sample);
if (index != -1) {
addToResultForSpecialIndex(index);
} else {
addToResultForNormalIndex(sample);
}
}
protected int getAndCheckSpecialIndex(String sample) {
int index = -1;
if (isFirst(sample)) {
index = 0;
}
if (isMiddle(sample)) {
index = Math.round((float) getUnitList().size() / 2) - 1;
}
if (isLast(sample)) {
index = getUnitList().size() - 1;
}
return index;
}
protected void addToResultForSpecialIndex(int index) {
Unit unit = getUnitList().get(index);
addToResult(StringUtils.toString(unit.getPositionInCarrier()), unit.getUnitId());
}
protected void addToResultForNormalIndex(String sample) {
for (Unit unit : getUnitList()) {
String postionInCarrier = StringUtils.toString(unit.getPositionInCarrier());
if (sample.equals(postionInCarrier)) {
addToResult(postionInCarrier, unit.getUnitId());
break;
}
}
}
protected void addToResult(String positionInCarrier, String unitId) {
if (!getSelectedUnitPositionList().contains(positionInCarrier) || !getSelectedUnitIdList().contains(unitId)) {
getSelectedUnitPositionList().add(positionInCarrier);
getSelectedUnitIdList().add(unitId);
}
}
protected Boolean checkResult(int sampleSize, int specialSampleSize) {
setAvailableSample(getSelectedUnitIdList().size());
return getAvailableSample() <= sampleSize;
}
protected Boolean checkResult(int sampleSize) {
setAvailableSample(getSelectedUnitIdList().size());
return sampleSize == availableSample;
}
}