SortAbsAction.java

package com.mycim.webapp.actions.sort;

import com.mycim.framework.utils.beans.BeanUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.framework.utils.lang.math.NumberUtils;
import com.mycim.valueobject.consts.SorterEnum;
import com.mycim.valueobject.sorter.*;
import com.mycim.valueobject.wip.Lot;
import com.mycim.valueobject.wip.Unit;
import com.mycim.webapp.actions.WipSetupAction;

import java.util.*;

public abstract class SortAbsAction extends WipSetupAction {
    public static final String COMMA = "、";

    public static final String MARK = "1";

    private static final int DEFAULT_SLOTCOUNT = 25;

    private void dealRepeatUnitPosition(List<Map> sourceUnitList, List<Map> targetUnitList, List<Map> repeatUnitList,
                                        int[] oldPositionArr) {
        sourceUnitList.addAll(targetUnitList);
        if (!repeatUnitList.isEmpty()) {
            for (Map rm : repeatUnitList) {
                int oldPosition = MapUtils.getIntValue(rm, "oldPosition");
                int blankPositon = -1;
                for (int i = 1; i < oldPositionArr.length; i++) {
                    if (oldPositionArr[i] == 0) {
                        blankPositon = i;
                        oldPositionArr[i] = i;
                        break;
                    }
                }
                rm.put("oldPosition", blankPositon);
                rm.put("repeat", "[Position:" + oldPosition + "]");
                sourceUnitList.add(rm);
            }
        }
    }

    private List<Map> rebuildSourceUnitList(List<Map> sourceUnitList, List<Unit> oldCarrierMapList) {
        String lotId = MapUtils.getString(SorterEnum.getListFirst(sourceUnitList), "lotId");
        Unit[] unitArr = new Unit[26];
        Map[] unitMapArr = new Map[26];
        for (Unit u : oldCarrierMapList) {
            unitArr[u.getPositionInCarrier()] = u;
        }

        for (Map m : sourceUnitList) {
            unitMapArr[MapUtils.getIntValue(m, "oldPosition", 0)] = m;
        }

        for (int i = 1; i < unitMapArr.length; i++) {
            if (unitMapArr[i] == null && unitArr[i] != null) {
                //源晶舟中的位置上有晶圆
                Map um = new HashMap<>();
                um.put("lotId", lotId);
                um.put("lotRrn", unitArr[i].getLotRrn());
                um.put("unitId", unitArr[i].getUnitId());
                um.put("unitRrn", unitArr[i].getUnitRrn());
                um.put("position", unitArr[i].getPositionInCarrier());
                um.put("carrierId", StringUtils.EMPTY);
                um.put("oldPosition", unitArr[i].getPositionInCarrier());
                unitMapArr[i] = um;
            }
        }
        sourceUnitList = Arrays.asList(unitMapArr);
        return sourceUnitList;
    }

