BatchFutureHoldAction.java

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

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.exception.SystemIllegalArgumentException;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.framework.utils.lang.collections.ListUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.alm.EenAction;
import com.mycim.valueobject.consts.ContextNames;
import com.mycim.valueobject.consts.EenActionType;
import com.mycim.valueobject.consts.TransactionNames;
import com.mycim.valueobject.prp.ContextValue;
import com.mycim.valueobject.prp.ProcessPlanning;
import com.mycim.valueobject.prp.ProcessVersion;
import com.mycim.webapp.actions.WipSetupAction;
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.*;
import java.util.stream.Collectors;

/**
 * @author liuji.li
 * @version 6.0.0
 * @date 2019/11/19
 **/
public class BatchFutureHoldAction extends WipSetupAction {
    @Override
    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                              HttpServletResponse response) throws Exception {
        return mapping.getInputForward();
    }

    public Map<String, Object> queryLots(Map map) {
        long facilityRrn = LocalContext.getFacilityRrn();
        String productId = StringUtils.trimToUpperCase(MapUtils.getString(map, "productId"));
        Assert.isFalse(StringUtils.isBlank(productId),
                       Errors.create().key(MessageIdList.BATCHFUTUREHOLDLOT_SELECT_PRODUCTID)
                             .content("The Part Have Not Select Or KeyIn!").build());

        long productRrn = getInstanceRrn(productId, getNamedSpace(ObjectList.PRODUCT_KEY, facilityRrn),
                                         ObjectList.PRODUCT_KEY);
        Assert.isFalse(productRrn <= 0,
                       Errors.create().key(MessageIdList.PRODUCT_PRODUCT_MISSING).content("产品不存在!").build());
        /*List<Map> lotsList = lotQueryService.getLotPriorityList(productRrn);
        if (CollectionUtils.isEmpty(lotsList)) {
            throw new WebException("batchfutureholdlot.product_not_lot", "The product has no qualified lot!");
        }*/
        List<Map> processIdList = new ArrayList<>();
        List<String> processIds = prpService.getProcessIdsByProductRrn(productRrn);
        for (String processId : processIds) {
            Map processIdMap = new HashMap(processIds.size());
            processIdMap.put("processId", processId);
            processIdMap.put("processRrn", getInstanceRrn(processId, facilityRrn, ObjectList.WFL_KEY));
            processIdList.add(processIdMap);
        }
        Map<String, Object> result = new HashMap();
        //result.put("lots", lotsList); //此处不查询了 qryLots方法 查询批次信息
        result.put("processIds", processIdList);
        result.put("productId", productId);
        result.put("productRrn", productRrn);
        return result;
    }

    public List<Map> qryLots(Map map) {
        int processVersion = MapUtils.getIntValue(map, "processVersion");
        long processRrn = MapUtils.getLongValue(map, "processRrn");
        String productId = StringUtils.trimToUpperCase(MapUtils.getString(map, "productId"));
        long productRrn = 0L;
        if (StringUtils.isNotEmpty(productId)) {
            productRrn = getInstanceRrn(productId, getNamedSpace(ObjectList.PRODUCT_KEY, LocalContext.getFacilityRrn()),
                                        ObjectList.PRODUCT_KEY);
            Assert.isFalse(productRrn <= 0,
                           Errors.create().key(MessageIdList.PRODUCT_PRODUCT_MISSING).content("产品不存在!").build());
        }
        if (productRrn <= 0 || processRrn <= 0 || processVersion <= 0) {
            return ListUtils.newArrayList();
        }
        List<Map> lotsList = lotQueryService.getLotPriorityList(productRrn);
        Assert.isFalse(CollectionUtils.isEmpty(lotsList),
                       Errors.create().key(MessageIdList.BATCHFUTUREHOLDLOT_PRODUCT_NOT_LOT)
                             .content("The product has no qualified lot!").build());
        Assert.isFalse(baseService.isExisted(processRrn) == null,
                       Errors.create().key(MessageIdList.PROCESS_PROCESS_MISSING).content("流程不存在!").build());
        lotsList = lotsList.stream().filter(m -> processRrn == MapUtils.getLongValue(m, "processRrn") &&
                processVersion == MapUtils.getIntValue(m, "processVersion")).collect(Collectors.toList());
        return lotsList;
    }

    public List<Map<String, String>> getProcessVersionByProcess(Map map) throws Exception {
        List<Map<String, String>> result = new ArrayList<>();
        long processRrn = MapUtils.getLongValue(map, "processRrn");
        if (processRrn > 0) {
            ProcessPlanning processPlanning = new ProcessPlanning(processRrn);
            List<ProcessVersion> processVersions = prpService.getProcessVersions(processPlanning);
            Assert.isFalse(CollectionUtils.isEmpty(processVersions),
                           Errors.create().key(MessageIdList.PROCESS_NO_VERSION)
                                 .content("There is no version under the process!").build());
            processVersions.forEach(processVersion -> {
                String key = String.valueOf(processVersion.getInstanceVersion());
                String text = key + "(" + processVersion.getVersionStatus() + ")";
                Map<String, String> m = new LinkedHashMap<>(2);
                m.put("key", key);
                m.put("text", text);
                result.add(m);
            });
        }
        return result;
    }

    public void batchFutureHoldLot(Map map) {
        String user = LocalContext.getUserId();
        long facilityRrn = LocalContext.getFacilityRrn();
        List<Map> futureHoldLots = (List<Map>) MapUtils.getObject(map, "dataArray");
        Assert.isFalse(CollectionUtils.isEmpty(futureHoldLots),
                       Errors.create().key(MessageIdList.BATCHHOLDLOT_SELECT_LOT).content("Please select lot id!")
                             .build());

        String routeId = MapUtils.getString(map, "routeId");
        String operationId = MapUtils.getString(map, "operationId");
        String reasonCode = MapUtils.getString(map, "reasonCode");

        checkRCHoldCode(reasonCode);

        String holdReason =
                MapUtils.getString(map, "department") + " " + MapUtils.getString(map, "userName") + " Reason:" +
                        "Holdcode is " + reasonCode + ". " + MapUtils.getString(map, "reason");
        int holdReasonLen = holdReason.replaceAll("[^\\x00-\\xff]", "***").length();
        Assert.isFalse(holdReasonLen > 256, Errors.create().key(MessageIdList.LOT_HOLDREASONTOOLONG)
                                                  .content("holdReason length can not be over 256!").build());

        long processRrn = MapUtils.getLongValue(map, "processRrn");
        int processVer = MapUtils.getIntValue(map, "processVer");
        checkLotAndProcessInfo(processRrn, processVer, futureHoldLots);
        Map transInfo = new HashMap();
        for (Map futureHoldLot : futureHoldLots) {
            long lotRrn = MapUtils.getLongValue(futureHoldLot, "lotRrn");
            ContextValue actionCondition = new ContextValue();
            actionCondition.setContextId(ContextNames.EEN_CONTEXT_HOLDLOT);
            actionCondition.setContextRrn(
                    getInstanceRrn(ContextNames.EEN_CONTEXT_HOLDLOT, getNamedSpace(ObjectList.CONTEXT_KEY, facilityRrn),
                                   ObjectList.CONTEXT_KEY));

            Assert.isFalse(actionCondition.getContextRrn() <= 0, Errors.create().content("Context").build());
            long routeRrn = this.getInstanceRrn(routeId, this.getNamedSpace("WFL", facilityRrn), "WFL", "ROUTE");
            actionCondition.setContextKey1(StringUtils.toString(routeRrn));
            long operationRrn = this
                    .getInstanceRrn(operationId, this.getNamedSpace("OPERATION", facilityRrn), "OPERATION");
            actionCondition.setContextKey2(StringUtils.toString(operationRrn));
            actionCondition.setContextKey3(StringUtils.toString(lotRrn));
            long refRrn = this.getInstanceRrn(ContextNames.EEN_CONTEXT_HOLDLOT, facilityRrn, ObjectList.CONTEXT_KEY);
            int sequenceNumber = prpService.getMaxSeq(refRrn);
            actionCondition.setSequenceNumber(new Integer(sequenceNumber) + 1);
            actionCondition.setResultValue2(user);
            actionCondition.setResultValue3(" ");
            actionCondition.setResultValue4(reasonCode);
            actionCondition.setResultValue5(holdReason);
            EenAction eenAction = new EenAction();
            eenAction.setActionType(EenActionType.FUTURE_HOLD_LOT_KEY);
            transInfo.put("eenAction", eenAction);
            transInfo.put("user", user);
            transInfo.put("facilityRrn", facilityRrn);
            transInfo.put("contextValue", actionCondition);
            transInfo.put("byLotFlag","Y");
            StringBuilder transComments = new StringBuilder(TransactionNames.BY_LOT_CREATE_FUTURE_HOLD);
            transComments.append(", Flow seq:").append(MapUtils.getString(map,"flowSeq")).append(" Hold Code:").append(reasonCode)
                         .append(" Hold Comment:").append(MapUtils.getString(map,"reason"));
            transInfo.put("transComments", transComments);
            transInfo.put("lotRrn",lotRrn);
            wipService.insertEenAction(transInfo,lotRrn);
        }
    }

    /**
     * 判断选中的Lot是否与当前流程和流程版本匹配,若有不匹配,抛出提示
     **/
    private void checkLotAndProcessInfo(long processRrn, int processVer, List<Map> futureHoldLots) {
        StringBuilder notMatchLots = new StringBuilder();
        if (CollectionUtils.isNotEmpty(futureHoldLots)) {
            futureHoldLots.stream().filter(m -> !(processRrn == MapUtils.getLongValue(m, "processRrn") &&
                    processVer == MapUtils.getLongValue(m, "processVer")))
                          .forEach(m -> notMatchLots.append(MapUtils.getString(m, "lotId")).append(","));
        }
        if (notMatchLots.length() > 0) {
            notMatchLots.deleteCharAt(notMatchLots.lastIndexOf(","));
            throw new SystemIllegalArgumentException(
                    Errors.create().content("Lot Id: {} process Or processVer is incorrect!")
                          .args(notMatchLots.toString()).build());
        }
    }

}