AutoMonitorItemInqDaoImpl.java

package com.mycim.server.automonitor.dao.impl;

import com.mycim.framework.jdbc.JdbcTemplate;
import com.mycim.framework.jdbc.Page;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.server.automonitor.dao.AutoMonitorItemInqDao;
import com.mycim.server.automonitor.dao.mapper.AutoMonitorItemMapper;
import com.mycim.server.automonitor.dao.mapper.AutoMonitorItemStepEdcInfoMapper;
import com.mycim.server.automonitor.dao.mapper.AutoMonitorItemStepMapper;
import com.mycim.valueobject.automonitor.dto.AutoMonitorItemQueryDTO;
import com.mycim.valueobject.automonitor.entity.AutoMonitorItem;
import com.mycim.valueobject.automonitor.entity.AutoMonitorItemStep;
import com.mycim.valueobject.automonitor.entity.AutoMonitorItemStepEdcInfo;
import com.mycim.valueobject.consts.DataBaseNames;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author finatice.yang
 * @date 2021/8/27
 **/
@Repository
public class AutoMonitorItemInqDaoImpl implements AutoMonitorItemInqDao {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Override
    public AutoMonitorItem getAutoMonitorActiveItem(Long eqptRrn, String itemType) {
        StringBuilder sql = new StringBuilder("SELECT ");
        sql.append(" AMIS.WORKFLOW_RRN,AMIS.WORKFLOW_VERSION,AMIS.WORKFLOW_ID,AMIS.equipment_rrn,AMIS.equipment_id, ");
        sql.append(" AMIS.ITEM_TYPE, AMIS.QTY,AMIS.PRODUCT_ID, AMIS.PRODUCT_RRN, AMIS.PROCESS_ID, AMIS.PROCESS_RRN, ");
        sql.append(" AMIS.MONITOR_CARRIER_FLAG,AMIS.MONITOR_CARRIER_TYPE,AMIS.SYS_INACTIVE_FLAG, ");
        sql.append(" AMIS.START_SPLIT_FLAG,");
        sql.append(" AMIS.main_equipment_type,WORK_N.OBJ_CURRENT_VERSION, WORK_N.OBJ_ACTIVE_VERSION ");
        sql.append(" FROM ").append(DataBaseNames.AUTO_MONITOR_ITEM).append(" AMIS ");
        sql.append(" JOIN ").append(DataBaseNames.ROUTE).append(" WORK_N ON ");
        sql.append(" AMIS.WORKFLOW_RRN = WORK_N.SYS_RRN AND AMIS.WORKFLOW_VERSION = WORK_N.OBJ_ACTIVE_VERSION ");
        sql.append(" WHERE AMIS.EQUIPMENT_RRN = ? AND AMIS.ITEM_TYPE = ? ");

        Object[] args = new Object[]{eqptRrn, itemType};

        return jdbcTemplate.queryForObject(sql.toString(), args, new AutoMonitorItemMapper());
    }

    @Override
    public AutoMonitorItem getAutoMonitorItem(Long eqptRrn, String itemType) {
        StringBuilder sql = new StringBuilder("SELECT ");
        sql.append(" AMIS.WORKFLOW_RRN,AMIS.WORKFLOW_VERSION,AMIS.WORKFLOW_ID,AMIS.equipment_rrn,AMIS.equipment_id, ");
        sql.append(" AMIS.ITEM_TYPE, AMIS.QTY,AMIS.PRODUCT_ID, AMIS.PRODUCT_RRN, AMIS.PROCESS_ID, AMIS.PROCESS_RRN, ");
        sql.append(" AMIS.MONITOR_CARRIER_FLAG,AMIS.MONITOR_CARRIER_TYPE,AMIS.SYS_INACTIVE_FLAG, ");
        sql.append(" AMIS.START_SPLIT_FLAG,");
        sql.append(" AMIS.main_equipment_type,WORK_N.OBJ_CURRENT_VERSION, WORK_N.OBJ_ACTIVE_VERSION ");
        sql.append(" FROM ").append(DataBaseNames.AUTO_MONITOR_ITEM).append(" AMIS ");
        sql.append(" JOIN ").append(DataBaseNames.ROUTE).append(" WORK_N ON ");
        sql.append(" AMIS.WORKFLOW_RRN = WORK_N.SYS_RRN AND AMIS.WORKFLOW_VERSION = WORK_N.OBJ_CURRENT_VERSION ");
        sql.append(" WHERE AMIS.EQUIPMENT_RRN = ? AND AMIS.ITEM_TYPE = ? ");

        Object[] args = new Object[]{eqptRrn, itemType};

        return jdbcTemplate.queryForObjectWithNull(sql.toString(), args, new AutoMonitorItemMapper());
    }