    protected Map<String, Object> buildSortJobDetail(SortJobBean sortJobBean) {
        if(SorterEnum.Check.isAutoMonitorType(sortJobBean.getJobType())) {
            return buildAutoMonitorSortJobDetail(sortJobBean);
        }

        Map<String, Object> lotInfo = new HashMap<>();
        //转换成List<Map>
        List<Map> targetUnitList = new ArrayList<>();
        List<Map> sourceUnitList = new ArrayList<>();
        String lotIds = StringUtils.EMPTY;
        String targetLotIds = StringUtils.EMPTY;
        String flipType = StringUtils.EMPTY;
        StringBuilder sourceCarrierId = new StringBuilder();
        int[] oldPositionArr = new int[26];
        long oldCarrierMapRrn = -1L;
        List<Map> repeatUnitList = new ArrayList<>();
        for (SorterBean sb : sortJobBean.getSorterBeans()) {
            flipType = sb.getJsonAttributeData3();
            sourceCarrierId.append(COMMA).append(sb.getSourceCarrierId());
            targetLotIds = (StringUtils.isNotEmpty(sb.getJsonAttributeData4()) &&
                    !targetLotIds.contains(sb.getJsonAttributeData4())) ?
                    targetLotIds + COMMA + sb.getJsonAttributeData4() : targetLotIds;
            if (StringUtils.isNotEmpty(sb.getJsonAttributeData5())) {
                oldCarrierMapRrn = NumberUtils.toLong(sb.getJsonAttributeData5(), -1);
            }
            for (SorterDetailBean sdb : sb.getSorterDetailBeanList()) {
                lotIds = (StringUtils.isNotEmpty(sdb.getLotId()) && !lotIds.contains(sdb.getLotId())) ?
                        lotIds + COMMA + sdb.getLotId() : lotIds;
                Map um = new HashMap<>();
                um.put("lotId", sdb.getLotId());
                um.put("lotRrn", sdb.getLotRrn());
                um.put("unitId", sdb.getUnitId());
                um.put("unitRrn", sdb.getUnitRrn());
                um.put("position", sdb.getTargetPosition());
                um.put("carrierId", sb.getSourceCarrierId());
                um.put("targetPosition", sdb.getTargetPosition());//暂定
                um.put("completedTime", sb.getUpdateTime());
                int op = sdb.getSourcePosition();
                if (oldPositionArr[op] > 0) {
                    repeatUnitList.add(um);
                } else {
                    oldPositionArr[op] = op;
                }
                um.put("oldPosition", sdb.getSourcePosition());//暂定
                targetUnitList.add(um);
            }
        }

        FilterParam<String> filterParam = new FilterParam<>();
        if (SorterEnum.Check.isFlip(sortJobBean.getJobType())) {
            filterParam = new FilterParam<>("lotId", String.class);
            String[] flipArr = StringUtils.split(flipType, "|");
            filterParam.setMark(flipArr[1]);
            filterParam.setCustomColumn("mark");
        }
        filterParam.addColumn("carrierId");
        filterParam.addColumn("oldPosition");
        filterParam.addColumn("completedTime");
        if (SorterEnum.Constant.SPLIT_3PORT.equalsIgnoreCase(sortJobBean.getJobType())) {
            filterParam.setSlotCount(13);
        }

        String targetListStr = sorterQueryService.parseToJsonT(targetUnitList, filterParam);
        filterParam.setIntegerColumn("oldPosition");
        filterParam.addColumn("repeat");
        dealRepeatUnitPosition(sourceUnitList, targetUnitList, repeatUnitList, oldPositionArr);
        //目标晶舟的槽位数 TODO
        if (oldCarrierMapRrn > 0 && !SorterEnum.Constant.EXCHANGE.equalsIgnoreCase(sortJobBean.getJobType())
                && !SorterEnum.Check.isOffLineCheckT7Code(sortJobBean.getJobType())) {
            List<Unit> oldCarrierMapList = wipQueryService.getUnitHistoryListByCarrierMapRrn(oldCarrierMapRrn);
            if (CollectionUtils.isNotEmpty(oldCarrierMapList) && oldCarrierMapList.size() <= 25) {
                sourceUnitList = rebuildSourceUnitList(sourceUnitList, oldCarrierMapList);
            }
        }
        filterParam.setSlotCount(25);
        if (SorterEnum.Check.isFlip(sortJobBean.getJobType())) {
            String[] flipArr = StringUtils.split(flipType, "|");
            filterParam.setMark(flipArr[0]);
        }
        String sourceListStr = sorterQueryService.parseToJsonT(sourceUnitList, filterParam);
        lotInfo.put("mainJobRrn", sortJobBean.getMainJobRrn());
        lotInfo.put("lotId", lotIds.length() > 1 ? lotIds.substring(1) : lotIds);
        lotInfo.put("targetLotId", targetLotIds.length() > 0 ? targetLotIds.substring(1) : targetLotIds);
        lotInfo.put("sourceListValue", sourceListStr);
        lotInfo.put("targetListValue", targetListStr);
        lotInfo.put("targetCarrierId", sortJobBean.getTargetCarrierId());
        lotInfo.put("sourceCarrierId", sourceCarrierId.length() > 0 ? sourceCarrierId.substring(1) : sourceCarrierId);
        lotInfo.put("status", sortJobBean.getStatus());
        lotInfo.put("jobStatus", sortJobBean.getStatusParse());
        lotInfo.put("jobType", sortJobBean.getJobTypeParse());
        return lotInfo;
    }

