EmsSetupAction.java

package com.mycim.webapp.actions;

import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.context.spring.SpringContext;
import com.mycim.framework.utils.beans.PropertyUtils;
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.quartz.service.QuartzOperateService;
import com.mycim.server.alarm.service.AlarmService;
import com.mycim.server.asm.service.AsmService;
import com.mycim.server.asm.service.WarehouseService;
import com.mycim.server.constrain.service.ConstrainService;
import com.mycim.server.ctx.exec.service.CtxExecService;
import com.mycim.server.ecn.service.EcnService;
import com.mycim.server.ems.service.EmsService;
import com.mycim.server.npw.service.EqpMonitorService;
import com.mycim.server.pms.service.PmsService;
import com.mycim.server.prp.service.PrpService;
import com.mycim.server.rcp.service.RecipeService;
import com.mycim.server.status.service.StatusService;
import com.mycim.server.wip.service.LotQueryService;
import com.mycim.server.wip.service.LotService;
import com.mycim.server.wip.service.WipQueryService;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.alm.Alarm;
import com.mycim.valueobject.alm.AlarmCategory;
import com.mycim.valueobject.bas.ErrorMsg;
import com.mycim.valueobject.bas.NamedObject;
import com.mycim.valueobject.consts.AlarmType;
import com.mycim.valueobject.consts.SessionNames;
import com.mycim.valueobject.ems.*;
import com.mycim.valueobject.prp.BORResource;
import com.mycim.valueobject.sys.ReferenceFileDetail;
import com.mycim.valueobject.wip.Lot;
import com.mycim.valueobject.wip.LotStatus;
import com.mycim.webapp.Constants;
import com.mycim.webapp.WebUtils;
import com.mycim.webapp.forms.DoChecklistInfoForm;
import com.mycim.webapp.forms.RootForm;

import javax.servlet.http.HttpServletRequest;
import java.sql.Timestamp;
import java.util.*;

public abstract class EmsSetupAction extends AbstractAction {
    public static final String COMPLETED = "COMPLETED";

    public static final String CANCELED = "CANCELED";

    protected static final String NEXT_SEQ = "next_seq";

    protected static final String STARTED = "STARTED";

    protected static final String JOB_CLASS_NAME = "com.mycim.quartz.jobs.AlarmScheduleJob";

    protected static final String CHAMBER_FLAG = "_";

    private static final String LOT_STATUS = "lotStatus";

    protected EmsService emsService = SpringContext.getBean(EmsService.class);

    protected LotService lotService = SpringContext.getBean(LotService.class);

    protected AlarmService alarmService = SpringContext.getBean(AlarmService.class);

    protected StatusService statusService = SpringContext.getBean(StatusService.class);

    protected PmsService pmsService = SpringContext.getBean(PmsService.class);

    protected WipQueryService wipQueryService = SpringContext.getBean(WipQueryService.class);

    protected LotQueryService lotQueryService = SpringContext.getBean(LotQueryService.class);

    protected ConstrainService constrainService = SpringContext.getBean(ConstrainService.class);

    protected RecipeService recipeService = SpringContext.getBean(RecipeService.class);

    protected EcnService ecnService = SpringContext.getBean(EcnService.class);

    protected QuartzOperateService quartzOperateService = SpringContext.getBean(QuartzOperateService.class);

    protected EqpMonitorService dmmService = SpringContext.getBean(EqpMonitorService.class);

    protected PrpService prpService = SpringContext.getBean(PrpService.class);

    protected AsmService asmService = SpringContext.getBean(AsmService.class);

    protected WarehouseService warehouseService = SpringContext.getBean(WarehouseService.class);

    protected CtxExecService ctxExecService = SpringContext.getBean(CtxExecService.class);

    private Map getTransInfoByItemRrn(BORResource borResource, List<Map<String, Object>> transInfos) {
        for (Map<String, Object> info : transInfos) {
            Long itemRrn = (Long) info.get("itemRrn");
            Long sequenceNumber = (Long) info.get("transSequence");
            if (borResource.getResourceRrn().equals(itemRrn) &&
                    (borResource.getSequenceNumber().intValue() == sequenceNumber.longValue())) {
                return info;
            }
        }
        return null;
    }

