EcnDAOImpl.java

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

import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.jdbc.JdbcTemplate;
import com.mycim.framework.jdbc.Page;
import com.mycim.framework.jdbc.mapper.RowMapper;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.time.DateUtils;
import com.mycim.server.ecn.dao.EcnDAO;
import com.mycim.server.ecn.dao.mapper.EcnMapper;
import com.mycim.valueobject.bas.ObjectVersion;
import com.mycim.valueobject.consts.DataBaseNames;
import com.mycim.valueobject.consts.ObjectStatus;
import com.mycim.valueobject.prp.ContextValue;
import com.mycim.valueobject.prp.Ecn;
import org.springframework.stereotype.Repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Johnson.Wang
 * @version 6.0.0
 * @date 2019/8/31
 **/
@Repository
public class EcnDAOImpl implements EcnDAO {

    private final JdbcTemplate jdbcTemplate;

    public EcnDAOImpl(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public String getMaxEcnNo(String today) {
        today = "F" + today + "." + "_____";
        String sql = "select count(t.instance_id) as cutid from named_object t where object='ECN' and t" +
                ".instance_id like '" + today + "' ";
        long count = jdbcTemplate.queryForObjectWithNull(sql, null, long.class);

        if (count > 0) {
            sql = "select instance_id " + "from (" + "select SUBSTR(t.instance_id,INSTR( t.instance_id,'.') + " +
                    "1,LENGTH(t.instance_id))" + " as d, " +
                    "t.instance_rrn as rrn,t.instance_id " + "from named_object t" +
                    " " + "where t.object='ECN' " + "and t.instance_id like '" + today + "' " + "ORDER BY d DESC " +
                    " ) l where rownum =1 ";
            return jdbcTemplate.queryForObjectWithNull(sql, null, String.class).toUpperCase().trim();
        }

        return null;
    }

    @Override
    public void insertEcn(Ecn ecn) {
        String ecnStatus;
        if ("ACTIVEP".equalsIgnoreCase(ecn.getEcnStatus())) {
            ecnStatus = ObjectStatus.ACTIVE_KEY;
        } else if (StringUtils.equals("SPLITRUNCARD", ecn.getObjectSubtype()) ||
                StringUtils.equals("RECOVERYRUNCARD", ecn.getObjectSubtype())) {
            ecnStatus = ecn.getEcnStatus();
        } else {
            ecnStatus = ObjectStatus.UNFROZEN_KEY;
        }

        String sql = "INSERT INTO " + DataBaseNames.ECN + "(" + "ECN_RRN,REQUEST_BY,COMMENTS,ECN_STATUS," + "SYS_RRN," +
                "ECN_ID,FACILITY_RRN,DESCRIPTION,OBJ_SPACE," + "OBJ_TYPE,OBJ_SUBTYPE,OBJ_STATUS,CREATE_TIME," +
                "UPDATE_TIME," + "CREATE_USER_RRN,UPDATE_USER_RRN,LOCK_VERSION," + "EFFECTIVE_DATE_FROM," +
                "EFFECTIVE_DATE_TO" + ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,";

        if (StringUtils.isNotEmpty(ecn.getEffectiveDateFrom())) {
            sql = sql + " to_date('" + ecn.getEffectiveDateFrom() + "', '" + DateUtils.DATE_FORMAT24 + "'),";
        } else {
            sql = sql + " null,";
        }

        if (StringUtils.isNotEmpty(ecn.getEffectiveDateTo())) {
            sql = sql + "to_date('" + ecn.getEffectiveDateTo() + "', '" + DateUtils.DATE_FORMAT24 + "')";
        } else {
            sql = sql + " null";
        }

        sql = sql + ")";
        Object[] args = new Object[]{ecn.getInstanceRrn(), ecn.getRequestBy(), ecn.getComments(), ecnStatus,
                ecn.getInstanceRrn(), ecn.getInstanceId(), LocalContext.getFacilityRrn(), ecn.getInstanceDesc(),
                ecn.getNamedSpace(), ecn.getObjectType(), ecn.getObjectSubtype(), ecn.getInstanceStatus(),
                ecn.getCreatedTimestamp(), ecn.getCreatedTimestamp(), ecn.getRequestBy(), ecn.getRequestBy(),
                ecn.getLockVersion()};
        jdbcTemplate.update(sql, args);
    }

    @Override
    public void insertEcnHistory(Long transRrn, Integer transSequence, String transId, Long ecnRrn,
                                 Timestamp transTime) {
        String sql = "INSERT INTO  ECN_H  (TRANS_RRN, TRANS_SEQUENCE, TRANS_ID, " + " ECN_RRN, REQUEST_BY, " +
                "APPROVAL_WFL_RRN, COMMENTS, " + " ECN_STATUS, EFFECTIVE_DATE_FROM, EFFECTIVE_DATE_TO," + " SYS_RRN," +
                "ECN_ID,FACILITY_RRN,DESCRIPTION,OBJ_SPACE," + " OBJ_TYPE,OBJ_SUBTYPE,OBJ_STATUS,TRANS_USER_RRN," +
                "TRANS_TIME" + ") SELECT " + " ?, ?, ?, ECN_RRN, REQUEST_BY, APPROVAL_WFL_RRN, COMMENTS, " + " " +
                "ECN_STATUS, EFFECTIVE_DATE_FROM, EFFECTIVE_DATE_TO," + " SYS_RRN, ECN_ID, FACILITY_RRN, DESCRIPTION," +
                " OBJ_SPACE," + " OBJ_TYPE, OBJ_SUBTYPE, OBJ_STATUS, ?,? " + " FROM ECN " + " WHERE ECN_RRN = ? ";
        Object[] args = new Object[]{transRrn, transSequence, transId, LocalContext.getUserRrn(), transTime, ecnRrn};
        jdbcTemplate.update(sql, args);
    }

    @Override
    public void insertEcnHistoryComment(Ecn ecn, long transRrn) {
        String sql = "INSERT INTO " + DataBaseNames.OBJECT_COMMENT + " (trans_rrn,instance_rrn,comments )" + " VALUES" +
                " (" + transRrn + "," + ecn.getInstanceRrn() + "," +
                StringUtils.wrapWithApostropheIfMissing(ecn.getComments()) + ")";

        jdbcTemplate.execute(sql);
    }

    @Override
    public Ecn getEcn(long ecnRrn) {
        String sql = "SELECT INSTANCE_ID,INSTANCE_RRN,INSTANCE_DESC,OBJECT_TYPE,OBJECT_SUBTYPE," +
                "CREATED_TIMESTAMP,REQUEST_BY,ECN_STATUS,APPROVAL_WFL_RRN ,COMMENTS," + "ECN.EFFECTIVE_DATE_FROM,ECN" +
                ".EFFECTIVE_DATE_TO FROM " + DataBaseNames.NAMEDOBJECT + "," + DataBaseNames.ECN + " WHERE " +
                "NAMED_OBJECT.INSTANCE_RRN=ECN.ECN_RRN AND ECN.ECN_RRN = ?";
        return jdbcTemplate.queryForObjectWithNull(sql, new EcnMapper(), ecnRrn);
    }

    @Override
    public List<Ecn> getActiveEcnList() {
        String sql = "SELECT INSTANCE_ID,INSTANCE_RRN,INSTANCE_DESC,OBJECT_TYPE,OBJECT_SUBTYPE," +
                "CREATED_TIMESTAMP,TRANSLATE_RRN(REQUEST_BY) REQUEST_BY_ID,REQUEST_BY,ECN_STATUS," +
                "APPROVAL_WFL_RRN ,COMMENTS,EFFECTIVE_DATE_FROM,EFFECTIVE_DATE_TO FROM " + DataBaseNames.NAMEDOBJECT +
                "," + DataBaseNames.ECN + " WHERE NAMED_OBJECT.INSTANCE_RRN=ECN.ECN_RRN" + " AND ECN_STATUS='ACTIVE'";
        return jdbcTemplate.query(sql, new EcnMapper());
    }

    @Override
    public List<ObjectVersion> getEcnObjectVersions(long ecnRrn) {
        String sql = "SELECT A.INSTANCE_RRN,A.INSTANCE_ID,A.INSTANCE_DESC,A.OBJECT," + "B.INSTANCE_VERSION,B" +
                ".VERSION_ID,B.VERSION_DESC" + " FROM " + DataBaseNames.NAMEDOBJECT + " A," +
                DataBaseNames.OBJECTVERSION + " B " + " WHERE ECN_RRN = ?" + " AND A.INSTANCE_RRN = B.INSTANCE_RRN" +
                " ORDER BY INSTANCE_ID";

        return jdbcTemplate.query(sql, new Object[]{ecnRrn}, (RowMapper<ObjectVersion>) (rs, rowNum) -> {
            ObjectVersion objectVersion = new ObjectVersion();
            int i = 1;
            objectVersion.setInstanceRrn(rs.getLong(i++));
            objectVersion.setInstanceId(rs.getString(i++));
            objectVersion.setInstanceDesc(rs.getString(i++));
            objectVersion.setObject(rs.getString(i++));
            objectVersion.setInstanceVersion(rs.getInt(i++));
            objectVersion.setVersionId(rs.getString(i++));
            objectVersion.setVersionDesc(rs.getString(i++));
            return objectVersion;
        });
    }

    @Override
    public List<ContextValue> getEcnContextValues(long ecnRrn) {
        String sql = " SELECT d.instance_id,sequence_number,status,effective_date_from,effective_date_to,ecn_rrn," +
                " context_key1, context_key2, context_key3, context_key4, context_key5, " + " context_key6, " +
                "context_key7, context_key8, context_key9, " + " context_key10,context_key11,context_key12," +
                "context_key13,context_key14,context_key15," + " result_value1,result_value2,result_value3," + " " +
                "result_value4,result_value5,result_value6, result_value7," + " result_value8,result_value9," +
                "result_value10 " + " FROM " + DataBaseNames.CONTEXT_VALUE + " C," + DataBaseNames.NAMEDOBJECT + " D " +
                " WHERE ecn_rrn = ?" + " and  C.CONTEXT_RRN=D.INSTANCE_RRN";

        return jdbcTemplate.query(sql, new Object[]{ecnRrn}, new RowMapper<ContextValue>() {
            int i = 0;

            @Override
            public ContextValue mapRow(ResultSet rs, int rowNum) throws SQLException {
                ContextValue contextValue = new ContextValue();

                contextValue.setStatus(rs.getString("status"));
                contextValue.setSequenceNumber(rs.getInt("sequence_number"));

                if (rs.getDate("effective_date_from") != null) {
                    contextValue.setEffectiveDateFrom(rs.getDate("effective_date_from").toString());
                }

                contextValue.setEcnRrn(new Long(rs.getLong("ecn_rrn")));

                if (rs.getDate("effective_date_to") != null) {
                    contextValue.setEffectiveDateTo(rs.getDate("effective_date_to").toString());
                }

                contextValue.setContextId(rs.getString("instance_id"));
                contextValue.setContextKey1(rs.getString("context_key1"));
                contextValue.setContextKey2(rs.getString("context_key2"));
                contextValue.setContextKey3(rs.getString("context_key3"));
                contextValue.setContextKey4(rs.getString("context_key4"));
                contextValue.setContextKey5(rs.getString("context_key5"));
                contextValue.setContextKey6(rs.getString("context_key6"));
                contextValue.setContextKey7(rs.getString("context_key7"));
                contextValue.setContextKey8(rs.getString("context_key8"));
                contextValue.setContextKey9(rs.getString("context_key9"));
                contextValue.setContextKey10(rs.getString("context_key10"));
                contextValue.setContextKey11(rs.getString("context_key11"));
                contextValue.setContextKey12(rs.getString("context_key12"));
                contextValue.setContextKey13(rs.getString("context_key13"));
                contextValue.setContextKey14(rs.getString("context_key14"));
                contextValue.setContextKey15(rs.getString("context_key15"));
                contextValue.setResultValue1(rs.getString("result_value1"));
                contextValue.setResultValue2(rs.getString("result_value2"));
                contextValue.setResultValue3(rs.getString("result_value3"));
                contextValue.setResultValue4(rs.getString("result_value4"));
                contextValue.setResultValue5(rs.getString("result_value5"));
                contextValue.setResultValue6(rs.getString("result_value6"));
                contextValue.setResultValue7(rs.getString("result_value7"));
                contextValue.setResultValue8(rs.getString("result_value8"));
                contextValue.setResultValue9(rs.getString("result_value9"));
                contextValue.setResultValue10(rs.getString("result_value10"));
                contextValue.setSequence(i++);
                return contextValue;
            }
        });
    }

    @Override
    public void updateEcnEffectiveDate(String fromDate, String toDate, long ecnRrn) {
        String sql =
                "UPDATE " + DataBaseNames.ECN + " SET EFFECTIVE_DATE_FROM = to_date(?,'" + DateUtils.DATE_FORMAT24 +
                        "'), EFFECTIVE_DATE_TO = to_date(?,'" + DateUtils.DATE_FORMAT24 + "'), UPDATE_TIME = ?, " +
                        "UPDATE_USER_RRN = ? WHERE ECN_RRN = ? ";
        jdbcTemplate.update(sql, fromDate, toDate, new Timestamp(System.currentTimeMillis()), LocalContext.getUserRrn(),
                            ecnRrn);
    }

    @Override
    public void updateEcnStatus(String status, String comments, long ecnRrn) {
        String sql = "UPDATE " + DataBaseNames.ECN + " SET ECN_STATUS = ?, COMMENTS = ?, UPDATE_TIME = ?, " +
                "UPDATE_USER_RRN = ? " + " WHERE ECN_RRN = ? ";
        jdbcTemplate.update(sql, status, comments, new Timestamp(System.currentTimeMillis()), LocalContext.getUserRrn(),
                            ecnRrn);
    }

    @Override
    public void updateStatusForContext(String status, long ecnRrn) {
        String sql = "UPDATE " + DataBaseNames.CONTEXT_VALUE + " SET STATUS = ? WHERE ECN_RRN = ? ";
        jdbcTemplate.update(sql, status, ecnRrn);
    }

    @Override
    public void updateStatusForObjectVersion(String status, long ecnRrn) {
        String sql = "UPDATE " + DataBaseNames.OBJECTVERSION + " SET VERSION_STATUS = ? WHERE ECN_RRN = ? ";
        jdbcTemplate.update(sql, status, ecnRrn);
    }

    @Override
    public long getEcnSignOffRrn(String ecnType, String refNamedSpace, String tNamedSpace) {
        String sql = "SELECT t.data_2_value FROM (SELECT N.NAMED_SPACE,N.INSTANCE_ID REF_FILE_ID," + "D.KEY_1_VALUE,D" +
                ".KEY_2_VALUE,D.DATA_1_VALUE,D.DATA_2_VALUE,D.DATA_3_VALUE," + "D.DATA_4_VALUE,D.DATA_5_VALUE FROM " +
                "NAMED_OBJECT N, REFERENCE_FILE_DETAIL D " + " WHERE N.INSTANCE_RRN = D.REFERENCE_FILE_RRN) t " + " " +
                "WHERE t.ref_file_id = '$ECN_TYPE' " + " AND named_space='" + refNamedSpace + "'" + " AND upper" +
                "(key_1_value)='" + ecnType.toUpperCase() + "'";

        long signOffRrn = 0;

        String _routineId = jdbcTemplate.queryForObjectWithNull(sql, String.class);

        sql = "select instance_rrn from named_object where instance_id='" + _routineId.trim().toUpperCase() +
                "' and   " + "named_space='" + tNamedSpace + "'";

        return jdbcTemplate.queryForObjectWithNull(sql, long.class);
    }

    @Override
    public boolean isEcnControled(String object, String namedSpace) {
        String sql = "SELECT COUNT(*) FROM  NAMED_SPACE_DEFINITION " + " WHERE  substr(control_flag,3,1)='1'" + " AND" +
                " object=? AND named_space=? ";
        return jdbcTemplate.queryForObjectWithNull(sql, new Object[]{object, namedSpace}, long.class) > 0;
    }

    @Override
    public void updateEcnForStatus(Ecn ecn) {
        String sql = "UPDATE " + DataBaseNames.ECN + " SET ECN_STATUS = ?, COMMENTS = ?, " + " EFFECTIVE_DATE_FROM = " +
                "to_date(?, '" + DateUtils.DATE_FORMAT24 + "'), " + " EFFECTIVE_DATE_TO = to_date(?, '" +
                DateUtils.DATE_FORMAT24 + "'), UPDATE_TIME = ?, UPDATE_USER_RRN = ? " + " WHERE ECN_RRN = ? ";
        Object[] args = new Object[]{ecn.getEcnStatus(), ecn.getComments(), ecn.getEffectiveDateFrom(),
                ecn.getEffectiveDateTo(), new Timestamp(
                System.currentTimeMillis()), LocalContext.getUserRrn(), ecn.getInstanceRrn()};
        jdbcTemplate.update(sql, args);
    }

    @Override
    public void updateContextValueForEcn(Ecn ecn) {
        StringBuilder sql = new StringBuilder("UPDATE ");
        sql.append(DataBaseNames.CONTEXT_VALUE);
        sql.append(" SET STATUS = ?, ");
        sql.append(" EFFECTIVE_DATE_FROM = to_date(?, '" + DateUtils.DATE_FORMAT24 + "'), ");
        sql.append(" EFFECTIVE_DATE_TO = to_date(?, '" + DateUtils.DATE_FORMAT24 + "') ");
        sql.append(" WHERE ECN_RRN = ? ");

        Object[] args = new Object[]{ecn.getEcnStatus(), ecn.getEffectiveDateFrom(), ecn.getEffectiveDateTo(),
                ecn.getInstanceRrn()};

        jdbcTemplate.update(sql.toString(), args);
    }

    @Override
    public void updateObjectVersionForEcn(Ecn ecn) {
        StringBuilder sql = new StringBuilder("UPDATE ");
        sql.append(DataBaseNames.OBJECTVERSION);
        sql.append(" SET VERSION_STATUS = ?, ");
        sql.append(" EFFECTIVE_DATE_FROM = to_date(?, '" + DateUtils.DATE_FORMAT24 + "'), ");
        sql.append(" EFFECTIVE_DATE_TO = to_date(?, '" + DateUtils.DATE_FORMAT24 + "') ");
        sql.append(" WHERE ECN_RRN = ? ");

        Object[] args = new Object[]{ecn.getEcnStatus(), ecn.getEffectiveDateFrom(), ecn.getEffectiveDateTo(),
                ecn.getInstanceRrn()};

        jdbcTemplate.update(sql.toString(), args);
    }

    @Override
    public String getMaxEcnIdFromHistory(String ecnIdPattern) {
        String sql = "SELECT " + " MAX(no.INSTANCE_ID) AS MAXID " + " FROM (SELECT DISTINCT INSTANCE_RRN, " +
                "INSTANCE_ID, OBJECT FROM NAMED_OBJECT_H) no " + " WHERE no.OBJECT = 'ECN' AND no.INSTANCE_ID LIKE ? ";
        return jdbcTemplate.queryForObjectWithNull(sql, new Object[]{ecnIdPattern}, String.class);
    }

    @Override
    public void updateRunCardStatus(Long runCardRrn, Timestamp effectiveDateFrom, Timestamp effectiveDateTo,
                                    String status) {
        String sql = "UPDATE " + DataBaseNames.ECN + " SET ECN_STATUS = ?, EFFECTIVE_DATE_FROM = ?, EFFECTIVE_DATE_TO" +
                " = ? " + ", UPDATE_TIME = ?, UPDATE_USER_RRN = ?  WHERE ECN_RRN = ? ";
        jdbcTemplate.update(sql, status, effectiveDateFrom, effectiveDateTo, new Timestamp(System.currentTimeMillis()),
                            LocalContext.getUserRrn(), runCardRrn);
    }

    @Override
    public Page getEcnHistoryPage(int pageNo, int pageSize, Long ecnRrn) {
        Page page = new Page(pageNo, pageSize);
        StringBuilder sql = new StringBuilder("SELECT ");
        sql.append(" eh.TRANS_RRN, eh.TRANS_SEQUENCE, tl.TRANS_ID, tl.TRANS_START_TIMESTAMP, tl" +
                           ".TRANS_END_TIMESTAMP, tl.TRANS_PERFORMED_BY, ");
        sql.append(
                " tl.COMMENTS AS TRANS_COMMENTS, eh.ECN_RRN, eh.REQUEST_BY, eh.APPROVAL_WFL_RRN, eh" + ".COMMENTS, ");
        sql.append(" eh.ECN_STATUS, eh.EFFECTIVE_DATE_FROM, eh.EFFECTIVE_DATE_TO ");
        sql.append(" FROM ECN_H eh, TRANSACTION_LOG tl ");
        sql.append(" WHERE eh.TRANS_RRN = tl.TRANS_RRN ");
        sql.append(" AND eh.ECN_RRN = ? ");
        sql.append(" ORDER BY tl.TRANS_START_TIMESTAMP DESC, eh.TRANS_SEQUENCE DESC ");
        return jdbcTemplate
                .queryForPage(page, sql.toString(), new Object[]{ecnRrn}, new RowMapper<Map<String, Object>>() {
                    Map<String, Object> map;

                    @Override
                    public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
                        map = new HashMap<>();

                        map.put("transRrn", rs.getLong("TRANS_RRN"));
                        map.put("transSequence", rs.getInt("TRANS_SEQUENCE"));
                        map.put("transId", rs.getString("TRANS_ID"));
                        map.put("transStartTimestamp", DateUtils.formatDate(rs.getTimestamp("TRANS_START_TIMESTAMP")));
                        map.put("transEndTimestamp", DateUtils.formatDate(rs.getTimestamp("TRANS_END_TIMESTAMP")));
                        map.put("transPerformedBy", rs.getString("TRANS_PERFORMED_BY"));

                        map.put("ecnRrn", rs.getLong("ECN_RRN"));
                        map.put("requestBy", rs.getLong("REQUEST_BY"));
                        map.put("approvalWflRrn", rs.getLong("APPROVAL_WFL_RRN"));
                        map.put("comments", StringUtils.defaultString(rs.getString("COMMENTS")));
                        map.put("ecnStatus", rs.getString("ECN_STATUS"));
                        map.put("effectiveDateFrom", DateUtils.formatDate(rs.getTimestamp("EFFECTIVE_DATE_FROM")));
                        map.put("effectiveDateTo", DateUtils.formatDate(rs.getTimestamp("EFFECTIVE_DATE_TO")));

                        map.put("transComments", StringUtils.defaultString(rs.getString("TRANS_COMMENTS")));

                        return map;
                    }
                });
    }

}