LogEventSaveAction.java

/*
 *        @ Copyright 2001 FA Software;
 *        All right reserved. No part of this program may be reproduced or
 *        transmitted in any form or by any means, electronic or
 *        mechanical, including photocopying, recording, or by any
 *        information storage or retrieval system without written
 *        permission from FA Software, except for inclusion of brief
 *        quotations in a review.
 */
package com.mycim.webapp.actions.logevent;

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.fasterxml.jackson.databind.ObjectMapper;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.framework.utils.lang.time.DateUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.SystemConstant;
import com.mycim.valueobject.alm.EenAction;
import com.mycim.valueobject.alm.EenMessage;
import com.mycim.valueobject.alm.EmailMessage;
import com.mycim.valueobject.bas.NamedObject;
import com.mycim.valueobject.consts.*;
import com.mycim.valueobject.ems.*;
import com.mycim.valueobject.prp.ContextValue;
import com.mycim.valueobject.security.User;
import com.mycim.valueobject.sys.ReferenceFileDetail;
import com.mycim.webapp.Constants;
import com.mycim.webapp.WebUtils;
import com.mycim.webapp.actions.EmsSetupAction;
import com.mycim.webapp.forms.LogEventInfoForm;
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.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 设备状态更改/光罩状态更改
 *
 * @author weike.li
 * @date 2019/8/26
 * @since 1.8
 **/
public class LogEventSaveAction extends EmsSetupAction {

    private static final String MAIN_EQPT = "MAINEQPT";

    private static final String TRANSACTION = "transaction";

    private static final String TRUE_YES_LOWER = "yes";

    private static final String HOLD_NEW = "holdnew";

    private static final String MAINT_TO_QC = "DD.MAINT_TO_QC";

    private static final String OT = "O/T";

    private static final String INITIALIZE = "initialize";

    private static final String REGULAR_PROD = "REGULAR PROD";

    private static final String END_PROD = "END PROD";

    private static final String NUMBER_1 = "1";

    private static final String NUMBER_2 = "2";

    private static final String NUMBER_4 = "4";

    private static final String RUN = "RUN";

    private static final String L_T = "L/T";

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

        if (WebUtils.getParameterBoolean("reticleStatusEventFlag", request)) {
            return mapping.findForward("logreticleevent");
        }
        long userRrn = LocalContext.getUserRrn();
        Long facilityRrn = LocalContext.getFacilityRrn();
        request.setAttribute("userrrn", userRrn);

        LogEventInfoForm theform = (LogEventInfoForm) form;
        theform.setEntityId(StringUtils.trim(theform.getEntityId()));
        theform.setEventId(StringUtils.trim(theform.getEventId()));

        String entityId = StringUtils.trimToUpperCase(theform.getEntityId());
        String eventId = StringUtils.trimToUpperCase(theform.getEventId());
        String reticleFlag = request.getParameter("reticleFlag");
        long entityRrn = 0;
        String status = StringUtils.EMPTY;
        if ("Y".equals(reticleFlag)) {
            Assert.isFalse(
                    StringUtils.isBlank(entityId) || StringUtils.isEmpty(entityId) || StringUtils.isBlank(eventId) ||
                            StringUtils.isEmpty(eventId),
                    Errors.create().content("Entity ID and event ID cannot be empty!").build());
        } else {
            if (StringUtils.isBlank(entityId) || StringUtils.isEmpty(entityId)) {
                return mapping.findForward("logeqptevent");
            }
        }
        entityRrn = getInstanceRrn(entityId, getNamedSpace(ObjectList.ENTITY_KEY, facilityRrn), ObjectList.ENTITY_KEY);
        if (entityRrn == 0) {
            Assert.isFalse("Y".equals(reticleFlag),
                           Errors.create().key(MessageIdList.RETICLE_ID_NOEXIST).content("Reticle Id does not exist!")
                                 .build());
            Assert.isTrue("Y".equals(reticleFlag),
                          Errors.create().key(MessageIdList.EQUIPMENT_ID_NOT_EXIST).content("EQP ID is not exist!")
                                .build());
        }
        List<EntityStatus> statusList = emsService.getEntityStatuss(entityRrn);
        for (EntityStatus statues : statusList) {
            status = statues.getCurrentStatus();
        }
        request.setAttribute("lotevent_eqptStatus", status);

        List<Entity> chamberList = emsService.getChildChamberEquip(entityRrn);
        if (chamberList != null && chamberList.size() > 0) {
            for (int i = 0; i < chamberList.size(); i++) {
                Entity chamberEntity = chamberList.get(i);
                chamberEntity.setCurrentStatus(emsService.getEntityCurrentStatus(chamberEntity.getInstanceRrn()));
                request.setAttribute("chamberList", chamberList);
            }
        }
        //是否是从派工界面进入
        if (WebUtils.getParameterBoolean("eqptPageFlag", request)) {
            request.setAttribute("eqptPageFlag", true);
        }
        //先查询机况
        if ((request.getParameter("qryEvents") != null && !StringUtils.EMPTY.equals(request.getParameter("qryEvents")))
            || request.getAttribute("refresh") != null) {
            request.setAttribute("entityId", entityId);
            Entity entity = StringUtils.isNotBlank(entityId) ? new Entity(entityId, getNamedSpace(ObjectList.ENTITY_KEY,
                                                                                                  facilityRrn),
                                                                          ObjectList.ENTITY_KEY) : null;
            request.setAttribute(SessionNames.ENTITY_KEY, entity);
            theform.setAvailabilityHidden("");
            theform.setValidAvailabilityHidden("");
            theform.setTargetAvailabilityHidden("");
            theform.setStatusEndTime("");
            theform.setIsChangeChild("");

            return mapping.findForward(Constants.MODIFY_KEY);
        }


        Event event = new Event();
        Entity entity = new Entity();

        String oldEntityId = StringUtils.trim(request.getParameter("entityId"));
        request.setAttribute("entityId", oldEntityId);

        entity = emsService.getEntity(new Entity(entityRrn));

        boolean logRights;
        String objectType = entity.getObjectType();

        Assert.isFalse(StringUtils.isBlank(entityId) || StringUtils.isBlank(eventId),
                       Errors.create().content("Entity ID and " + "event ID" + " cannot " + "be empty!").build());

