PcdDAOImpl.java

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

import com.mycim.framework.jdbc.JdbcTemplate;
import com.mycim.framework.jdbc.mapper.RowMapper;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.framework.utils.lang.time.DateUtils;
import com.mycim.server.carrier.dao.PcdDAO;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.consts.DataBaseNames;
import com.mycim.valueobject.ems.PcdAssembly;
import com.mycim.valueobject.ems.PcdClean;
import com.mycim.valueobject.wip.TransReason;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

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

@Repository
public class PcdDAOImpl implements PcdDAO {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Override
    public PcdAssembly getPcdAssembly(Long carrierRrn, Long podRrn, Long doorRrn) {
        String sql = "SELECT CARRIER_RRN,getinstanceid(CARRIER_RRN) as CARRIER_ID,POD_RRN,getinstanceid(POD_RRN)" +
                " as POR_ID," + "DOOR_RRN,getinstanceid(DOOR_RRN) as DOOR_ID,CREATE_USER,CREATE_TIME FROM " +
                "PCD_ASSEMBLY " + "WHERE 1=1";
        if (carrierRrn != null && carrierRrn.longValue() > 0) {
            sql += " AND CARRIER_RRN=" + carrierRrn;
        }
        if (podRrn != null && podRrn.longValue() > 0) {
            sql += " AND POD_RRN=" + podRrn;
        }
        if (doorRrn != null && doorRrn.longValue() > 0) {
            sql += " AND DOOR_RRN=" + doorRrn;
        }
        List<PcdAssembly> list = jdbcTemplate.query(sql, new RowMapper<PcdAssembly>() {

            @Override
            public PcdAssembly mapRow(ResultSet rs, int rowNum) throws SQLException {
                PcdAssembly pcd = new PcdAssembly();
                pcd.setCarrierId(rs.getString("CARRIER_ID"));
                pcd.setCarrierRrn(rs.getLong("CARRIER_RRN"));
                pcd.setPodId(rs.getString("POR_ID"));
                pcd.setPodRrn(rs.getLong("POD_RRN"));
                pcd.setDoorId(rs.getString("DOOR_ID"));
                pcd.setDoorRrn(rs.getLong("DOOR_RRN"));
                pcd.setCreatedUserId(rs.getString("CREATE_USER"));
                pcd.setCreatedTime(rs.getString("CREATE_TIME"));
                pcd.setCreatedTimestamp(rs.getTimestamp("CREATE_TIME"));
                return pcd;
            }
        });
        if (list != null && list.size() > 0) {
            return list.get(0);
        } else {
            return null;
        }
    }

    @Override
    public PcdClean getPcdCleanInfo(Long pcdRrn) {
        String sql = "SELECT getinstanceid(C.INSTANCE_RRN) AS PCD_ID, C.INSTANCE_RRN, C.IN_CLEAN_DATE, C" +
                ".CLEAN_OVER_DATE, C.CLEAN_CYCLE, C.PCD_TYPE, C.OUT_CLEAN_DATE, " + "C.CLEAN_COUNT, C.EQPT_ID FROM " +
                "PCD_CLEAN C WHERE C.INSTANCE_RRN = ?";

        return jdbcTemplate.queryForObject(sql, new Object[]{pcdRrn}, new RowMapper<PcdClean>() {

            @Override
            public PcdClean mapRow(ResultSet rs, int rowNum) throws SQLException {
                PcdClean cleanInfo = new PcdClean();
                cleanInfo.setInstanceId(rs.getString("PCD_ID"));
                cleanInfo.setInstanceRrn(rs.getLong("INSTANCE_RRN"));
                cleanInfo.setInCleanDate(rs.getTimestamp("IN_CLEAN_DATE"));
                cleanInfo.setCleanOverDate(rs.getTimestamp("CLEAN_OVER_DATE"));
                cleanInfo.setCleanCycle(rs.getDouble("CLEAN_CYCLE"));
                cleanInfo.setPcdType(rs.getString("PCD_TYPE"));
                cleanInfo.setOutCleanDate(rs.getTimestamp("OUT_CLEAN_DATE"));
                cleanInfo.setCleanCount(rs.getInt("CLEAN_COUNT"));
                cleanInfo.setCleanEqptId(rs.getString("EQPT_ID"));
                if (cleanInfo.getInCleanDate() != null) {
                    long now = DateUtils.parse(DateUtils.getNowTime()).getTime();
                    long inClean = cleanInfo.getInCleanDate().getTime();
                    cleanInfo.setCleaningMinutes((now - inClean) / 1000 / 60);
                }
                return cleanInfo;
            }
        });
    }