    private List<BORResource> concatCollection(List<BORResource> borResources, List<Map<String, Object>> transInfos) {
        for (BORResource borResource : borResources) {
            if (borResource.getResourceRrn() != null) {
                Map transInfo = getTransInfoByItemRrn(borResource, transInfos);
                if (transInfo != null) {
                    borResource.setConsumedQty((Double) transInfo.get("transQty"));
                    borResource.setRemarks((String) transInfo.get("comments"));
                }
            }
        }
        return borResources;
    }

    private String parseMessage(String rep, String msg) {

        if (msg == null) {
            return null;
        }

        StringBuffer sb = new StringBuffer();

        sb.append(msg);

        int pos = msg.indexOf("$");

        if (pos >= 0) {
            sb.replace(pos, pos + 1, rep);
        }

        return sb.toString();
    }

    private Map<String, Object> buildAlarmInfo(String alarmId, String text, Long checkListRrn, Entity entity,
                                               Long userRrn) {
        Map<String, Object> alarmInfo = new HashMap<>();
        Alarm alarm = new Alarm();
        alarm.setAlarmId(alarmId);
        alarm.setAlarmType(AlarmType.SYSTEM_KEY);
        alarm = alarmService.getAlarm(alarm);
        alarmInfo.put("alarm", alarm);
        alarmInfo.put("eqptId", entity.getInstanceId() + "");

        alarmInfo.put("alarmId", "The Alarm: " + alarmId + " has been triggered!");

        alarmInfo.put("alarmText", parseMessage(text, alarm.getAlarmDesc()));
        alarmInfo.put("fromUserRrn", userRrn);
        alarmInfo.put("toUserRrn", entity.getMaintenanceEngineerRrn());
        // add
        alarmInfo.put("checklistRrn", checkListRrn);
        alarmInfo.put("entityRrn", entity.getInstanceRrn());
        alarmInfo.put("entityId", entity.getInstanceId());

        if (alarm.getAlarmCategoryRrn() != null) {
            AlarmCategory item = new AlarmCategory();
            item.setInstanceRrn(alarm.getAlarmCategoryRrn());
            item = alarmService.getAlarmCategory(item);
            alarmInfo.put("workflowRrn", item.getTriggerWflRrn());
            alarmInfo.put("alarmCategory", item);
        }

        return alarmInfo;
    }

