ProcessSpecInfoDaoImpl.java

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

import com.mycim.framework.jdbc.JdbcTemplate;
import com.mycim.framework.jdbc.mapper.RowMapper;
import com.mycim.server.spec.dao.ProcessSpecInfoDao;
import com.mycim.server.spec.dao.mapper.ProcessSpecInfoRowMapper;
import com.mycim.valueobject.prp.ProcessSpecInfo;
import com.mycim.valueobject.prp.ProcessVersion;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * @author Qiansheng.Wang
 * @since 2020-09-08
 */
@Repository
public class ProcessSpecInfoDaoImpl implements ProcessSpecInfoDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public int insertProcessSpecInfo(ProcessSpecInfo processSpecInfo) {
        StringBuilder sql = new StringBuilder("insert into ");

        sql.append(" PROCESS_SPEC_ITEM_INFO ");
        sql.append(" (PROCESS_RRN, PROCESS_ID, PROCESS_VERSION, ACTIVE_FLAG, ACTIVE_TIME, ACTIVE_USER, ");
        sql.append(" CURRENT_STATUS, LAST_UPDATED_USER, LAST_UPDATED_TIME, CREATE_USER_ID, CREATE_TIME, ");
        sql.append(" VERSION_LAST_UPDATED_TIME) ");
        sql.append(" values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ");

        return jdbcTemplate
                .update(sql.toString(), processSpecInfo.getProcessRrn(), processSpecInfo.getProcessId(),
                        processSpecInfo.getProcessVersion(), processSpecInfo.getActiveFlag(),
                        processSpecInfo.getActiveTime(), processSpecInfo.getActiveUser(),
                        processSpecInfo.getCurrentStatus(), processSpecInfo.getLastUpdatedUser(),
                        processSpecInfo.getLastUpdatedTime(), processSpecInfo.getCreateUserId(),
                        processSpecInfo.getCreateTime(), processSpecInfo.getVersionLastUpdateTime());
    }

    @Override
    public int updateProcessSpecInfo(ProcessSpecInfo processSpecInfo) {
        StringBuilder sql = new StringBuilder("update ");

        sql.append(" PROCESS_SPEC_ITEM_INFO ");
        sql.append(" set ACTIVE_FLAG = ?, ACTIVE_TIME = ?, ACTIVE_USER = ?, VERSION_LAST_UPDATED_TIME = ?, ");
        sql.append(" CURRENT_STATUS = ?, LAST_UPDATED_USER = ?, LAST_UPDATED_TIME = ? ");
        sql.append(" where PROCESS_RRN = ? and PROCESS_VERSION = ? ");

        return jdbcTemplate
                .update(sql.toString(), processSpecInfo.getActiveFlag(), processSpecInfo.getActiveTime(),
                        processSpecInfo.getActiveUser(), processSpecInfo.getVersionLastUpdateTime(),
                        processSpecInfo.getCurrentStatus(), processSpecInfo.getLastUpdatedUser(),
                        processSpecInfo.getLastUpdatedTime(), processSpecInfo.getProcessRrn(),
                        processSpecInfo.getProcessVersion());
    }

    @Override
    public ProcessSpecInfo getProcessSpecInfoByPrimaryKey(Long processRrn, Integer processVersion) {
        StringBuilder sql = new StringBuilder("select ");

        sql.append(" PROCESS_RRN, PROCESS_ID, PROCESS_VERSION, ACTIVE_FLAG, ACTIVE_TIME, ACTIVE_USER, ");
        sql.append(" CURRENT_STATUS, LAST_UPDATED_USER, LAST_UPDATED_TIME, CREATE_USER_ID, CREATE_TIME, ");
        sql.append(" VERSION_LAST_UPDATED_TIME ");
        sql.append(" from PROCESS_SPEC_ITEM_INFO ");
        sql.append(" where PROCESS_RRN = ? and PROCESS_VERSION = ? ");

        return jdbcTemplate
                .queryForObjectWithNull(sql.toString(), new ProcessSpecInfoRowMapper(), processRrn, processVersion);
    }

    @Override
    public List<ProcessSpecInfo> getProcessSpecInfos(Long processRrn) {
        StringBuilder sql = new StringBuilder("select ");

        sql.append(" PROCESS_RRN, PROCESS_ID, PROCESS_VERSION, ACTIVE_FLAG, ACTIVE_TIME, ACTIVE_USER, ");
        sql.append(" CURRENT_STATUS, LAST_UPDATED_USER, LAST_UPDATED_TIME, CREATE_USER_ID, CREATE_TIME, ");
        sql.append(" VERSION_LAST_UPDATED_TIME ");
        sql.append(" from PROCESS_SPEC_ITEM_INFO ");
        sql.append(" where PROCESS_RRN = ? ");
        sql.append(" order by PROCESS_VERSION desc ");

        return jdbcTemplate.query(sql.toString(), new ProcessSpecInfoRowMapper(), processRrn);
    }

    @Override
    public List<Integer> getAllActivatedProcessVersions(Long processRrn) {
        StringBuilder sql = new StringBuilder("select ");

        sql.append(" PROCESS_VERSION ");
        sql.append(" from PROCESS_SPEC_ITEM_INFO ");
        sql.append(" where PROCESS_RRN = ? and ACTIVE_FLAG = ? ");

        sql.append(" order by PROCESS_VERSION desc ");

        return jdbcTemplate.query(sql.toString(), Integer.class, processRrn, true);
    }

    @Override
    public List<Integer> getAllProcessVersions(Long processRrn) {
        StringBuilder sql = new StringBuilder("select ");

        sql.append(" PROCESS_VERSION ");
        sql.append(" from PROCESS_SPEC_ITEM_INFO ");
        sql.append(" where PROCESS_RRN = ? ");

        sql.append(" order by PROCESS_VERSION desc ");

        return jdbcTemplate.query(sql.toString(), Integer.class, processRrn);
    }

    @Override
    public Integer getHighestActivatedProcessVersion(Long processRrn) {
        StringBuilder sql = new StringBuilder("select ");

        sql.append(" max(PROCESS_VERSION) ");
        sql.append(" from PROCESS_SPEC_ITEM_INFO ");
        sql.append(" where PROCESS_RRN = ? and ACTIVE_FLAG = ? ");

        return jdbcTemplate.queryForObject(sql.toString(), new Object[]{processRrn, true}, Integer.class);
    }

    @Override
    public boolean hasActiveProcessSpec(long processRrn, Integer processVersion) {
        String sql = "SELECT COUNT(*) FROM PROCESS_SPEC_ITEM_INFO WHERE PROCESS_RRN=? " +
                " AND  PROCESS_VERSION=? AND CURRENT_STATUS = 'ACTIVE'";
        Integer count = jdbcTemplate
                .queryForObjectWithNull(sql, new Object[]{processRrn, processVersion}, Integer.class);
        return count != null && count > 0;
    }

}