    @Override
    public Map getPcdDefaultCleanCycleInfo(String category, String type) {
        String sql = "SELECT PD.CATEGORY, PD.TYPE, PD.DEFAULT_CLEAN_CYCLE, PD.OPERATION_DATE, PD.OPERATION_USER " +
                "FROM  PCD_DEFALULT_CLEAN_CYCLE PD WHERE PD.CATEGORY = ? AND PD.TYPE = ?";
        return jdbcTemplate.queryForObjectWithNull(sql, new Object[]{category, type}, new RowMapper<Map>() {

            @Override
            public Map mapRow(ResultSet rs, int rowNum) throws SQLException {
                Map<String, Object> map = new HashMap();
                map.put("category", rs.getString("CATEGORY"));
                map.put("type", rs.getString("TYPE"));
                map.put("defaultCleanCycle", rs.getDouble("DEFAULT_CLEAN_CYCLE"));
                map.put("operationDate", rs.getTimestamp("OPERATION_DATE"));
                map.put("operationUser", rs.getString("OPERATION_USER"));
                return map;
            }
        });
    }

    @Override
    public String getCarrierIdSerial(String prefix) {
        String sql = "SELECT nvl(MAX(SUFFIX),'0000') as a  FROM (select SUBSTR(n.instance_id, 3) " + "SUFFIX from " +
                "named_object n, carrier c where n.instance_rrn=c.carrier_rrn and n" + ".instance_id like ?) t_0  " +
                "WHERE REGEXP_LIKE (SUFFIX , '^[0-9]{4}$')";
        return jdbcTemplate.queryForObject(sql, new Object[]{"%" + prefix + "%"}, String.class);
    }

    @Override
    public String getCarrierIdSerial(String prefix, int serialLength) {
        String zeros = "";
        for (int i = 0; i < serialLength; i++) {
            zeros += "0";
        }
        int prefixLen = prefix != null ? prefix.length() : 0;
        String sql = "SELECT nvl(MAX(SUFFIX),'" + zeros + "') as a  FROM (select SUBSTR(n.instance_id, ?) " + "SUFFIX" +
                " from named_object n, carrier c where n.instance_rrn=c.carrier_rrn and n" + ".instance_id like ?) " +
                "t_0  WHERE REGEXP_LIKE ( SUFFIX , '^[0-9]{" + serialLength + "}$')";
        return jdbcTemplate.queryForObject(sql, new Object[]{prefixLen + 1, "%" + prefix + "%"}, String.class);
    }

    @Override
    public int deletePcdCleanInfo(Long pcdRrn) {
        String sql = "delete from pcd_clean pc where pc.instance_rrn = ?";
        int successCount = jdbcTemplate.update(sql, new Object[]{pcdRrn});
        return successCount;
    }

    @Override
    public int insertPcdCleanH(Long transRrn, PcdClean cleanInfo) {
        StringBuffer sql = new StringBuffer("INSERT INTO PCD_CLEAN_H (TRANS_RRN, INSTANCE_RRN");
        StringBuffer values = new StringBuffer(" VALUES (?, ?");
        List<Object> args = new ArrayList();
        args.add(transRrn);
        args.add(cleanInfo.getInstanceRrn());
        if (cleanInfo.getInCleanDate() != null) {
            sql.append(", IN_CLEAN_DATE");
            values.append(", ?");
            args.add(cleanInfo.getInCleanDate());
        }
        if (cleanInfo.getCleanOverDate() != null) {
            sql.append(", CLEAN_OVER_DATE");
            values.append(", ?");
            args.add(cleanInfo.getCleanOverDate());
        }
        if (cleanInfo.getCleanCycle() > 0) {
            sql.append(", CLEAN_CYCLE");
            values.append(", ?");
            args.add(cleanInfo.getCleanCycle());
        }
        if (StringUtils.isNotBlank(cleanInfo.getPcdType())) {
            sql.append(", PCD_TYPE");
            values.append(", ?");
            args.add(cleanInfo.getPcdType());
        }
        if (cleanInfo.getOutCleanDate() != null) {
            sql.append(", OUT_CLEAN_DATE");
            values.append(", ?");
            args.add(cleanInfo.getOutCleanDate());
        }

        sql.append(", EQPT_ID ");
        values.append(", ?");
        args.add(cleanInfo.getCleanEqptId());

        sql.append(")");
        values.append(")");
        sql.append(values);

        int successCount = jdbcTemplate.update(sql.toString(), args.toArray());
        return successCount;
    }

