LotSuperReleaseAction.java

package com.mycim.webapp.actions.lot.lotholdrelease;

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.consts.HoldCodeNames;
import com.mycim.valueobject.consts.TransactionNames;
import com.mycim.valueobject.wip.Lot;
import com.mycim.valueobject.wip.LotStatus;
import com.mycim.valueobject.wip.TransReason;
import com.mycim.webapp.Constants;
import com.mycim.webapp.actions.WipSetupAction;
import com.mycim.webapp.forms.lot.HoldReleaseLotInfoForm;
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 Luopeng.Wang
 * @version 6.0.0
 * @date 2019/9/16
 **/
public class LotSuperReleaseAction extends WipSetupAction {
    @Override
    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                              HttpServletResponse response) throws Exception {
        Lot lot = initLotBaseInfoForJsp(request, false, "RELEASELOT", "RELEASELOT_CARRIER");

        List<Map> holdInfos = new ArrayList<>();
        if (lot != null && lot.getLotRrn() > 0) {
            holdInfos = wipQueryService.getHoldReasons(lot.getLotRrn());
        }

        request.setAttribute("collection", holdInfos);
        return mapping.findForward(Constants.SUPERRELEASE_KEY);
    }

    public ActionForward superRelease(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                                      HttpServletResponse response) throws Exception {
        HoldReleaseLotInfoForm theform = (HoldReleaseLotInfoForm) form;

        long facilityRrn = LocalContext.getFacilityRrn();
        String lotId = theform.getLotId();
        long userRrn = LocalContext.getUserRrn();
        String userId = LocalContext.getUserId();
        String fieldFlag = request.getParameter("fieldFlags");
        String[] fieldFlags = fieldFlag.split(",");

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

        //卡控post future hold被hold住的lot
        checkPostFutureHold(lot.getLotRrn());

        Assert.isFalse(lot.getLotRrn() <= 0,
                       Errors.create().key(MessageIdList.LOT_LOTRRN_NOT_FOUND).content("Cannot Find Lot!").build());

        Assert.isTrue(StringUtils.equals(lot.getLotStatus(), LotStatus.HOLD),
                      Errors.create().key(MessageIdList.LOT_STATUS_NOT_ALLOW).content("Lot status not allow").build());

        List<Map> holdReasons = wipQueryService.getHoldReasons(lot.getLotRrn());
        List<Map> releaseReasons = new ArrayList();
        List<Map> unReleaseReasons = new ArrayList();

        //是否存在trackOutHold释放
        boolean trackOutHoldExisted = false;
        //工步变更检查flag
        boolean lotStepChanged = false;
        // 是否存在Bonding绑定错误
        boolean sapphireBondedError = false;
        for (int i = 0; i < holdReasons.size(); i++) {
            Map holdReason = holdReasons.get(i);
            String reasonCode = MapUtils.getString(holdReason, "reasonCode");

            if (StringUtils.equals(TransReason.reasonCode.BONDERROR.name(), reasonCode)) {
                sapphireBondedError = true;
            }

            if (StringUtils.equals("0", fieldFlags[i])) {
                Assert.isFalse(
                        StringUtils.contains(MapUtils.getString(holdReason, "reasonCode"), HoldCodeNames.SRCHOLD_KEY) &&
                                StringUtils.equalsIgnoreCase(lot.getLotStatus(), LotStatus.RUNCARD_HOLD),
                        Errors.create().content("Can't release SRCHOLD!").build());

                if (StringUtils.equals("TRACKOUTHOLD", MapUtils.getString(holdReason, "reasonCategory"))) {
                    trackOutHoldExisted = true;
                }

                releaseReasons.add(holdReason);
            } else {
                unReleaseReasons.add(holdReason);
            }
        }

        Assert.isFalse(releaseReasons.size() <= 0,
                       Errors.create().key(MessageIdList.LOT_RELEASE_HOLD_EMPTY).content("please select release hold!")
                             .build());

        Assert.isFalse(trackOutHoldExisted == true && unReleaseReasons.size() > 0,
                       Errors.create().key(MessageIdList.LOT_TRACKOUT_HOLD_CANNOT_RELEASE).content(
                               "Before " + "Trackout " + "hold " + "released, " + "Please " + "release " +
                                       "other hold " + "first!").build());

        if (trackOutHoldExisted) {
            lotStepChanged = lotService.checkLotStepChange(lot.getLotRrn());
        }

        HashMap releaseInfo = new HashMap();
        releaseInfo.put("lotRrn", new Long(lot.getLotRrn()).toString());
        releaseInfo.put("lotId", lot.getLotId());
        releaseInfo.put("releaseReasons", releaseReasons);
        releaseInfo.put("transPerformedBy", userId);
        releaseInfo.put("transComments", theform.getLotComments());
        releaseInfo.put("operation", lot.getOperationId());

        TransReason transReason = new TransReason();
        transReason.setReasonCode(theform.getReasonCode());

        transReason.setReason(theform.getLotComments());
        transReason.setTransQty1(lot.getQty1());
        transReason.setTransQty2(lot.getQty2());
        transReason.setResponsibility(userId);
        transReason.setReason(theform.getReason());

        releaseInfo.put("transReason", transReason);
        releaseInfo.put("superFlag", "1");
        // List<Lot> lockLots = new ArrayList<>();
        // lockLots.add(lot);
        // checkAndCreateLotsTransLock(LocalContext.getUserRrn(), TransactionNames.LOCK_RELEASE_LOT, lockLots,
        //                             "super release lot in LotSuperReleaseAction by: " + LocalContext.getUserId());
        lotService.releaseLot(releaseInfo);

        releaseSpcHold(lot, releaseReasons);

        if (sapphireBondedError || (trackOutHoldExisted && unReleaseReasons.isEmpty() && !lotStepChanged)) {
            //查询最新批次信息
            lot = lotQueryService.getLot(lot.getLotRrn());
            return dispatchLotAfterRelease(mapping, request, response, userId, facilityRrn, lot);
        }

        splitRunCardService.doStartSplitRunCard(LocalContext.getUserId(), lot);

        List<Map> holdInfos = wipQueryService.getHoldReasons(lot.getLotRrn());

        theform.setReasonGroup("");
        ActionForward forward = init(mapping, form, request, response);
        request.setAttribute("lotBaseInfo", new HashMap());
        return forward;
    }

}