    private Map<String, Object> buildAlarmInfo(Long sequenceNumber, String scheduleId, String scheduleDesc,
                                               String alarmId, String text, Long checkListRrn, Entity entity,
                                               Long userRrn, ChecklistJob checklistJob, String jobType,
                                               String nameSpace) {
        Map<String, Object> alarmInfo = new HashMap<>();
        Alarm alarm = new Alarm();
        alarm.setAlarmId(alarmId);

        alarm.setAlarmType(AlarmType.SYSTEM_KEY);
        alarm = alarmService.getAlarm(alarm);
        // alarmInfo.put("alarm", alarm);

        // alarmInfo.put("alarmId", alarm.getAlarmId());
        /**
         * add by Bright 添加mail subject为: 设备周期PM: entityId (entityDesc) triggerTime 因为triggerTime时pm
         * schedule的下一次触发时间,所以在触发的时候添加
         */
        String entityDesc = entity.getInstanceDesc() == null ? " " : " (" + entity.getInstanceDesc() + ")";// FIX 设备描述
        // alarmInfo.put("subject", "设备周期PM: " + entity.getInstanceId() + entityDesc);
        // alarmInfo.put("entityDesc", entity.getInstanceDesc());

        // alarmInfo.put("alarmText", parseMessage(text, alarm.getAlarmDesc()));
        alarmInfo.put("fromUserRrn", userRrn);
        alarmInfo.put("userRrn", userRrn);
        // alarmInfo.put("toUserRrn", entity.getMaintenanceEngineerRrn());
        // add
        // alarmInfo.put("checklistRrn", checkListRrn);
        alarmInfo.put("entityRrn", entity.getInstanceRrn());
        alarmInfo.put("equipmentRrn", entity.getInstanceRrn());
        alarmInfo.put("entityId", entity.getInstanceId());
        // checklistJob.setSequenceNumber(sequenceNumber);

        // alarmInfo.put("checklistJob", checklistJob.toString());
        /**
         * comment by Bright mail内容: 设备号:SL-10, 设备描述 :线切割10号机 维护计划序号:1 维护计划号:SL-3M-1 本次计划维护中心时间:2007-7-1 ,在+/-
         * 3天内需要完成维护。 (动态添加) 重复警报: 1 Day (或无) (动态添加) 检查单号:EQ1-SL-3M 警报等级:Warning (或Information或Error)
         * 发送人:MES PM
         * Schedule 发送日期:2007-6-29
         */
        /*
         * String contentHead = ""; String contentTrail = ""; Calendar cal = Calendar.getInstance();
         * AlarmCategory
         * category = new AlarmCategory(); if (alarm.getAlarmCategoryRrn() != null &&
         * alarm.getAlarmCategoryRrn().longValue() > 0)
         * category.setInstanceRrn(alarm.getAlarmCategoryRrn().longValue()); category =
         * this.getAlmManager().getAlarmCategory(category); String severity = category.getSeverity(); if
         * (severity !=
         * null && severity.equals(AlarmCategory.SEVERITY_TYPE_INFORMATION)) severity = "Information"; else
         *  if (severity
         * != null && severity.equals(AlarmCategory.SEVERITY_TYPE_WARNING)) severity = "Warning"; else if
         * (severity !=
         * null && severity.equals(AlarmCategory.SEVERITY_TYPE_FATALERROR)) severity = "Error"; else
         * severity = "N/A";
         * SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); // Get detail check list info,
         * added by
         * yichao, 2013-07-03 Checklist checkListInfo = new Checklist(this.getInstanceId(checkListRrn
         * .longValue()),
         * nameSpace, ObjectList.CHECKLIST_KEY); checkListInfo = (Checklist) getInstance(checkListInfo);
         * Collection
         * checkListItems = this.getChecklistItems(checkListInfo); String ChecklistItemInfo = ""; for
         * (Iterator it =
         * checkListItems.iterator(); it.hasNext();) { ChecklistItem citem = (ChecklistItem) it.next();
         * ChecklistItemInfo += "  " + citem.getChecklistSequence() + ":" + citem.getChecklistItemId() +
         * MailComponent.ENTER_KEY; } if (checkListInfo.getInstanceId().substring(0, 3).equalsIgnoreCase
         * ("QC-") ||
         * checkListInfo.getInstanceId().substring(0, 3).equalsIgnoreCase("QC_")) { alarmInfo.put
         * ("alarmUserType",
         * "QC"); } else { alarmInfo.put("alarmUserType", "PM"); } contentHead += MailComponent
         * .ENTITY_ID_KEY + ":" +
         * entity.getInstanceId() + ",	" + MailComponent.ENTITY_DESC_KEY + ":" + entityDesc + MailComponent
         * .ENTER_KEY +
         * MailComponent.PM_SCHEDULE_SEQ_KEY + ":" + sequenceNumber.longValue() + ",	" +
         * MailComponent.PM_SCHEDULE_ID_KEY + ":" + scheduleId + "(" + scheduleDesc + ")" + MailComponent
         * .ENTER_KEY;
         * contentTrail = MailComponent.CHECKLIST_ID_KEY + ":" + this.getInstanceId(checkListRrn.longValue
         * ()) +
         * MailComponent.ENTER_KEY + ChecklistItemInfo + MailComponent.ENTER_KEY + // MailComponent
         * .ALARM_SEVERITY_KEY +
         * ":" + severity + MailComponent.ENTER_KEY + // MailComponent.MAIL_FROM_KEY + ":MES PM Schedule" +
         * MailComponent.ENTER_KEY + MailComponent.MODIFY_DATE_KEY + ":" + formatter.format(cal.getTime());
         * alarmInfo.put("contentHead", contentHead); alarmInfo.put("contentTrail", contentTrail);
         */
        /**
         * comment by Bright 添加jobType: NORMAL表示周期性触发,REPEAT表示重复触发,NOTIFY保留
         */
        alarmInfo.put("jobType", jobType);
        /**
         * comment by Bright 添加pm schedule的顺序号,使checklistjob可以对应到pm schedule
         */
        alarmInfo.put("sequenceNumber", sequenceNumber);

        if (alarm.getAlarmCategoryRrn() != null) {
            AlarmCategory item = new AlarmCategory();
            item.setInstanceRrn(alarm.getAlarmCategoryRrn());
            item = alarmService.getAlarmCategory(item);
            alarmInfo.put("workflowRrn", item.getTriggerWflRrn());
            alarmInfo.put("alarmCategory", item);
        }

        return alarmInfo;
    }