    @Override
    public void insertPcdNamedObjectExt(Long pcdRrn, String flagType, String dmm_type) {
        String sql = "insert into named_object_ext (instance_rrn, flag_type, dmm_type) values (?, ?, ?)";
        jdbcTemplate.update(sql, new Object[]{pcdRrn, flagType, dmm_type});
    }

    @Override
    public int insertPcdCleanInfo(PcdClean cleanInfo) {
        String sql = "INSERT INTO PCD_CLEAN (INSTANCE_RRN, CLEAN_OVER_DATE, CLEAN_CYCLE, PCD_TYPE, " + "CLEAN_COUNT) " +
                "VALUES (?, ?, ?, ?, ?)";
        Object[] args = new Object[]{cleanInfo.getInstanceRrn(), cleanInfo.getCleanOverDate(),
                cleanInfo.getCleanCycle(), cleanInfo.getPcdType(), cleanInfo.getCleanCount()};
        int successCount = jdbcTemplate.update(sql, args);
        return successCount;
    }

    @Override
    public void updatePcdNamedObjectExt(Long pcdRrn, String flagType) {
        String sql = "update named_object_ext set flag_type = ? where instance_rrn = ?";
        jdbcTemplate.update(sql, new Object[]{flagType, pcdRrn});
    }

    @Override
    public int countPcdCategoryByRrn(Long pcdRrn) {
        String sql = "select count(n.flag_type) from named_object_ext n where n.instance_rrn = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{pcdRrn}, int.class);
    }

    @Override
    public int updatePcdCleanInfo(PcdClean cleanInfo) {
        StringBuffer sql = new StringBuffer("UPDATE PCD_CLEAN SET INSTANCE_RRN=?");
        List<Object> args = new ArrayList<Object>();
        args.add(cleanInfo.getInstanceRrn());
        if (cleanInfo.getInCleanDate() != null) {
            sql.append(", IN_CLEAN_DATE=?");
            args.add(cleanInfo.getInCleanDate());
        }
        if (cleanInfo.getCleanOverDate() != null) {
            sql.append(", CLEAN_OVER_DATE=?");
            args.add(cleanInfo.getCleanOverDate());
        }
        if (cleanInfo.getCleanCycle() > 0) {
            sql.append(", CLEAN_CYCLE=?");
            args.add(cleanInfo.getCleanCycle());
        }
        if (StringUtils.isNotBlank(cleanInfo.getPcdType())) {
            sql.append(", PCD_TYPE=?");
            args.add(cleanInfo.getPcdType());
        }
        if (cleanInfo.getOutCleanDate() != null) {
            sql.append(", OUT_CLEAN_DATE=? ");
            args.add(cleanInfo.getOutCleanDate());
        } else {
            sql.append(", OUT_CLEAN_DATE=? ");
            args.add(null);
        }
        if (cleanInfo.getCleanCount() >= 0) {
            sql.append(", CLEAN_COUNT=? ");
            args.add(cleanInfo.getCleanCount());
        }

        sql.append(", EQPT_ID=? ");
        args.add(cleanInfo.getCleanEqptId());

        sql.append(" WHERE INSTANCE_RRN=?");
        args.add(cleanInfo.getInstanceRrn());
        int successCount = jdbcTemplate.update(sql.toString(), args.toArray());
        return successCount;
    }

    @Override
    public void deletePcdAssembly(Long carrierRrn) {
        String sql = "DELETE FROM PCD_ASSEMBLY WHERE CARRIER_RRN=?";
        Object[] args = new Object[]{carrierRrn};
        jdbcTemplate.update(sql, args);
    }

