PmsScheduleManagerImpl.java

package com.mycim.server.pms.manager.impl;

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.jdbc.Page;
import com.mycim.framework.utils.MiscUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.framework.utils.lang.math.NumberUtils;
import com.mycim.framework.utils.lang.time.DateUtils;
import com.mycim.server.asm.manager.LotInventoryManager;
import com.mycim.server.asm.manager.MaterialManager;
import com.mycim.server.asm.manager.WarehouseManager;
import com.mycim.server.base.manager.EventManager;
import com.mycim.server.base.manager.NamedObjectManager;
import com.mycim.server.base.manager.TransactionLogManager;
import com.mycim.server.emas.manager.EmasEventManager;
import com.mycim.server.ems.manager.CheckListJobManager;
import com.mycim.server.ems.manager.EntityManager;
import com.mycim.server.pilot.manager.PiLotCheckManager;
import com.mycim.server.pms.dao.PmsScheduleDao;
import com.mycim.server.pms.manager.CheckListManager;
import com.mycim.server.pms.manager.PmsScheduleManager;
import com.mycim.server.prp.manager.OperationManager;
import com.mycim.server.status.manager.StatusManager;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.SystemConstant;
import com.mycim.valueobject.bas.TransactionLog;
import com.mycim.valueobject.consts.Constants;
import com.mycim.valueobject.consts.EventName;
import com.mycim.valueobject.consts.TransactionNames;
import com.mycim.valueobject.ems.*;
import com.mycim.valueobject.inv.LotInventoryDO;
import com.mycim.valueobject.inv.MaterialDO;
import com.mycim.valueobject.inv.PartConsumeDO;
import com.mycim.valueobject.inv.WarehouseTransBO;
import com.mycim.valueobject.prp.Operation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.sql.Timestamp;
import java.util.*;
import java.util.stream.Collectors;

@Service
@Transactional
public class PmsScheduleManagerImpl implements PmsScheduleManager {


    @Autowired
    PmsScheduleDao pmsScheduleDao;

    @Autowired
    NamedObjectManager namedObjectManager;

    @Autowired
    TransactionLogManager transactionLogManager;

    @Autowired
    EventManager eventManager;

    @Autowired
    StatusManager statusManager;

    @Autowired
    EntityManager entityManager;

    @Autowired
    CheckListManager checkListManager;

    @Autowired
    CheckListJobManager checkListJobManager;

    @Autowired
    EmasEventManager emasEventManager;

    @Autowired
    MaterialManager materialManager;

    @Autowired
    private LotInventoryManager lotInventoryManager;

    @Autowired
    private WarehouseManager warehouseManager;

    @Autowired
    private OperationManager operationManager;

    @Autowired
    private PiLotCheckManager piLotCheckManager;

    @Override
    public String pmsCheck(Entity entity, String type) {
        PmsSchedule pmItem = new PmsSchedule();
        pmItem.setItemStatus(SystemConstant.Str.ON);
        pmItem.setObjectRrn(entity.getInstanceRrn());
        pmItem.setObjectId(entity.getInstanceId());
        List<PmsSchedule> list = pmsScheduleDao.qryEqptPMInfo(pmItem);
        for (PmsSchedule pmsSchedule : list) {
            if (StringUtils.equalsIgnoreCase(type, Constants.PM_CHECK_TYPE.WAIT_ENT4DEADLINE)) {
                String ControlType = pmsSchedule.getControlType();
                if (StringUtils.equals(ControlType, PmControlTypeEnum.PM_TIME.getControlType())) {
                    //Time类型的
                    long deadLineTime = DateUtils.parse(pmsSchedule.getDeadLine()).getTime();
                    long currentTime = System.currentTimeMillis();
                    if (currentTime >= deadLineTime &&
                            StringUtils.equalsIgnoreCase(pmsSchedule.getEqptStatus(), EventName.HOLD_TO_EE)) {
                        return pmsSchedule.getObjectId() + " must PM before.</br>";
                    }
                } else if (StringUtils.equals(ControlType, PmControlTypeEnum.PM_COUNT.getControlType())) {
                    //Count类型的
                    int runCount = pmsScheduleDao.getRunCountForPMCount(pmsSchedule);
                    if (runCount >= pmsSchedule.getTotalCount() &&
                            StringUtils.equalsIgnoreCase(pmsSchedule.getEqptStatus(), EventName.HOLD_TO_EE)) {
                        return pmsSchedule.getObjectId() + " must PM before.</br>";
                    }

                }
            }

            if (StringUtils.equalsIgnoreCase(type, Constants.PM_CHECK_TYPE.EQPTRUN4PM)) {
                if (StringUtils.equals(pmsSchedule.getEqptStatus(), EventName.PM)) {
                    return pmsSchedule.getObjectId() + " is under maintenance.<br>";
                }
                String ControlType = pmsSchedule.getControlType();
                if (StringUtils.equals(ControlType, PmControlTypeEnum.PM_TIME.getControlType())) {
                    long nextPmTime = pmsSchedule.getNextPmTime().getTime();
                    long toleranceTime = (long) (pmsSchedule.getToleranceTime() * 24 * 60 * 60 * 1000);
                    long currentTime = System.currentTimeMillis();
                    if (currentTime > (nextPmTime + toleranceTime)) {
                        return pmsSchedule.getObjectId() + " must PM before.</br>";
                    }
                }
            }
        }
        return StringUtils.EMPTY;
    }

    @Override
    public String pmsCheck(Entity entity) {
        PmsSchedule pmItem = new PmsSchedule();
        pmItem.setItemStatus(SystemConstant.Str.ON);
        pmItem.setObjectRrn(entity.getInstanceRrn());
        pmItem.setObjectId(entity.getInstanceId());
        List<PmsSchedule> list = pmsScheduleDao.qryEqptPMInfo(pmItem);
        StringBuilder msg = new StringBuilder();
        for (PmsSchedule pmsSchedule : list) {
            if (pmsSchedule.getToleranceStatus() == 3) {
                msg.append("PM of ").append(entity.getInstanceId()).append(" : ").append(pmsSchedule.getPmId())
                   .append(" has expired!</br>");
            }
        }
        return msg.toString();
    }

    @Override
    public String deletePmSchedules(long instanceRrn) {
        return pmsScheduleDao.deletePmSchedules(instanceRrn);
    }