    @Override
    public AutoMonitorItem getAutoMonitorItem(Long workflowRrn, Integer workflowVersion) {
        StringBuilder sql = new StringBuilder("SELECT ");
        sql.append(" AMIS.WORKFLOW_RRN,AMIS.WORKFLOW_VERSION,AMIS.WORKFLOW_ID,AMIS.equipment_rrn,AMIS.equipment_id, ");
        sql.append(" AMIS.ITEM_TYPE, AMIS.QTY,AMIS.PRODUCT_ID, AMIS.PRODUCT_RRN, AMIS.PROCESS_ID, AMIS.PROCESS_RRN, ");
        sql.append(" AMIS.MONITOR_CARRIER_FLAG,AMIS.MONITOR_CARRIER_TYPE,AMIS.SYS_INACTIVE_FLAG, ");
        sql.append(" AMIS.START_SPLIT_FLAG,");
        sql.append(" AMIS.main_equipment_type,WORK_N.OBJ_CURRENT_VERSION, WORK_N.OBJ_ACTIVE_VERSION ");
        sql.append(" FROM ").append(DataBaseNames.AUTO_MONITOR_ITEM).append(" AMIS ");
        sql.append(" JOIN ").append(DataBaseNames.ROUTE).append(" WORK_N ON ");
        sql.append(" AMIS.WORKFLOW_RRN = WORK_N.SYS_RRN ");
        sql.append(" WHERE AMIS.WORKFLOW_RRN = ? AND AMIS.WORKFLOW_VERSION = ? ");

        Object[] args = new Object[]{workflowRrn, workflowVersion};

        return jdbcTemplate.queryForObjectWithNull(sql.toString(), args, new AutoMonitorItemMapper());
    }

    @Override
    public List<AutoMonitorItem> getAutoMonitorItemList(AutoMonitorItemQueryDTO conditions) {
        List<Object> argList = new ArrayList<>();
        String sql = buildAutoMonitorItemListSqlArgs(conditions, argList);
        return jdbcTemplate.query(sql, argList.toArray(), new AutoMonitorItemMapper());
    }

    @Override
    public Page getAutoMonitorItemPage(Page page, AutoMonitorItemQueryDTO conditions) {
        List<Object> argList = new ArrayList<>();
        String sql = buildAutoMonitorItemListSqlArgs(conditions, argList);
        return jdbcTemplate.queryForPage(page, sql, argList.toArray(), new AutoMonitorItemMapper());
    }

    @Override
    public List<String> getAutoMonitorItemTypeList(Long eqptRrn) {
        StringBuilder sql = new StringBuilder("SELECT AMIS.ITEM_TYPE FROM ");
        sql.append(DataBaseNames.AUTO_MONITOR_ITEM).append(" AMIS ");
        sql.append(" JOIN ").append(DataBaseNames.ROUTE).append(" WORK_N ON ");
        sql.append(" AMIS.WORKFLOW_RRN = WORK_N.SYS_RRN AND AMIS.WORKFLOW_VERSION = WORK_N.OBJ_ACTIVE_VERSION ");
        sql.append(" AND AMIS.EQUIPMENT_RRN = ? ");
        sql.append(" AND (AMIS.SYS_INACTIVE_FLAG = 0 OR AMIS.SYS_INACTIVE_FLAG IS NULL)");

        Object[] args = new Object[]{eqptRrn};

        return jdbcTemplate.query(sql.toString(), args, String.class);
    }