    @Override
    public void insertPcdAssemblyH(Long carrierRrn, String user, Long transRrn) {
        String sql = "INSERT INTO PCD_ASSEMBLY_H (TRANS_RRN,CARRIER_RRN,POD_RRN,DOOR_RRN,CREATE_USER," +
                "CREATE_TIME,UPDATE_USER,UPDATE_TIME) " + " SELECT ?,CARRIER_RRN,POD_RRN,DOOR_RRN,CREATE_USER," +
                "CREATE_TIME,?,sysdate FROM " + "PCD_ASSEMBLY WHERE CARRIER_RRN = ?";
        Object[] args = new Object[]{transRrn, user, carrierRrn};
        jdbcTemplate.update(sql, args);
    }

    @Override
    public void insertPcdAssemblyH(Long carrierRrn, Long podRrn, Long doorRrn, String user, Long transRrn) {
        String sql = "INSERT INTO PCD_ASSEMBLY_H (TRANS_RRN,CARRIER_RRN,POD_RRN,DOOR_RRN,CREATE_USER," +
                "CREATE_TIME,UPDATE_USER,UPDATE_TIME) VALUES (?,?,?,?,?,sysdate,?,sysdate)";
        Object[] args = new Object[]{transRrn, carrierRrn, podRrn, doorRrn, user, user};
        jdbcTemplate.update(sql, args);
    }

    @Override
    public void insertPcdAssembly(Long carrierRrn, Long podRrn, Long doorRrn, String user) {
        String sql = "INSERT INTO PCD_ASSEMBLY (CARRIER_RRN,POD_RRN,DOOR_RRN,CREATE_USER,CREATE_TIME) " + "VALUES (?," +
                "?,?,?,sysdate)";
        Object[] args = new Object[]{carrierRrn, podRrn, doorRrn, user};
        jdbcTemplate.update(sql, args);
    }

    @Override
    public boolean isAssembledPCD(Long instanceRrn) {
        String sql = "SELECT COUNT(*)  FROM PCD_ASSEMBLY  WHERE CARRIER_RRN = ? OR POD_RRN = ? OR DOOR_RRN " + "= ?";
        long count = jdbcTemplate
                .queryForObjectWithNull(sql, new Object[]{instanceRrn, instanceRrn, instanceRrn}, Long.class);
        return count > 0 ? true : false;
    }

    @Override
    public List<Map> getHoldReasons(long instanceRrn) {
        String sql = "SELECT REASON_CATEGORY,REASON_CODE,REASON," + "SEQUENCE_NUMBER,HOLD_PASSWORD,INSTANCE_ID," +
                "HOLD_TIMESTAMP,B.HOLD_BY" + " FROM " + DataBaseNames.TRANS_REASON + " A," +
                DataBaseNames.MULTIPLE_HOLD + " B," + DataBaseNames.NAMEDOBJECT + " C" +
                " WHERE A.INSTANCE_RRN = B.INSTANCE_RRN" + " AND A.TRANS_RRN = B.TRANS_RRN" +
                " AND A.INSTANCE_RRN = ?" + " AND B.HOLD_BY = C.INSTANCE_RRN";
        return jdbcTemplate.query(sql, new Object[]{instanceRrn}, new RowMapper<Map>() {

            @Override
            public Map mapRow(ResultSet rs, int rowNum) throws SQLException {
                Map holdReason = new HashMap();
                holdReason.put("instanceRrn", (new Long(instanceRrn)).toString());
                holdReason.put("reasonCategory", rs.getString(1));
                holdReason.put("reasonCode", rs.getString(2));
                holdReason.put("reason", rs.getString(3));
                holdReason.put("sequenceNumber", rs.getString(4));
                holdReason.put("holdPassword", rs.getString(5));
                String holdName = getTransByName(rs.getString(6));
                if (holdName != null) {
                    holdReason.put("holdBy", rs.getString(6) + " " + holdName);
                } else {
                    holdReason.put("holdBy", rs.getString(6));
                }
                holdReason.put("holdByRrn", rs.getString("HOLD_BY"));
                if (rs.getTimestamp(7) != null) {
                    SimpleDateFormat formatter = new SimpleDateFormat(DateUtils.DATE_FORMAT);
                    holdReason.put("holdDate", formatter.format(rs.getTimestamp(7)));
                } else {
                    holdReason.put("holdDate", "");
                }
                return holdReason;
            }
        });
    }