    private String getcronExpression(Date startDate, long f) {
        int ss = startDate.getSeconds();
        int mm = startDate.getMonth();
        int hh = startDate.getHours();
        int day = startDate.getDay();
        int month = startDate.getMonth();

        return ss + " " + mm + " " + hh + " " + day + " " + month + "/" + f + " ?";
    }

    /**
     * @param jobName   jobName
     * @param jobGroup  jobGroup
     * @param alarmInfo jobData
     * @param baseFlag  以完成checklistjob为标志,true表示只触发一次,false表示周期性触发
     * @param startDate 开始日期
     * @param repeat    重复间隔
     * @param frequency 频率
     * @param unit      单位
     */
    protected void addJob(String jobName, String jobGroup, Map alarmInfo, boolean baseFlag, Date startDate, Long repeat,
                          long frequency, String unit) {
        if (StringUtils.equals("Y", unit) || StringUtils.equals("M", unit)) {
            quartzOperateService.addJob(jobName, JOB_CLASS_NAME, jobGroup, getcronExpression(startDate, frequency),
                                        alarmInfo);
        } else {

            long repeatTime;

            if (repeat != null) {
                repeatTime = repeat;
            } else {
                repeatTime = getTimebyUnit(frequency, unit);
            }

            int repeatCount = -1;

            if (baseFlag || repeatTime == 0) {
                repeatTime = 0L;
                repeatCount = 0;
            }
            quartzOperateService.addJob(jobName, JOB_CLASS_NAME, jobGroup, startDate, repeatCount, repeatTime,
                                        alarmInfo);
        }
    }