    private Map<String, Object> buildAutoMonitorSortJobDetail(SortJobBean sortJobBean) {
        Map<String, Object> lotInfo = new HashMap<>();
        //转换成List<Map>
        List<Map> targetUnitList = new ArrayList<>();
        List<Map> sourceUnitList = new ArrayList<>();

        for (SorterBean sb : sortJobBean.getSorterBeans()) {
            List<SorterCarrierMap> carrierMapList = sorterQueryService.getSorterCarrierMapList(sb.getSubJobRrn());

            for (int i = 1; i <= DEFAULT_SLOTCOUNT; i++) {
                Map sourceUnit = null;
                Map targetUnit = null;

                for (SorterDetailBean sdb : sb.getSorterDetailBeanList()) {
                    if(sdb.getTargetPosition()==i){
                        targetUnit = MapUtils.newHashMap();
                        targetUnit.put("lotId", sdb.getLotId());
                        targetUnit.put("lotRrn", sdb.getLotRrn());
                        targetUnit.put("unitId", sdb.getUnitId());
                        targetUnit.put("unitRrn", sdb.getUnitRrn());
                        targetUnit.put("position", sdb.getTargetPosition());
                        targetUnit.put("carrierId", sb.getSourceCarrierId());
                    }
                }

                for (SorterCarrierMap carrierMap : carrierMapList) {
                    if (sb.getSourceCarrierRrn() == carrierMap.getCarrierRrn().longValue() &&
                            carrierMap.getPosition().intValue() == i) {
                        sourceUnit = BeanUtils.copyBeanToMap(carrierMap);
                    }

                    if (sb.getTargetCarrierRrn() == carrierMap.getCarrierRrn().longValue() &&
                            carrierMap.getPosition().intValue() == i && targetUnit == null) {
                        targetUnit = BeanUtils.copyBeanToMap(carrierMap);
                    }
                }
                sourceUnitList.add(sourceUnit);
                targetUnitList.add(targetUnit);
            }
        }

        FilterParam<String> filterParam = new FilterParam<>();
        String targetListStr = sorterQueryService.parseToJsonT(targetUnitList, filterParam);
        String sourceListStr = sorterQueryService.parseToJsonT(sourceUnitList, filterParam);
        lotInfo.put("mainJobRrn", sortJobBean.getMainJobRrn());
        lotInfo.put("lotId", StringUtils.EMPTY);
        lotInfo.put("targetLotId", StringUtils.EMPTY);
        lotInfo.put("sourceListValue", sourceListStr);
        lotInfo.put("targetListValue", targetListStr);
        lotInfo.put("targetCarrierId", sortJobBean.getTargetCarrierId());
        lotInfo.put("sourceCarrierId", sortJobBean.getSourceCarrierId());
        lotInfo.put("status", sortJobBean.getStatus());
        lotInfo.put("jobStatus", sortJobBean.getStatusParse());
        lotInfo.put("jobType", sortJobBean.getJobTypeParse());
        return lotInfo;
    }