    @Override
    public PcdAssembly getPcdAssembly(Long carrierRrn) {
        String sql = "SELECT CARRIER_RRN,getinstanceid(CARRIER_RRN) as CARRIER_ID,POD_RRN,getinstanceid(POD_RRN)" +
                " as POR_ID," + " DOOR_RRN,getinstanceid(DOOR_RRN) as DOOR_ID,CREATE_USER,CREATE_TIME FROM " +
                "PCD_ASSEMBLY " + "WHERE 1=1 " + " AND CARRIER_RRN=" + carrierRrn;
        List<PcdAssembly> list = jdbcTemplate.query(sql, new RowMapper<PcdAssembly>() {

            @Override
            public PcdAssembly mapRow(ResultSet rs, int rowNum) throws SQLException {
                PcdAssembly pcd = new PcdAssembly();
                pcd.setCarrierId(rs.getString("CARRIER_ID"));
                pcd.setCarrierRrn(rs.getLong("CARRIER_RRN"));
                pcd.setPodId(rs.getString("POR_ID"));
                pcd.setPodRrn(rs.getLong("POD_RRN"));
                pcd.setDoorId(rs.getString("DOOR_ID"));
                pcd.setDoorRrn(rs.getLong("DOOR_RRN"));
                pcd.setCreatedUserId(rs.getString("CREATE_USER"));
                pcd.setCreatedTime(rs.getString("CREATE_TIME"));
                pcd.setCreatedTimestamp(rs.getTimestamp("CREATE_TIME"));
                return pcd;
            }
        });
        if (list != null && list.size() > 0) {
            return list.get(0);
        } else {
            return null;
        }
    }

    @Override
    public void insertMultipleHold(long instanceRrn, long holdBy, long transRrn) {
        String sql = "INSERT INTO " + DataBaseNames.MULTIPLE_HOLD + "(INSTANCE_RRN,OBJECT,SEQUENCE_NUMBER," +
                "HOLD_BY,HOLD_TIMESTAMP,TRANS_RRN) VALUES(?,?," + "NVL((SELECT MAX(NVL(SEQUENCE_NUMBER,0))+1 FROM " +
                DataBaseNames.MULTIPLE_HOLD + " WHERE INSTANCE_RRN = ?),1),?,?,?)";
        jdbcTemplate.update(sql, instanceRrn, ObjectList.CARRIER_KEY, instanceRrn, holdBy,
                            new java.sql.Timestamp(System.currentTimeMillis()), transRrn);
    }

    @Override
    public void insertTransReason(long transRrn, long instanceRrn, TransReason transReason, int reasonCodeSequence) {

        String sql = "INSERT INTO " + DataBaseNames.TRANS_REASON + "(TRANS_RRN,INSTANCE_RRN,REASON_CODE_SEQUENCE," +
                "REASON_CATEGORY," + "REASON_CODE,REASON,TRANS_QTY1,TRANS_QTY2,RESPONSIBILITY,ACCOUNT_CODE) " +
                "VALUES" + "(?,?,?,?,?,?,?,?,?,?)";

        if (transReason.getTransQty1() == null) {
            transReason.setTransQty1(0.0);
        }

        if (transReason.getTransQty2() == null) {
            transReason.setTransQty2(0.0);
        }

        Object[] args = {transRrn, instanceRrn, reasonCodeSequence, transReason.getReasonCategory(),
                transReason.getReasonCode(), transReason.getReason(), transReason.getTransQty1(),
                transReason.getTransQty2(), transReason.getResponsibility(), transReason.getAccountCode()};

        jdbcTemplate.update(sql, args);
    }

    @Override
    public void deleteMultipleHold(long instanceRrn, long sequence) {
        String sql = "DELETE FROM " + DataBaseNames.MULTIPLE_HOLD + " WHERE INSTANCE_RRN = ? AND SEQUENCE_NUMBER = ?";

        jdbcTemplate.update(sql, instanceRrn, sequence);

    }

