LotHistoryAction.java

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

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.exception.SystemIllegalArgumentException;
import com.fa.sesa.i18n.I18nUtils;
import com.fa.sesa.threadlocal.LocalContext;
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.lang.time.DateUtils;
import com.mycim.framework.utils.msg.JsonUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.consts.TransactionNames;
import com.mycim.valueobject.prp.Operation;
import com.mycim.valueobject.wip.Lot;
import com.mycim.webapp.Constants;
import com.mycim.webapp.TemplateLocation;
import com.mycim.webapp.WebUtils;
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.*;

/**
 * 批次历史
 *
 * @author sandy
 * @version 6.0.0
 * @date 2019/9/26
 **/
public class LotHistoryAction extends WipSetupAction {

    private static final String COMMENT_DOM = ".";

    @Override
    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                              HttpServletResponse response) {
        return mapping.findForward(Constants.LOTHISTORY_KEY);
    }

    public ActionForward exportLotHistory(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                                          HttpServletResponse response) throws Exception {

        Map<String, Object> map = WebUtils.getExportParams(request);
        List<Map<String, Object>> lotHistoryList = (List<Map<String, Object>>) lothistory(request, map).get("rows");
        String exportDateTime = DateUtils.getNowTime(DateUtils.DATE_FORMAT4NOSPLICING);
        String fileName = "lot_" + exportDateTime + ".xlsx";
        Map<String, Object> titles = WebUtils.getExportTitles(request);
        WebUtils.exportExcel(fileName, titles, lotHistoryList, TemplateLocation.LOT_HISTORY_INFO, response);
        return WebUtils.NULLActionForward;
    }


    public Map<String, Object> qryLotBaseInfo(HttpServletRequest request, Map map) throws Exception {

        Long facility = LocalContext.getFacilityRrn();
        Map<String, Object> result = new HashMap<>();
        Map<String, Object> lotBaseInfo = new HashMap<>();

        String lotId = MapUtils.getString(map, "lotId");
        String carrierId = MapUtils.getString(map, "carrierId");
        Long carrierRrn = 0L;

        if (StringUtils.isNotEmpty(carrierId)) {
            carrierRrn = this.getInstanceRrn(carrierId, this.getNamedSpace(ObjectList.ENTITY_KEY, facility),
                                             ObjectList.ENTITY_KEY);
            Assert.isFalse(carrierRrn <= 0, Errors.create().key(MessageIdList.CARRIER_CASSETTE_ID_MISSING)
                                                  .content("No such Cassette ID!").build());
        }

        /* Lot lot = lotQueryService.getLot(StringUtils.trimToUpperCase(lotId), LocalContext.getFacilityRrn
        ());
        if (lot.getLotRrn() <= 0) {
            lot = lotQueryService.getLotByCarrierId(carrierId, LocalContext.getFacilityRrn());
        }
        if ((StringUtils.isNotEmpty(lotId) && StringUtils.isNotEmpty(carrierId))) {
            if (!carrierRrn.equals(lot.getCarrierRrn())) {
                throw new WebException("lot.lotId_not_match_with_cassetteId");
            }
        }*/

        Map lotInfo = null;
        if (StringUtils.isNotBlank(lotId) || carrierRrn > 0) {
            lotInfo = lotQueryService.getLotInfoasMap(facility, StringUtils.trimToUpperCase(lotId), carrierRrn);
        }

        if (lotInfo != null) {
            lotBaseInfo.put("lotId", lotInfo.get("lotId"));
            lotBaseInfo.put("carrierId", lotInfo.get("carrierId"));
            lotBaseInfo.put("productId", lotInfo.get("productId"));
            lotBaseInfo.put("lotType", lotInfo.get("lotType"));
            lotBaseInfo.put("priority", wipQueryService
                    .getHotflagSplicingPriority(NumberUtils.toInt(MapUtils.getString(lotInfo, "hotflag"), 0),
                                                NumberUtils.toInt(MapUtils.getString(lotInfo, "priority"), 0),
                                                facility));
            lotBaseInfo.put("lotRrn", lotInfo.get("lotRrn"));
            lotBaseInfo.put("processVersion", lotInfo.get("processVersion"));
            long processRrn = MapUtils.getLongValue(lotInfo, "processRrn");
            lotBaseInfo.put("newProcessVersion", getProcessVersion(processRrn));
        } else {
            lotBaseInfo.put("length", 0);
            //todo
            throw new SystemIllegalArgumentException(
                    Errors.create().key(MessageIdList.LOT_NOT_QUERYING_INFORMATION).content("未查询到相关信息!").build());
        }
        result.put("success", lotInfo != null);
        result.put("lotBaseInfo", lotBaseInfo);
        return result;
    }

    public Map<String, Object> lothistory(HttpServletRequest request, Map map) throws Exception {

        String language = I18nUtils.getCurrentLanguage().toString();
        Long facility = LocalContext.getFacilityRrn();

        Map<String, Object> rteturnResult = new HashMap<>();
        List<Map<String, Object>> resultArray = new ArrayList<>();
        Map<String, Object> result = new HashMap<>();
        /*boolean navFlag = this.getParameterBoolean(Constants.NAV_KEY, request);
        rteturnResult.put(Constants.NAV_KEY, navFlag);
        if (navFlag == true) {
            rteturnResult.put("success", "true");
            resultArray.add(result);
            rteturnResult.put("rows", resultArray);
            return null;
        }
*/
        // rows per page
        String lotId = MapUtils.getString(map, "lotId");
        String carrierId = MapUtils.getString(map, "carrierId");
        Integer startRow = MapUtils.getInteger(map, "start", 0);
        Integer pageSize = MapUtils.getInteger(map, "limit", Integer.MAX_VALUE);
        long carrierRrn = 0;
        if (carrierId != null && !carrierId.trim().equals("")) {
            carrierRrn = this.getInstanceRrn(StringUtils.trimToUpperCase(carrierId),
                                             this.getNamedSpace(ObjectList.ENTITY_KEY, facility),
                                             ObjectList.ENTITY_KEY);
            Assert.isFalse(carrierRrn <= 0, Errors.create().content("No such Carrier exist!").build());
        }
        Map lotInfo = null;
        if (StringUtils.isNotEmpty(lotId) || carrierRrn > 0) {
            lotInfo = lotQueryService.getLotInfoasMap(facility, StringUtils.trimToUpperCase(lotId), carrierRrn);
        }

        Assert.isFalse(lotInfo == null, Errors.create().content("No such Lot exist!").build());

        Long lotRrn = MapUtils.getLong(lotInfo, "lotRrn");
        int processVersion = MapUtils.getIntValue(lotInfo, "processVersion");

        Map condition = new HashMap();
        condition.put("lotRrn", lotRrn);

        Collection lotHistory = lotQueryService.qryLotHistoryExp(lotRrn, startRow, pageSize);
        if (lotHistory != null && !lotHistory.isEmpty()) {
            Map<Long, String> paramSetMap = wipQueryService.getParamSetMapByLotRrn(lotRrn);
            int i = 1;
            for (Iterator iterator = lotHistory.iterator(); iterator.hasNext(); ) {
                HashMap object = (HashMap) iterator.next();

                Collection operationList = (Collection) object.get(object.get("operationRrn"));
                result = new HashMap<>();
                StringBuffer transId = new StringBuffer();
                StringBuffer holdReason = new StringBuffer();
                StringBuffer trackInTime = new StringBuffer();
                StringBuffer trackInUser = new StringBuffer();
                String lastTrackInTime = null;
                StringBuffer trackOutTime = new StringBuffer();
                StringBuffer trackOutUser = new StringBuffer();
                String lastTrackOutTime = null;
                StringBuffer holdComments = new StringBuffer();
                StringBuffer holdUsers = new StringBuffer();
                StringBuffer releaseComments = new StringBuffer();
                StringBuffer splitLots = new StringBuffer();
                StringBuffer mergeLots = new StringBuffer();
                StringBuffer reworkFlag = new StringBuffer();
                StringBuffer scrapFlag = new StringBuffer();
                StringBuffer action = new StringBuffer();
                StringBuffer reticleId = new StringBuffer();
                StringBuffer stepComments = new StringBuffer();
                String parameterData = "";
                StringBuffer operationParameters = new StringBuffer();
                StringBuffer spcJob = new StringBuffer();

                boolean firstFlag = true;
                int holdCount = 0;
                for (Iterator iterator2 = operationList.iterator(); iterator2.hasNext(); ) {
                    result.put("stepSeq", new Integer(i));
                    HashMap lotTransmap = (HashMap) iterator2.next();
                    String tempTransId = (String) lotTransmap.get("trans_id");
                    transId.append(tempTransId).append(",");

                    if (firstFlag) {
                        // 步骤的跨境时间限制
                        Lot lot = lotQueryService.getLot(Long.valueOf(lotTransmap.get("lotRrn").toString()));
                        //TODO: timelimit待支持
                        //result.put("queueTime", timeLimitService.getOperationQueueTime(lot.getProcessRrn(),
                        //lot.getProcessVersion(),
                        //lot.getOperationRrn()));
                        result.put("lotId", lotTransmap.get("lot_id"));
                        result.put("carrierId", lotTransmap.get("carrierId"));
                        result.put("productId", lotTransmap.get("product_id"));
                        result.put("processId", lotTransmap.get("technology_id"));
                        result.put("processRrn", lotTransmap.get("process_rrn"));
                        result.put("operationRrn", lotTransmap.get("operation_rrn"));
                        result.put("routeRrn", lotTransmap.get("routeRrn"));
                        result.put("productRrn", lotTransmap.get("productRrn"));
                        result.put("processVersion", processVersion);
                        result.put("stageId", lotTransmap.get("stageId"));
                        result.put("routeId", lotTransmap.get("route_id"));
                        result.put("routeDesc", getInstanceDesc(
                                getInstanceRrn(String.valueOf(lotTransmap.get("route_id")), "MYCIM2",
                                               ObjectList.WFL_KEY)));

                        addOperation(result, lotTransmap);
                        result.put("operationType", MapUtils.getString(lotTransmap, "operationType"));
                        result.put("workArea", MapUtils.getString(lotTransmap, "workArea"));
                        result.put("operationDesc", MapUtils.getString(lotTransmap, "operationDesc"));
                        result.put("flowSeq", MapUtils.getString(lotTransmap, "flowSeq"));

                        result.put("recipeId", lotTransmap.get("recipeId"));
                        result.put("recipeParam", lotTransmap.get("recipeParam"));
                        result.put("recipePhysicalId", MapUtils.getString(lotTransmap, "recipePhysicalId"));

                        result.put("quantity", lotTransmap.get("qty_1"));
                        result.put("equipId", lotTransmap.get("equipment_id"));
                        result.put("stepSequence", lotTransmap.get("step_sequence"));
                        result.put("lotPollutionLevel", lotTransmap.get("lotPollutionLevel"));
                        result.put("lotPollutionLevelAfter", lotTransmap.get("lotPollutionLevelAfter"));
                        result.put("operationSeq", lotTransmap.get("operationSeq"));
                        result.put("routeSeq", lotTransmap.get("routeSeq"));
                        result.put("hotFlag", lotTransmap.get("hotFlag"));
                        result.put("priority", lotQueryService
                                .getPriorityText(MapUtils.getInteger(lotTransmap, "priority"), facility));
                        result.put("createCategory", lotTransmap.get("createCategory"));

                        ArrayList lotsList = (ArrayList) lotService
                                .getLotsByRunRrn(MapUtils.getLong(lotTransmap, "runRrn"));
                        if (lotsList != null && lotsList.size() > 1) {
                            result.put("runRrn", lotTransmap.get("runRrn"));
                        }
                        condition.put("lotRrn", lotInfo.get("lotRrn").toString());
                        condition.put("stepSequence", lotTransmap.get("step_sequence"));
                        result.put("processStepIdVersion", MapUtils.getString(lotTransmap, "processStepIdVersion"));
                        List comments = lotQueryService.qryLotStepHistoryComment(lotRrn, MapUtils.getLongValue(object,"step_sequence",0L),
                                                                                                  1, 1000);

                        if (comments != null && !comments.isEmpty()) {
                            for (Iterator iterator3 = comments.iterator(); iterator3.hasNext(); ) {
                                Map comment = (Map) iterator3.next();
                                stepComments.append("(").append(comment.get("commentSequence")).append(")")
                                            .append(comment.get("stepComment")).append(";");

                            }
                        }
                        firstFlag = false;
                    }
                    if (lotTransmap.get("reticleId") != null &&
                            !(reticleId.indexOf((String) lotTransmap.get("reticleId")) > 0)) {
                        reticleId.append(lotTransmap.get("reticleId")).append(" ");
                    }
                    result.put("reticleId", lotTransmap.get("reticleId"));
                    if (TransactionNames.HOLD_KEY.equals(tempTransId)) {
                        holdReason.append(lotTransmap.get("reason")).append(" ");
                        holdComments.append(lotTransmap.get("comments")).append(" ");
                        holdUsers.append(lotTransmap.get("trans_performed_by")).append(" ");
                        holdCount++;
                    }
                    if (TransactionNames.RELEASE_KEY.equals(tempTransId)) {
                        releaseComments.append(lotTransmap.get("reason")).append(" ");
                    }

                    if (TransactionNames.MOVEIN_KEY.equals(tempTransId)) {
                        trackInTime.append(lotTransmap.get("trans_start_timestamp")).append(" ");
                        trackInUser.append(lotTransmap.get("trans_performed_by")).append(" ");
                        lastTrackInTime = (String) lotTransmap.get("trans_start_timestamp");
                    }
                    if (TransactionNames.MOVEOUT_KEY.equals(tempTransId)) {
                        trackOutTime.append(lotTransmap.get("trans_start_timestamp")).append(" ");
                        trackOutUser.append(lotTransmap.get("trans_performed_by")).append(" ");
                        lastTrackOutTime = (String) lotTransmap.get("trans_start_timestamp");
                    }

                    if (TransactionNames.SPLIT_KEY.equals(tempTransId)) {
                        splitLots.append(lotTransmap.get("to_lot_id")).append(",");
                    }
                    if (TransactionNames.MERGE_KEY.equals(tempTransId)) {
                        mergeLots.append(lotTransmap.get("to_lot_id")).append(",");
                    }

                    if (TransactionNames.EXTERNALREWORK_KEY.equals(tempTransId) ||
                            TransactionNames.INTERNALREWORK_KEY.equals(tempTransId)) {
                        reworkFlag.append("rework").append(" ");
                    }

                    if (TransactionNames.SCRAP_KEY.equals(tempTransId)) {
                        scrapFlag.append(lotTransmap.get("lot_id")).append(",");
                    }
                    if (TransactionNames.EXCHANGE_KEY.equals(tempTransId) ||
                            StringUtils.indexOf(tempTransId, TransactionNames.VIRTUAL_KEY) > 0) {
                        if (StringUtils.equalsIgnoreCase("CN", language)) {
                            action.append(tempTransId).append(": ").append(lotTransmap.get("trans_start_timestamp"))
                                  .append(" 目标晶舟:").append(lotTransmap.get("targetCarrierId")).append(" 操作者: ")
                                  .append(lotTransmap.get("trans_performed_by")).append(" 备注: ")
                                  .append(convertNull2Blank(lotTransmap.get("comments"))).append("<br>");
                        } else {
                            action.append(tempTransId).append(": ").append(lotTransmap.get("trans_start_timestamp"))
                                  .append(" Target Cassette Id:").append(lotTransmap.get("targetCarrierId"))
                                  .append(" Operator: ").append(lotTransmap.get("trans_performed_by"))
                                  .append(" Remarks: ").append(convertNull2Blank(lotTransmap.get("comments")))
                                  .append("<br>");
                        }
                    }
                    if ((!TransactionNames.MOVEIN_KEY.equals(tempTransId)) &&
                            (!TransactionNames.MOVEOUT_KEY.equals(tempTransId)) &&
                            (!TransactionNames.DISPATCH_KEY.equals(tempTransId)) &&
                            (!TransactionNames.MOVENEXT_KEY.equals(tempTransId)) &&
                            (!TransactionNames.CREATE_KEY.equals(tempTransId))
                            // && (!TransactionNames.START_KEY.equals(tempTransId))
                            && (!TransactionNames.SPLIT_HOLD_KEY.equals(tempTransId)) &&
                            (!TransactionNames.SPLIT_RELEASE_KEY.equals(tempTransId)) &&
                            (!TransactionNames.LBRD_KEY.equals(tempTransId)) &&
                            (!TransactionNames.EXCHANGE_KEY.equals(tempTransId) &&
                                    StringUtils.indexOf(tempTransId, TransactionNames.VIRTUAL_KEY) <= 0)) {
                        action.append(tempTransId).append(": ");
                        if (StringUtils.equals(TransactionNames.SPLITFROM_KEY, tempTransId) ||
                                StringUtils.equals(TransactionNames.SPLIT_KEY, tempTransId) ||
                                StringUtils.equals(TransactionNames.MERGE_KEY, tempTransId) ||
                                StringUtils.equals(TransactionNames.MERGETO_KEY, tempTransId)) {
                            String targetUnitId = MapUtils.getString(lotTransmap, "targetUnitId");
                            targetUnitId = StringUtils.substring(targetUnitId, StringUtils.indexOf(targetUnitId, "("));
                            action.append(MapUtils.getString(lotTransmap, "to_lot_id") + targetUnitId);
                        }
                        // 结尾使用<br>,以便前台显示时能够换行
                        action.append(lotTransmap.get("trans_start_timestamp")).append(" 操作者: ")
                              .append(lotTransmap.get("trans_performed_by")).append(" 原因: ")
                              .append(convertNull2Blank(lotTransmap.get("reason"))).append(" 备注: ")
                              .append(convertNull2Blank(lotTransmap.get("comments"))).append("<br>");
                    }

                }
                result.put("transId", transId.toString());

                result.put("trackInTime", trackInTime.toString().trim());

                result.put("trackInUser", trackInUser.toString().trim());

                result.put("trackOutTime", trackOutTime.toString().trim());

                result.put("trackOutUser", trackOutUser.toString().trim());
                String processTime = "";
                if (lastTrackInTime != null && lastTrackOutTime != null) {
                    Date lastTrackInDate = DateUtils.parse(lastTrackInTime, DateUtils.DATE_FORMAT);
                    Date lastTrackOutDate = DateUtils.parse(lastTrackOutTime, DateUtils.DATE_FORMAT);
                    if (lastTrackOutDate.getTime() > lastTrackInDate.getTime()) {
                        processTime = DateUtils
                                .formatDateForSeconds((lastTrackOutDate.getTime() - lastTrackInDate.getTime()) / 1000);
                    }
                }
                result.put("processTime", processTime);

                result.put("holdReson", holdReason.toString());
                result.put("holdComment", holdComments.toString());
                result.put("holdUser", holdUsers.toString());
                result.put("releaseComment", releaseComments.toString());
                if (holdCount > 0) {
                    result.put("holdFlag", holdCount + "");
                }

                result.put("splitLots", splitLots.toString());
                result.put("mergeLots", mergeLots.toString());

                result.put("reworkFlag", reworkFlag.toString().trim());

                result.put("scrapFlag", scrapFlag.toString());
                // 去除action中的最后一个<br>
                String actionStr = action.toString().trim();
                if (actionStr.length() > 0) {
                    if (actionStr.substring(actionStr.length() - 4).equals("<br>")) {
                        actionStr = actionStr.substring(0, actionStr.length() - 4);
                    }
                }
                result.put("action", actionStr);
                result.put("stepComment", stepComments.toString());

                // add EDC Parameter collection
                //                parameterData = wipQueryService.getParamCon(Long.parseLong(lotInfo.get
                //                ("lotRrn").toString()),
                //                        condition.get("stepSequence").toString());
                //                if (parameterData.length() > 0) {
                //                    if (parameterData.substring(parameterData.length() - 4).equals
                //                    ("<br>")) {
                //                        parameterData = parameterData.substring(0, parameterData.length()
                //                        - 4);
                //                    }
                //                }
                //                result.put("edcParameter", parameterData);
                result.put("edcParameter",
                           paramSetMap.get(lotRrn + MapUtils.getLongValue(condition, "stepSequence", 0)));

                Long stepSequence = MapUtils.getLong(result, "stepSequence");
                List operationParameterList = lotQueryService.qryOperationParameters(lotRrn, stepSequence);

                for (Iterator iterator2 = operationParameterList.iterator(); iterator2.hasNext(); ) {
                    Map operationParameter = (Map) iterator2.next();
                    String operationParameterId = MapUtils.getString(operationParameter, "operationParameterId");
                    String operationParameterDesc = sysService
                            .referenceDetailExchangeNull("$$OPERATION_PARAMETER", operationParameterId, "DATA_1_VALUE");
                    operationParameters.append(operationParameterDesc);
                    operationParameters.append(":");
                    operationParameters.append(MapUtils.getString(operationParameter, "operationParameterValue"));
                    if (iterator2.hasNext()) {
                        operationParameters.append("<br>");
                    }
                }
                result.put("operationParameters", operationParameters.toString());
                if (StringUtils.isNotEmptyTrim(parameterData)) {
                    int k = 1;
                    Collection spcJobInfoList = spcService.getSpcJobInfo(lotRrn, stepSequence);
                    if (spcJobInfoList.size() > 0) {
                        for (Iterator iterator2 = spcJobInfoList.iterator(); iterator2.hasNext(); ) {
                            Map spcJobInfo = (Map) iterator2.next();
                            String reasonCode = MapUtils.getString(spcJobInfo, "reasonCode");
                            if (StringUtils.isNotEmpty(reasonCode)) {
                                spcJob.append(k++);
                                spcJob.append(":");
                                spcJob.append(reasonCode);
                                if (iterator2.hasNext()) {
                                    spcJob.append("<br>");
                                }
                            }
                        }
                    }
                    result.put("spcJobInfo", spcJob.toString());
                }
                result.put("facilityRrn", facility);
                resultArray.add(result);
                i++;
            }

        }
        rteturnResult.put("rows", resultArray);
        //查询总条数
        int totalCount = lotQueryService.qryLotTransHisCountByStepseq(lotRrn);

        rteturnResult.put("totalCount", totalCount);
        rteturnResult.put("success", "true");

        return rteturnResult;
    }

    public String getNewLotComments(Map params) {
        Lot lot = new Lot();
        lot.setLotRrn(MapUtils.getLongValue(params, "lotRrn"));
        lot.setStepSequence(MapUtils.getLongValue(params, "stepSequence"));

        return getLotComments(lot, MapUtils.getBoolean(params, "latest"));
    }

    public ActionForward validLot(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                                  HttpServletResponse response) throws Exception {
        ActionForward dest = WebUtils.NULLActionForward;
        Long facility = LocalContext.getFacilityRrn();
        Map result = new HashMap();
        Map lotBaseInfo = new HashMap();
        String lotId = request.getParameter("lotId");
        Map lotInfo = null;

        if (lotId != null) {
            //            Lot lot = lotQueryService.getLot(lotId.trim().toUpperCase(), facility);
            //            lotInfo = BeanUtils.copyBeanToMap(lot);
            lotInfo = lotQueryService.getLotInfoasMap(facility, StringUtils.trimToUpperCase(lotId), null);
        }
        if (lotInfo == null) {
            if (StringUtils.equalsIgnoreCase("CN", I18nUtils.getCurrentLanguage().toString())) {
                result.put("Msg", "未查询到相关信息");
            } else {
                result.put("Msg", "Not querying the relevant information");
            }

            result.put("lotBaseInfo", "");
            WebUtils.writeJson(response, result.toString());
        } else {
            lotBaseInfo.put("lotId", lotInfo.get("lotId"));
            lotBaseInfo.put("productId", lotInfo.get("productId"));
            lotBaseInfo.put("lotType", lotInfo.get("lotType"));
            lotBaseInfo.put("carrierId", lotInfo.get("carrierId"));
            lotBaseInfo.put("priority", wipQueryService
                    .getHotflagSplicingPriority(NumberUtils.toInt(MapUtils.getString(lotInfo, "hotflag"), 0),
                                                NumberUtils.toInt(MapUtils.getString(lotInfo, "priority"), 0),
                                                facility));
            lotBaseInfo.put("lotRrn", lotInfo.get("lotRrn"));
            lotBaseInfo.put("processVersion", lotInfo.get("processVersion"));
            long processRrn = MapUtils.getLongValue(lotInfo, "processRrn");
            lotBaseInfo.put("newProcessVersion", getProcessVersion(processRrn));

            request.setAttribute("lot_base_info", JsonUtils.toString(lotBaseInfo));
            request.setAttribute("from", "lot_location_4csec_action");
            request.setAttribute("lot_id", lotId);
            dest = mapping.findForward(Constants.LOTHISTORY_KEY);
        }
        return dest;
    }

    private void addOperation(Map<String, Object> result, HashMap object) throws Exception {
        if (NumberUtils.isNumber(MapUtils.getString(object,"operation_rrn"))) {
            Operation operation = getOperation(new Operation(MapUtils.getLongValue( object,"operation_rrn")));
            if (operation != null) {
                result.put("operationDesc", operation.getInstanceDesc());
                result.put("operationId", operation.getInstanceId());

                String operationType = sysService
                        .referenceDetailExchangeNull("$OPERATION_TYPE", operation.getObjectType(), "DATA_1_VALUE");
                result.put("operationType", operationType);

                if (operation != null && StringUtils.isNotEmpty(operation.getWorkArea())) {
                    String workArea = sysService
                            .referenceDetailExchangeNull("$$WORK_AREA", operation.getWorkArea(), "DATA_1_VALUE");
                    result.put("workArea", workArea);
                }
                // add edc flag
                result.put("edcFlag", operation.getMoveInRequired());
            }
        }
    }

    private String convertNull2Blank(Object obj) {
        String str = "";
        if (obj != null && (obj instanceof String) && !"null".equals(obj)) {
            return obj.toString();
        }
        return str;
    }

    private String getLotComments(Lot lot, Boolean latest) {
        Map condition = new HashMap();
        condition.put("lotRrn", lot.getLotRrn());
        condition.put("stepSequence", lot.getStepSequence());

/*        List commentList = (List) lotQueryService.qryLotStepHistoryComment(lot.getLotRrn(),
                                                                           lot.getStepSequence(), 1, 1000);
        Iterator     it              = commentList.iterator();
        StringBuffer commentStr      = new StringBuffer();
        Integer      commentSequence = 0;
        while (it.hasNext()) {
            Map m = (HashMap) it.next();
            if (latest != null && latest) {
                //只要最新的一条数据
                if (MapUtils.getInteger(m, "commentSequence") > commentSequence) {
                    commentSequence = MapUtils.getInteger(m, "commentSequence");
                    commentStr.delete(0, commentStr.length());
                    commentStr.append(MapUtils.getString(m, "commentSequence")).append(COMMENT_DOM).append(
                            MapUtils.getString(m, "stepComment")).append(";\n");
                }
            } else {
                commentStr.append(MapUtils.getString(m, "commentSequence")).append(COMMENT_DOM).append(
                        MapUtils.getString(m, "stepComment")).append(";\n");
            }
        }*/
        List commentList = lotQueryService.qryLotHistoryCommentByTime(lot.getLotRrn());
        StringBuilder commentStr = new StringBuilder();
        //取commentList 第一条,即历史最新一条
        for (Object o : commentList) {
            Map m = (HashMap) o;
            commentStr.append(MapUtils.getString(m, "stepComment")).append(";\n");
            break;
        }

        return commentStr.toString();
    }

}