    @Override
    public List<PmSchedule> getPmSchedulesOfEntity(long entityRrn) {
        List<PmSchedule> temp = pmsScheduleDao.getPmSchedulesOfEntity(entityRrn);
        // 补充数据
        for (PmSchedule pmSchedule : temp) {
            if (MiscUtils.parseSQL(pmSchedule.getChecklistRrn()) > 0) {
                pmSchedule.setChecklistId(
                        namedObjectManager.getInstanceId(MiscUtils.parseSQL(pmSchedule.getChecklistRrn())));
            }
        }

        return temp;
    }

    @Override
    public List<Map> getPmListByCheckList(long checklistRrn) {
        return pmsScheduleDao.getPmListByCheckList(checklistRrn);
    }

    @Override
    public void insertPmSchedule(PmSchedule pmSchedule) {
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(pmSchedule.getTransPerformedBy(),
                                                                                  TransactionNames.CREATE_KEY);
        pmsScheduleDao.insertPmSchedule(pmSchedule);
        pmsScheduleDao.insertPmScheduleHistory(pmSchedule, transactionLog.getTransRrn());
        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public PmSchedule getPmSchedule(PmSchedule pmSchedule) {
        pmSchedule = pmsScheduleDao.getPmSchedule(pmSchedule);
        // 补充数据
        pmSchedule.setChecklistId(namedObjectManager.getInstanceId(MiscUtils.parseSQL(pmSchedule.getChecklistRrn())));
        return pmSchedule;
    }

    @Override
    public void updatePmSchedule(PmSchedule pmSchedule) {
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(pmSchedule.getTransPerformedBy(),
                                                                                  TransactionNames.MODIFY_KEY);
        pmsScheduleDao.insertPmScheduleHistory(pmSchedule, transactionLog.getTransRrn());
        pmsScheduleDao.updatePmSchedule(pmSchedule);
        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public void deletePmSchedule(PmSchedule pmSchedule) {
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(pmSchedule.getTransPerformedBy(),
                                                                                  TransactionNames.DELETE_KEY);
        pmsScheduleDao.insertPmScheduleHistory(pmSchedule, transactionLog.getTransRrn());
        pmsScheduleDao.deletePmSchedule(pmSchedule);
        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public PmSchedule getActualEventTime(Entity entity, Long sequenceNumber) {
        return pmsScheduleDao.getActualEventTime(entity, sequenceNumber);
    }

    @Override
    public void delaySchedule(PmSchedule instance, Long userRrn, String jobName, String jobGroup, String rjobName,
                              String rjobGroup, long startTime, long repeatStartTime) {
        pmsScheduleDao.delaySchedule(jobName, jobGroup, startTime);
        pmsScheduleDao.delaySchedule(rjobName, rjobGroup, repeatStartTime);
    }

    @Override
    public Page qryPmsEqptHist(Map<String, Object> condition, Page page) {
        return pmsScheduleDao.qryPmsEqptHist(condition, page);
    }

    @Override
    public Page qryEqptPMInfo(PmsSchedule schedule, Page page) {
        if (StringUtils.isNotBlank(schedule.getObjectId())) {
            schedule.setObjectId(StringUtils.replace(schedule.getObjectId(), "*", "%").toString());
        }
        if (StringUtils.isNotBlank(schedule.getStation())) {
            schedule.setStation(StringUtils.replace(schedule.getStation(), "*", "%").toString());
        }
        schedule.setNamedSpace(namedObjectManager.getNamedSpace(LocalContext.getFacilityRrn(), ObjectList.ENTITY_KEY));
        return pmsScheduleDao.qryEqptPMInfo(schedule, page);
    }

    @Override
    public List<PmsSchedule> qryEqptPMInfo(PmsSchedule schedule) {
        return pmsScheduleDao.qryEqptPMInfo(schedule);
    }

    @Override
    public PmsSchedule qryEqptPMInfo(long pmRrn) {
        return pmsScheduleDao.qryEqptPMInfo(pmRrn);
    }

    @Override
    public void addPmSchedule(PmsSchedule schedule) {
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(schedule.getCreateUserId(),
                                                                                  TransactionNames.CREATE_KEY);
        long transRrn = transactionLog.getTransRrn();
        transactionLog.setComments(schedule.getComment());
        schedule.setPmRrn(transRrn);
        schedule.setTransRrn(transRrn);
        pmsScheduleDao.addPmSchedule(schedule);
        pmsScheduleDao.addPmScheduleH(schedule);
        String checklistId = schedule.getChecklistId();
        if (StringUtils.isNotBlank(checklistId)) {
            Checklist checklist = new Checklist(checklistId,
                                                namedObjectManager.getNamedSpace(LocalContext.getFacilityRrn(),
                                                                                 ObjectList.CHECKLIST_KEY),
                                                ObjectList.CHECKLIST_KEY);
            checklist = checkListManager.getCheckList(checklist);
            Assert.isFalse((checklist == null) || (checklist.getInstanceRrn() <= 0),
                           Errors.create().content("Checklist not " + "find!").build());
            ChecklistJob instance = new ChecklistJob();
            instance.setEntityRrn(schedule.getObjectRrn());
            instance.setChecklistJobId("");
            instance.setComments(schedule.getComment());
            instance.setChecklistRrn(checklist.getInstanceRrn());
            instance.setStartTimestamp(new Timestamp(System.currentTimeMillis()));
            instance.setTriggerTimestamp(new Timestamp(System.currentTimeMillis()));
            instance.setChecklistJobState("STARTED");
            instance.setTransId("create");
            instance.setTransPerformedby(LocalContext.getUserId());
            instance.setTriggerPerformedBy(LocalContext.getUserId());
            instance.setAttri1(schedule.getControlType());
            instance.setCreatePerformedBy(LocalContext.getUserId());
            instance.setPmType(schedule.getPmType());
            instance.setPmRrn(schedule.getPmRrn());
            checkListJobManager.insertChecklistJob(instance);
        }
        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public void modifyPmSchedule(PmsSchedule schedule) {
        String transId = StringUtils.isEmpty(
                schedule.getTransId()) ? TransactionNames.MODIFY_KEY : schedule.getTransId();
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(schedule.getCreateUserId(), transId);
        long transRrn = transactionLog.getTransRrn();
        transactionLog.setTransPerformedBy(StringUtils.isBlank(
                transactionLog.getTransPerformedBy()) ? LocalContext.getUserId() :
                                                   transactionLog.getTransPerformedBy());
        transactionLog.setComments(schedule.getComment());
        schedule.setTransRrn(transRrn);
        schedule.setTransPerformedby(LocalContext.getUserId());
        String[] pmRrns = schedule.getPmLink();
        Map<String, EquipmentTriggerMaintain> triggerMaintainMap = new HashMap<>();
        if (StringUtils.equalsIgnoreCase(TransactionNames.PMS_END, transId)) {
            for (String pmRrn : pmRrns) {
                if (StringUtils.isBlank(pmRrn)) {
                    continue;
                }
                PmsSchedule __schedule = pmsScheduleDao.qryEqptPMInfo(Long.parseLong(pmRrn));
                Long checkListRrn = __schedule.getChecklistRrn();
                if (checkListRrn != null && checkListRrn > 0) {
                    List<ChecklistJob> checklistJobs = new ArrayList();
                    String extendCondition = "PM_RRN = '" + __schedule.getPmRrn() + "'";
                    List<ChecklistJob> _checklistJobs = checkListJobManager.getChecklistJobs(extendCondition);
                    for (ChecklistJob checklistJob : _checklistJobs) {
                        checklistJob.setComments("主PM完成,关联PM的checkList重置");
                        checkListJobManager.insertChecklistJobH(transRrn, checklistJob);
                        checkListJobManager.deleteChecklistJob(
                                checklistJob.getChecklistJobRrn());//多勾选情况下,第一个循环中删除了以后,第二次在进入循环时,便查不出数据了。
                        /*
                        checklistJob.setComments(checklistJob.getComments() + " >>>System.echo: 主PM完成,
                        关联PM的checkList自动完成<<<");
                        checklistJob.setChecklistJobState("COMPLETED");
                        checklistJob.setTransPerformedby("SYSTEM");
                        checklistJob.setTriggerPerformedBy("SYSTEM");
                        checklistJob.setCompletePerformedBy("SYSTEM");
                        checklistJob.setTriggerTimestamp(new Timestamp(System.currentTimeMillis()));
                        checklistJob.setCompletedTimestamp(new Timestamp(System.currentTimeMillis()));
                        checklistJob.setTransId("COMPLETED");
                        checkListJobManager.completeChecklistJob(checklistJob);
                         */
                    }
                }
                PmsSchedule _schedule = buildNewPmsScheduleForSE(TransactionNames.PMS_END, __schedule);
                _schedule.setTransRrn(transRrn);
                _schedule.setPmLinks("");
                //如果配置了checkList 再创建一个新的checklistJob
                if (checkListRrn != null && checkListRrn > 0) {
                    Checklist checklist = new Checklist();
                    checklist.setInstanceRrn(checkListRrn);
                    checklist = checkListManager.getCheckList(checklist);
                    ChecklistJob instance = new ChecklistJob();
                    instance.setEntityRrn(__schedule.getObjectRrn());
                    instance.setChecklistJobId("");
                    instance.setComments(schedule.getComment());
                    instance.setChecklistRrn(checklist.getInstanceRrn());
                    instance.setStartTimestamp(new Timestamp(System.currentTimeMillis()));
                    instance.setTriggerTimestamp(new Timestamp(System.currentTimeMillis()));
                    instance.setChecklistJobState("STARTED");
                    instance.setTransId("create");
                    instance.setTransPerformedby(LocalContext.getUserId());
                    instance.setTriggerPerformedBy(LocalContext.getUserId());
                    instance.setCreatePerformedBy(LocalContext.getUserId());
                    instance.setAttri1(__schedule.getControlType());
                    instance.setPmType(__schedule.getPmType());
                    instance.setPmRrn(__schedule.getPmRrn());
                    checkListJobManager.insertChecklistJob(instance);
                }
                pmsScheduleDao.modifyPmSchedule(_schedule);
                this.buildTriggerMaintain(_schedule, triggerMaintainMap);
                pmsScheduleDao.addPmScheduleH(_schedule);
            }
            schedule.setPmLinks("");
            if (TransactionNames.PMS_END.equalsIgnoreCase(schedule.getPmEnd())) {
                //手动点击 PM End 才消耗Part
                this.consumeParts(schedule);
            }
        }
        pmsScheduleDao.modifyPmSchedule(schedule);
        this.buildTriggerMaintain(schedule, triggerMaintainMap);
        pmsScheduleDao.addPmScheduleH(schedule);
        //PM END后,Trigger Maintain中的reading值需要被清空
        List<EquipmentTriggerMaintain> triggerMaintainList = new ArrayList<>(triggerMaintainMap.values());
        this.batchUpdateTriggerMaintain(triggerMaintainList, transactionLog);
        transactionLogManager.markTransactionLog(transactionLog);
    }

    private void buildTriggerMaintain(PmsSchedule schedule, Map<String, EquipmentTriggerMaintain> triggerMaintainMap) {
        if (TransactionNames.PMS_END.equalsIgnoreCase(schedule.getTransId())){
            if (PmControlTypeEnum.PM_TRIGGER_READING.name().equalsIgnoreCase(schedule.getControlType())){
                EquipmentTriggerMaintain etm = new EquipmentTriggerMaintain();
                etm.setEquipmentRrn(schedule.getObjectRrn());
                etm.setTriggerCode(schedule.getTriggerCode());
                etm.setTriggerCodeSpec(schedule.getTriggerCodeSpec());
                triggerMaintainMap.put(etm.getEquipmentRrn() + "|" +etm.getTriggerCode(), etm);
            }
        }
    }

    @Override
    public void refreshCheckList(long transRrn, List<Long> refreshCheckListPmRrn) {
        for (Long pmRrn : refreshCheckListPmRrn) {
            PmsSchedule __schedule = pmsScheduleDao.qryEqptPMInfo(pmRrn);
            Long checkListRrn = __schedule.getChecklistRrn();
            if (checkListRrn != null && checkListRrn > 0) {
                List<ChecklistJob> checklistJobs = new ArrayList();
                String extendCondition = "PM_RRN = '" + __schedule.getPmRrn() + "' ";
                List<ChecklistJob> _checklistJobs = checkListJobManager.getChecklistJobs(extendCondition);
                for (ChecklistJob checklistJob : _checklistJobs) {
                    checklistJob.setComments("主PM完成,关联PM的checkList重置");
                    checkListJobManager.insertChecklistJobH(transRrn, checklistJob);
                    checkListJobManager.deleteChecklistJob(checklistJob.getChecklistJobRrn());
                    /*
                    checklistJob.setComments(checklistJob.getComments() + " >>>System.echo: PM完成,
                    同设备的其他PM的checkList刷新<<<");
                    checklistJob.setChecklistJobState("COMPLETED");
                    checklistJob.setTransPerformedby("SYSTEM");
                    checklistJob.setTriggerPerformedBy("SYSTEM");
                    checklistJob.setCompletePerformedBy("SYSTEM");
                    checklistJob.setTriggerTimestamp(new Timestamp(System.currentTimeMillis()));
                    checklistJob.setCompletedTimestamp(new Timestamp(System.currentTimeMillis()));
                    checklistJob.setTransId("COMPLETED");
                    checkListJobManager.completeChecklistJob(checklistJob);
                     */
                }
                Checklist checklist = new Checklist();
                checklist.setInstanceRrn(checkListRrn);
                checklist = checkListManager.getCheckList(checklist);
                ChecklistJob instance = new ChecklistJob();
                instance.setEntityRrn(__schedule.getObjectRrn());
                instance.setChecklistJobId("");
                instance.setComments("该设备有PM完成,同设备的其他PM刷新。");
                instance.setChecklistRrn(checklist.getInstanceRrn());
                instance.setStartTimestamp(new Timestamp(System.currentTimeMillis()));
                instance.setTriggerTimestamp(new Timestamp(System.currentTimeMillis()));
                instance.setChecklistJobState("STARTED");
                instance.setTransId("create");
                instance.setTransPerformedby(LocalContext.getUserId());
                instance.setTriggerPerformedBy(LocalContext.getUserId());
                instance.setCreatePerformedBy(LocalContext.getUserId());
                instance.setAttri1(__schedule.getControlType());
                instance.setPmType(__schedule.getPmType());
                instance.setPmRrn(__schedule.getPmRrn());
                checkListJobManager.insertChecklistJob(instance);
            }
        }
    }

    @Override
    public void pmsPmStart(PmsSchedule schedule) {
        String pmsStr = schedule.getPmRrnStr();
        String[] pmLink = schedule.getPmLink();
        String pmLinks = schedule.getPmLinks();
        String comment = schedule.getComment();
        String linkComment = comment;
        List<PmsSchedule> list = pmsScheduleDao.qryEqptPMInfo(schedule);
        List<PmsSchedule> pmsScheduleList = new ArrayList<>();
        if (StringUtils.isNotBlank(pmLinks)) {
            PmsSchedule _pmsSchedule = new PmsSchedule();
            _pmsSchedule.setPmRrnStr(pmLinks);
            pmsScheduleList = pmsScheduleDao.qryEqptPMInfo(_pmsSchedule);
            if (CollectionUtils.isNotEmpty(pmsScheduleList)){
                String pmlinkComments = ".Link PM Id: " + StringUtils.join(
                        pmsScheduleList.stream().map(PmsSchedule::getPmId).toArray(), ",");
                linkComment += pmlinkComments;
            }
        }

        String eventId = EventName.WAIT_ENG_TO_PM;

        Event event = new Event(eventId,  namedObjectManager.getNamedSpace(LocalContext.getFacilityRrn(), ObjectList.EVENT_KEY), ObjectList.EVENT_KEY);
        event.setEntityType(ObjectList.EQUIPMENT_KEY);
        event = eventManager.getEvent(event);
        Map<Long, Long> map = new HashMap<>();
        if (CollectionUtils.isNotEmpty(list)) {
            startPm(list, pmLinks, linkComment, event, schedule, map);
        }
        if (CollectionUtils.isNotEmpty(pmsScheduleList)){
            startPm(pmsScheduleList, StringUtils.EMPTY, comment, event, schedule, map);
        }
    }

    private void startPm(List<PmsSchedule> list, String pmLinks, String comment, Event event, PmsSchedule schedule, Map<Long, Long> map) {
        long parentEqptRrn = getParentEqptFromPms(list);
        for (PmsSchedule pmsSchedule : list) {
            long entityRrn = pmsSchedule.getChamberRrn() != null &&
                    pmsSchedule.getChamberRrn() > 0 ? pmsSchedule.getChamberRrn() : pmsSchedule.getObjectRrn();
            if (map.get(entityRrn) == null) {
                autoEvent4Entity(event, entityRrn, schedule.getCreateUserId(), schedule.getComment());
                map.put(entityRrn, entityRrn);
            }
            Assert.isFalse(map.size() > 1 && parentEqptRrn <= 0,
                           Errors.create().content("Multiple Eqpt can`t PM start together.").build());

            PmsSchedule modifyPms = new PmsSchedule();
            modifyPms.setPmRrn(pmsSchedule.getPmRrn());
            modifyPms.setTransId(TransactionNames.PMS_START);
            modifyPms.setPmLinks(pmLinks);
            modifyPms.setComment(comment);
            modifyPmSchedule(modifyPms);
        }
    }

    @Override
    public void pmsPmEnd(PmsSchedule schedule) {
        String transId = TransactionNames.PMS_END;
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(schedule.getCreateUserId(), transId);
        long transRrn = transactionLog.getTransRrn();
        transactionLog.setComments(schedule.getComment());
        Map<Long, List<PartConsumeDO>> partConsumeMap = schedule.getPartConsumeMap();
        List<PmsSchedule> list = pmsScheduleDao.qryEqptPMInfo(schedule);//根据pmRrn 和 pmRrnStr来查询
        String[] pmLink = schedule.getPmLink();
        String pmLinks = schedule.getPmLinks();
        String eventId = schedule.getTargetEventId();
        Event event = new Event(eventId,
                                namedObjectManager.getNamedSpace(LocalContext.getFacilityRrn(), ObjectList.EVENT_KEY),
                                ObjectList.EVENT_KEY);
        event.setEntityType(ObjectList.EQUIPMENT_KEY);
        event = eventManager.getEvent(event);
        if (list != null && !list.isEmpty()) {//可能出现1条 或者勾选的N条
            Map<Long, Long> map = new HashMap<>();
            long parentEqptRrn = getParentEqptFromPms(list);//找出N条中的主机台,也可能为0
            for (PmsSchedule pmsSchedule : list) {
                PmsSchedule _pmsSchedule = new PmsSchedule();
                _pmsSchedule.setObjectId(pmsSchedule.getObjectId());
                List<PmsSchedule> allPmsList = pmsScheduleDao.qryEqptPMInfo(
                        _pmsSchedule);//主机台找主+Chamber的,Chamber机台只找Chamber的
                List<Long> refreshCheckListPmRrns = allPmsList.stream().filter(_pms -> {
                    if (_pms.getChecklistRrn() == null && _pms.getChecklistRrn() < 1) {
                        return false;
                    }
                    Long _pmRrn = _pms.getPmRrn();
                    if (_pmRrn.equals(pmsSchedule.getPmRrn())) {
                        return false;
                    }
                    String[] _pmLink =
                            pmsSchedule.getPmLinks() == null ? new String[]{} : pmsSchedule.getPmLinks().split(",");
                    for (String _pmStr : _pmLink) {
                        if (StringUtils.equals(_pmRrn.toString(), _pmStr)) {
                            return false;
                        }
                    }
                    return true;
                }).map(PmsSchedule::getPmRrn).collect(Collectors.toList());
                long entityRrn = pmsSchedule.getChamberRrn() != null &&
                        pmsSchedule.getChamberRrn() > 0 ? pmsSchedule.getChamberRrn() : pmsSchedule.getObjectRrn();
                if (map.get(entityRrn) == null) {
                    autoEvent4Entity(event, entityRrn, schedule.getCreateUserId(), schedule.getComment());
                    map.put(entityRrn, entityRrn);
                }
                Assert.isFalse(map.size() > 1 && parentEqptRrn <= 0,
                               Errors.create().content("Multiple Eqpt can`t pm end " + "together.").build());

                pmsSchedule.setCreateUserId(schedule.getCreateUserId());
                pmsSchedule.setComment(schedule.getComment());
                Long checklistRrn = pmsSchedule.getChecklistRrn();
                PmsSchedule ms = buildNewPmsScheduleForSE(TransactionNames.PMS_END, pmsSchedule);
                ms.setPmLink(pmLink);
                ms.setPmEnd(TransactionNames.PMS_END);
                ms.setPartConsume(partConsumeMap.get(pmsSchedule.getPmRrn()));
                modifyPmSchedule(ms);
                //刷新该设备的其他checkList,防止没有关联pm,但是做了checkList。
                refreshCheckList(transRrn, refreshCheckListPmRrns);
                //如果配置了checkList 再创建一个新的checklistJob
                List<ChecklistJob> checklistJobs = new ArrayList<>();
                String extendCondition = "PM_RRN = '" + pmsSchedule.getPmRrn() + "'";
                List<ChecklistJob> _checklistJobs = checkListJobManager.getChecklistJobs(extendCondition);
                for (ChecklistJob checklistJob : _checklistJobs) {
                    checklistJob.setComments("checkList重置");
                    checkListJobManager.insertChecklistJobH(transRrn, checklistJob);
                    checkListJobManager.deleteChecklistJob(checklistJob.getChecklistJobRrn());
                }
                if (checklistRrn != null && checklistRrn > 0) {
                    Checklist checklist = new Checklist();
                    checklist.setInstanceRrn(checklistRrn);
                    checklist = checkListManager.getCheckList(checklist);
                    ChecklistJob instance = new ChecklistJob();
                    instance.setEntityRrn(pmsSchedule.getObjectRrn());
                    instance.setChecklistJobId("");
                    instance.setComments(schedule.getComment());
                    instance.setChecklistRrn(checklist.getInstanceRrn());
                    instance.setStartTimestamp(new Timestamp(System.currentTimeMillis()));
                    instance.setTriggerTimestamp(new Timestamp(System.currentTimeMillis()));
                    instance.setChecklistJobState("STARTED");
                    instance.setTransId("create");
                    instance.setTransPerformedby(LocalContext.getUserId());
                    instance.setTriggerPerformedBy(LocalContext.getUserId());
                    instance.setCreatePerformedBy(LocalContext.getUserId());
                    instance.setAttri1(pmsSchedule.getControlType());
                    instance.setPmType(pmsSchedule.getPmType());
                    instance.setPmRrn(ms.getPmRrn());
                    checkListJobManager.insertChecklistJob(instance);
                }

                // new Emas 处理
                emasEventManager.generateEmasEventRecord(pmsSchedule.getObjectId(), eventId);
                piLotCheckManager.checkEquipmentPiLotByPM(pmsSchedule.getObjectId());

            }
            /*String msg = autoPmEndForChildEqpt(parentEqptRrn, event, schedule.getCreateUserId(),
                                               schedule.getComment(), map);
            if (StringUtils.isNotBlank(msg)) {
                throw new ManagerException("", msg + "cannot end pm, reason: status is invalid.");
            }*/
            transactionLogManager.markTransactionLog(transactionLog);
        }
    }

    @Override
    public void pmsPmEnd(List<PmsSchedule> schedules) {
        for (PmsSchedule pmsSchedule : schedules) {
            this.pmsPmEnd(pmsSchedule);
        }
    }

    @Override
    public void onOffChange(PmsSchedule schedule) {
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(schedule.getCreateUserId(),
                                                                                  TransactionNames.PMS_ON_OFF);
        long transRrn = transactionLog.getTransRrn();
        transactionLog.setComments(schedule.getComment());
        PmsSchedule pm = new PmsSchedule();
        pm.setPmRrnStr(schedule.getPmRrnStr());
        pm.setTransRrn(transRrn);
        pm.setItemStatus(schedule.getItemStatus());
        pmsScheduleDao.modifyPmSchedule(pm);
        pmsScheduleDao.addPmScheduleH(pm);
        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public void deletePmSchedule(PmsSchedule schedule) {
        List<PmsSchedule> scheduleList = this.qryEqptPMInfo(schedule);
        for (PmsSchedule _schedule : scheduleList) {
            Assert.isFalse(StringUtils.equals(_schedule.getTransId(), TransactionNames.PMS_START),
                           Errors.create().content("PM Item has started. delete not allowed!").build());
        }
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(schedule.getCreateUserId(),
                                                                                  TransactionNames.DELETE_KEY);
        long transRrn = transactionLog.getTransRrn();
        transactionLog.setComments(schedule.getComment());
        schedule.setTransRrn(transRrn);
        pmsScheduleDao.addPmScheduleH(schedule);
        pmsScheduleDao.deletePmSchedule(schedule);
        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public PmSchedule updateNextPMTime(PmSchedule pmSchedule) {
        return pmsScheduleDao.updateNextPMTime(pmSchedule);
    }

    @Override
    public Page getPmSchedulesByPageQuery(Map condition, Page page) {
        return pmsScheduleDao.getPmSchedulesByPageQuery(condition, page);
    }

    @Override
    public Map getPMScheduleByMonth(String equipmentId, int year, int month, long ownerEntityRrn) {
        return pmsScheduleDao.getPMScheduleByMonth(equipmentId, year, month, ownerEntityRrn);
    }

    @Override
    public PmSchedule selectPMScheduleDetail(long checklistRrn, long entityRrn, long sequenceNum) {
        return pmsScheduleDao.selectPMScheduleDetail(checklistRrn, entityRrn, sequenceNum);
    }

    @Override
    public void updatePmScheduleNext(PmSchedule pms) {
        pmsScheduleDao.updatePmScheduleNext(pms);
    }

    @Override
    public Map getPMScheduleByWeek(int year, int week, long ownerEntityRrn) {
        return null;
    }

    @Override
    public void pmsAutoEvent(PmsSchedule pmItem) {
        String eventId = pmItem.getTargetEventId();
        Event event = new Event(eventId,
                                namedObjectManager.getNamedSpace(LocalContext.getFacilityRrn(), ObjectList.EVENT_KEY),
                                ObjectList.EVENT_KEY);
        event.setEntityType(ObjectList.EQUIPMENT_KEY);
        event = eventManager.getEvent(event);
        if (event != null) {
            long entityRrn = pmItem.getChamberRrn() != null &&
                    pmItem.getChamberRrn() > 0 ? pmItem.getChamberRrn() : pmItem.getObjectRrn();
            autoEvent4Entity(event, entityRrn, pmItem.getCreateUserId(), pmItem.getComment());
        }
    }

    @Override
    public void updatePmScheduleNextTime(Map jobData) {
        pmsScheduleDao.updatePmScheduleNextTime(jobData);
    }

    @Override
    public Map<String, Object> getTrigger(String jobName, String jobGroup) {
        return pmsScheduleDao.getTrigger(jobName, jobGroup);
    }

    @Override
    public List qryChecklistJobDataHist(Long checklistJobRrn) {
        return pmsScheduleDao.qryChecklistJobDataHist(checklistJobRrn);
    }

    @Override
    public void addTriggerMaintain(EquipmentTriggerMaintainQuery maintainQuery) {
        if (getTriggerMaintain(maintainQuery) == null){
            TransactionLog tl = transactionLogManager.startTransactionLog(maintainQuery.getUserId(), TransactionNames.CREATE_KEY);
            pmsScheduleDao.addTriggerMaintain(maintainQuery, tl);
            pmsScheduleDao.addTriggerMaintainHistory(maintainQuery, tl);
            transactionLogManager.markTransactionLog(tl);
        }
    }

    @Override
    public void modifyTriggerMaintain(EquipmentTriggerMaintainQuery maintainQuery, List<PmsSchedule> list) {
        //先查询有没有被PM关联
        if (getTriggerMaintain(maintainQuery) != null){
            TransactionLog tl = transactionLogManager.startTransactionLog(maintainQuery.getUserId(), TransactionNames.MODIFY_KEY);
            pmsScheduleDao.modifyTriggerMaintain(maintainQuery, tl);
            tl.setComments(maintainQuery.getComment());
            pmsScheduleDao.addTriggerMaintainHistory(maintainQuery, tl);
            if (CollectionUtils.isNotEmpty(list)){
                for (PmsSchedule ps:list){
                    ps.setTriggerReading(maintainQuery.getTriggerReading());
                }
                batchUpdateTriggerMaintain("", list, new ArrayList<>(),TransactionNames.MANUAL_TRIGGER_READING);
            }
            transactionLogManager.markTransactionLog(tl);
        }
    }

    @Override
    public void deleteTriggerMaintain(EquipmentTriggerMaintainQuery maintainQuery) {
        TransactionLog tl = transactionLogManager.startTransactionLog(maintainQuery.getUserId(), TransactionNames.DELETE_KEY);
        tl.setComments(maintainQuery.getComment());
        for (EquipmentTriggerMaintain etmq: maintainQuery.getDeleteList()){
            maintainQuery.setEquipmentRrn(etmq.getEquipmentRrn());
            maintainQuery.setTriggerCode(etmq.getTriggerCode());
            pmsScheduleDao.addTriggerMaintainHistory(maintainQuery, tl);
            pmsScheduleDao.deleteTriggerMaintain(maintainQuery);
        }
        transactionLogManager.markTransactionLog(tl);
    }

    @Override
    public List<EquipmentTriggerMaintain> queryTriggerCodeByEquipment(EquipmentTriggerMaintainQuery maintainQuery) {
        return pmsScheduleDao.queryTriggerCodeByEquipment(maintainQuery);
    }


    @Override
    public Page queryMaintainByPage(Page page, EquipmentTriggerMaintainQuery maintainQuery) {
        return pmsScheduleDao.queryMaintainByPage(page, maintainQuery);
    }

    @Override
    public Page queryMaintainHistoryByPage(Page page, EquipmentTriggerMaintainQuery maintainQuery) {
        return pmsScheduleDao.queryMaintainHistoryByPage(page, maintainQuery);
    }

    @Override
    public EquipmentTriggerMaintain getTriggerMaintain(EquipmentTriggerMaintainQuery maintainQuery) {
        return pmsScheduleDao.getTriggerMaintain(maintainQuery);
    }

    @Override
    public void batchUpdateTriggerMaintain(String equipmentId, List<PmsSchedule> maintainList, List<EquipmentTriggerMaintain> triggerMaintainList, String transId) {
        TransactionLog tl = transactionLogManager.startTransactionLog(LocalContext.getUserId(), transId);
        for (PmsSchedule ps : maintainList){
            ps.setTransRrn(tl.getTransRrn());
            pmsScheduleDao.updateTriggerReadingByPms(ps);//修改PMS中的TriggerReading
            pmsScheduleDao.addPmScheduleH(ps);//记录修改PMS中的TriggerReading的历史
            tl.setTransSequence(tl.getTransSequence() + 1);
        }
        this.batchUpdateTriggerMaintain(triggerMaintainList, tl);
        transactionLogManager.markTransactionLog(tl);
    }

    @Override
    public void batchUpdateTriggerMaintain(List<EquipmentTriggerMaintain> triggerMaintainList, TransactionLog tl) {
        if (CollectionUtils.isNotEmpty(triggerMaintainList)){
            for (EquipmentTriggerMaintain e: triggerMaintainList){
                EquipmentTriggerMaintainQuery etmq = new EquipmentTriggerMaintainQuery();
                etmq.setTriggerCodeSpec(e.getTriggerCodeSpec());
                etmq.setUserRrn(LocalContext.getUserRrn());
                etmq.setTriggerReading(e.getTriggerReading());
                etmq.setEquipmentRrn(e.getEquipmentRrn());
                etmq.setTriggerCode(e.getTriggerCode());
                pmsScheduleDao.modifyTriggerMaintain(etmq, tl);
                pmsScheduleDao.addTriggerMaintainHistory(etmq, tl);
                tl.setTransSequence(tl.getTransSequence() + 1);
            }
        }
    }


    /**
     * 根据chamber主机台rrn,自动做chamber设备的PM start或end
     *
     * @param parentEqptRrn chamber主机台rrn
     * @param event         事件
     * @param userId        用户ID
     * @param comment       备注
     * @param changedRrnMap map<rrn, rrn>, chamber主机台下已经做过了event的chamber设备rrn
     * @param transId       事务ID
     * @return 不能做event的设备ID,多个设备以逗号分隔
     */
    public String autoChildEqptPmOfSE(long parentEqptRrn, Event event, String userId, String comment,
                                      Map<Long, Long> changedRrnMap, String transId) {
        List<Long> notWatiEngEqptRrnList = new ArrayList<Long>();
        if (parentEqptRrn > 0) {
            List<Long> childRrnList = entityManager.getChildEntityRrns(parentEqptRrn);
            if (CollectionUtils.isNotEmpty(childRrnList)) {
                for (Long childRrn : childRrnList) {
                    if (changedRrnMap.get(childRrn) == null) {
                        Entity childEntity = new Entity();
                        childEntity.setInstanceRrn(childRrn);
                        childEntity = entityManager.getEntity(childEntity);
                        if (StringUtils.isNotBlank(childEntity.getChamberType())) {
                            // 有chamber type的才算是chamber设备
                            boolean allowLogEventFlag = false;
                            allowLogEventFlag = statusManager.checkEnableLogEvent(event.getInstanceRrn(), childRrn);
                            if (allowLogEventFlag) {
                                autoEvent4Entity(event, childRrn, userId, comment);
                                // 在PMS中是否设置了设备PM
                                PmsSchedule existPms = new PmsSchedule();
                                existPms.setObjectRrn(childRrn);
                                List<PmsSchedule> childPmsList = pmsScheduleDao.qryEqptPMInfo(existPms);
                                if (CollectionUtils.isNotEmpty(childPmsList)) {
                                    for (PmsSchedule childPm : childPmsList) {
                                        childPm.setCreateUserId(userId);
                                        childPm.setComment(comment);
                                        PmsSchedule ms = buildNewPmsScheduleForSE(transId, childPm);
                                        modifyPmSchedule(ms);
                                    }
                                }
                            } else {
                                // 设备当前状态不允许执行 PM 的 rrn 集合
                                notWatiEngEqptRrnList.add(childRrn);
                            }
                        }
                        changedRrnMap.put(childRrn, childRrn);
                    }
                }
            }
        }
        StringBuilder eqptIds = new StringBuilder("");
        if (CollectionUtils.isNotEmpty(notWatiEngEqptRrnList)) {
            for (Long rrn : notWatiEngEqptRrnList) {
                eqptIds.append(namedObjectManager.getInstanceId(rrn));
                eqptIds.append(",");
            }
        }
        return StringUtils.removeLastChar(eqptIds.toString(), ",");
    }

    private void consumeParts(PmsSchedule ms) {
        //query part
        List<PartConsumeDO> partConsumeDOList = ms.getPartConsume();
        //consume part
        if (CollectionUtils.isNotEmpty(partConsumeDOList)) {
            for (PartConsumeDO part : partConsumeDOList) {
                String partId = part.getConsumePartId();
                int consumeQty = part.getConsumePartQty();
                MaterialDO material = new MaterialDO(partId,
                                                     namedObjectManager.getNamedSpace(LocalContext.getFacilityRrn(),
                                                                                      ObjectList.ITEM_KEY),
                                                     ObjectList.ITEM_KEY);
                material = materialManager.getMaterial(material);
                Assert.isFalse(material == null || material.getInstanceRrn() <= 0,
                               Errors.create().key(MessageIdList.PART_ID_NOT_EXIST).content("Part ID not exist!")
                                     .build());
                int totalQuantity = materialManager.getMaterialTotalQuantity(material.getInstanceRrn());
                int remainQty = totalQuantity - consumeQty;
                Assert.isFalse(remainQty < 0,
                               Errors.create().key(MessageIdList.PART_INVENTORY_NOT_ENOUGH).args(remainQty).build());
                //inventory maintain
                consumeMaterialFromWarehouseForPms(material, consumeQty, part.getConsumePmId());

            }
        }

    }

    private void consumeMaterialFromWarehouseForPms(MaterialDO material, int consumeQty, String pmId) {
        long facilityRrn = LocalContext.getFacilityRrn();
        WarehouseTransBO warehouseTrans;
        LotInventoryDO lotInventory;
        Operation warehouse = operationManager.getOperation(SystemConstant.PmSchedule.PARTS_BANK, facilityRrn);
        List<WarehouseTransBO> convertTrans = new ArrayList<>();
        //找到需要消耗的物料的批次
        List<LotInventoryDO> lids = lotInventoryManager.getAvailableLotInventory(material.getInstanceRrn(),
                                                                                 warehouse.getInstanceRrn(), null);
        Assert.isFalse(lids == null || lids.isEmpty(),
                       Errors.create().key(MessageIdList.NO_HAVE_PART_LOT).content("No material lot available")
                             .build());
        String lotNumber = "";
        int remainQty = consumeQty;
        int consume;
        for (LotInventoryDO lid : lids) {
            //多个LotNumber消耗
            if (lid.getTotalQuantity() <= 0) {
                continue;
            }
            if (remainQty <= 0) {
                break;
            }
            if (lid.getTotalQuantity() > remainQty) {
                consume = remainQty;
                remainQty = remainQty - consumeQty;
            } else {
                consume = lid.getTotalQuantity().intValue();
                remainQty = remainQty - consume;
            }
            lotNumber = lid.getLotNumber();
            Double qty = NumberUtils.toDouble(Integer.toString(consume));
            lotInventory = lotInventoryManager.getLotInventory(lotNumber, material.getInstanceRrn(),
                                                               warehouse.getInstanceRrn());
            lotInventory.setReceiptQty(0D);
            lotInventory.setAdjustQty(0D);
            lotInventory.setIssueQty(qty);

            warehouseTrans = new WarehouseTransBO(lotInventory);
            warehouseTrans.setTransComments(SystemConstant.PmSchedule.PM_END_CONSUME + pmId);
            warehouseTrans.setTransQty(qty);
            convertTrans.add(warehouseTrans);
        }

        warehouseManager.consumeMaterialFromWarehouse4Pms(facilityRrn, LocalContext.getUserId(), convertTrans);

    }

    /**
     * pm start的时候,如果选中有chamber主机台设备,则同时操作所有chamber设备
     *
     * @param parentEqptRrn chamber主机台设备rrn
     * @param event         logevent 事件对象
     * @param changedRrnMap chamber设备已经做过的设备rrn map<rrn, rrn>
     * @return 不能执行PM的chamber设备id,多个id用逗号分隔
     */
    private String autoPmStartForChildEqpt(long parentEqptRrn, Event event, String userId, String comment,
                                           Map<Long, Long> changedRrnMap) {
        return autoChildEqptPmOfSE(parentEqptRrn, event, userId, comment, changedRrnMap, TransactionNames.PMS_START);
    }

    /**
     * pm end的时候,如果选中有chamber主机台设备,则同时操作所有chamber设备
     *
     * @param parentEqptRrn chamber主机台设备rrn
     * @param event         logevent 事件对象
     * @param changedRrnMap chamber设备已经做过的设备rrn map<rrn, rrn>
     * @return 不能执行PM的chamber设备id,多个id用逗号分隔
     */
    private String autoPmEndForChildEqpt(long parentEqptRrn, Event event, String userId, String comment,
                                         Map<Long, Long> changedRrnMap) {
        return autoChildEqptPmOfSE(parentEqptRrn, event, userId, comment, changedRrnMap, TransactionNames.PMS_END);
    }

    /**
     * 构建一个新的修改后的的PM对象
     *
     * @param transId
     * @param oldPms  原PM对象
     * @return 新new的一个PmsSchedule对象,对象中的数据是修改后的信息
     */
    private PmsSchedule buildNewPmsScheduleForSE(String transId, PmsSchedule oldPms) {
        PmsSchedule ms = new PmsSchedule();
        if (StringUtils.equals(TransactionNames.PMS_END, transId)) {
            ms.setTriggerReading(StringUtils.UPDATE_COLUMN_NULL_FLAG);
            if (PmControlTypeEnum.PM_COUNT.name().equalsIgnoreCase(oldPms.getControlType())
                    || PmControlTypeEnum.PM_TRIGGER_READING.name().equalsIgnoreCase(oldPms.getControlType())) {
                ms.setCreateDate(new Date());
            } else {
                // PM END 操作重新计算next pm time
                if (StringUtils.equalsIgnoreCase(oldPms.getPmTimeType(), "static")) {
                    Date nextPmBaseDate = oldPms.getNextPmTime();
                    long cycleTimes = (long) (oldPms.getCycleTime() * 24 * 60 * 60 * 1000);
                    ms.setNextPmTime(new Date(nextPmBaseDate.getTime() + cycleTimes));
                } else {
                    String setPmTimeStr = DateUtils.formatDate(oldPms.getNextPmTime());
                    String setTime = setPmTimeStr.split(" ")[1];
                    String newDay = DateUtils.formatDate(new Date(), DateUtils.DATE_FORMAT4DAY);
                    setPmTimeStr = newDay + " " + setTime;
                    Date nextPmBaseDate = DateUtils.parse(setPmTimeStr, DateUtils.DATE_FORMAT);
                    long cycleTimes = (long) (oldPms.getCycleTime() * 24 * 60 * 60 * 1000);
                    //long toleranceTime = (long) (oldPms.getToleranceTime() * 24 * 60 * 60 * 1000);
                    ms.setNextPmTime(new Date(nextPmBaseDate.getTime() + cycleTimes));
                }
            }
            //PM END 的时候需要重置TriggerMaintain里的TriggerReading
            ms.setObjectRrn(oldPms.getObjectRrn());
            ms.setTriggerCode(oldPms.getTriggerCode());
            ms.setTriggerCodeSpec(oldPms.getTriggerCodeSpec());
            ms.setControlType(oldPms.getControlType());
        }

        ms.setPmRrn(oldPms.getPmRrn());
        ms.setComment(oldPms.getComment());
        ms.setCreateUserId(oldPms.getCreateUserId());
        ms.setPmId(oldPms.getPmId());
        ms.setObjectId(oldPms.getObjectId());
        ms.setPmType(oldPms.getPmType());
        ms.setPmItemDesc(oldPms.getPmItemDesc());
        ms.setTransId(transId);
        return ms;
    }

    private void autoEvent4Entity(Event event, Long entityRrn, String userId, String comments) {
        List<EventModel> eventModels = eventManager.getEventModels(event.getInstanceRrn(), entityRrn);
        List<EntityStatus> entityStatuss = new ArrayList<>();
        for (EventModel instance : eventModels) {
            EntityStatus entityStatus = new EntityStatus();
            entityStatus.setCurrentStatus(instance.getTargetStatus());
            entityStatus.setStatusGroupId(instance.getStatusGroupId());
            entityStatus.setStatusBefore(instance.getCurrentStatus());
            entityStatus.setEntityRrn(entityRrn);
            entityStatuss.add(entityStatus);
        }
        boolean boo = statusManager.checkEnableLogEvent(event.getInstanceRrn(), entityRrn);
        if (boo) {
            HashMap<String, Object> map = new HashMap<>();
            map.put("event", event);
            map.put("user", userId);
            map.put("comments", comments);
            map.put("comments1", "");
            map.put("comments2", "");
            map.put("statusEndTime", DateUtils.getNowTime());
            map.put("entityrrn", entityRrn);
            statusManager.updateEntityStatus(entityStatuss, map);//操作chamber 设备
            //如果为down 或者 wait_eng 集联更新
            statusManager.updateParentEntityByChamberAllInSameState(entityStatuss, map,
                                                                    Arrays.asList(EventName.WAIT_ENG, EventName.DOWN));
        }
    }

    /**
     * pms的目标设备中是否含有chamber主机台设备
     *
     * @param list pm的设备集合
     * @return 返回chamber主机台设备rrn;返回 0 表示没有chamber主机台设备
     */
    private long getParentEqptFromPms(List<PmsSchedule> list) {
        if (CollectionUtils.isNotEmpty(list)) {
            for (PmsSchedule pmsSchedule : list) {
                long entityRrn = pmsSchedule.getChamberRrn() != null &&
                        pmsSchedule.getChamberRrn() > 0 ? pmsSchedule.getChamberRrn() : pmsSchedule.getObjectRrn();
                if (pmsScheduleDao.checkIsParentEqpt(entityRrn)) {
                    return entityRrn;
                }
            }
        }
        return 0;
    }

}