    @Override
    public List<Map> getHoldReasonCodes(String holdReasonGroupID, List<String> holdRoles, String referenceFileId) {
        StringBuffer sql = new StringBuffer(
                "select rfd.key_1_value, rfd.data_1_value,rfd.data_2_value,rfd.data_3_value from " +
                        "reference_file_detail rfd, " + "named_object no " + "where rfd.reference_file_rrn=no" +
                        ".instance_rrn and no.instance_id=? and ( rfd" + ".data_3_value=? or rfd.data_3_value like " +
                        "'%ALL%' )" + " and rfd.data_5_value = '1' ");

        List args = new ArrayList();
        args.add(referenceFileId);
        args.add(holdReasonGroupID);
        //        if (CollectionUtils.isNotEmpty(holdRoles)) {
        //            sql.append(" AND (");
        //            for (Iterator iterator = holdRoles.iterator(); iterator.hasNext(); ) {
        //                String holdRole = (String) iterator.next();
        //                sql.append(" rfd.data_2_value LIKE ? ");
        //                args.add("%" + holdRole + "%");
        //                if (iterator.hasNext()) {
        //                    sql.append(" OR ");
        //                }
        //            }
        //            sql.append(" )");
        //        }
        sql.append(" order by rfd.data_1_value ");
        List<Map> holdReasons = jdbcTemplate.query(sql.toString(), args.toArray(), new RowMapper<Map>() {

            @Override
            public Map mapRow(ResultSet rs, int rowNum) throws SQLException {
                Map holdReason = null;
                if (isMatchDept(holdRoles, rs.getString("data_2_value"))) {
                    holdReason = new HashMap();
                    holdReason.put("holdCode", rs.getString("key_1_value"));
                    holdReason.put("holdDesc", rs.getString("data_1_value"));
                    holdReason.put("holdUsersGroup", rs.getString("data_3_value"));
                }
                return holdReason;
            }
        });
        return holdReasons;
    }

    @Override
    public List<Map> getReleaseGroup(String holdCode, String classTableValue) {
        String sql = "select rfd.data_4_value from reference_file_detail rfd, named_object no " + "where rfd" +
                ".reference_file_rrn=no.instance_rrn and no.instance_id=? and rfd" + ".key_1_value=?";
        List args = new ArrayList();
        args.add(classTableValue);
        args.add(holdCode);
        List<Map> releaseGroup = jdbcTemplate.query(sql.toString(), args.toArray(), new RowMapper<Map>() {

            @Override
            public Map mapRow(ResultSet rs, int rowNum) throws SQLException {
                Map map = new HashMap();
                map.put("releaseGroup", rs.getString("data_4_value"));
                return map;
            }
        });
        return releaseGroup;
    }

    @Override
    public List<Map> getReleaseReasonCodes(String releaseReasonGroupID, List releaseRoles, String referenceFileId) {

        StringBuffer sql = new StringBuffer(
                "select rfd.key_1_value, rfd.data_1_value,rfd.data_2_value,rfd.data_3_value from " +
                        "reference_file_detail rfd, " + "named_object no " + "where rfd.reference_file_rrn=no" +
                        ".instance_rrn and no.instance_id=? and ( rfd" + ".data_2_value=? or rfd.data_2_value like " +
                        "'%ALL%' )" + " and rfd.data_5_value='1' ");

        List args = new ArrayList();
        args.add(referenceFileId);
        args.add(releaseReasonGroupID);

        //        if (CollectionUtils.isNotEmpty(releaseRoles)) {
        //            sql.append(" AND (");
        //            for (Iterator iterator = releaseRoles.iterator(); iterator.hasNext(); ) {
        //                String holdRole = (String) iterator.next();
        //                sql.append(" rfd.data_3_value LIKE ? ");
        //                args.add("%" + holdRole + "%");
        //                if (iterator.hasNext()) {
        //                    sql.append(" OR ");
        //                }
        //            }
        //            sql.append(" )");
        //        }

        sql.append(" order by rfd.data_2_value ");
        List<Map> releaseReasons = jdbcTemplate.query(sql.toString(), args.toArray(), new RowMapper<Map>() {

            @Override
            public Map mapRow(ResultSet rs, int rowNum) throws SQLException {
                Map releaseReason = null;
                if (isMatchDept(releaseRoles, rs.getString("data_3_value"))) {
                    releaseReason = new HashMap();
                    releaseReason.put("releaseCode", rs.getString("key_1_value"));
                    releaseReason.put("releaseDesc", rs.getString("data_1_value"));
                }
                return releaseReason;
            }
        });
        return releaseReasons;
    }

