ResistManagerImpl.java

package com.mycim.server.resist.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.oid.IDGenerators;
import com.mycim.framework.oid.type.IDNames;
import com.mycim.framework.oid.type.SequenceNames;
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.server.base.manager.EventManager;
import com.mycim.server.base.manager.NamedObjectManager;
import com.mycim.server.base.manager.TransactionLogManager;
import com.mycim.server.ems.manager.EntityManager;
import com.mycim.server.resist.dao.ResistDAO;
import com.mycim.server.resist.manager.ResistManager;
import com.mycim.server.resist.manager.ResistRcpMappingManager;
import com.mycim.server.resist.manager.ResistStatusManager;
import com.mycim.server.status.manager.StatusManager;
import com.mycim.server.wip.manager.LotManager;
import com.mycim.utils.CheckRegexUtils;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.bas.TransactionLog;
import com.mycim.valueobject.consts.EventName;
import com.mycim.valueobject.consts.TransactionNames;
import com.mycim.valueobject.ems.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.regex.Pattern;

/**
 * @author yanbing.chen
 * @version 6.0.0
 * @date 2019/10/29
 **/
@Service
@Transactional
public class ResistManagerImpl implements ResistManager {

    @Autowired
    ResistDAO resistDAO;

    @Autowired
    TransactionLogManager transactionLogManager;

    @Autowired
    NamedObjectManager namedObjectManager;

    @Autowired
    EntityManager entityManager;

    @Autowired
    StatusManager statusManager;

    @Autowired
    EventManager eventManager;

    @Autowired
    LotManager lotManager;

    @Autowired
    ResistRcpMappingManager resistRcpMappingManager;

    @Autowired
    ResistStatusManager resistStatusManager;

    @Override
    public Page qryResistByPage(Page page, Map<String, Object> argMap) {
        return resistDAO.qryResistByPage(page, argMap);
    }

    @Override
    public String buildResistErrorInfo(String recipeId, Equipment equipment) {
        StringBuilder sb = new StringBuilder();

        Map<String, Object> argMap = new HashMap<>();
        if (StringUtils.isBlank(equipment.getInstanceId()) || StringUtils.isBlank(recipeId)) {
            return StringUtils.EMPTY;
        }
        String mainEqpt = StringUtils.substringBeforeLast(equipment.getInstanceId(), "_");
        argMap.put("eqptId", mainEqpt);

        Page page = new Page(1, Long.MAX_VALUE);
        page = this.qryResistByPage(page, argMap);

        List<Resist> resistList = (List<Resist>) page.getResults();

        if (CollectionUtils.isNotEmpty(resistList)) {
            for (Resist resist : resistList) {
                boolean recipeMatchFlag = false;
                List<ResistRcpMapping> resistRcpMapping = getResistRcpMapping(resist.getResistNo());
                for (ResistRcpMapping mapping : resistRcpMapping) {
                    String recipe = mapping.getRecipe();
                    if (StringUtils.isNotBlank(recipeId)) {
                        String regex = recipe
                                .replaceAll(CheckRegexUtils.LOT_SAMPLING_SPLIT_KEY, CheckRegexUtils.REPLACE_SPLIT_KEY)
                                .replaceAll(CheckRegexUtils.REGEX_KEY, CheckRegexUtils.LOT_SAMPLING_REPLACE_REGEX_KEY);

                        if ((Pattern
                                .matches(CheckRegexUtils.REGEX_START + regex + CheckRegexUtils.REGEX_END, recipeId)) ||
                                StringUtils.equals(CheckRegexUtils.SEARCH_MATCH_KEY, recipeId)) {
                            recipeMatchFlag = true;
                        }
                    }
                }
                if (recipeMatchFlag) {

                    //resist过期与EMPTY,HOLD的处理方式一致,expireFlag用于提示过期
                    boolean expireFlag = DateUtils.parse(resist.getActualExpireDate(), DateUtils.DATE_FORMAT4DATE)
                                                  .before(new Date());
                    if (!StringUtils.equalsIgnoreCase(resist.getCurrentEntityStatus(), ResistEnum.INUSE.getValue()) ||
                            expireFlag) {
                        sb.append("Resist: ").append(resist.getInstanceId());
                        sb.append(" the recipe is matched Resist Rcp Mapping!");
                        sb.append(" status is ").append(resist.getCurrentEntityStatus());
                        sb.append("!  ");
                        if (expireFlag) {
                            sb.append(" Resist reached expired time !");
                        }

                    }
                }

            }
        }
        return sb.toString();
    }

