LotTransHistoryDetailAction.java

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

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.framework.utils.lang.math.NumberUtils;
import com.mycim.framework.utils.msg.JsonUtils;
import com.mycim.valueobject.automonitor.entity.LotAutoMonitorInfo;
import com.mycim.valueobject.automonitor.entity.LotMonitorJobStepEdcInfo;
import com.mycim.valueobject.consts.TransactionNames;
import com.mycim.valueobject.wip.Lot;
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.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 批次事务历史详细信息
 *
 * @author weike.li
 * @version 6.0.0
 * @date 2019/9/9
 **/
public class LotTransHistoryDetailAction extends WipSetupAction {

    private static final String[] ADJUST_LOT_FIELDS = {"createCategory", "lotType", "priority", "hotFlag",
            "splitMergeFlag", "lotOwner", "dueDate", "customerId", "shippingCode", "outerOrderNO", "outOrderType",
            "lotComments"};

    private static final String QRY_LOT_TRANS_DETAIL = "qryLotTransDetail";

    private static final String TRANS_ID = "transId";


    @Override
    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                              HttpServletResponse response) {

        String reqCode = request.getParameter("reqCode");

        if (StringUtils.equalsIgnoreCase(QRY_LOT_TRANS_DETAIL, reqCode)) {
            return qryLotTransDetail(mapping, request);
        }

        return mapping.findForward("view");
    }

    private ActionForward qryLotTransDetail(ActionMapping mapping, HttpServletRequest request) {
        Long facility = LocalContext.getFacilityRrn();

        Long lotRrn = NumberUtils.toLong(request.getParameter("lotRrn"));
        Long transRrn = NumberUtils.toLong(request.getParameter("transRrn"));

        Map<String, Object> detail = new HashMap<>();

        Map<String, Object> adjust = lotQueryService.qryAdjustTransHistory(transRrn, lotRrn);
        if (adjust != null) {
            Map<String, Object> beforeDetail = lotQueryService.qryTransHistoryDetail(transRrn, lotRrn);

            detail.putAll(beforeDetail);

            Map before = JsonUtils.toMap(MapUtils.getString(adjust, "adjustBefore"));
            Map after = JsonUtils.toMap(MapUtils.getString(adjust, "adjustAfter"));
            for (Object key : before.keySet()) {
                if (checkShowChangeField(key.toString())) {
                    String beforeS = MapUtils.getString(before, key) == null ? "" : MapUtils.getString(before, key);
                    String afterS = MapUtils.getString(after, key) == null ? "" : MapUtils.getString(after, key);
                    if (StringUtils.equals("dueDate", key.toString())) {
                        beforeS = StringUtils.contains(beforeS, "00:00:00.0") ? StringUtils
                                .substring(beforeS, 0, beforeS.length() - 11) : beforeS;
                        afterS = StringUtils.contains(afterS, "00:00:00.0") ? StringUtils
                                .substring(afterS, 0, afterS.length() - 11) : afterS;
                    }

                    if (StringUtils.equals("priority", key.toString())) {
                        beforeS = MapUtils.getString(before, "hotFlag") + "-" + MapUtils.getString(before, "priority");
                        afterS = MapUtils.getString(after, "hotFlag") + "-" + MapUtils.getString(after, "priority");
                    }

                    if (StringUtils.equals(beforeS, afterS)) {
                        detail.put(key.toString(), beforeS);
                    } else {
                        detail.put(key.toString(), beforeS + "-->" + afterS);
                    }
                }
            }

            List<Map> transList = lotQueryService.queryAllLotTrans(lotRrn);
            for (int i = 0; i < transList.size(); i++) {
                Map<String, Object> map = transList.get(i);
                if (MapUtils.getLong(map, "transRrn").equals(transRrn) &&
                        checkHiddenTrans(MapUtils.getString(map, "transId"))) {
                    detail.put("carrierId", MapUtils.getString(map, "carrierId"));
                    detail.put("routeId", MapUtils.getString(map, "routeId"));
                    detail.put("routeRrn", MapUtils.getLong(map, "routeRrn"));
                    detail.put("flowSeq", MapUtils.getString(map, "flowSeq"));
                    detail.put("operationType", MapUtils.getString(map, "operationType"));
                    detail.put("workArea", MapUtils.getString(map, "workArea"));
                    detail.put("transComments", MapUtils.getString(map, "transComments"));
                }
            }
        } else {
            Map<String, Object> preDetail = lotQueryService.qryLotAfterTransDetail(transRrn, lotRrn);

            Map<String, Object> preTrans = null;
            Map<String, Object> postTrans = new HashMap<String, Object>();
            List<Map> transList = lotQueryService.queryAllLotTrans(lotRrn);
            for (int i = 0; i < transList.size(); i++) {
                Map<String, Object> map = transList.get(i);
                if (MapUtils.getLong(map, "transRrn").equals(transRrn) &&
                        checkHiddenTrans(MapUtils.getString(map, "transId"))) {
                    postTrans = map;
                    if (i < transList.size() - 1) {
                        preTrans = transList.get(i + 1);
                    }
                    break;
                }
            }

            if (preDetail == null) {
                Lot lot = lotQueryService.getLot(lotRrn);
                preDetail = BeanUtils.copyBeanToMap(lot);
            }

            detail.putAll(preDetail);

            if (postTrans != null) {
                detail.putAll(postTrans);
            }

            for (String key : ADJUST_LOT_FIELDS) {
                detail.put(key, MapUtils.getObject(preDetail, key));
            }

            for (String key : detail.keySet()) {
                if (checkShowChangeField(key)) {
                    String beforeS = MapUtils.getString(preTrans, key);
                    String afterS = MapUtils.getString(detail, key) == null ? "" : MapUtils.getString(detail, key);

                    if (StringUtils.equals("priority", key)) {
                        beforeS = MapUtils.getString(preTrans, "hotFlag") + "-" +
                                MapUtils.getString(preTrans, "priority");
                        afterS = MapUtils.getString(detail, "hotFlag") + "-" + MapUtils.getString(detail, "priority");
                    }

                    if (StringUtils.equals(beforeS, afterS)) {
                        detail.put(key.toString(), beforeS);
                    } else {
                        if (MapUtils.getString(preTrans, key) == null) {
                            detail.put(key.toString(), afterS);
                        } else {
                            detail.put(key.toString(), beforeS + "-->" + afterS);
                        }
                    }
                }
            }
        }

        String transId = MapUtils.getString(detail, TRANS_ID);
        if (StringUtils.equals(transId, TransactionNames.MOVEOUT_KEY)) {
            String parameterData = wipQueryService.getParamCon(lotRrn, MapUtils.getString(detail, "stepSequence"));
            if (parameterData.length() > 0) {
                parameterData = StringUtils.replace(parameterData, "<br>", "\n");
            }

            detail.put("edcParameter", parameterData);
            if (StringUtils.indexOf(parameterData, "(") > 0) {
                String parameterId = StringUtils.substring(parameterData, 0, StringUtils.indexOf(parameterData, "("));
                String chartId = StringUtils.substring(parameterId, 0, 1) +
                        StringUtils.substring(parameterId, 2, parameterId.length());
                detail.put("hadUrl", "1");
                detail.put("edcUrl", "");
            }

        } else if (StringUtils.equals(transId, TransactionNames.DATA_COLLECTION_KEY)) {
            LotAutoMonitorInfo monitorInfo = lotAutoMonitorInqService.getLotAutoMonitorInfo(lotRrn);
            if (Objects.nonNull(monitorInfo)) {
                List<LotMonitorJobStepEdcInfo> stepEdcInfoList = lotAutoMonitorInqService.getStepEdcInfoList(transRrn);
                String parameterData = stepEdcInfoList.stream().map(edcInfo -> {
                    return edcInfo.getUnitId() + " " + edcInfo.getSpcJobName() + " " + edcInfo.getDataValue();
                }).collect(Collectors.joining("\n"));

                detail.put("edcParameter", parameterData);
            }
        }

        Map<String, Object> ctxSearch = new HashMap<>();
        ctxSearch.put("facilityRrn", facility);
        ctxSearch.put("productRrn", MapUtils.getLong(detail, "productRrn"));
        ctxSearch.put("processRrn", MapUtils.getLong(detail, "processRrn"));
        ctxSearch.put("routeRrn", MapUtils.getLong(detail, "routeRrn"));
        ctxSearch.put("operationRrn", MapUtils.getLong(detail, "operationRrn"));
        ctxSearch.put("processVersion", MapUtils.getLong(detail, "processVersion"));

        detail.put("operationDesc", ctxExecService.getOperationDescByProcessInfo(ctxSearch));

        request.setAttribute("detail", detail);

        return mapping.findForward("transDetail");
    }

    private boolean checkShowChangeField(String key) {
        String[] noChanges = new String[]{"transStartTime", "transEndTime", "transPerformedBy", "transComments",
                "comments", "transId", "transRrn", "stepSequence"};
        for (String str : noChanges) {
            if (StringUtils.equals(str, key)) {
                return false;
            }
        }
        return true;
    }

    private boolean checkIsAdjustField(String key) {
        for (String adjust : ADJUST_LOT_FIELDS) {
            if (StringUtils.equals(adjust, key)) {
                return true;
            }
        }
        return false;
    }

    private boolean checkHiddenTrans(String transId) {
        String[] transs = new String[]{TransactionNames.LBRD_KEY, TransactionNames.MOVENEXT_KEY,
                TransactionNames.WS_MOVENEXT_KEY, TransactionNames.CREATE_KEY};
        for (String trans : transs) {
            if (StringUtils.equals(trans, transId)) {
                return false;
            }
        }
        return true;

    }

}