    @Override
    public AutoMonitorItemStep getAutoMonitorItemStep(Long workflowRrn, Integer workflowVersion, Long operationRrn) {
        StringBuilder sql = new StringBuilder("SELECT ");
        sql.append(" WORKFLOW_RRN,WORKFLOW_VERSION,WORKFLOW_ID,STEP_SEQUENCE,EQUIPMENT_TYPE,MAIN_EQUIPMENT_FLAG, ");
        sql.append(" EQUIPMENT_ID,EQUIPMENT_RRN,EQUIPMENT_GROUP_ID,EQUIPMENT_GROUP_RRN,NONRT_SLOT_TYPE, ");
        sql.append(" FLOW_SEQ,OPERATION_RRN,OPERATION_ID,OPERATION_DESC,RECIPE_ID,RECIPE_RRN,STAGE_ID, ");
        sql.append(" RETICLE_ID,RETICLE_RRN,RETICLE_GROUP_ID,RETICLE_GROUP_RRN ");
        sql.append(" FROM ").append(DataBaseNames.AUTO_MONITOR_ITEM_STEP);
        sql.append(" WHERE WORKFLOW_RRN = ? AND WORKFLOW_VERSION = ? AND OPERATION_RRN = ?");

        Object[] args = new Object[]{workflowRrn, workflowVersion, operationRrn};

        return jdbcTemplate.queryForObjectWithNull(sql.toString(), args, new AutoMonitorItemStepMapper());
    }

    @Override
    public List<AutoMonitorItemStep> getAutoMonitorItemSteps(Long workflowRrn, Integer workflowVersion) {
        StringBuilder sql = new StringBuilder("SELECT ");
        sql.append(" WORKFLOW_RRN,WORKFLOW_VERSION,WORKFLOW_ID,STEP_SEQUENCE,EQUIPMENT_TYPE,MAIN_EQUIPMENT_FLAG, ");
        sql.append(" EQUIPMENT_ID,EQUIPMENT_RRN,EQUIPMENT_GROUP_ID,EQUIPMENT_GROUP_RRN,NONRT_SLOT_TYPE, ");
        sql.append(" FLOW_SEQ,OPERATION_RRN,OPERATION_ID,OPERATION_DESC,RECIPE_ID,RECIPE_RRN,STAGE_ID, ");
        sql.append(" RETICLE_ID,RETICLE_RRN,RETICLE_GROUP_ID,RETICLE_GROUP_RRN ");
        sql.append(" FROM ").append(DataBaseNames.AUTO_MONITOR_ITEM_STEP);
        sql.append(" WHERE WORKFLOW_RRN = ? AND WORKFLOW_VERSION = ? ");

        Object[] args = new Object[] { workflowRrn, workflowVersion };

        return jdbcTemplate.query(sql.toString(), args, new AutoMonitorItemStepMapper());
    }

    @Override
    public List<AutoMonitorItemStepEdcInfo> getItemStepEdcInfo(Long workflowRrn, Integer workflowVersion) {

        StringBuilder sql = new StringBuilder("SELECT ");
        sql.append(" WORKFLOW_RRN, WORKFLOW_VERSION, STEP_SEQUENCE, WAFER_SLOT, NONRT_JOB_IDS, NONRT_JOB_NAMES ");
        sql.append(" FROM ").append(DataBaseNames.AUTO_MONITOR_ITEM_STEP_EDC);
        sql.append(" WHERE WORKFLOW_RRN = ? AND WORKFLOW_VERSION = ? ORDER BY STEP_SEQUENCE,WAFER_SLOT ");

        Object[] args = new Object[] { workflowRrn, workflowVersion };

        return jdbcTemplate.query(sql.toString(), args, new AutoMonitorItemStepEdcInfoMapper());
    }

