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;
    }

}