PiLotReqManagerImpl.java

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

import com.fa.sesa.i18n.I18nUtils;
import com.fa.sesa.threadlocal.LocalContext;
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.beans.BeanUtils;
import com.mycim.framework.utils.lang.ObjectUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.time.DateUtils;
import com.mycim.server.base.manager.TransactionLogManager;
import com.mycim.server.ems.manager.EquipmentManager;
import com.mycim.server.pilot.dao.PiLotReqDAO;
import com.mycim.server.pilot.manager.PiLotCheckManager;
import com.mycim.server.pilot.manager.PiLotReqManager;
import com.mycim.server.wip.manager.*;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.bas.TransactionLog;
import com.mycim.valueobject.consts.PiLotStatusEnum;
import com.mycim.valueobject.consts.PiLotTypeEnum;
import com.mycim.valueobject.consts.TransactionNames;
import com.mycim.valueobject.ems.Equipment;
import com.mycim.valueobject.ems.pilot.*;
import com.mycim.valueobject.wip.Lot;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * @author songpy
 * @version 1.0.0
 * @date 2021/8/26
 **/
@Service
@Transactional
public class PiLotReqManagerImpl implements PiLotReqManager {
    @Autowired
    PiLotInqManager piLotInqManager;

    @Autowired
    private TransactionLogManager transactionLogManager;

    @Autowired
    private EquipmentManager equipmentManager;

    @Autowired
    private PiLotCheckManager piLotCheckManager;

    @Autowired
    private PiLotReqDAO dao;

    @Autowired
    private EenActionManager eenActionManager;

    @Autowired
    private LotTransHistoryReqManager lotTransHistoryReqManager;

    @Autowired
    private LotInqManager lotInqManager;

    @Override
    public void addPiLotSetup(PiLotSetup piLotSetup, TransactionLog transactionLog) {
        piLotSetup.setPiLotRrn(
                Long.valueOf(IDGenerators.get(IDNames.SEQUENCE).generateId(SequenceNames.MODULE_SEQ_OBJECT_RRN)));
        piLotSetup.setCreateUserRrn(LocalContext.getUserRrn());
        piLotSetup.setCreateTime(transactionLog.getTransStartTimestamp());
        piLotSetup.setUpdateUserRrn(LocalContext.getUserRrn());
        piLotSetup.setUpdateTime(transactionLog.getTransStartTimestamp());
        piLotSetup.setPiLotId(initPiLotId(piLotSetup));
        piLotSetup.setStatus(PiLotStatusEnum.CREATED.toString());
        dao.insertPiLotSetup(piLotSetup);

        if (Objects.nonNull(piLotSetup.getIdle())) {
            dao.insertPiLotSetupIdle(piLotSetup, piLotSetup.getIdle());
            insertPiLotSetupIdleHistory(piLotSetup, piLotSetup.getIdle(), transactionLog);
        } else if (Objects.nonNull(piLotSetup.getPm())) {
            dao.insertPiLotSetupPM(piLotSetup, piLotSetup.getPm());
            insertPiLotSetupPMHistory(piLotSetup, piLotSetup.getPm(), transactionLog);
        } else if (Objects.nonNull(piLotSetup.getCount())) {
            dao.insertPiLotSetupCount(piLotSetup, piLotSetup.getCount());
            insertPiLotSetupCountHistory(piLotSetup, piLotSetup.getCount(), transactionLog);
        } else if (Objects.nonNull(piLotSetup.getRcpGrp())) {
            dao.insertPiLotSetupRcpGrp(piLotSetup, piLotSetup.getRcpGrp());
            insertPiLotSetupRcpGrpHistory(piLotSetup, piLotSetup.getRcpGrp(), transactionLog);
        }

        piLotSetup = piLotInqManager.getPiLotSetupByRrn(piLotSetup.getPiLotRrn());
        insertPiLotSetupHistory(piLotSetup, transactionLog);
    }