    @Override
    public List<AutoMonitorItemStepEdcInfo> getItemStepEdcInfo(Long workflowRrn, Integer workflowVersion,
                                                               Long stepSequence) {

        StringBuilder sql = new StringBuilder("SELECT ");
        sql.append(" WORKFLOW_RRN, WORKFLOW_VERSION, STEP_SEQUENCE, WAFER_SLOT, NONRT_JOB_IDS, NONRT_JOB_NAMES ");
        sql.append(" FROM ").append(DataBaseNames.AUTO_MONITOR_ITEM_STEP_EDC);
        sql.append(" WHERE WORKFLOW_RRN = ? AND WORKFLOW_VERSION = ? AND STEP_SEQUENCE = ?  ORDER BY WAFER_SLOT ");

        Object[] args = new Object[] { workflowRrn, workflowVersion, stepSequence };

        return jdbcTemplate.query(sql.toString(), args, new AutoMonitorItemStepEdcInfoMapper());
    }

    private String buildAutoMonitorItemListSqlArgs(AutoMonitorItemQueryDTO conditions, List<Object> argList) {
        StringBuilder sql = new StringBuilder("SELECT ");
        sql.append(" AMIS.WORKFLOW_RRN,AMIS.WORKFLOW_VERSION,AMIS.WORKFLOW_ID,AMIS.equipment_rrn,AMIS.equipment_id, ");
        sql.append(" AMIS.ITEM_TYPE, AMIS.QTY,AMIS.PRODUCT_ID, AMIS.PRODUCT_RRN, AMIS.PROCESS_ID, AMIS.PROCESS_RRN, ");
        sql.append(" AMIS.MONITOR_CARRIER_FLAG,AMIS.MONITOR_CARRIER_TYPE,AMIS.SYS_INACTIVE_FLAG, ");
        sql.append(" AMIS.START_SPLIT_FLAG,");
        sql.append(" AMIS.main_equipment_type,WORK_N.OBJ_CURRENT_VERSION, WORK_N.OBJ_ACTIVE_VERSION ");
        sql.append(" FROM ").append(DataBaseNames.AUTO_MONITOR_ITEM).append(" AMIS ");
        sql.append(" JOIN ").append(DataBaseNames.ROUTE).append(" WORK_N ON ");
        sql.append(" AMIS.WORKFLOW_RRN = WORK_N.SYS_RRN ");
        sql.append(" JOIN (SELECT WORKFLOW_RRN,MAX(WORKFLOW_VERSION) AS MAX_VERSION FROM ");
        sql.append(DataBaseNames.AUTO_MONITOR_ITEM).append(" GROUP BY WORKFLOW_RRN) FLOW_VERSION ON ");
        sql.append(" AMIS.WORKFLOW_RRN=FLOW_VERSION.WORKFLOW_RRN AND AMIS.WORKFLOW_VERSION=FLOW_VERSION.MAX_VERSION ");

        if (StringUtils.isNotBlank(conditions.getEqptId())) {
            sql.append(" AND AMIS.EQUIPMENT_ID LIKE ? ");
            argList.add(conditions.getEqptId());
        }

        if (StringUtils.isNotBlank(conditions.getItemType())) {
            sql.append(" AND AMIS.ITEM_TYPE LIKE ? ");
            argList.add(conditions.getItemType());
        }

        if (StringUtils.isNotBlank(conditions.getProductId())) {
            sql.append(" AND AMIS.PRODUCT_ID LIKE ? ");
            argList.add(conditions.getProductId());
        }

        if (StringUtils.isNotBlank(conditions.getMainEqptType())) {
            sql.append(" AND AMIS.MAIN_EQUIPMENT_TYPE = ? ");
            argList.add(conditions.getMainEqptType());
        }
        return sql.toString();
    }

}