    protected Map<String, Object> buildExchangeSortJobDetail(SortJobBean sortJobBean) {
        Map<String, Object> lotInfo = new HashMap<>();
        //转换成List<Map>
        List<Map> targetUnitList = new ArrayList<>();
        List<Map> sourceUnitList = new ArrayList<>();
        String lotIds = StringUtils.EMPTY;
        String targetLotIds = StringUtils.EMPTY;
        String flipType = StringUtils.EMPTY;
        StringBuilder sourceCarrierId = new StringBuilder();
        int[] oldPositionArr = new int[26];
        long oldCarrierMapRrn = -1L;
        List<Map> repeatUnitList = new ArrayList<>();
        for (SorterBean sb : sortJobBean.getSorterBeans()) {
            flipType = sb.getJsonAttributeData3();
            sourceCarrierId.append(COMMA).append(sb.getSourceCarrierId());
            targetLotIds = (StringUtils.isNotEmpty(sb.getJsonAttributeData4()) &&
                    !targetLotIds.contains(sb.getJsonAttributeData4())) ?
                    targetLotIds + COMMA + sb.getJsonAttributeData4() : targetLotIds;
            if (StringUtils.isNotEmpty(sb.getJsonAttributeData5())) {
                oldCarrierMapRrn = NumberUtils.toLong(sb.getJsonAttributeData5(), -1);
            }
            for (SorterDetailBean sdb : sb.getSorterDetailBeanList()) {
                lotIds = (StringUtils.isNotEmpty(sdb.getLotId()) && !lotIds.contains(sdb.getLotId())) ?
                        lotIds + COMMA + sdb.getLotId() : lotIds;
                Map um = new HashMap<>();
                um.put("lotId", sdb.getLotId());
                um.put("lotRrn", sdb.getLotRrn());
                um.put("unitId", sdb.getUnitId());
                um.put("unitRrn", sdb.getUnitRrn());
                um.put("position", sdb.getTargetPosition());
                um.put("carrierId", sb.getSourceCarrierId());
                um.put("targetPosition", sdb.getTargetPosition());//暂定
                um.put("completedTime", sb.getUpdateTime());
                int op = sdb.getSourcePosition();
                if (oldPositionArr[op] > 0) {
                    repeatUnitList.add(um);
                } else {
                    oldPositionArr[op] = op;
                }
                um.put("oldPosition", sdb.getSourcePosition());//暂定
                targetUnitList.add(um);
            }
        }

        FilterParam<String> filterParam = new FilterParam<>();
        if (SorterEnum.Check.isFlip(sortJobBean.getJobType())) {
            filterParam = new FilterParam<>("lotId", String.class);
            String[] flipArr = StringUtils.split(flipType, "|");
            filterParam.setMark(flipArr[1]);
            filterParam.setCustomColumn("mark");
        }
        filterParam.addColumn("carrierId");
        filterParam.addColumn("oldPosition");
        filterParam.addColumn("completedTime");

        String targetListStr = sorterQueryService.parseToJsonT(targetUnitList, filterParam);
        filterParam.setIntegerColumn("oldPosition");
        filterParam.addColumn("repeat");
        dealRepeatUnitPosition(sourceUnitList, targetUnitList, repeatUnitList, oldPositionArr);
        filterParam.setSlotCount(25);
        if (SorterEnum.Check.isFlip(sortJobBean.getJobType())) {
            String[] flipArr = StringUtils.split(flipType, "|");
            filterParam.setMark(flipArr[0]);
        }
        String sourceListStr = sorterQueryService.parseToJsonT(sourceUnitList, filterParam);
        lotInfo.put("mainJobRrn", sortJobBean.getMainJobRrn());
        lotInfo.put("lotId", lotIds.length() > 1 ? lotIds.substring(1) : lotIds);
        lotInfo.put("targetLotId", targetLotIds.length() > 0 ? targetLotIds.substring(1) : targetLotIds);
        lotInfo.put("sourceListValue", sourceListStr);
        lotInfo.put("targetListValue", targetListStr);
        lotInfo.put("targetCarrierId", sortJobBean.getTargetCarrierId());
        lotInfo.put("sourceCarrierId", sourceCarrierId.length() > 0 ? sourceCarrierId.substring(1) : sourceCarrierId);
        lotInfo.put("status", sortJobBean.getStatus());
        lotInfo.put("jobStatus", sortJobBean.getStatusParse());
        lotInfo.put("jobType", sortJobBean.getJobTypeParse());
        if (SorterEnum.Constant.EXCHANGE.equalsIgnoreCase(sortJobBean.getJobType())) {
            String lotId = MapUtils.getString(lotInfo, "lotId");
            Lot lot = lotInqService.getLot(lotId);
            String targetCSTType = lotQueryService.getToCarrierTypeForChange(lot);
            lotInfo.put("targetCarrierType", targetCSTType);
            lotInfo.put("createCategory", lot.getCreateCategory());
        }
        return lotInfo;
    }