    @Override
    public void updatePiLotSetup(PiLotSetup piLotSetup, TransactionLog transactionLog) {
        piLotSetup.setUpdateUserRrn(LocalContext.getUserRrn());
        piLotSetup.setUpdateTime(transactionLog.getTransStartTimestamp());
        dao.updatePiLotSetup(piLotSetup);
        if (Objects.nonNull(piLotSetup.getIdle())) {
            dao.updatePiLotSetupIdle(piLotSetup, piLotSetup.getIdle());
            insertPiLotSetupIdleHistory(piLotSetup, piLotSetup.getIdle(), transactionLog);
        } else if (Objects.nonNull(piLotSetup.getPm())) {
            dao.updatePiLotSetupPM(piLotSetup, piLotSetup.getPm());
            insertPiLotSetupPMHistory(piLotSetup, piLotSetup.getPm(), transactionLog);
        } else if (Objects.nonNull(piLotSetup.getCount())) {
            dao.updatePiLotSetupCount(piLotSetup, piLotSetup.getCount());
            insertPiLotSetupCountHistory(piLotSetup, piLotSetup.getCount(), transactionLog);
        } else if (Objects.nonNull(piLotSetup.getRcpGrp())) {
            dao.updatePiLotSetupRcpGrp(piLotSetup, piLotSetup.getRcpGrp());
            insertPiLotSetupRcpGrpHistory(piLotSetup, piLotSetup.getRcpGrp(), transactionLog);
        }

        piLotSetup = piLotInqManager.getPiLotSetupByRrn(piLotSetup.getPiLotRrn());
        insertPiLotSetupHistory(piLotSetup, transactionLog);
    }

    @Override
    public void deletePiLotSetup(Long piLotSetupRrn, TransactionLog transactionLog) {
        insertPiLotSetupHistory(piLotInqManager.getPiLotSetupByRrn(piLotSetupRrn), transactionLog);
        dao.deletePiLotSetup(piLotSetupRrn);
    }

    @Override
    public void createPiLotView(PiLotSetup piLotSetup) {
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(LocalContext.getUserId(),
                                                                                  TransactionNames.CREATE_KEY +
                                                                                          " VIEW");
        createPiLotView(piLotSetup, transactionLog);
        piLotSetup.setStatus(PiLotStatusEnum.ONGOING.toString());
        updatePiLotSetup(piLotSetup, transactionLog);
    }

    @Override
    public void savePiLotView(PiLotView piLotView, TransactionLog transactionLog) {
        String comments = piLotView.getComments();
        piLotView.setUpdateUserRrn(LocalContext.getUserRrn());
        piLotView.setUpdateTime(transactionLog.getTransStartTimestamp());
        dao.updatePiLotView(piLotView);

        piLotView = piLotInqManager.getPiLotViewByRrn(piLotView.getViewRrn());
        piLotView.setComments(comments);
        insertPiLotViewHistory(piLotView, transactionLog);
    }

    @Override
    public void updateRcpGrp(PiLotRcpGrp piLotRcpGrp, TransactionLog transactionLog) {
        piLotRcpGrp.setUpdateUserRrn(LocalContext.getUserRrn());
        piLotRcpGrp.setUpdateTime(transactionLog.getTransStartTimestamp());
        dao.updatePiLotRcpGrp(piLotRcpGrp);
        piLotRcpGrp = piLotInqManager.getPiLotRcpGrpByRrn(piLotRcpGrp.getRcpGrpRrn());
        insertPiLotRcpGrpHistory(piLotRcpGrp, transactionLog);
    }

    @Override
    public void addRcpGrp(PiLotRcpGrp piLotRcpGrp, TransactionLog transactionLog) {
        piLotRcpGrp.setRcpGrpRrn(
                Long.valueOf(IDGenerators.get(IDNames.SEQUENCE).generateId(SequenceNames.MODULE_SEQ_OBJECT_RRN)));
        piLotRcpGrp.setCreateUserRrn(LocalContext.getUserRrn());
        piLotRcpGrp.setCreateTime(transactionLog.getTransStartTimestamp());
        piLotRcpGrp.setUpdateUserRrn(LocalContext.getUserRrn());
        piLotRcpGrp.setUpdateTime(transactionLog.getTransStartTimestamp());
        dao.insertPiLotRcpGrp(piLotRcpGrp);

        piLotRcpGrp = piLotInqManager.getPiLotRcpGrpByRrn(piLotRcpGrp.getRcpGrpRrn());
        insertPiLotRcpGrpHistory(piLotRcpGrp, transactionLog);
    }

    @Override
    public void addRcpToGrp(PiLotRcpMaping piLotRcpMaping, TransactionLog transactionLog) {
        dao.insertPiLotRcpMapping(piLotRcpMaping);
        insertPiLotRcpMappingHistory(piLotRcpMaping, transactionLog);
    }