    @Override
    public Boolean hasVendorBarodeReceived(String vendorBarcode) {
        return resistDAO.hasVendorBarodeReceived(vendorBarcode);
    }

    @Override
    public Boolean hasResistIdReceived(String resistId) {
        return resistDAO.hasResistIdReceived(resistId);
    }

    @Override
    public Long getMaxSerialNumber(String resistNo) {
        return resistDAO.getMaxSerialNumber(resistNo);
    }

    @Override
    public void addResist(Resist resist) {
        long instanceRrn = 0;

        // resist resist_h 以及状态初始
        TransactionLog transactionLog = transactionLogManager
                .startTransactionLog(resist.getModifyBy(), TransactionNames.CREATE_KEY);
        instanceRrn = Long
                .parseLong(IDGenerators.get(IDNames.SEQUENCE).generateId(SequenceNames.MODULE_SEQ_OBJECT_RRN));
        resist.setInstanceRrn(instanceRrn);
        resist.setMaskSize(StringUtils.EMPTY);

        resist.setPrevEntityStatus(StringUtils.EMPTY);

        resist.setTransRrn(transactionLog.getTransRrn());
        resist.setTransSequence(1);
        resist.setTransId(transactionLog.getTransId());
        resistDAO.addResist(resist);
        //初始化resist状态
        resistStatusManager.initResistStatus(EventName.INIT_RESIST, resist);
        ResistStatus resistStatus = new ResistStatus();
        resistStatus.setResistSysRrn(instanceRrn);
        ResistStatus resistStatusEnd = resistStatusManager.getResistStatus(resistStatus);
        resist.setCurrentEntityStatus(resistStatusEnd.getCurrentStatus());

        this.updateResistAvailability(resist, EventName.INIT_RESIST);
        //插入历史表
        addResistH(resist);

        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public Resist getResistByResistId(String instanceId) {
        Resist resist = resistDAO.getResistByResistId(instanceId);

        if (resist != null && resist.getInstanceRrn() > 0) {
            ResistStatus resistStatus = new ResistStatus();
            resistStatus.setResistSysRrn(resist.getInstanceRrn());
            resist.setPrevEntityStatus(resistStatusManager.getPreResistStatus(resistStatus));// 释放的时候使用
        }

        return resist;
    }

    @Override
    public Resist getRecommendResist(Resist resist) {
        return resistDAO.getRecommendResist(resist);
    }

    @Override
    public void modifyResistExpireDate(Resist resist) {
        TransactionLog transactionLog = transactionLogManager
                .startTransactionLog(resist.getModifyBy(), TransactionNames.MODIFY_KEY);
        resistDAO.modifyResistExpireDate(resist);
        ResistStatus resistStatus = new ResistStatus();
        resistStatus.setResistSysRrn(resist.getInstanceRrn());
        resistStatus = resistStatusManager.getResistStatus(resistStatus);
        resist.setPrevEntityStatus(resistStatus.getCurrentStatus());
        resist.setCurrentEntityStatus(resistStatus.getCurrentStatus());
        resist.setTransRrn(transactionLog.getTransRrn());
        resist.setTransSequence(1);
        resist.setTransId(transactionLog.getTransId());
        addResistH(resist);
        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public void changeResistStatus(Map transMap) {
        Resist resist = (Resist) transMap.get("resist");
        String eventId = MapUtils.getString(transMap, "eventId");
        String comments = MapUtils.getString(transMap, "comments");
        TransactionLog transactionLog = transactionLogManager
                .startTransactionLog(resist.getModifyBy(), TransactionNames.MODIFY_KEY);

        ResistStatus resistStatus = new ResistStatus();
        resistStatus.setResistSysRrn(resist.getInstanceRrn());
        resistStatus = resistStatusManager.getResistStatus(resistStatus);
        String currentStatus = resistStatus.getCurrentStatus();
        long transRrn = resistStatusManager.changeResistStatus(resist, ObjectList.RESIST_KEY, eventId, comments);
        ResistStatus targetStatus = resistStatusManager.getResistStatus(resistStatus);

        resistDAO.modifyResistExpireDate(resist);
        resist.setTransRrn(transRrn);
        resist.setTransSequence(1);
        resist.setPrevEntityStatus(currentStatus);
        resist.setCurrentEntityStatus(targetStatus.getCurrentStatus());
        resist.setComments(comments);
        resist.setTransId(transactionLog.getTransId());
        addResistH(resist);
        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public void deleteResist(Resist resist) {
        TransactionLog transactionLog = transactionLogManager
                .startTransactionLog(resist.getModifyBy(), TransactionNames.DELETE_KEY);

        //namedObjectExtManager.deleteNamedObjectExt(resist.getInstanceRrn());
        //entityManager.deleteEntity(new Entity(resist.getInstanceRrn()));
        resist.setTransRrn(transactionLog.getTransRrn());
        resist.setModifyTime(new Date());
        resist.setTransSequence(1);
        resist.setTransId(transactionLog.getTransId());
        //插入历史
        addResistH(resist);
        resistDAO.deleteResist(resist.getInstanceRrn());
        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public void resistMoveInAndRemove(String eventId, Resist resist) {
        ResistStatus resistStatus = new ResistStatus();
        resistStatus.setResistSysRrn(resist.getInstanceRrn());
        resistStatus = resistStatusManager.getResistStatus(resistStatus);
        TransactionLog transactionLog = transactionLogManager
                .startTransactionLog(resist.getModifyBy(), TransactionNames.MODIFY_KEY);
        Long transRrn = resistStatusManager
                .changeResistStatus(resist, ObjectList.RESIST_KEY, eventId, resist.getComments());

        ResistStatus targetStatus = resistStatusManager.getResistStatus(resistStatus);

        resist.setTransRrn(transRrn);
        resist.setTransSequence(1);
        resist.setPrevEntityStatus(resistStatus.getCurrentStatus());
        resist.setCurrentEntityStatus(targetStatus.getCurrentStatus());
        resist.setTransId(transactionLog.getTransId());
        resistDAO.modifyResistEqptInfo(resist);
        addResistH(resist);
        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public void resistExchange(Resist oldResist, Resist newResist, String targetEventIdForOld,
                               String targetEventIdForNew) {
        ResistStatus resistStatus = new ResistStatus();
        resistStatus.setResistSysRrn(oldResist.getInstanceRrn());
        resistStatus = resistStatusManager.getResistStatus(resistStatus);
        TransactionLog transactionLog = transactionLogManager
                .startTransactionLog(LocalContext.getUserId(), TransactionNames.MODIFY_KEY);

        String comments = "Exchange Old resist,new resist is: " + newResist.getInstanceId();
        Long transRrn = resistStatusManager
                .changeResistStatus(oldResist, ObjectList.RESIST_KEY, targetEventIdForOld, comments);
        ResistStatus targetStatus = resistStatusManager.getResistStatus(resistStatus);

        oldResist.setTransRrn(transRrn);
        oldResist.setTransSequence(1);
        oldResist.setPrevEntityStatus(resistStatus.getCurrentStatus());
        oldResist.setCurrentEntityStatus(targetStatus.getCurrentStatus());
        oldResist.setComments(comments);
        oldResist.setTransId(transactionLog.getTransId());
        resistDAO.modifyResistEqptInfo(oldResist);
        addResistH(oldResist);

        resistStatus.setResistSysRrn(newResist.getInstanceRrn());
        resistStatus = resistStatusManager.getResistStatus(resistStatus);

        comments = "Exchange Old resist,old resist is: " + oldResist.getInstanceId();

        transRrn = resistStatusManager
                .changeResistStatus(newResist, ObjectList.RESIST_KEY, targetEventIdForNew, comments);
        targetStatus = resistStatusManager.getResistStatus(resistStatus);
        newResist.setTransRrn(transRrn);
        newResist.setTransSequence(1);
        newResist.setPrevEntityStatus(resistStatus.getCurrentStatus());
        newResist.setCurrentEntityStatus(targetStatus.getCurrentStatus());
        newResist.setComments(comments);
        newResist.setTransId(transactionLog.getTransId());
        resistDAO.modifyResistEqptInfo(newResist);
        addResistH(newResist);
        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public Page qryResistHistByPage(Map<String, Object> paramMap, Page page) {
        if (StringUtils.isNotBlank(MapUtils.getString(paramMap, "instanceId"))) {
            paramMap.put("instanceId",
                         StringUtils.replace(MapUtils.getString(paramMap, "instanceId"), "*", "%").toString());
        }

        if (StringUtils.isNotBlank(MapUtils.getString(paramMap, "resistNo"))) {
            paramMap.put("resistNo",
                         StringUtils.replace(MapUtils.getString(paramMap, "resistNo"), "*", "%").toString());
        }

        if (StringUtils.isNotBlank(MapUtils.getString(paramMap, "materialNo"))) {
            paramMap.put("materialNo",
                         StringUtils.replace(MapUtils.getString(paramMap, "materialNo"), "*", "%").toString());
        }

        if (StringUtils.isNotBlank(MapUtils.getString(paramMap, "resistName"))) {
            paramMap.put("resistName",
                         StringUtils.replace(MapUtils.getString(paramMap, "resistName"), "*", "%").toString());
        }

        if (StringUtils.isNotBlank(MapUtils.getString(paramMap, "eqptId"))) {
            paramMap.put("eqptId", StringUtils
                    .trimToUpperCase(StringUtils.replace(MapUtils.getString(paramMap, "eqptId"), "*", "%").toString()));
        }

        if (StringUtils.isNotBlank(MapUtils.getString(paramMap, "modifyBy"))) {
            paramMap.put("modifyBy",
                         StringUtils.replace(MapUtils.getString(paramMap, "modifyBy"), "*", "%").toString());
        }

        if (StringUtils.isNotBlank(MapUtils.getString(paramMap, "modifyStartDate"))) {
            paramMap.put("modifyStartDate",
                         StringUtils.replace(MapUtils.getString(paramMap, "modifyStartDate"), "*", "%").toString());
        }

        if (StringUtils.isNotBlank(MapUtils.getString(paramMap, "modifyEndDate"))) {
            paramMap.put("modifyEndDate",
                         StringUtils.replace(MapUtils.getString(paramMap, "modifyEndDate"), "*", "%").toString());
        }

        return resistDAO.qryResistHistByPage(paramMap, page);
    }

    @Override
    public void defrostAllResist() {
        Map<String, Object> argMap = new HashMap<String, Object>();
        argMap.put("resistStatus", Arrays.asList(new String[]{ResistEnum.DEFROSTING.getValue()}));

        Page page = new Page(1, Long.MAX_VALUE);
        page = this.qryResistByPage(page, argMap);

        Collection resistList = page.getResults();

        String eventId = EventName.RESIST_DEFROSTING_TO_READY;

        if (resistList != null && !resistList.isEmpty()) {

            Iterator<Resist> it = resistList.iterator();

            while (it.hasNext()) {

                Resist resist = it.next();

                if (resist.getCreateTime().getTime() + DateUtils.getSecondsTime(resist.getDefrostTime()) * 1000L <=
                        System.currentTimeMillis()) {
                    Map<String, Object> transMap = new HashMap<String, Object>();

                    resist.setModifyBy("SYSTEM");
                    transMap.put("resist", resist);
                    transMap.put("eventId", eventId);
                    transMap.put("comments", "Auto defrosting");
                    this.changeResistStatus(transMap);
                }
            }
        }
    }

    @Override
    public void holdExpireResist() {
        Map<String, Object> argMap = new HashMap<String, Object>();
        argMap.put("resistStatus",
                   Arrays.asList(new String[]{ResistEnum.READY.getValue(), ResistEnum.INUSE.getValue()}));

        Page page = new Page(1, Long.MAX_VALUE);
        page = this.qryResistByPage(page, argMap);

        Collection resistList = page.getResults();

        String targetResistStatus = ResistEnum.HOLD.getValue();

        if (resistList != null && !resistList.isEmpty()) {
            Iterator<Resist> it = resistList.iterator();

            while (it.hasNext()) {
                Resist resist = it.next();

                if (DateUtils.parse(resist.getActualExpireDate(), DateUtils.DATE_FORMAT4DATE).before(new Date())) {
                    Map<String, Object> transMap = new HashMap<String, Object>();
                    Long facilityRrn = LocalContext.getFacilityRrn();
                    String targetEventId = getResistEventIdBy2Status(resist.getInstanceRrn(),
                                                                     resist.getCurrentEntityStatus(),
                                                                     targetResistStatus);

                    if (StringUtils.isNotEmpty(targetEventId)) {
                        resist.setModifyBy("SYSTEM");
                        transMap.put("facilityRrn", facilityRrn);
                        transMap.put("resist", resist);
                        transMap.put("eventId", targetEventId);
                        transMap.put("comments", "Auto hold expire resist");
                        resist.setComments("Auto hold expire resist");

                        this.changeResistStatus(transMap);

                        if (StringUtils
                                .equalsIgnoreCase(resist.getCurrentEntityStatus(), ResistEnum.INUSE.getValue()) &&
                                StringUtils.isNotBlank(resist.getEqptId())) {

                            Long entityRrn = namedObjectManager
                                    .getNamedObjectRrn(resist.getEqptId(), facilityRrn, ObjectList.ENTITY_KEY);


                            String currentStatus = entityManager.getEntityCurrentStatus(entityRrn);

                            String targetStatus = EventName.WAIT_ENG;

                            String eventId = eventManager
                                    .getEventIdBy2Status(facilityRrn, entityRrn, currentStatus, targetStatus);

                            // 表示需要从当前状态切换成wait eng
                            if (StringUtils.isNotBlank(eventId)) {

                                statusManager
                                        .changePCDStatusByEvent(facilityRrn, "SYSTEM", entityRrn, ObjectList.ENTITY_KEY,
                                                                eventId, "Resist: " + resist.getInstanceId() + " has " +
                                                                        "reached expire time,auto wait " + "eng");

                                Map holdInfo = new HashMap();
                                holdInfo.put("holdCode", "WAIT_ENG");
                                holdInfo.put("holdReasons",
                                             "Resist: " + resist.getInstanceId() + " has reached expire time,eqpt " +
                                                     "auto wait eng");
                                holdInfo.put("userId", "SYSTEM");
                                lotManager.holdRunningLotByEqpWaitENG(entityRrn, holdInfo);
                            }
                        }
                    }
                }
            }
        }
    }

    @Override
    public void updateResistAvailability(Resist resist, String eventId) {
        long eventRrn = namedObjectManager.getNamedObjectRrn(eventId, resist.getNamedSpace(), ObjectList.EVENT_KEY);
        Assert.isFalse(eventRrn == 0, Errors.create().content("Event: {} not found").args(eventId).build());
        resistDAO.updateResistAvailability(eventRrn, resist.getInstanceRrn());
    }

    @Override
    public Resist getResistByResistRrn(long resistRrn) {
        return resistDAO.getResistByResistRrn(resistRrn);
    }

    @Override
    public void addResistH(Resist resist) {
        Resist addResistH = resistDAO.getResistByResistRrn(resist.getInstanceRrn());
        addResistH.buildExpireInfo();
        resist.setExpireDate(addResistH.getActualExpireDate());
        resistDAO.addResistH(resist);
    }

    @Override
    public String getResistEventIdBy2Status(long resistRrn, String currentStatus, String targetStatus) {
        List<Map> eventList = resistDAO.getResistEventIdBy2Status(resistRrn, currentStatus, targetStatus);
        if (CollectionUtils.isNotEmpty(eventList)) {
            for (Map<String, Object> eventMap : eventList) {
                return MapUtils.getString(eventMap, "eventId", StringUtils.EMPTY);
            }
        }
        return StringUtils.EMPTY;
    }

    @Override
    public List<EventModel> getResistEventModels(long eventRrn, long resistRrn) {
        return resistDAO.getResistEventModels(eventRrn, resistRrn);
    }

    private List<ResistRcpMapping> getResistRcpMapping(String resistNo) {
        Page page = new Page(1, Long.MAX_VALUE);
        ResistRcpMapping resistRcpMapping = new ResistRcpMapping(resistNo, null);
        page = resistRcpMappingManager.qryResistRcpMappingByPage(resistRcpMapping, page);
        return (List<ResistRcpMapping>) page.getResults();
    }


}