CarrierFlipAction.java

package com.mycim.webapp.actions.carrier.carrierflip;

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.utils.beans.BeanUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.SystemConstant;
import com.mycim.valueobject.consts.ReferenceDetailNames;
import com.mycim.valueobject.consts.SorterEnum;
import com.mycim.valueobject.ems.Carrier;
import com.mycim.valueobject.runcard.util.RunCardConstants;
import com.mycim.valueobject.runcard.util.RunCardUtils;
import com.mycim.valueobject.sorter.FilterParam;
import com.mycim.valueobject.sys.ReferenceFileDetail;
import com.mycim.valueobject.wip.*;
import com.mycim.webapp.Constants;
import com.mycim.webapp.WebUtils;
import com.mycim.webapp.actions.CarrierSetupAction;
import com.mycim.webapp.forms.LotBaseInfoForm;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: yibing.liu
 * @Date: 2021/10/19 14:15
 */
public class CarrierFlipAction extends CarrierSetupAction {

    @Override
    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
        if (WebUtils.getParameterBoolean(Constants.INIT_KEY, request)) {
            return mapping.findForward(Constants.SETUP_KEY);
        }

        long facilityRrn = LocalContext.getFacilityRrn();
        LotBaseInfoForm theform = (LotBaseInfoForm) form;
        String flipCarrierId = theform.getCarrierId().trim().toUpperCase();


        Carrier flipCarrier = carrierService.getCarrier(facilityRrn, flipCarrierId);

        //check sortJob and Lot
        Lot lot = checkCarrierAndLot(flipCarrier, facilityRrn);