    protected void addSchedule(PmSchedule instance, Entity entity, ChecklistJob checklistJob) {
        int offset = 0;
        if (instance.getOffset() != null && instance.getOffset() > 0) {
            offset = instance.getOffset().intValue();
        }
        Timestamp triggerTime = DateUtils.stringToTimestamp(instance.getNextEventTime());
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(triggerTime.getTime());
        // triggerTime-offset(Day)
        calendar.add(Calendar.DATE, 0 - offset);
        long triggerTimeMillis = calendar.getTimeInMillis();
        // end by Bright

        boolean basePmFlag = false;

        if (StringUtils.equalsIgnoreCase(instance.getBasedOnPmFlag(), "1") ||
                StringUtils.equalsIgnoreCase(instance.getBasedOnPmFlag(), "Y")) {
            basePmFlag = true;
        }

        String[] id = getScheduleJobIdGroupId(instance, entity);

        if (StringUtils.isNotEmpty(instance.getAlarmIdWhenDue())) {
            Map<String, Object> alarmInfo = buildAlarmInfo(instance.getSequenceNumber(), instance.getScheduleId(),
                                                           instance.getScheduleDescription(),
                                                           instance.getAlarmIdWhenDue(), instance.getScheduleId(),
                                                           instance.getChecklistRrn(), entity,
                                                           LocalContext.getUserRrn(), checklistJob, "NORMAL",
                                                           instance.getEquipmentNamedSpace());
            alarmInfo.put("jobName", "R" + id[0]);
            alarmInfo.put("jobGroup", "R" + id[1]);

            addJob(id[0], id[1], alarmInfo, basePmFlag, new Date(triggerTimeMillis), null,
                   NumberUtils.toLong(instance.getFrequence()), instance.getUnit());
        }

        if (StringUtils.isNotEmpty(instance.getNotifyAlarmId())) {
            Map<String, Object> alarmInfo = buildAlarmInfo(instance.getSequenceNumber(), instance.getScheduleId(),
                                                           instance.getScheduleDescription(),
                                                           instance.getNotifyAlarmId(), instance.getScheduleId(),
                                                           instance.getChecklistRrn(), entity,
                                                           LocalContext.getUserRrn(), checklistJob, "NOTIFY",
                                                           instance.getEquipmentNamedSpace());
            alarmInfo.put("jobName", "R" + id[0]);
            alarmInfo.put("jobGroup", "R" + id[1]);

            Long notifyTime = null;

            if (instance.getNotifyBefore() == null) {
                notifyTime = DateUtils.stringToTimestamp(instance.getNextEventTime()).getTime();
            } else {
                notifyTime = DateUtils.stringToTimestamp(instance.getNextEventTime()).getTime() -
                        instance.getNotifyBefore() * 1000;
            }

            addJob("N" + id[0], "N" + id[1], alarmInfo, basePmFlag, new Date(notifyTime), null,
                   NumberUtils.toLong(instance.getFrequence()), instance.getUnit());
        }

        if (instance.getRepeatInFrequence() != null && instance.getRepeatInFrequence() > 0 &&
                instance.getRepeatInUnit() != null) {
            long repeatStartTime = this.getNextTime(triggerTimeMillis, instance.getRepeatInFrequence().intValue(),
                                                    instance.getRepeatInUnit());

            Map<String, Object> alarmInfo = buildAlarmInfo(instance.getSequenceNumber(), instance.getScheduleId(),
                                                           instance.getScheduleDescription(),
                                                           instance.getAlarmIdWhenRepeat(), instance.getScheduleId(),
                                                           instance.getChecklistRrn(), entity,
                                                           LocalContext.getUserRrn(), checklistJob, "REPEAT",
                                                           instance.getEquipmentNamedSpace());
            alarmInfo.put("jobName", "R" + id[0]);
            alarmInfo.put("jobGroup", "R" + id[1]);

            addJob("R" + id[0], "R" + id[1], alarmInfo, basePmFlag, new Date(repeatStartTime), null,
                   instance.getRepeatInFrequence(), instance.getRepeatInUnit());
        }

    }

    protected void deleteSchedule(PmSchedule instance, Entity entity) {
        String[] id = getScheduleJobIdGroupId(instance, entity);
        if (StringUtils.isNotEmpty(instance.getAlarmIdWhenDue())) {
            quartzOperateService.deleteJob(id[0], id[1]);
        }

        if (StringUtils.isNotEmpty(instance.getNotifyAlarmId())) {
            quartzOperateService.deleteJob("N" + id[0], "N" + id[1]);
        }

        if ((instance.getRepeatInFrequence() != null) && instance.getRepeatInUnit() != null) {
            quartzOperateService.deleteJob("R" + id[0], "R" + id[1]);
        }
    }

    protected long getTimebyUnit(long f, String unit) {
        long day = 1000L * 60L * 60L * 24;
        long week = day * 7L;
        long year = day * 365L;
        long hour = 1000L * 60L * 60L;
        long second = 1000L;
        long minute = second * 60L;
        long longTime = 0;

        if (unit.equalsIgnoreCase("D")) {
            longTime = day * f;
        } else if (unit.equalsIgnoreCase("W")) {
            longTime = week * f;
        } else if (unit.equalsIgnoreCase("M")) {
            longTime = day * 30L * f;
        } else if (unit.equalsIgnoreCase("Y")) {
            longTime = year * f;
        } else if (unit.equalsIgnoreCase("I")) {
            longTime = minute * f;
        } else if (unit.equalsIgnoreCase("H")) {
            longTime = hour * f;
        } else if (unit.equalsIgnoreCase("S")) {
            longTime = second * f;
        }

        return longTime;
    }