        if (StringUtils.equals(reticleFlag, "Y")) {
            Assert.isTrue(StringUtils.equals(objectType, ObjectList.RETICLE_KEY),
                          Errors.create().key(MessageIdList.RETICLE_ID_MISSING).content("Reticle Id is not " + "found!")
                                .build());

            Assert.isFalse(
                    StringUtils.equalsIgnoreCase("INIT", status) && StringUtils.equalsIgnoreCase("INIT_RTL", eventId),
                    Errors.create().key(MessageIdList.RETICLE_HAS_BEEN_INIT).content("光罩{}已经Init!不能重复init")
                          .args(entityId).build());
            String maskSize = entity.getMaskSize();
            if (StringUtils.equalsIgnoreCase("9", maskSize)) {
                if (StringUtils.equalsIgnoreCase("RTL.WAIT_PD", eventId)) {
                    theform.setComment("请直接做maskclean.");
                }
                if (StringUtils.equalsIgnoreCase("RTL.WAIT_PD_TO_IN_PD", eventId)) {
                    theform.setComment("正在做maskclean.");
                }
            }
            //因为quartz能把6寸光罩切换为WAIT_PD但是手动不行
            // 所以暂时把6寸光罩的卡控暂时去掉
            //            if (StringUtils.equalsIgnoreCase("6", maskSize)) {
            //                if (StringUtils.equalsIgnoreCase("RTL.WAIT_PD", eventId)) {
            //                    throw new WebException(I18nUtils.getMessage("reticle
            //                    .six_size_cannot_wait_pd",
            //                                                                "Reticle size is 6,
            //                                                                cannot
            //                                                                Wait Pd by "
            //                                                                + "handle.",
            //                                                                entityId));
            //                }
            //            }
            logRights = emsService.checkLogRights(entityId, eventId, userRrn, "RTL");
            request.setAttribute("reticleFlag", "Y");
        } else {
            Assert.isTrue(StringUtils.equals(objectType, MAIN_EQPT),
                          Errors.create().key(MessageIdList.EQUIPMENT_MISSING_ID).content("设备号为空或不存在").build());
            // 主设备如果当前状态是RUN,在查询设备上的所有批次
            if (StringUtils.equalsIgnoreCase(status, RUN)) {
                String lotIds = getLotByRunEqpt(entity.getInstanceId(), facilityRrn);
                request.setAttribute("lotIds", lotIds);
            }
            logRights = emsService.checkLogRights(entityId, eventId, userRrn, "MAINEQPT");
            if (WebUtils.getParameter("nav", request) == null) {
                logRights = true;
            }
        }
        Assert.isTrue(logRights, Errors.create().key(MessageIdList.EQUIPMENT_NOT_AUTHORIZED_LOG_EVENT)
                                       .content("你无权登录该事件或设备状态与该事件不符").build());

        event = new Event(eventId, getNamedSpace(ObjectList.EVENT_KEY, facilityRrn), ObjectList.EVENT_KEY);
        //PM Check
        if (eventId.contains(SystemConstant.Str.OTHER_TO_PM) || eventId.startsWith(SystemConstant.Str.PM_TO_OTHER)){
            request.setAttribute("refresh", "true");
            theform.setEventId(StringUtils.EMPTY);
            throw new SystemIllegalArgumentException(Errors.create().key(MessageIdList.PM_CANNOT_DO_IN_HERE)
                                                           .content("Please go to the PMS Portal to operate the PM related status switch!").build());
        }

        request.setAttribute("NEXT_KEY", "next");
        theform.setEntityId(entityId);

        entity = emsService.getEntity(new Entity(entityRrn));
        getInstance(entity);
        entity.setInstanceRrn(entityRrn);

        event.setEntityType(entity.getObjectType());
        event = baseService.getEvent(event);

        request.setAttribute(SessionNames.ENTITY_KEY, entity);

        theform.setEntityId(entity.getInstanceId());
        theform.setEntityNamedSpace(entity.getNamedSpace());
        theform.setEntityDesc(entity.getInstanceDesc());
        theform.setAvailability(entity.getAvailability());
        theform.setAvailabilityHidden(sysService.referenceDetailExchangeNull("$$TARGET_AVAILABILITY",
                                                                             entity.getAvailability(), "data_1_value"));

        if (request.getParameter(Constants.NEXT_KEY) != null) {

            List<NamedObject> validEvents = getValidEvents(entity);

            request.setAttribute(SessionNames.OPTIONS_KEY, validEvents);

            boolean checked = false;
            for (NamedObject validEvent : validEvents) {
                if (validEvent.getInstanceRrn() == event.getInstanceRrn()) {
                    checked = true;
                    break;
                }
            }

            Assert.isTrue(checked,
                          Errors.create().key(MessageIdList.EQUIPMENT_MISSING_EVENT).content("设备缺少相应的事件").build());
            theform.setTransId(Constants.MODIFY_KEY);
        }

        List<EventModel> eventStatus = baseService.getEventModels(event.getInstanceRrn(), entity.getInstanceRrn());

        event.setEventModels(eventStatus);

        List<Map<String, Object>> cascadingEvent = baseService
                .getCascadingEvent(entity.getInstanceRrn(), event.getInstanceRrn());

        if (cascadingEvent != null && cascadingEvent.size() > 0) {
            request.setAttribute("cascadingEvent", cascadingEvent);
        } else {
            request.removeAttribute("cascadingEvent");
        }

        List<PrincipalSupportingEvent> principalEvent = baseService
                .getPrincipalSupportingEvents(entity.getInstanceRrn(), event.getInstanceRrn());

        if (principalEvent != null && principalEvent.size() > 0) {
            request.setAttribute("principalEvent", principalEvent);
        } else {
            request.removeAttribute("principalEvent");
        }
        theform.setTargetAvailability(event.getTargetAvailability());
        request.setAttribute(SessionNames.EVENT_KEY, event);
        theform.setEventNamedSpace(event.getNamedSpace());
        theform.setEventId(event.getInstanceId());
        theform.setEventRrn(event.getInstanceRrn());
        theform.setEventDesc(event.getInstanceDesc());
        theform.setIsChangeChild(event.getIsChangeChild());
        theform.setStatusEndTime(DateUtils.formatDate(new Date(), "yyyy/MM/dd HH:mm:ss"));

        theform.setValidAvailability(event.getValidAvailability());
        theform.setValidAvailabilityHidden(sysService.referenceDetailExchangeNull("$$VALID_AVAILABILITY",
                                                                                  event.getValidAvailability(),
                                                                                  "data_1_value"));

        theform.setTargetAvailabilityHidden(
                (event.getTargetAvailability() == null) ? "0" : event.getTargetAvailability());

       /* if (NUMBER_2.equalsIgnoreCase(theform.getTargetAvailabilityHidden())) {
            theform.setTargetAvailabilityHidden(theform.getAvailabilityHidden());
        } else {*/
        theform.setTargetAvailabilityHidden(sysService.referenceDetailExchangeNull("$$TARGET_AVAILABILITY",
                                                                                   theform.getTargetAvailabilityHidden(),
                                                                                   "data_1_value"));
        //}