    protected Map<String, Object> buildReadT7CodeSortJobDetail(SortJobBean sortJobBean) {
        Map<String, Object> lotInfo = new HashMap<>();
        //转换成List<Map>
        List<Map> targetUnitList = new ArrayList<>();
        List<Map> sourceUnitList = new ArrayList<>();
        String lotIds = StringUtils.EMPTY;
        StringBuilder sourceCarrierId = new StringBuilder();
        int[] oldPositionArr = new int[26];
        long oldCarrierMapRrn = -1L;
        List<Map> repeatUnitList = new ArrayList<>();
        for (SorterBean sb : sortJobBean.getSorterBeans()) {
            sourceCarrierId.append(COMMA).append(sb.getSourceCarrierId());
            if (StringUtils.isNotEmpty(sb.getJsonAttributeData5())) {
                oldCarrierMapRrn = NumberUtils.toLong(sb.getJsonAttributeData5(), -1);
            }
            for (SorterDetailBean sdb : sb.getSorterDetailBeanList()) {
                lotIds = (StringUtils.isNotEmpty(sdb.getLotId()) && !lotIds.contains(sdb.getLotId())) ?
                        lotIds + COMMA + sdb.getLotId() : lotIds;
                Map um = new HashMap<>();
                um.put("lotId", sdb.getLotId());
                um.put("lotRrn", sdb.getLotRrn());
                um.put("unitId", sdb.getUnitId());
                um.put("unitRrn", sdb.getUnitRrn());
                um.put("position", sdb.getTargetPosition());
                um.put("carrierId", sb.getSourceCarrierId());
                um.put("targetPosition", sdb.getTargetPosition());//暂定
                um.put("completedTime", sb.getUpdateTime());
                int op = sdb.getSourcePosition();
                if (oldPositionArr[op] > 0) {
                    repeatUnitList.add(um);
                } else {
                    oldPositionArr[op] = op;
                }
                um.put("oldPosition", sdb.getSourcePosition());//暂定
                targetUnitList.add(um);
            }
        }
        FilterParam<String> filterParam = new FilterParam<>();

        filterParam.addColumn("carrierId");
        filterParam.addColumn("oldPosition");
        filterParam.addColumn("completedTime");
        if (SorterEnum.Constant.SPLIT_3PORT.equalsIgnoreCase(sortJobBean.getJobType())) {
            filterParam.setSlotCount(13);
        }

        filterParam.setIntegerColumn("oldPosition");
        filterParam.addColumn("repeat");
        dealRepeatUnitPosition(sourceUnitList, targetUnitList, repeatUnitList, oldPositionArr);
        //目标晶舟的槽位数 TODO
        if (oldCarrierMapRrn > 0 && !SorterEnum.Constant.EXCHANGE.equalsIgnoreCase(sortJobBean.getJobType())) {
            List<Unit> oldCarrierMapList = wipQueryService.getUnitHistoryListByCarrierMapRrn(oldCarrierMapRrn);
            if (CollectionUtils.isNotEmpty(oldCarrierMapList) && oldCarrierMapList.size() <= 25) {
                sourceUnitList = rebuildSourceUnitList(sourceUnitList, oldCarrierMapList);
            }
        }
        filterParam.setSlotCount(25);
        filterParam.setCustomColumn("customerT7Code");
        filterParam.addColumn("customerT7Code", "customerT7Code");
        String sourceListStr = sorterQueryService.parseToJsonT(sourceUnitList, filterParam);
        lotInfo.put("mainJobRrn", sortJobBean.getMainJobRrn());
        lotInfo.put("lotId", lotIds.length() > 1 ? lotIds.substring(1) : lotIds);
        lotInfo.put("sourceListValue", sourceListStr);
        lotInfo.put("targetCarrierId", sortJobBean.getTargetCarrierId());
        lotInfo.put("sourceCarrierId", sourceCarrierId.length() > 0 ? sourceCarrierId.substring(1) : sourceCarrierId);
        lotInfo.put("status", sortJobBean.getStatus());
        lotInfo.put("jobStatus", sortJobBean.getStatusParse());
        lotInfo.put("jobType", sortJobBean.getJobTypeParse());
        return lotInfo;
    }

}