    /**
     * @param startTime :开始时间
     * @param frequence :间隔
     * @param unit      :间隔单位Y,M,W,D,H,I,S分别表示年,月,周,日,天,分,秒
     * @return : long :startTime+ frequence*unit 得到开始时间在第一次间隔以后的时间
     * @author Bright
     */
    protected long getNextTime(long startTime, int frequence, String unit) {
        long nextTime = startTime;
        java.util.Calendar calendar = java.util.Calendar.getInstance();
        calendar.setTimeInMillis(startTime);
        if (unit.equalsIgnoreCase("Y")) {
            calendar.add(java.util.Calendar.YEAR, frequence);
        } else if (unit.equalsIgnoreCase("M")) {
            calendar.add(java.util.Calendar.MONTH, frequence);
        } else if (unit.equalsIgnoreCase("W")) {
            calendar.add(java.util.Calendar.WEEK_OF_YEAR, frequence);
        } else if (unit.equalsIgnoreCase("D")) {
            calendar.add(java.util.Calendar.DATE, frequence);
        } else if (unit.equalsIgnoreCase("H")) {
            calendar.add(java.util.Calendar.HOUR, frequence);
        } else if (unit.equalsIgnoreCase("I")) {
            calendar.add(java.util.Calendar.MINUTE, frequence);
        } else if (unit.equalsIgnoreCase("S")) {
            calendar.add(java.util.Calendar.SECOND, frequence);
        }

        nextTime = calendar.getTimeInMillis();

        return nextTime;
    }

    protected void deleteRepeatSchedule(PmSchedule instance, Entity entity) {
        String[] id = getScheduleJobIdGroupId(instance, entity);
        if ((instance.getRepeatInFrequence() != null) && instance.getRepeatInUnit() != null) {
            quartzOperateService.deleteJob("R" + id[0], "R" + id[1]);
        }

    }

    protected void addDelayRepeatSchedule(PmSchedule instance, Entity entity) {
        String[] id = getScheduleJobIdGroupId(instance, entity);
        if (instance.getRepeatInFrequence() != null && instance.getRepeatInUnit() != null) {
            long startTime = DateUtils.stringToTimestamp(instance.getActualEventTime()).getTime();
            long repeatTime = getTimebyUnit(instance.getRepeatInFrequence(), instance.getRepeatInUnit());

            Map<String, Object> alarmInfo = this.buildAlarmInfo(instance.getAlarmIdWhenDue(), instance.getScheduleId(),
                                                                instance.getChecklistRrn(), entity,
                                                                LocalContext.getUserRrn());

            addJob("R" + id[0], "R" + id[1], alarmInfo, false, new Date(repeatTime + startTime), repeatTime,
                   NumberUtils.toLong(instance.getFrequence()), instance.getUnit());

        }
    }

    protected String[] getScheduleJobIdGroupId(PmSchedule pm, Entity entity) {
        String[] id = new String[2];
        id[0] = entity.getInstanceRrn() + entity.getInstanceId() + pm.getSequenceNumber();
        id[1] = "DEFAULT";
        return id;
    }

    protected void process(NamedObject instance) {

        String action = instance.getTransId();

        if (action.equals(Constants.CREATE_KEY)) {
            long instanceRrn = 0;

            if (instance instanceof EntityGroup) {
                instanceRrn = emsService.insertEntityGroup((EntityGroup) instance);
            } else if (instance instanceof Equipment) {
                instanceRrn = emsService.insertEquipment((Equipment) instance);
            } else if (instance instanceof Checklist) {
                instanceRrn = emsService.insertChecklist((Checklist) instance);
            }

            instance.setInstanceRrn(instanceRrn);
        } else if (action.equals(Constants.DELETE_KEY)) {
            if (instance instanceof EntityGroup) {
                emsService.deleteEntityGroup((EntityGroup) instance);
            } else if (instance instanceof Equipment) {
                emsService.deleteEquipment((Equipment) instance);
            } else if (instance instanceof Checklist) {
                emsService.deleteChecklist((Checklist) instance);
            }
        } else if (action.equals(Constants.MODIFY_KEY)) {
            if (instance instanceof EntityGroup) {
                emsService.updateEntityGroup((EntityGroup) instance);
            } else if (instance instanceof Equipment) {
                emsService.updateEquipment((Equipment) instance);
            } else if (instance instanceof Checklist) {
                emsService.updateChecklist((Checklist) instance);
            }
        } else if (action.equals(Constants.CLEAR_KEY)) {

        }
    }