        request.setAttribute("entityType", request.getParameter("entityType"));
        return mapping.findForward(Constants.MODIFY_KEY);
    }

    public ActionForward eqptCancel(ActionMapping mapping, LogEventInfoForm theform, HttpServletRequest request,
                                    HttpServletResponse response) throws Exception {
        //是否是从派工界面进入
        if (WebUtils.getParameterBoolean("eqptPageFlag", request)) {
            request.setAttribute("eqptPageFlag", true);
            response.sendRedirect(
                    request.getContextPath() + "/eqptlogeventsave.do?showLogEvent=Y&dispatch=Y&entityId=" +
                            theform.getEntityId() + "&nav=true&eqptPageFlag=true&qryEvents=true");
        } else {
            theform.setEntityId("");
        }
        return mapping.findForward("logeqptevent");
    }

    public String getReticleLogEvent(Map<String, Object> params) throws Exception {
        Map<String, Object> map = new HashMap();
        String entityId = MapUtils.getString(params, "entityId");
        String eventId = MapUtils.getString(params, "eventId");
        String reticleFlag = MapUtils.getString(params, "reticleFlag");
        long userRrn = LocalContext.getUserRrn();
        Long facilityRrn = LocalContext.getFacilityRrn();
        LogEventInfoForm theform = new LogEventInfoForm();
        theform.setEntityId(entityId);
        theform.setEventId(eventId);
        long entityRrn = 0;
        String status = StringUtils.EMPTY;
        entityRrn = getInstanceRrn(entityId, getNamedSpace(ObjectList.ENTITY_KEY, facilityRrn), ObjectList.ENTITY_KEY);
        if (entityRrn == 0) {
            Assert.isFalse("Y".equals(reticleFlag),
                           Errors.create().key(MessageIdList.RETICLE_ID_NOEXIST).content("Reticle Id does not exist!")
                                 .build());
            Assert.isTrue("Y".equals(reticleFlag),
                          Errors.create().key(MessageIdList.EQUIPMENT_ID_NOT_EXIST).content("EQP ID is not exist!")
                                .build());
        }
        List<EntityStatus> statusList = emsService.getEntityStatuss(entityRrn);
        for (EntityStatus statues : statusList) {
            status = statues.getCurrentStatus();
        }
        List<Entity> chamberList = emsService.getChildChamberEquip(entityRrn);
        Event event = new Event();
        Entity entity = new Entity();
        String oldEntityId = StringUtils.trim(entityId);
        entity = emsService.getEntity(new Entity(entityRrn));
        boolean logRights;
        String objectType = entity.getObjectType();

        Assert.isFalse(StringUtils.isBlank(entityId) || StringUtils.isBlank(eventId),
                       Errors.create().content("Entity ID and " + "event ID" + " cannot " + "be empty!").build());

        if (StringUtils.equals(reticleFlag, "Y")) {
            Assert.isTrue(StringUtils.equals(objectType, ObjectList.RETICLE_KEY),
                          Errors.create().key(MessageIdList.RETICLE_ID_MISSING).content("Reticle Id is not " + "found!")
                                .build());

            Assert.isFalse(
                    StringUtils.equalsIgnoreCase("INIT", status) && StringUtils.equalsIgnoreCase("INIT_RTL", eventId),
                    Errors.create().key(MessageIdList.RETICLE_HAS_BEEN_INIT).content("光罩{}已经Init!不能重复init")
                          .args(entityId).build());

            String maskSize = entity.getMaskSize();
            if (StringUtils.equalsIgnoreCase("9", maskSize)) {
                if (StringUtils.equalsIgnoreCase("RTL.WAIT_PD", eventId)) {
                    theform.setComment("请直接做maskclean.");
                }
                if (StringUtils.equalsIgnoreCase("RTL.WAIT_PD_TO_IN_PD", eventId)) {
                    theform.setComment("正在做maskclean.");
                }
            }
            logRights = emsService.checkLogRights(entityId, eventId, userRrn, "RTL");
        }

        event = new Event(eventId, getNamedSpace(ObjectList.EVENT_KEY, facilityRrn), ObjectList.EVENT_KEY);
        theform.setEntityId(entityId);

        entity = emsService.getEntity(new Entity(entityRrn));
        getInstance(entity);
        entity.setInstanceRrn(entityRrn);

        event.setEntityType(entity.getObjectType());
        event = baseService.getEvent(event);
        theform.setEntityId(entity.getInstanceId());
        theform.setEntityNamedSpace(entity.getNamedSpace());
        theform.setEntityDesc(entity.getInstanceDesc());
        theform.setAvailability(entity.getAvailability());
        theform.setAvailabilityHidden(sysService.referenceDetailExchangeNull("$$TARGET_AVAILABILITY",
                                                                             entity.getAvailability(), "data_1_value"));

        List<EventModel> eventStatus = baseService.getEventModels(event.getInstanceRrn(), entity.getInstanceRrn());

        event.setEventModels(eventStatus);

        List<Map<String, Object>> cascadingEvent = baseService
                .getCascadingEvent(entity.getInstanceRrn(), event.getInstanceRrn());

        List<PrincipalSupportingEvent> principalEvent = baseService
                .getPrincipalSupportingEvents(entity.getInstanceRrn(), event.getInstanceRrn());
        theform.setTargetAvailability(event.getTargetAvailability());
        theform.setEventNamedSpace(event.getNamedSpace());
        theform.setEventId(event.getInstanceId());
        theform.setEventRrn(event.getInstanceRrn());
        theform.setEventDesc(event.getInstanceDesc());
        theform.setIsChangeChild(event.getIsChangeChild());
        theform.setStatusEndTime(DateUtils.formatDate(new Date(), "yyyy/MM/dd HH:mm:ss"));

        theform.setValidAvailability(event.getValidAvailability());
        theform.setValidAvailabilityHidden(sysService.referenceDetailExchangeNull("$$VALID_AVAILABILITY",
                                                                                  event.getValidAvailability(),
                                                                                  "data_1_value"));
        theform.setTargetAvailabilityHidden(
                (event.getTargetAvailability() == null) ? "0" : event.getTargetAvailability());
        theform.setTargetAvailabilityHidden(sysService.referenceDetailExchangeNull("$$TARGET_AVAILABILITY",
                                                                                   theform.getTargetAvailabilityHidden(),
                                                                                   "data_1_value"));
        map.put("availability", theform.getAvailabilityHidden());
        map.put("validAvailability", theform.getValidAvailabilityHidden());
        map.put("targetAvailability", theform.getTargetAvailabilityHidden());
        map.put("statusEndTime", theform.getStatusEndTime());
        map.put("changeSubEQP", theform.getIsChangeChild());
        map.put("comments", theform.getComment());
        EventModel eventModel = eventStatus.get(0);
        map.put("statusGrpID", eventModel.getStatusGroupId());
        map.put("currentStatus", eventModel.getCurrentStatus());
        map.put("validStatus", eventModel.getValidStatus());
        map.put("targetStatus", eventModel.getTargetStatus());
        ObjectMapper mapper = new ObjectMapper();
        String s = mapper.writeValueAsString(map);
        return s;
    }

    public ActionForward eqptModify(ActionMapping mapping, LogEventInfoForm theform,
                                    HttpServletRequest request) throws Exception {
        String user = LocalContext.getUserId();
        Long facility = LocalContext.getFacilityRrn();
        Long userRrn = LocalContext.getUserRrn();
        String namedSpace = baseService.getNamedSpace(facility, ObjectList.ENTITY_KEY);
        // chamber设备id,通过逗号分隔
        String chamberIdsStr = WebUtils.getParameter("chamberIdList", request);
        String[] chamberIdArray = new String[]{};
        // 修改成功的chamber设备集合
        List<Entity> successChamberList = new ArrayList();
        // 修改成功的chamber设备对应的event事件集合
        List<Event> successChamberEventList = new ArrayList();
        if (StringUtils.isNotBlank(chamberIdsStr)) {
            chamberIdArray = chamberIdsStr.split(",");
        }
        //是否是从派工界面进入
        if (WebUtils.getParameterBoolean("eqptPageFlag", request)) {
            request.setAttribute("eqptPageFlag", true);
        }
        NamedObject entityObject = baseService
                .getNamedObject(new NamedObject(theform.getEntityId(), namedSpace, ObjectList.ENTITY_KEY));
        Entity entity = emsService.getEntity(new Entity(entityObject.getInstanceRrn()));
        request.setAttribute("entityId", entity.getInstanceId());
        if (StringUtils.isEmpty(entityObject.getInstanceDesc())) {
            request.setAttribute("entityDesc", "");
        } else {
            request.setAttribute("entityDesc", entityObject.getInstanceDesc());
        }
        Assert.isFalse(entity == null ||
                               !StringUtils.equals(entity.getInstanceId(), theform.getEntityId().trim().toUpperCase()),
                       Errors.create().key(MessageIdList.EQUIPMENT_ENTER_THE_EQP_ID)
                             .content("Please enter or confirm the current EQP id!").build());

        String eventNamedSpace = baseService.getNamedSpace(facility, ObjectList.EVENT_KEY);
        Event oldEvent = new Event(theform.getEventId(), eventNamedSpace, ObjectList.EVENT_KEY);
        oldEvent.setEntityType(entityObject.getObjectType());
        Event event = baseService.getEvent(oldEvent);
        Assert.isFalse(event == null,
                       Errors.create().key(MessageIdList.EQUIPMENT_SELECT_TARGET_STATUS).content("请选择目标状态!").build());

        String validateStatusEndTimeFlag = request.getParameter("validateStatusEndTimeFlag");
        if (TRUE_YES_LOWER.equals(validateStatusEndTimeFlag)) {
            Long statusEndTimeLong = null;
            statusEndTimeLong = new SimpleDateFormat(DateUtils.DATE_FORMAT).parse(theform.getStatusEndTime()).getTime();

            Assert.isFalse(statusEndTimeLong > System.currentTimeMillis(),
                           Errors.create().key(MessageIdList.EQUIPMENT_END_TIME_GREATER_CURRENT).content("请选择目标状态!")
                                 .build());
        }

        if (StringUtils.equalsIgnoreCase(entity.getObjectType(), MAIN_EQPT)) {
            Assert.isTrue(emsService.checkUserAndEqptStationJurisdiction(user, entity.getInstanceId(), facility),
                          Errors.create().key(MessageIdList.EQUIPMENT_NO_PERMISSION_MODIFY_EQP).content("没有修改设备的权限!")
                                .build());

            /*
            String msg = pmsService.pmsCheck(entity, Constants.PM_CHECK_TYPE.WAIT_ENT4DEADLINE);
            if (StringUtils.isNotEmpty(msg)) {
                throw new WebException(msg);
            }
            */
            // 主设备有RUN切换到其它状态需要提示
        }

        // ocap check
        // wipQueryService.checkActiveOfflineOcapId(entity.getInstanceRrn());
        Assert.state(wipQueryService.checkActiveOfflineOcapId(entity.getInstanceRrn(), event.getInstanceId()),
                     Errors.create().content("Eqp has active ocapId.only change {}")
                           .args(Arrays.asList(EventName.AVAILABLE_EQP_LOG_EVENT_BY_OFFLINE).toString()).build());

        if (request.getParameter(HOLD_NEW) != null) {
            theform.setComment("NEW-->HOLD");
            theform.setEntityId(entity.getInstanceId());
            theform.setEventId(event.getInstanceId());
            theform.setTransId("modify");
        }

        List<EntityStatus> entityStatuss = new ArrayList();
        // 事件模型,选中的设备状态更改信息
        List<EventModel> eventModels = baseService.getEventModels(event.getInstanceRrn(), entity.getInstanceRrn());

        if (request.getParameter(Constants.MEMBERS_KEY) != null) {
            entity = (Entity) request.getAttribute(SessionNames.ENTITY_KEY);

            Collection validEvents = (Collection) request.getAttribute(SessionNames.OPTIONS_KEY);

            if ((entity == null) || (validEvents == null)) {
                return mapping.findForward(Constants.LOGIN_KEY);
            }

            long eventRrn = theform.getEventRrn();

            Event tempEvent = new Event();

            tempEvent.setInstanceRrn(eventRrn);
            tempEvent.setEntityType(entity.getObjectType());

            tempEvent = (Event) getInstance(tempEvent);

            tempEvent.setEventModels(baseService.getEventModels(eventRrn, entity.getInstanceRrn()));

            request.setAttribute(SessionNames.EVENT_KEY, tempEvent);

            theform.setEventNamedSpace(tempEvent.getNamedSpace());
            theform.setEventDesc(tempEvent.getInstanceDesc());

            theform.setValidAvailability(tempEvent.getValidAvailability());

            theform.setValidAvailabilityHidden(sysService.referenceDetailExchangeNull("$$VALID_AVAILABILITY",
                                                                                      tempEvent.getValidAvailability(),
                                                                                      "data_1_value"));

            theform.setTargetAvailabilityHidden(
                    (tempEvent.getTargetAvailability() == null) ? "0" : tempEvent.getTargetAvailability());
            tempEvent.setTargetAvailability(theform.getTargetAvailabilityHidden());
            if (NUMBER_2.equalsIgnoreCase(theform.getTargetAvailabilityHidden())) {

                theform.setTargetAvailabilityHidden(theform.getValidAvailability());
            } else {
                theform.setTargetAvailabilityHidden(sysService.referenceDetailExchangeNull("$$TARGET_AVAILABILITY",
                                                                                           tempEvent
                                                                                                   .getTargetAvailability(),
                                                                                           "data_1_value"));
            }

            return mapping.findForward(Constants.MODIFY_KEY);
        } else {
            String comment = theform.getComment();
            String comment1 = theform.getComment1();
            String comment2 = theform.getComment2();
            String eventId = theform.getEventId();

            if (MAINT_TO_QC.equals(eventId)) {
                Assert.isFalse("".equalsIgnoreCase(comment) || comment == null || "".equalsIgnoreCase(comment1) ||
                                       comment1 == null || "".equalsIgnoreCase(comment2) || comment2 == null,
                               Errors.create().key(MessageIdList.EQUIPMENT_DISPOSAL_MEASURES_MUST_BE_ENTERED)
                                     .content("维修人员,故障现象,处置措施 必须填写!").build());
            }

            boolean otFlag = !OT.equalsIgnoreCase(eventId);
            Assert.isFalse(
                    ("".equalsIgnoreCase(comment) || comment == null) && otFlag && (!L_T.equalsIgnoreCase(eventId)),
                    Errors.create().key(MessageIdList.EQUIPMENT_MISSING_COMMENT).content("备注不能为空").build());

            if (StringUtils.equalsIgnoreCase(StringUtils.trim(eventId), INITIALIZE) ||
                    StringUtils.indexOf(eventId, "INIT") != -1) {
                long transRrn = 0;
                Map map = new HashMap(10);
                map.put("comments", comment);
                map.put("comments1", comment1);
                map.put("comments2", comment2);
                transRrn = emsService.initializeEntityStatus(new Long(entity.getInstanceRrn()), entity.getObjectType(),
                                                             new Long(event.getInstanceRrn()), user, map);
                // 更改选中的腔体设备TO_INIT
                if (StringUtils.isNotBlank(chamberIdsStr)) {
                    for (int i = 0; i < chamberIdArray.length; i++) {
                        String chamberId = chamberIdArray[i];
                        if (!emsService.checkUserAndEqptStationJurisdiction(user, chamberId, facility)) {
                            Assert.isFalse(
                                    StringUtils.equalsIgnoreCase("CN", I18nUtils.getCurrentLanguage().toString()),
                                    Errors.create().content("没有修改设备 {} 的权限<br>").args(chamberId).build());

                            throw new SystemIllegalArgumentException(
                                    Errors.create().content("No permission to modify the " + "{}!<br>").args(chamberId)
                                          .build());
                        }

                        Long chamberRrn = this
                                .getInstanceRrn(chamberId, baseService.getNamedSpace(facility, ObjectList.ENTITY_KEY),
                                                ObjectList.ENTITY_KEY, "MAINEQPT");
                        Entity object = new Entity();
                        object.setInstanceRrn(chamberRrn);
                        Entity chamberEntity = emsService.getEntity(object);
                        emsService.initializeEntityStatus(new Long(chamberEntity.getInstanceRrn()),
                                                          chamberEntity.getObjectType(),
                                                          new Long(event.getInstanceRrn()), user, map);
                    }
                }

                if (TRANSACTION.equals(theform.getTransId())) {
                    HashMap parameters = (HashMap) request.getAttribute(SessionNames.PARAMETERSINFO_KEY);
                    Assert.isFalse(parameters == null,
                                   Errors.create().key(MessageIdList.EQUIPMENT_MISSING_PARAMETER).content("缺少参数")
                                         .build());
                    parameters.put(SessionNames.RUNSTEP_FLAG, "0");
                    return mapping.findForward("workflow");
                } else {
                    request.removeAttribute("NEXT_KEY");
                    request.setAttribute("successFlag", true);
                    request.setAttribute("entityId", theform.getEntityId());
                    return mapping.findForward(Constants.MODIFY_KEY);
                }

            }

            int i = 0;
            for (EventModel instance : eventModels) {
                EntityStatus entityStatus = new EntityStatus();
                entityStatus.setStatusGroupId(instance.getStatusGroupId());

                if (request.getParameter("holdnew") != null) {
                    entityStatus.setCurrentStatus(StringUtils.upperCase(Constants.HOLD_KEY));
                } else {
                    entityStatus.setCurrentStatus(theform.getTargetStatus()[i++]);
                }

                entityStatus.setStatusBefore(instance.getCurrentStatus());
                entityStatus.setEntityRrn(entity.getInstanceRrn());
                entityStatuss.add(entityStatus);
            }

            Assert.isFalse(entityStatuss.size() < 1,
                           Errors.create().key(MessageIdList.EQUIPMENT_MISSING_EVENT_MODEL).content("未定义事件模型").build());

            String validAvailability = theform.getAvailability();

            String validAvailabilityHidden = theform.getAvailabilityHidden();

            if (validAvailability != null && !NUMBER_2.equalsIgnoreCase(validAvailability)) {

                Collection cascadingEvent = (Collection) request.getAttribute("cascadingEvent");

                if (cascadingEvent != null && cascadingEvent.size() > 0) {
                    Iterator cascading = cascadingEvent.iterator();
                    while (cascading.hasNext()) {
                        HashMap map = (HashMap) cascading.next();

                        String temp = (String) map.get("availability");
                        String entityId = (String) map.get("entityId");

                        Assert.isFalse(temp != null && !temp.equalsIgnoreCase(validAvailabilityHidden),
                                       Errors.create().key(MessageIdList.EQUIPMENT_CHECK_STATUS).content("请检查{}的状态")
                                             .args(entityId).build());
                    }
                }
            }

            if (entity != null) {

                if (REGULAR_PROD.equalsIgnoreCase(eventId)) {
                    if (checkRunningJobByEqpt(entity.getInstanceRrn()) &&
                            (NUMBER_1).equalsIgnoreCase(entity.getAvailability())) {
                        // "1"-->"REGULAR PROD" target availability
                    } else {
                        statusService.updatEntityStatus(entityStatuss, user, event, theform.getComment(),
                                                        theform.getComment1(), theform.getComment2(),
                                                        theform.getStatusEndTime(), entity);
                    }
                } else if (END_PROD.equalsIgnoreCase(eventId)) {
                    if (NUMBER_4.equalsIgnoreCase(entity.getAvailability()) ||
                            checkRunningJobByEqpt(entity.getInstanceRrn())) {
                        // "4"-->"END PROD" target availability
                    } else {
                        statusService.updatEntityStatus(entityStatuss, user, event, theform.getComment(),
                                                        theform.getComment1(), theform.getComment2(),
                                                        theform.getStatusEndTime(), entity);
                    }
                } else {
                    // 主设备更改
                    long transRrn = statusService
                            .updateEntityStatusByEntityId(entityStatuss, user, userRrn, event, theform.getComment(),
                                                          theform.getComment1(), theform.getComment2(),
                                                          theform.getStatusEndTime(), entity.getInstanceRrn());
                    // chamber设备更改
                    if (chamberIdArray.length > 0) {
                        for (int j = 0; j < chamberIdArray.length; j++) {
                            String chamberId = chamberIdArray[j];
                            if (!emsService.checkUserAndEqptStationJurisdiction(user, chamberId, facility)) {
                                Assert.isFalse(
                                        StringUtils.equalsIgnoreCase("CN", I18nUtils.getCurrentLanguage().toString()),
                                        Errors.create().content("没有修改设备 {} 的权限<br>").args(chamberId).build());
                                throw new SystemIllegalArgumentException(
                                        Errors.create().content("No permission to modify the " + "{}!<br>")
                                              .args(chamberId).build());
                            }
                            Long chamberRrn = baseService
                                    .getNamedObjectRrn(chamberId, this.getNamedSpace(ObjectList.ENTITY_KEY, facility),
                                                       ObjectList.ENTITY_KEY);
                            // 捕获chamber修改失败信息
                            // 修改chamber相关status信息,存储entity status历史数据
                            String chamberCurrentStatus = emsService.getEntityCurrentStatus(chamberRrn);
                            List ChamberStatuss = new ArrayList();
                            Iterator parentEnityESIt = entityStatuss.iterator();
                            String chamberTargetStatus = "";
                            while (parentEnityESIt.hasNext()) {
                                EntityStatus parentEntityES = (EntityStatus) parentEnityESIt.next();
                                EntityStatus chamberES = new EntityStatus();
                                chamberES.setStatusBefore(chamberCurrentStatus);
                                chamberES.setEntityRrn(chamberRrn);
                                chamberES.setCurrentStatus(parentEntityES.getCurrentStatus());
                                chamberES.setStatusGroupId(parentEntityES.getStatusGroupId());

                                chamberTargetStatus = parentEntityES.getCurrentStatus();
                                ChamberStatuss.add(chamberES);
                            }

                            // 修改event信息,eventRrn通过chamber的当前状态到主设备的目标状态获取
                            String chamberEventId = "EQP." + chamberCurrentStatus + "_TO_" + chamberTargetStatus;
                            long chamberEventRrn = this
                                    .getInstanceRrn(chamberEventId, this.getNamedSpace(ObjectList.EVENT_KEY, facility),
                                                    ObjectList.EVENT_KEY);
                            Assert.isFalse(chamberEventRrn == 0,
                                           Errors.create().content("子腔设备事件集 {} 不存在").args(chamberEventId).build());
                            Collection chamberEventColl = baseService.getEvents(chamberEventRrn);
                            Iterator chamberEventIt = chamberEventColl.iterator();
                            Event chamberEvent = new Event();
                            while (chamberEventIt.hasNext()) {
                                chamberEvent = (Event) chamberEventIt.next();
                                chamberEvent.setInstanceId(chamberEventId);
                            }

                            statusService.updateEntityStatusByEntityId(ChamberStatuss, user, userRrn, chamberEvent,
                                                                       theform.getComment(), theform.getComment1(),
                                                                       theform.getComment2(),
                                                                       theform.getStatusEndTime(), chamberRrn);

                            Entity chamberEntity = new Entity(chamberRrn);
                            chamberEntity = emsService.getEntity(entity);
                            successChamberList.add(chamberEntity);
                            successChamberEventList.add(chamberEvent);
                        }
                    }
                }
            }
        }

        // 调用ERP接口,chamber设备暂不需要调用
        String message = updateWorkStream(entity, event, entityStatuss, facility, user);

        Assert.isFalse(message != null, Errors.create().content(message).build());

        // 主设备
        handleFutureAction4Eqpt(entity, event, "LOGEVENT", facility.longValue(), userRrn, theform);
        // chamber 设备
        if (chamberIdArray.length > 0) {
            if (successChamberList != null && successChamberList.size() > 0) {
                for (int j = 0; j < successChamberList.size(); j++) {
                    Entity chamberEntity = successChamberList.get(j);
                    Event chamberEvent = successChamberEventList.get(j);
                    theform.setEventId(chamberEvent.getInstanceId());
                    handleFutureAction4Eqpt(chamberEntity, chamberEvent, "LOGEVENT", facility.longValue(), userRrn,
                                            theform);
                }
            }
        }
        if (TRANSACTION.equals(theform.getTransId())) {
            HashMap parameters = (HashMap) request.getAttribute(SessionNames.PARAMETERSINFO_KEY);

            Assert.isFalse(parameters == null,
                           Errors.create().key(MessageIdList.EQUIPMENT_MISSING_PARAMETER).content("缺少参数").build());

            parameters.put(SessionNames.RUNSTEP_FLAG, "0");

            return mapping.findForward("workflow");
        } else {
            theform.setEntityId("");
            theform.setEventId("");
            String availability = "";
            List<EntityStatus> entityStatus = emsService.getEntityStatuss(entity.getInstanceRrn());
            //   availability = emsService.getEntityAvailability(entity.getInstanceRrn());
            request.setAttribute("availability", theform.getTargetAvailabilityHidden());
            // 设备组内设备down,系统自动hold lot
            EntityStatus es = entityStatus.iterator().next();
            entity.setCurrentStatus(es.getCurrentStatus());
            List<ReferenceFileDetail> eqptHoldInfos = sysService.getRefFileValues("$$EQUP_LOT_HOLD_STATUS", facility);
            for (ReferenceFileDetail eqptHoldInfo : eqptHoldInfos) {
                // 如果设备当前状态(修改后状态)与类表中的key1一致,则hold设备上的批次
                if (StringUtils.equals(entity.getCurrentStatus(), eqptHoldInfo.getKey1Value())) {
                    String holdReason = eqptHoldInfo.getData2Value();
                    String holdReasonCode = eqptHoldInfo.getData1Value();
                    if (StringUtils.isBlank(holdReasonCode)) {
                        holdReasonCode = "EQPTDOWNHOLD";
                        eqptHoldInfo.setData1Value(holdReasonCode);
                    }
                    if (StringUtils.isBlank(holdReason)) {
                        holdReason = "THE EQUIPMENTS ALL DOWN";
                        eqptHoldInfo.setData2Value(holdReason);
                    }
                    // hold主设备批次
                    handleLotsByEqptDown(entity, eqptHoldInfo, eqptHoldInfos);
                    // hold chamber设备批次
                    if (chamberIdArray.length > 0) {
                        if (successChamberList != null && successChamberList.size() > 0) {
                            for (int j = 0; j < successChamberList.size(); j++) {
                                Entity chamberEntity = successChamberList.get(j);
                                handleLotsByEqptDown(chamberEntity, eqptHoldInfo, eqptHoldInfos);
                            }
                        }
                    }
                }
            }

            request.setAttribute("entitystatus", entityStatus);
            request.removeAttribute("NEXT_KEY");
            request.setAttribute("entityType", request.getParameter("entityType"));
            WebUtils.setSuccessMsg(request);
            if (StringUtils.isNotBlank(chamberIdsStr)) {
                request.setAttribute("successFlag", true);
                request.setAttribute("entityId", theform.getEntityId());
                request.setAttribute("chamberIdList", chamberIdsStr);
                request.setAttribute("isChamberChangeFalg", "Y");
                return mapping.findForward("changeChamberBack");
            } else {
                return (mapping.findForward("sucess"));
            }

        }
    }

    public ActionForward reticleModify(ActionMapping mapping, LogEventInfoForm theform,
                                       HttpServletRequest request) throws Exception {
        String user = LocalContext.getUserId();
        Long facility = LocalContext.getFacilityRrn();
        Long userRrn = LocalContext.getUserRrn();
        String reticlePortal = WebUtils.getParameter("reticlePortal", request);
        if (StringUtils.isNotBlank(reticlePortal)) {
            request.setAttribute("reticlePortal", reticlePortal);
        }

        String namedSpace = baseService.getNamedSpace(facility, ObjectList.ENTITY_KEY);
        NamedObject entityObject = baseService.getNamedObject(
                new NamedObject(StringUtils.trim(theform.getEntityId()), namedSpace, ObjectList.ENTITY_KEY));
        Entity entity = emsService.getEntity(new Entity(entityObject.getInstanceRrn()));
        request.setAttribute("entityId", entity.getInstanceId());
        String eventNamedSpace = baseService.getNamedSpace(facility, ObjectList.EVENT_KEY);
        Event oldEvent = new Event(StringUtils.trim(theform.getEventId()), eventNamedSpace, ObjectList.EVENT_KEY);
        oldEvent.setEntityType(entityObject.getObjectType());
        Event event = baseService.getEvent(oldEvent);
        if (StringUtils.isEmpty(entityObject.getInstanceDesc())) {
            request.setAttribute("entityDesc", "");
        } else {
            request.setAttribute("entityDesc", entityObject.getInstanceDesc());
        }
        // ---------------------validate StatusEndTime-----------
        String validateStatusEndTimeFlag = request.getParameter("validateStatusEndTimeFlag");
        if (TRUE_YES_LOWER.equals(validateStatusEndTimeFlag)) {
            Long statusEndTimeLong = null;
            statusEndTimeLong = new SimpleDateFormat(DateUtils.DATE_FORMAT).parse(theform.getStatusEndTime()).getTime();

            Assert.isFalse(statusEndTimeLong > System.currentTimeMillis(),
                           Errors.create().key(MessageIdList.EQUIPMENT_END_TIME_GREATER_CURRENT).content("请选择目标状态!")
                                 .build());
        }

        List<EntityStatus> entityStatuss = new ArrayList();
        // 事件模型,选中的设备状态更改信息
        List<EventModel> eventModels = baseService.getEventModels(event.getInstanceRrn(), entity.getInstanceRrn());

        String comment = theform.getComment();
        String eventId = theform.getEventId();

        boolean otFlag = !OT.equalsIgnoreCase(eventId);
        Assert.isFalse(("".equalsIgnoreCase(comment) || comment == null) && otFlag && (!L_T.equalsIgnoreCase(eventId)),
                       Errors.create().key(MessageIdList.EQUIPMENT_MISSING_COMMENT).content("备注不能为空").build());

        int i = 0;
        String beforeStatus = "";
        for (EventModel instance : eventModels) {
            EntityStatus entityStatus = new EntityStatus();
            entityStatus.setStatusGroupId(instance.getStatusGroupId());
            entityStatus.setCurrentStatus(theform.getTargetStatus()[i++]);
            entityStatus.setStatusBefore(instance.getCurrentStatus());
            entityStatus.setEntityRrn(entity.getInstanceRrn());
            entityStatuss.add(entityStatus);
            beforeStatus = instance.getCurrentStatus();
        }

        Assert.isFalse(entityStatuss.size() < 1,
                       Errors.create().key(MessageIdList.EQUIPMENT_MISSING_EVENT_MODEL).content("未定义事件模型").build());
        // 主设备更改
        statusService.updateEntityStatusByEntityId(entityStatuss, user, userRrn, event, theform.getComment(),
                                                   theform.getComment1(), theform.getComment2(),
                                                   theform.getStatusEndTime(), entity.getInstanceRrn());

        // handle future actions when log event
        // 主设备
        handleFutureAction4Eqpt(entity, event, "LOGEVENT", facility.longValue(), userRrn, theform);
        //手动做PD使用次数清零和更新Last PD Time,Deadline
        if (StringUtils.equals(beforeStatus, EventName.RTL_STATUS_IN_PD) ||
                StringUtils.equals(beforeStatus, EventName.INIT)) {
            emsService.manualReticlePD(entity);
        }
        theform.setEntityId("");
        theform.setEventId("");
        Collection entityStatus = new ArrayList();
        String availability = "";

        entityStatus = emsService.getEntityStatuss(entity.getInstanceRrn());
        availability = emsService.getEntityAvailability(entity.getInstanceRrn());
        request.setAttribute("reticleFlag", "Y");
        request.setAttribute("availability", availability);
        request.setAttribute("entitystatus", entityStatus);
        request.setAttribute("entityType", request.getParameter("entityType"));
        WebUtils.setSuccessMsg(request);
        return (mapping.findForward("sucess"));
    }

    public ActionForward reticleCancel(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                                       HttpServletResponse response) {
        return mapping.findForward("logreticleevent");
    }

    private String getLotByRunEqpt(String entityId, Long facilityRrn) {
        String lotIds = StringUtils.EMPTY;
        Map<String, Object> argMap = new HashMap<String, Object>(10);
        argMap.put("showAll", "1");
        argMap.put("eqptId", StringUtils.trimToUpperCase(entityId));
        argMap.put("facility", facilityRrn);
        Map dataMap = emsService.qryEqptInfo(argMap);
        if (dataMap != null && dataMap.size() > 0) {
            List<Map> eqptInfoList = (List<Map>) dataMap.get("data");
            if (CollectionUtils.isNotEmpty(eqptInfoList)) {
                for (Map eqptInfo : eqptInfoList) {
                    Map<String, Object> eqptMap = (Map<String, Object>) eqptInfo;
                    lotIds = MapUtils.getString(eqptMap, "currentLotId", StringUtils.EMPTY);
                    if (lotIds.contains("#")) {
                        lotIds = StringUtils.replace(lotIds, "#", ",").toString();
                    }
                }
            }
        }

        return lotIds;
    }

    private List<NamedObject> getValidEvents(Entity entity) {
        return baseService.getValidEventsOfEntity(entity.getInstanceRrn());
    }

    private String updateWorkStream(Entity entity, Event event, Collection entityStatus, Long facility, String user) {
        String message = "";

        HashMap map = new HashMap(10);

        Iterator it = entityStatus.iterator();
        EntityStatus es = null;
        Collection status = new ArrayList();

        // ignore status since workstream will ignore the status check
        /*
         * while (it.hasNext()) { es = (EntityStatus) it.next(); status.add(es.getCurrentStatus()
         * ); log
         * .debug("status :"
         * + es.getCurrentStatus()); }
         */

        map.put("status", status);

        entity.setAvailability("");

        map.put("entity", entity);
        map.put("event", event);
        map.put("wsname", "logEvent");
        message = connectMesSystem(map, facility.longValue(), user);

        return message;
    }

    private void handleFutureAction4Eqpt(Entity entity, Event event, String actionPoint, long facilityRrn, Long userRrn,
                                         LogEventInfoForm theform) {
        if (StringUtils.equals(event.getNoticeLotEngineer(), NUMBER_1)) {
            User user = new User();
            user.setInstanceRrn(userRrn.longValue());
            //todo email重做
            //            EmailMessage emailMessage = buildEmail(entity, securityService.getUser
            //            (user),
            //            theform);
            //            alarmService.insertAlarmEmailMessag(emailMessage);
        }
        ContextValue actionCondition = null;
        actionCondition = new ContextValue();
        actionCondition.setContextRrn(
                getInstanceRrn("EEN_CONTEXT_EQPT", getNamedSpace(ObjectList.CONTEXT_KEY, new Long(facilityRrn)),
                               ObjectList.CONTEXT_KEY));

        actionCondition.setContextKey1(entity.getInstanceId());
        actionCondition.setContextKey2(event.getInstanceId());
        actionCondition.setContextKey3(actionPoint);

        List<EenAction> actions = wipQueryService.getFutureActions(actionCondition, facilityRrn);

        for (EenAction eenAction : actions) {
            if (eenAction.getActionType() == null) {
                continue;
            }
            // In send mail case, the parameters seq is like param1/Current
            // Operator,param2(een msg id)/135450
            if (EenActionType.SEND_EMAIL_KEY.equals(eenAction.getActionType())) {

                Map fromUserInfo = securityService.getUserInfo4Alarm(userRrn.longValue());

                Map toUserInfo = new HashMap(10);

                if (!"Current Operator".equals(eenAction.getParameterValue1())) {
                    toUserInfo = securityService
                            .getUserInfo4Alarm(new Long(eenAction.getParameterValue1()).longValue());
                    if (toUserInfo == null) {
                        toUserInfo = securityService
                                .getUserInfo4AlarmByUserGroup(new Long(eenAction.getParameterValue1()).longValue());
                    }

                } else {
                    toUserInfo = fromUserInfo;
                }

                String subject = "";
                String content = "";

                if (eenAction.getParameterValue2() != null) {
                    long msg = new Long(eenAction.getParameterValue2()).longValue();
                    EenMessage e = alarmService.getEenMessage(new EenMessage(msg));
                    subject = entity.getInstanceId() + e.getMessageSubject();
                    content = e.getMessageText();
                }

                Map values = new HashMap(10);

                values.put("from", fromUserInfo.get("emailAddress"));
                values.put("to", toUserInfo.get("emailAddress"));
                values.put("subject", subject);
                values.put("content", content);

                //todo email重做
                //sysService.sendMail(values);
            }
        }
    }

    private boolean checkRunningJobByEqpt(long eqptRrn) {
        return emsService.checkRunningJobByEqpt(eqptRrn);
    }

    private EmailMessage buildEmail(Entity entity, User user, LogEventInfoForm theform) throws Exception {
        EmailMessage emailMessage = new EmailMessage();
        emailMessage.setFromUser(user.getInstanceId());
        emailMessage.setCreatedUser(user);
        emailMessage.setLastUpdatedUser(user);
        // emailMessage.setAttributeData1()
        // jobType: NORMAL表示周期性触发,REPEAT表示重复触发,NOTIFY保留
        emailMessage.setEmailType("LOG_EVENT");
        emailMessage.setToUsers(getEmailUserGroups(entity));
        emailMessage.setSubject(buildEmailSubject(theform, entity));
        emailMessage.setContent(buildContent(entity, user, theform));
        return emailMessage;

    }

    private String getEmailUserGroups(Entity entity) {
        StringBuffer userGroups = new StringBuffer();

        Long maintenanceEngineerRrn = entity.getMaintenanceEngineerRrn();
        if (maintenanceEngineerRrn != null && maintenanceEngineerRrn.longValue() > 0) {
            userGroups.append(maintenanceEngineerRrn);
        }
        return userGroups.toString();
    }

    private String buildEmailSubject(LogEventInfoForm theform, Entity entity) {
        StringBuffer subject = null;
        if (StringUtils.equalsIgnoreCase(ObjectList.RETICLE_KEY, entity.getObjectType())) {
            subject = new StringBuffer(
                    "reticle " + entity.getInstanceId() + " status must change to " + theform.getTargetStatus()[0]);
        } else {
            subject = new StringBuffer(
                    "equipment " + entity.getInstanceId() + " status must change to " + theform.getTargetStatus()[0]);
        }
        return subject.toString();
    }

    private String buildContent(Entity entity, User user, LogEventInfoForm theform) {
        StringBuffer subject = new StringBuffer();
        subject.append("event id:" + theform.getEventId() + ";").append(MailComponent.ENTER_KEY);
        if (StringUtils.equalsIgnoreCase(ObjectList.RETICLE_KEY, entity.getObjectType())) {
            subject.append("reticle status:" + theform.getTargetStatus()[0] + ";").append(MailComponent.ENTER_KEY);
            subject.append("reticle status change time:" + theform.getStatusEndTime() + ";")
                   .append(MailComponent.ENTER_KEY);
        } else {
            subject.append("equipment status:" + theform.getTargetStatus()[0] + ";").append(MailComponent.ENTER_KEY);
            subject.append("equipment status change time:" + theform.getStatusEndTime() + ";")
                   .append(MailComponent.ENTER_KEY);
        }
        if (StringUtils.isNotBlank(theform.getComment())) {
            subject.append("note:" + theform.getComment() + ";").append(MailComponent.ENTER_KEY);
        }
        if (StringUtils.isNotBlank(theform.getComment1())) {
            subject.append("note 1:" + theform.getComment1() + ";").append(MailComponent.ENTER_KEY);
        }
        if (StringUtils.isNotBlank(theform.getComment2())) {
            subject.append("note 2:" + theform.getComment2() + ";").append(MailComponent.ENTER_KEY);
        }

        subject.append("operator:" + user.getInstanceId() + ";").append(MailComponent.ENTER_KEY);
        subject.append("operation time:" + new Timestamp(System.currentTimeMillis()) + ";")
               .append(MailComponent.ENTER_KEY);
        return MailComponent.parseText(subject.toString());

    }

}