    @Override
    public List<Map<String, Object>> getAllPcdDefaultCleanCycle() {
        String sql = "SELECT PD.CATEGORY, PD.TYPE, PD.DEFAULT_CLEAN_CYCLE, PD.OPERATION_DATE, PD.OPERATION_USER " +
                "FROM  PCD_DEFALULT_CLEAN_CYCLE PD ";

        List<Map<String, Object>> list = jdbcTemplate.query(sql.toString(), new RowMapper<Map<String, Object>>() {
            @Override
            public Map mapRow(ResultSet rs, int rowNum) throws SQLException {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("category", rs.getString("CATEGORY"));
                map.put("type", rs.getString("TYPE"));
                map.put("defaultCleanCycle", rs.getDouble("DEFAULT_CLEAN_CYCLE"));
                map.put("operationDate", rs.getTimestamp("OPERATION_DATE"));
                map.put("operationUser", rs.getString("OPERATION_USER"));
                return map;
            }
        });
        return list;
    }

    @Override
    public void batchInsertOrUpdatePcdDefaultCleanCycle(List<Map<String, Object>> defaultCleanCycleList) {
        String sql = "MERGE INTO PCD_DEFALULT_CLEAN_CYCLE PD_1 " + "USING (SELECT ? AS CATEGORY, ? AS TYPE, ? AS " +
                "DEFAULT_CLEAN_CYCLE, " + "? AS OPERATION_USER, SYSDATE AS OPERATION_DATE FROM DUAL) PD_2 " + "ON " +
                "(PD_1.CATEGORY = PD_2.CATEGORY AND PD_1.TYPE = PD_2.TYPE) " + "WHEN MATCHED THEN " + "UPDATE SET " +
                "PD_1.DEFAULT_CLEAN_CYCLE = PD_2.DEFAULT_CLEAN_CYCLE " + "WHEN NOT MATCHED THEN " + "INSERT " +
                "(CATEGORY, TYPE, DEFAULT_CLEAN_CYCLE, OPERATION_USER, OPERATION_DATE) " + "VALUES " + "(PD_2" +
                ".CATEGORY, PD_2.TYPE, PD_2.DEFAULT_CLEAN_CYCLE, PD_2.OPERATION_USER, PD_2" + ".OPERATION_DATE)";

        List<Object[]> batchArgs = new ArrayList<Object[]>();
        for (int i = 0; i < defaultCleanCycleList.size(); i++) {
            Map<String, Object> map = defaultCleanCycleList.get(i);
            batchArgs.add(new Object[]{MapUtils.getString(map, "categoryCode"), MapUtils.getString(map,
                                                                                                   "typeCode"),
                    MapUtils.getDoubleValue(
                    map, "defaultCleanCycle"), MapUtils.getString(map, "operationUser")});
        }
        jdbcTemplate.batchUpdate(sql, batchArgs);

    }

    @Override
    public int addPcdDefaultCleanCycleHistory(long transRrn, String targetCategoryDesc, String targetTypeDesc,
                                              double targetDefaultCycleD, String user) {
        StringBuffer sql = new StringBuffer("INSERT INTO ");
        sql.append("PCD_DEFALULT_CLEAN_CYCLE_H (TRANS_RRN, CATEGORY, TYPE, DEFAULT_CLEAN_CYCLE, " + "OPERATION_USER, " +
                           "OPERATION_DATE) ");
        sql.append("VALUES (?, ?, ?, ?, ?, sysdate) ");

        int result = jdbcTemplate.update(sql.toString(),
                                         new Object[]{transRrn, targetCategoryDesc, targetTypeDesc,
                                                 targetDefaultCycleD, user});
        return result;
    }

    @Override
    public List<PcdClean> getPcdInfoByCleanEqpt(String eqptId, String entityNamedSpace) {
        String sql = "select pc.instance_rrn, getinstanceid(pc.instance_rrn) as pcd_id, pc.in_clean_date, pc" +
                ".clean_over_date, " + "pc.clean_cycle, pc.pcd_type, pc.out_clean_date, pc.clean_count, pc.eqpt_id " +
                "from pcd_clean pc, named_object n " +
                "where pc.instance_rrn = n.instance_rrn and n.named_space = ? and pc.eqpt_id = ?";
        return jdbcTemplate.query(sql, new Object[]{entityNamedSpace, eqptId}, new RowMapper<PcdClean>() {

            @Override
            public PcdClean mapRow(ResultSet rs, int rowNum) throws SQLException {
                PcdClean pc = new PcdClean();
                pc.setInstanceRrn(rs.getLong("instance_rrn"));
                pc.setInstanceId(rs.getString("pcd_id"));
                pc.setInCleanDate(rs.getTimestamp("in_clean_date"));
                pc.setCleanOverDate(rs.getTimestamp("clean_over_date"));
                pc.setCleanCycle(rs.getDouble("clean_cycle"));
                pc.setPcdType(rs.getString("pcd_type"));
                pc.setOutCleanDate(rs.getTimestamp("out_clean_date"));
                pc.setCleanCount(rs.getInt("clean_count"));
                pc.setCleanEqptId(rs.getString("eqpt_id"));
                if (pc.getInCleanDate() != null) {
                    long now = DateUtils.parse(DateUtils.getNowTime()).getTime();
                    long inClean = pc.getInCleanDate().getTime();
                    pc.setCleaningMinutes((now - inClean) / 1000 / 60);
                }
                return pc;
            }
        });
    }