    @Override
    public void deleteRcpFromGrp(PiLotRcpMaping piLotRcpMaping, TransactionLog transactionLog) {
        insertPiLotRcpMappingHistory(piLotRcpMaping, transactionLog);
        dao.deletePiLotRcpMapping(piLotRcpMaping);
    }

    @Override
    public void completePiLotFlow(Long lotRrn) {
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(LocalContext.getUserId(),
                                                                                  TransactionNames.PI_LOT_COMPLETE_FLOW);
        PiLotView view = piLotInqManager.getPiLotViewByLotRrn(lotRrn);
        view.setComplete(true);
        savePiLotView(view, transactionLog);
        createPilotFlowLotTransHistory(null, view);
    }

    @Override
    public void updatePiLotStatusBySplit(Lot lot, Lot childLot) {
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(LocalContext.getUserId(),
                                                                                  TransactionNames.SPLIT_KEY);

        PiLotView view = piLotInqManager.getPiLotViewByLotRrn(lot.getLotRrn());
        PiLotSetup setup = piLotInqManager.getPiLotSetupByRrn(view.getPiLotRrn());

        view.setStatus(PiLotStatusEnum.WAITMERGE.toString());
        view.setCanSplit(false);
        view.setChildLotRrn(childLot.getLotRrn());
        view.setChildLotId(childLot.getLotId());
        savePiLotView(view, transactionLog);

        setup.setStatus(PiLotStatusEnum.WAITMERGE.toString());
        updatePiLotSetup(setup, transactionLog);
        createPilotFlowLotTransHistory(null, view);
    }

    @Override
    public void meregePiLot(Long basedLotRrn, TransactionLog transactionLog) {
        PiLotView view = piLotInqManager.getPiLotViewByLotRrn(basedLotRrn);
        view.setStatus(PiLotStatusEnum.CLOSE.toString());
        savePiLotView(view, transactionLog);

        PiLotSetup setup = piLotInqManager.getPiLotSetupByRrn(view.getPiLotRrn());
        setup.setStatus(PiLotStatusEnum.CREATED.toString());
        updatePiLotSetup(setup, transactionLog);
    }

    private void insertPiLotSetupRcpGrpHistory(PiLotSetup piLotSetup, RcpGrpType rcpGrp,
                                               TransactionLog transactionLog) {
        RcpGrpTypeH rcpGrpTypeH = new RcpGrpTypeH();
        BeanUtils.copyProperties(rcpGrp, rcpGrpTypeH);
        rcpGrpTypeH.setTransRrn(transactionLog.getTransRrn());
        rcpGrpTypeH.setTransId(transactionLog.getTransId());
        rcpGrpTypeH.setTransTime(transactionLog.getTransStartTimestamp());
        rcpGrpTypeH.setTransUserRrn(LocalContext.getUserRrn());
        rcpGrpTypeH.setTransUserId(LocalContext.getUserId());
        dao.insertPiLotSetupRcpGrpHistory(rcpGrpTypeH, piLotSetup);
    }

    private void insertPiLotSetupCountHistory(PiLotSetup piLotSetup, CountType count, TransactionLog transactionLog) {
        CountTypeH countTypeH = new CountTypeH();
        BeanUtils.copyProperties(count, countTypeH);
        countTypeH.setTransRrn(transactionLog.getTransRrn());
        countTypeH.setTransId(transactionLog.getTransId());
        countTypeH.setTransTime(transactionLog.getTransStartTimestamp());
        countTypeH.setTransUserRrn(LocalContext.getUserRrn());
        countTypeH.setTransUserId(LocalContext.getUserId());
        dao.insertPiLotSetupCountHistory(countTypeH, piLotSetup);
    }

    private void insertPiLotSetupPMHistory(PiLotSetup piLotSetup, PmType pm, TransactionLog transactionLog) {
        PmTypeH pmTypeH = new PmTypeH();
        BeanUtils.copyProperties(pm, pmTypeH);
        pmTypeH.setTransRrn(transactionLog.getTransRrn());
        pmTypeH.setTransId(transactionLog.getTransId());
        pmTypeH.setTransTime(transactionLog.getTransStartTimestamp());
        pmTypeH.setTransUserRrn(LocalContext.getUserRrn());
        pmTypeH.setTransUserId(LocalContext.getUserId());
        dao.insertPiLotSetupPMHistory(pmTypeH, piLotSetup);
    }