    @Override
    protected void doCopy(RootForm theform, NamedObject instance) {
        String origId = theform.getInstanceId();
        instance = getInstance(instance);
        // populate the new information thru the new instance id
        PropertyUtils.copyProperties(theform, instance);

        // and restore the original Id
        theform.setInstanceId(origId);
    }

    @Override
    protected NamedObject getInstance(NamedObject instance) {

        // temp object to store the value object retrived from database
        NamedObject namedObject = null;

        if (instance instanceof EntityGroup) {
            namedObject = emsService.getEntityGroup((EntityGroup) instance);
        } else if (instance instanceof Entity) {
            namedObject = emsService.getEntity((Entity) instance);
        } else if (instance instanceof Checklist) {
            namedObject = emsService.getChecklist((Checklist) instance);
        }

        return namedObject;
    }

    protected void handleLotsByEqptDown(Entity entity, ReferenceFileDetail eqptHoldInfo,
                                        List<ReferenceFileDetail> eqptHoldInfos) {
        List<Map> lotsInEqpGroup = getWaitingLotsByEqpt(entity);
        for (Map lotMapInfo : lotsInEqpGroup) {
            long lotRrn = MapUtils.getLongValue(lotMapInfo, "lotRrn");
            Lot currentLot = lotQueryService.getLot(lotRrn);
            // constrain过滤
            Equipment equipment = new Equipment();
            equipment.setInstanceRrn(entity.getInstanceRrn());
            ErrorMsg errorMsg = constrainService.checkLotConstrain(equipment, currentLot);
            if (!errorMsg.getError()) {
                lotService.handleLotByEqptDown(errorMsg.getEqpIds(), currentLot, eqptHoldInfo, eqptHoldInfos);
            }
        }
    }

    protected List<Map> getWaitingLotsByEqpt(Entity entity) {
        String entityRrnStr = entity.getInstanceRrn() + "";
        Map criterion = new HashMap(10);
        if (null != LotStatus.WAITING) {
            criterion.put(LOT_STATUS, new ArrayList(Arrays.asList(StringUtils.split(LotStatus.WAITING, ","))));
        }
        criterion.put("dummyFlag", null);
        criterion.put("PAGESIZE", new Integer(500));
        criterion.put("jobGridFlag", new Boolean(false));
        criterion.put("objectType", "ENTITY");
        criterion.put("objectRrn", entityRrnStr);
        List<Map> lots = lotQueryService.getLotList4ExtAtEqpt(criterion);
        return lots;
    }

    protected String connectMesSystem(Map objectInfo, long facilityRrn, String user) {
        // todo 接口相关的待完成
        return null;
    }

    protected void addRepeatSchedule(PmSchedule instance, Entity entity) {
        String[] id = getScheduleJobIdGroupId(instance, entity);

        // repeat alarm create
        if (instance.getRepeatInFrequence() != null && instance.getRepeatInUnit() != null) {
            long startTime = DateUtils.stringToTimestamp(instance.getNextEventTime()).getTime();
            long repeatTime = getTimebyUnit(instance.getRepeatInFrequence(), instance.getRepeatInUnit());

            Map<String, Object> alarmInfo = this.buildAlarmInfo(instance.getAlarmIdWhenDue(), instance.getScheduleId(),
                                                                instance.getChecklistRrn(), entity,
                                                                LocalContext.getUserRrn());

            addJob("R" + id[0], "R" + id[1], alarmInfo, false, new Date(repeatTime + startTime), repeatTime,
                   NumberUtils.toLong(instance.getFrequence()), instance.getUnit());
        }

    }

    protected ChecklistJob getChecklistJob(DoChecklistInfoForm theform) {
        ChecklistJob checklistJob = new ChecklistJob();
        checklistJob.setChecklistJobRrn(theform.getChecklistJobRrn());
        checklistJob = emsService.getChecklistJob(checklistJob);
        checklistJob.setTriggerPerformedBy(LocalContext.getUserId());
        checklistJob.setTriggerTimestamp(new Timestamp(System.currentTimeMillis()));
        return checklistJob;
    }