    @Override
    public List<PcdClean> qryPCDCleanInfo(String targetStatus) {
        String sql = "select DISTINCT pc.instance_rrn, pc.in_clean_date,pc.clean_over_date,pc.clean_cycle,pc" +
                ".pcd_type,pc.out_clean_date," + " pc.clean_count,m.event_rrn,n.instance_id event_id from pcd_clean " +
                "pc,entity e, " + "event_model m,relation r, entity_status s,named_object n," + " NAMED_OBJECT N2, " +
                "REFERENCE_FILE_DETAIL RE" + " where pc.instance_rrn = e.entity_rrn and pc.instance_rrn = s" +
                ".entity_rrn and e" + ".allowable_events_rrn = r.from_rrn" + " and r.link_type = " +
                "'ALLOWABLEEVENT_TO_EVENT' and r.to_rrn = m.event_rrn and n" + ".instance_rrn = m.event_rrn" + " AND " +
                "n.instance_id=RE.DATA_1_VALUE and (m.valid_status=s.current_status or " + " m.valid_status is null) " +
                "and m.target_status=?" + " AND N2.INSTANCE_RRN=RE.REFERENCE_FILE_RRN AND N2" +
                ".INSTANCE_ID='$$AUTO_CHANGE_STATUS'" + " AND " + "N2.OBJECT='REFERENCEFILE' AND PC" +
                ".CLEAN_OVER_DATE<=sysdate";

        List<PcdClean> pcdCleanInfo = jdbcTemplate.query(sql, new Object[]{targetStatus}, new RowMapper<PcdClean>() {
            @Override
            public PcdClean mapRow(ResultSet rs, int rowNum) throws SQLException {
                PcdClean pcd = new PcdClean();

                pcd.setInstanceRrn(rs.getLong("instance_rrn"));
                pcd.setInCleanDate(rs.getTimestamp("in_clean_date"));
                pcd.setCleanOverDate(rs.getTimestamp("clean_over_date"));
                pcd.setCleanCycle(rs.getDouble("clean_cycle"));
                pcd.setPcdType(rs.getString("pcd_type"));
                pcd.setOutCleanDate(rs.getTimestamp("out_clean_date"));
                pcd.setCleanCount(rs.getInt("clean_count"));
                pcd.setEventRrn(rs.getLong("event_rrn"));
                pcd.setEventId(rs.getString("event_id"));
                if (pcd.getInCleanDate() != null) {
                    long now = DateUtils.parse(DateUtils.getNowTime()).getTime();
                    long inClean = pcd.getInCleanDate().getTime();
                    pcd.setCleaningMinutes((now - inClean) / 1000 / 60);
                }

                return pcd;
            }
        });

        return pcdCleanInfo;
    }

    private String getTransByName(String transBy) {
        String sql =
                "select t.user_name from user_profile t,named_object o " + " where t.user_rrn=o.instance_rrn " + " " +
                        "and o.instance_id='" + transBy + "' and o.object='USER'";
        return jdbcTemplate.queryForObject(sql, String.class);
    }

    private boolean isMatchDept(List holdRoles, String data_2_value) {

        String[] datas = StringUtils.split(data_2_value, ",");
        for (int i = 0; i < datas.length; i++) {
            if (holdRoles.contains(datas[i]) || StringUtils.equals(datas[i], "ALL")) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void updateCleanOverTimeByRrn(Long podRrn, Timestamp timestamp) {
        String sql = "UPDATE PCD_CLEAN t " +
                "SET t.CLEAN_OVER_DATE =? " +
                "WHERE t.INSTANCE_RRN = ? ";
        jdbcTemplate.update(sql,new Object[]{timestamp,podRrn});
    }

}