    private void insertPiLotSetupIdleHistory(PiLotSetup piLotSetup, IdleType idle, TransactionLog transactionLog) {
        IdleTypeH idleTypeH = new IdleTypeH();
        BeanUtils.copyProperties(idle, idleTypeH);
        idleTypeH.setTransRrn(transactionLog.getTransRrn());
        idleTypeH.setTransId(transactionLog.getTransId());
        idleTypeH.setTransTime(transactionLog.getTransStartTimestamp());
        idleTypeH.setTransUserRrn(LocalContext.getUserRrn());
        idleTypeH.setTransUserId(LocalContext.getUserId());
        dao.insertPiLotSetupIdleHistory(idleTypeH, piLotSetup);
    }

    private void insertPiLotRcpMappingHistory(PiLotRcpMaping piLotRcpMaping, TransactionLog transactionLog) {
        PiLotRcpMapingH mapingH = new PiLotRcpMapingH();
        BeanUtils.copyProperties(piLotRcpMaping, mapingH);
        mapingH.setTransRrn(transactionLog.getTransRrn());
        mapingH.setTransId(transactionLog.getTransId());
        mapingH.setTransTime(transactionLog.getTransStartTimestamp());
        mapingH.setTransUserRrn(LocalContext.getUserRrn());
        mapingH.setTransUserId(LocalContext.getUserId());
        dao.insertPiLotRcpMappingH(mapingH);
    }

    private void insertPiLotRcpGrpHistory(PiLotRcpGrp piLotRcpGrp, TransactionLog transactionLog) {
        PiLotRcpGrpH rcpGrpH = new PiLotRcpGrpH();
        BeanUtils.copyProperties(piLotRcpGrp, rcpGrpH);
        rcpGrpH.setTransRrn(transactionLog.getTransRrn());
        rcpGrpH.setTransId(transactionLog.getTransId());
        rcpGrpH.setTransTime(transactionLog.getTransStartTimestamp());
        rcpGrpH.setTransUserRrn(LocalContext.getUserRrn());
        rcpGrpH.setTransUserId(LocalContext.getUserId());
        dao.insertPiLotRcpGrpH(rcpGrpH);
    }

    private void createPiLotView(PiLotSetup piLotSetup, TransactionLog transactionLog) {
        PiLotView piLotView = new PiLotView();
        BeanUtils.copyProperties(piLotSetup, piLotView);

        piLotView.setViewRrn(
                Long.valueOf(IDGenerators.get(IDNames.SEQUENCE).generateId(SequenceNames.MODULE_SEQ_OBJECT_RRN)));
        piLotView.setViewId(generateViewId(piLotSetup));
        piLotView.setStatus(PiLotStatusEnum.ONGOING.toString());

        piLotView.setCreateUserRrn(LocalContext.getUserRrn());
        piLotView.setCreateTime(transactionLog.getTransStartTimestamp());
        piLotView.setUpdateUserRrn(LocalContext.getUserRrn());
        piLotView.setUpdateTime(transactionLog.getTransStartTimestamp());

        dao.insertPiLotView(piLotView);

        piLotView = piLotInqManager.getPiLotViewByRrn(piLotView.getViewRrn());
        insertPiLotViewHistory(piLotView, transactionLog);
    }

    private String generateViewId(PiLotSetup piLotSetup) {
        int count = piLotInqManager.getCountPiLotViewBySetupRrn(piLotSetup.getPiLotRrn());
        count++;
        return piLotSetup.getPiLotId() + "." + String.format("%04d", count);
    }

    private void insertPiLotViewHistory(PiLotView piLotView, TransactionLog transactionLog) {
        PiLotViewH piLotViewH = new PiLotViewH();
        BeanUtils.copyProperties(piLotView, piLotViewH);
        piLotViewH.setTransRrn(transactionLog.getTransRrn());
        piLotViewH.setTransId(transactionLog.getTransId());
        piLotViewH.setTransTime(transactionLog.getTransStartTimestamp());
        piLotViewH.setTransUserRrn(LocalContext.getUserRrn());
        piLotViewH.setTransUserId(LocalContext.getUserId());
        dao.insertPiLotViewH(piLotViewH);
    }