        FilterParam filterParam = new FilterParam<>("lotId", String.class);
        filterParam.setMark(lot.getFlipType());
        filterParam.setCustomColumn("mark");
        // source和target都放一样的数据,表示不会wafer的位置不会受影响
        List<Map> list;
        if (RunCardUtils.checkLotIdIsRunCardLot(lot.getLotId())){
            list = parseUnits(wipQueryService.getUnitList(lot.getLotRrn()));
        } else {
            list = wipQueryService.getUnitListByCarrier(flipCarrier.getInstanceRrn());
        }
        String sourceList = sorterQueryService.parseToJsonT(list, filterParam);
        theform.setSourceListValues(sourceList);
        filterParam.setMark(SorterEnum.Constant.getOpposite(lot.getFlipType()));
        String targetList = sorterQueryService.parseToJsonT(list, filterParam);
        theform.setTargetListValues(targetList);
        theform.setLotId(lot.getLotId());
        theform.setCarrierId(flipCarrier.getInstanceId());
        theform.setSourceFlipType(lot.getFlipType());
        theform.setTargetFlipType(SorterEnum.Constant.getOpposite(lot.getFlipType()));
        if (request.getAttribute("exchangeSuccess") == null){
            request.setAttribute("success",0);
        } else {
            request.setAttribute("success",1);
        }
        return mapping.findForward(Constants.MODIFY_KEY);
    }

    protected List<Map> parseUnits(List<Unit> unitList) {
        List<Map> unitMapList = new ArrayList<>();
        for (Unit u:unitList){
            Map unit = new HashMap<>();
            unit.put("lotRrn", u.getLotRrn());
            unit.put("unitRrn", u.getUnitRrn());
            unit.put("unitId", u.getUnitId());
            unit.put("position", u.getPositionInCarrier());
            unit.put("unitstatus", u.getUnitStatus());
            unit.put("lotid", u.getLotId());
            unit.put("lotId", u.getLotId());
            unit.put("t7code", u.getT7code());
            unit.put("ppid", u.getRecipeId());
            unit.put("recipeId", u.getRecipeId());
            unit.put("unitAlias1", u.getUnitAlias1());
            unit.put("unitAlias2", u.getUnitAlias2());
            unit.put("itemId", u.getItemId());
            unitMapList.add(unit);
        }
        return unitMapList;
    }

    /**
     * 翻面操作
     */
    public ActionForward flipSide(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
        long facilityRrn = LocalContext.getFacilityRrn();
        LotBaseInfoForm theform = (LotBaseInfoForm) form;
        String flipCarrierId = theform.getCarrierId().trim().toUpperCase();
        String targetFlip = theform.getTargetFlipType();

        Carrier flipCarrier = carrierService.getCarrier(facilityRrn, flipCarrierId);
        //check sortJob and Lot
        Lot lot = checkCarrierAndLot(flipCarrier, facilityRrn);

        Assert.isFalse(StringUtils.equalsIgnoreCase(targetFlip, lot.getFlipType()),
                       Errors.create().key(MessageIdList.FLIP_HAVE_BEEN_MODIFY)
                             .content("The properties of Lot Flip have been modified,please refresh and try again!").build());

        lotService.flipSideByLot(lot, targetFlip);

        request.setAttribute("exchangeSuccess", "1");

        return init(mapping, form, request, response);
    }



    protected Lot checkCarrierAndLot(Carrier flipCarrier, long facilityRrn) {
        ReferenceFileDetail referenceFileDetail = getReferenceFileDetail(ReferenceDetailNames.SORT_HOLD_CODE, SorterEnum.Constant.FLIP_SIDE, LocalContext.getFacilityRrn());
        Assert.isFalse(referenceFileDetail == null,
                       Errors.create().key(MessageIdList.REFERENCE_NOT_EXIST).args(ReferenceDetailNames.SORT_HOLD_CODE).build());
        String sortHoldCode = referenceFileDetail.getData1Value();
        Assert.isFalse(StringUtils.isBlank(sortHoldCode),
                       Errors.create().key(MessageIdList.REFERENCE_NOT_EXIST_VALUE).args(SorterEnum.Constant.FLIP_SIDE, ReferenceDetailNames.SORT_HOLD_CODE).build());



        this.checkWaitJobs(flipCarrier.getInstanceRrn(), 0L, 0L);

        List<String> lotIds = carrierService.getInUseCarrierLotIdList(flipCarrier.getInstanceRrn());
        String lotId;
        Assert.isFalse(lotIds == null || lotIds.size() != 1,
                       Errors.create().key(MessageIdList.CARRIER_CASSETTE_HAVE_SOME_LOTS).content("该晶舟内有{}个批次")
                             .args(lotIds == null ? 0 : lotIds.size()).build());

        lotId = SorterEnum.getListFirst(lotIds);

        Lot lot = lotQueryService.getLot(lotId, facilityRrn);

        //先查询是否为RC的LOT
        if (lotRunCardQueryService.checkLotInRunCard(lot.getLotRrn())){
            if (LotStatus.isRunCardHold(lot.getLotStatus())) {
                lot = lotQueryService.getLot(RunCardUtils.buildMainRcLotId(lot.getLotId()));
            }
        }

        Assert.isFalse(StringUtils.isBlank(lot.getFlipType()),
                       Errors.create().key(MessageIdList.LOT_NOT_SET).content("Flip property is not set for Lot {}!").args(lot.getLotId()).build());

        Assert.isFalse(flipCarrier.getCarrierMapRrn() == null || flipCarrier.getCarrierMapRrn() <= 0,
                       Errors.create().key(MessageIdList.NOT_FOUND_UNIT).content("Not found unit in fromCassette!").build());

        //2、检查HoldCode
        List<Map> holdInfos = wipQueryService.getHoldReasons(lot.getLotRrn());
        boolean holdCodeFlag = false;
        for (Map map : holdInfos){
            String holdCode = MapUtils.getString(map, "reasonCode", StringUtils.EMPTY);
            if (sortHoldCode.equalsIgnoreCase(holdCode)){
                holdCodeFlag = true;
                break;
            }
        }
        Assert.isFalse(!holdCodeFlag, Errors.create().key(MessageIdList.HOLD_CODE_NOT_FOUND).build());
        return lot;
    }
}