    protected ChecklistJobData getChecklistItemAndSetSequence(ChecklistJob instance, HttpServletRequest request) {
        List<ChecklistJobData> checklistJobDatas = (List<ChecklistJobData>) instance.getChecklistJobDatas();

        int seq = WebUtils.getParameterInt(Constants.SEQUENCENUMBER_KEY, request);
        request.setAttribute(Constants.SEQUENCENUMBER_KEY, seq);
        request.setAttribute(NEXT_SEQ, seq + 1);

        for (ChecklistJobData checklistJobData : checklistJobDatas) {
            if (checklistJobData.getChecklistItemSequence() == seq) {// if (checklistJobData.getRecordIndex() == Seq) {
                checklistJobData.setChecklistItemSequence(seq);
                checklistJobData.setOperatorRrn(LocalContext.getUserRrn());
                checklistJobData.setChecklistJobRrn(instance.getChecklistJobRrn());
                request.setAttribute(SessionNames.CHECKLISTJOBDATA_KEY, checklistJobData);
                return checklistJobData;
            }
        }
        return null;
    }

    protected List<BORResource> getBorResources(ChecklistJobData checklistJobData) {
        if (checklistJobData.getConsumedTransRrn() == null) {
            return prpService.getActiveBorResources(checklistJobData.getBorRrn());
        } else {
            List<Map<String, Object>> data = asmService.getLotInventoryTransHistory(
                    checklistJobData.getConsumedTransRrn());
            return concatCollection(prpService.getActiveBorResources(checklistJobData.getBorRrn()), data);
        }
    }

    protected void doChecklistItem(ChecklistJobData instance) {
        instance.setCompletedTimestamp(new Timestamp(System.currentTimeMillis()).toString());
        emsService.updateChecklistJobData(instance);
    }

    protected long inCreaseBorResource(List<BORResource> borResources, Long checklistJobRrn,
                                       HttpServletRequest request) {
        String[] consumedQty = request.getParameterValues("consumedQty");
        String[] remarks = request.getParameterValues("remarks");

        List<Map<String, Object>> items = new ArrayList<>();
        int i = 0;

        for (BORResource item : borResources) {
            if (item.getResourceType() != null && item.getResourceType().equalsIgnoreCase(ObjectList.PRODUCT_KEY)) {
                Map<String, Object> info = new HashMap<>();
                info.put("itemRrn", item.getResourceRrn());
                info.put("consumedQty", new Double(consumedQty[i]));
                info.put("comments", remarks[i]);
                info.put("sequenceNumber", item.getSequenceNumber());
                items.add(info);
            }
            i++;
        }

        return warehouseService.consumeItemQty(items, LocalContext.getUserId(), LocalContext.getFacilityRrn(),
                                               checklistJobRrn);
    }

    protected Map getPmDetailString(Map pmScheduleInfo) {
        Map<String, Object> pmsInfo = new HashMap<>();
        if (pmScheduleInfo != null) {
            Set s = pmScheduleInfo.keySet();
            for (Object o : s) {
                // if(theform instanceof EntityPmScheduleMonthForm) {
                // EntityPmScheduleMonthForm form = (EntityPmScheduleMonthForm)theform;
                String key = (String) o;
                List list = (List) pmScheduleInfo.get(key);
                StringBuilder buf = new StringBuilder();
                for (Iterator ite = list.iterator(); ite.hasNext(); ) {
                    PmSchedule pms = (PmSchedule) ite.next();

                    String desc = StringUtils.isEmpty(
                            pms.getChecklistDescription()) ? "" : pms.getChecklistDescription();

                    buf.append("<span class=\"myview\"><a href=\"javascript:doDetail('").append(pms.getChecklistRrn())
                       .append("','").append(pms.getEntityRrn()).append("','").append(pms.getSequenceNumber())
                       .append("')\" title=\"").append(desc).append("\">").append(pms.getChecklistId())
                       .append("</a></span>");
                    if (ite.hasNext()) {
                        buf.append("<br>");
                    }
                }
                pmsInfo.put(key, buf.toString());
                // }
            }
        }
        return pmsInfo;
    }

}