    private String initPiLotId(PiLotSetup piLotSetup) {
        StringBuilder piLotId = new StringBuilder("PILOT");
        piLotId.append(DateUtils.formatDate(new Date(), DateUtils.DATE_FORMAT4NOSPLICING));
        return piLotId.toString();
    }

    private void insertPiLotSetupHistory(PiLotSetup piLotSetup, TransactionLog transactionLog) {
        PiLotSetupH piLotSetupH = new PiLotSetupH();
        BeanUtils.copyProperties(piLotSetup, piLotSetupH);
        piLotSetupH.setTransRrn(transactionLog.getTransRrn());
        piLotSetupH.setTransId(transactionLog.getTransId());
        piLotSetupH.setTransTime(transactionLog.getTransStartTimestamp());
        piLotSetupH.setTransUserRrn(LocalContext.getUserRrn());
        piLotSetupH.setTransUserId(LocalContext.getUserId());
        dao.insertPiLotSetupHistory(piLotSetupH);
    }

    @Override
    public void setSingleLotFutureHold(PiLotView view, PiLotSetup oldSetup) {
        eenActionManager.setPilotSingleLotFutureHold(view, oldSetup);
    }

    @Override
    public void closeSingleLotPilot(Long basedLotRrn) {
        TransactionLog transactionLog =transactionLogManager.startTransactionLog(LocalContext.getUserId(),
                                                                                 TransactionNames.PI_LOT_COMPLETE_FLOW);
        PiLotView view = piLotInqManager.getPiLotViewByLotRrn(basedLotRrn);
        view.setStatus(PiLotStatusEnum.CLOSE.toString());
        savePiLotView(view, transactionLog);

        PiLotSetup setup = piLotInqManager.getPiLotSetupByRrn(view.getPiLotRrn());
        setup.setStatus(PiLotStatusEnum.CREATED.toString());
        updatePiLotSetup(setup, transactionLog);

        transactionLog.setTransId(TransactionNames.PI_LOT_END);
        String transComments = "Pilot End! (Single lot 量测结束) Pilot Number:" + view.getViewId() +"! Equipment ID: " + view.getEqptId() + "!";
        lotTransHistoryReqManager.createLotTransHistory(transactionLog, lotInqManager.getLot(view.getBoundLotRrn()), transComments);
        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public void deletePilotSingleLotFutureHold(PiLotView view) {
        eenActionManager.deletePilotSingleLotFutureHold(view);
    }

    @Override
    public void handPilotByTime() {
        // 查询出所有idletime并且状态为CREATED的pilot
        List<PiLotSetup> pilotSetupIdles = piLotInqManager.getPilotSetupIdle();
        for (PiLotSetup piLotSetup : pilotSetupIdles) {
            Boolean needPiLot = false;
            Equipment equipment = equipmentManager.getEquipment(piLotSetup.getEqptRrn());
            //判断是否满足触发条件
            needPiLot = piLotCheckManager.checkNeedPilotByTime(piLotSetup, equipment, needPiLot);
            if (Boolean.TRUE.equals(needPiLot)) {
                createPiLotView(piLotSetup);
            }
        }
    }

    @Override
    public void createPilotFlowLotTransHistory(PiLotSetup oldSetup, PiLotView view) {
        if (ObjectUtils.isEmpty(view)) {
            return;
        }
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(LocalContext.getUserId(), StringUtils.EMPTY);

        switch (PiLotStatusEnum.valueOf(view.getStatus())) {
            case WAITSPLIT:
            case WAITCOMPLETE:
                buildLotTransByWaitSplitOrWaitComplete(oldSetup, view, transactionLog);
                break;
            case WAITMERGE:
                buildLotTransByWaitMerge(view, transactionLog);
                break;
            case CLOSE:
                buildLotTransByClose(view, transactionLog);
                break;
            default:
                break;
        }

        transactionLogManager.markTransactionLog(transactionLog);
    }

    /**
     * 子母批Assign Lot时两种情况  和 单批Assign Lot和Retry
     * @param oldSetup
     * @param view
     * @param transactionLog
     */
    private void buildLotTransByWaitSplitOrWaitComplete(PiLotSetup oldSetup, PiLotView view, TransactionLog transactionLog) {
        String transComments = StringUtils.EMPTY;
        //不存在旧Assign lot 需将新lot记录PILOT_START
        transactionLog.setTransId(TransactionNames.PI_LOT_START);
        transComments = "Pilot Start! (Assign lot) Pilot Number:" + view.getViewId() +"! Equipment ID: " + view.getEqptId() + "!";
        lotTransHistoryReqManager.createLotTransHistory(transactionLog, lotInqManager.getLot(view.getBoundLotRrn()), transComments.toString());
        //存在旧Assign lot 需将旧lot记录PILOT_WITHDRAW
        if (StringUtils.isNotEmpty(oldSetup.getBoundLotId())) {
            transactionLog.setTransId(TransactionNames.PI_LOT_WITHDRAW);
            if (StringUtils.equalsIgnoreCase(view.getSingleLot(), PiLotStatusEnum.YES.toString())) {
                transComments = "Pilot Withdraw! (单批Pilot Retry) Pilot Number:" + view.getViewId() +"! Equipment ID: " + view.getEqptId() + "!";
            }
            if (StringUtils.equalsIgnoreCase(view.getSingleLot(), PiLotStatusEnum.NO.toString())) {
                transComments = "Pilot Withdraw! (Assign lot) Pilot Number:" + view.getViewId() +"! Equipment ID: " + view.getEqptId() + "!";
            }
            lotTransHistoryReqManager.createLotTransHistory(transactionLog, lotInqManager.getLot(oldSetup.getBoundLotRrn()), transComments);
        }
    }

    /**
     * 子母批分批、retry、子母量测结束
     * @param view
     * @param transactionLog
     */
    private void buildLotTransByWaitMerge(PiLotView view, TransactionLog transactionLog) {
        String transComments = StringUtils.EMPTY;
        // WaitMerge状态  retry、split都是子批记录历史 默认为为子批记录历史
        Lot childLot = lotInqManager.getLot(view.getChildLotRrn());
        Lot parentLot = lotInqManager.getLot(view.getBoundLotRrn());
        //判断是否可以进行分批  能分批为retry操作 不能分批为split操作或已经分批走流程
        if (view.getCanSplit()) {
            transactionLog.setTransId(TransactionNames.PI_LOT_WITHDRAW);
            transComments = "Pilot Withdraw!(子母批Pilot retry) Pilot Number:" + view.getViewId() +"! Equipment ID: " + view.getEqptId() + "!";
        } else {
            transactionLog.setTransId(TransactionNames.PI_LOT_START);
            transComments = "Pilot Start! (Pilot Split) Pilot Number:" + view.getViewId() +"! Equipment ID: " + view.getEqptId() + "!";
            // 子批走完流程量测结束
            if (view.getComplete()) {
                transactionLog.setTransId(TransactionNames.PI_LOT_END);
                transComments = "Pilot End! (Child lot 量测结束) Pilot Number:" + view.getViewId() +"! Equipment ID: " + view.getEqptId() + "!";
                //子批走完流程 母批也走完流程量测结束
                if (StringUtils.equalsIgnoreCase(childLot.getFlowSeq(), parentLot.getFlowSeq())) {
                    childLot = parentLot;
                    transComments = "Pilot End! (Parent lot 量测结束) Pilot Number:" + view.getViewId() +"! Equipment ID: " + view.getEqptId() + "!";
                }
            }
        }
        lotTransHistoryReqManager.createLotTransHistory(transactionLog, childLot, transComments);
    }

    /**
     * 手动close
     * @param view
     * @param transactionLog
     */
    private void buildLotTransByClose(PiLotView view, TransactionLog transactionLog) {

       String transComments = StringUtils.EMPTY;
       transactionLog.setTransId(TransactionNames.PI_LOT_END);
       transComments = "Pilot End!(Special Close) Pilot Number:" + view.getViewId() +"! Equipment ID: " + view.getEqptId() + "!";
       if (StringUtils.isNotEmpty(view.getBoundLotId())) {
           lotTransHistoryReqManager.createLotTransHistory(transactionLog, lotInqManager.getLot(view.getBoundLotRrn()), transComments);
       }

       // 存在子批也需要 记录end lot trans
       if (StringUtils.isNotEmpty(view.getChildLotId())) {
           lotTransHistoryReqManager.createLotTransHistory(transactionLog, lotInqManager.getLot(view.getChildLotRrn()), transComments);
       }
    }


}