FutureHoldContextValueDAOImpl.java

package com.mycim.server.ctx.exec.dao.impl;

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.collections.MapUtils;
import com.mycim.framework.utils.lang.math.NumberUtils;
import com.mycim.framework.utils.lang.time.DateUtils;
import com.mycim.server.ctx.exec.dao.FutureHoldContextValueDAO;
import com.mycim.server.wip.dao.LotQueryDAO;
import com.mycim.valueobject.consts.DataBaseNames;
import com.mycim.valueobject.consts.EenActionType;
import com.mycim.valueobject.consts.VersionStatus;
import com.mycim.valueobject.prp.FutureHold;
import com.mycim.valueobject.wip.Lot;
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.*;

/**
 * @author shijie.deng
 * @version 6.0.0
 * @date 2019/9/21
 **/
@Repository
public class FutureHoldContextValueDAOImpl implements FutureHoldContextValueDAO {
    @Autowired
    private JdbcTemplate jdbcTemplate;


    @Autowired
    private LotQueryDAO lotQueryDAO;

    @Override
    public List<Map> getFutureHoldListByLot(long refRrn, long lotRrn) {

        String sql = "SELECT V.status,V.CONTEXT_KEY1,V.CONTEXT_KEY2,V.CONTEXT_KEY3, V.SEQUENCE_NUMBER, " + " V" +
                ".RESULT_VALUE2,V.RESULT_VALUE3,V.RESULT_VALUE4,V.RESULT_VALUE5,V.RESULT_VALUE6,V" + ".RESULT_VALUE1," +
                " " + " V.EFFECTIVE_DATE_FROM,E.ACTION_TYPE FROM CONTEXT_VALUE V,EEN_ACTION E WHERE V" +
                ".CONTEXT_RRN = ? AND V.CONTEXT_KEY3=?" + " AND V.RESULT_VALUE1 = E.ACTION_RRN";

        List futureHoldList = jdbcTemplate.query(sql, new Object[]{refRrn, lotRrn}, new RowMapper<Map>() {
            @Override
            public Map mapRow(ResultSet rs, int rowNum) throws SQLException {
                // TODO: fix me
                Map futureHoldMap = new HashMap();
                futureHoldMap.put("processId", "");
                long routeRrn = NumberUtils.toLong(rs.getString("CONTEXT_KEY1"));
                futureHoldMap.put("routeRrn", routeRrn);
                long operationRrn = NumberUtils.toLong(rs.getString("CONTEXT_KEY2"));
                futureHoldMap.put("operationRrn", operationRrn);
                HashMap tempInfo = new HashMap();
                Lot lot = lotQueryDAO.getLot(lotRrn);
                //                tempInfo.put("operationRrn", new Long(operationRrn));
                tempInfo.put("productRrn", lot.getProductRrn());
                tempInfo.put("productVersion", lot.getProductVersion());
                //                tempInfo.put("routeRrn", StringUtils.trimToEmpty(rs.getString
                //                ("CONTEXT_KEY1")));
                tempInfo.put("technologyRrn", lot.getProcessRrn());
                tempInfo.put("processRrn", lot.getProcessRrn());
                tempInfo.put("processVersion", lot.getProcessVersion());
                tempInfo.put("recipeRrn", null);

                tempInfo.put("lotRrn", new Long(lotRrn));

                tempInfo.put("equipmentModel", null);
                tempInfo.put("lotId", lot.getLotId());
                tempInfo.put("facilityRrn", lot.getFacilityRrn());
                tempInfo.put("entityRrn", null);
                tempInfo.put("productLayer", lot.getProductLayer());

                String transByName = getTransByName(rs.getString("RESULT_VALUE2"));
                if (transByName != null) {
                    futureHoldMap.put("userNamed", rs.getString("RESULT_VALUE2") + " " + transByName);
                } else {
                    futureHoldMap.put("userNamed", rs.getString("RESULT_VALUE2"));
                }
                futureHoldMap.put("holdGroup", rs.getString("RESULT_VALUE3"));
                futureHoldMap.put("holdCode", rs.getString("RESULT_VALUE4"));
                futureHoldMap.put("holdReason", rs.getString("RESULT_VALUE5"));
                futureHoldMap.put("effectCount", rs.getString("RESULT_VALUE6"));
                futureHoldMap.put("actionRrn", rs.getString("RESULT_VALUE1"));
                futureHoldMap.put("operationRrn", new Long(operationRrn));
                futureHoldMap.put("routeRrn", StringUtils.trimToEmpty(rs.getString("CONTEXT_KEY1")));

                java.sql.Date db_Date = rs.getDate("EFFECTIVE_DATE_FROM");
                String dbDate = DateUtils.formatDate(db_Date, DateUtils.DATE_FORMAT4DAY);
                futureHoldMap.put("futureholdsetupdate", dbDate);
                futureHoldMap.put("seqNum", new Long(rs.getLong("SEQUENCE_NUMBER")));
                futureHoldMap.put("flag", rs.getString("ACTION_TYPE"));
                futureHoldMap.put("lotStatus", rs.getString("status"));
                Collection executedLotList = new ArrayList();
                executedLotList = getLotExecutedForLotFH(lotRrn, routeRrn, operationRrn, rs.getString("RESULT_VALUE1"));
                if (!executedLotList.isEmpty()) {
                    futureHoldMap.put("executedFlag", "EXECUTED");
                } else {
                    futureHoldMap.put("executedFlag", "");
                }
                return futureHoldMap;
            }
        });

        return futureHoldList;
    }

    @Override
    public List<Map> getFutureHoldListByProduct(long refRrn, long productRrn, long processRrn, long lotRrn) {
        List<Map> futureHoldList = new ArrayList();
        List args = new ArrayList();
        args.add(refRrn);
        args.add(productRrn);
        String sql = "SELECT V.CONTEXT_KEY1,V.CONTEXT_KEY2,V.CONTEXT_KEY3, V.CONTEXT_KEY4,V.CONTEXT_KEY5,V" +
                ".CONTEXT_KEY6, V.SEQUENCE_NUMBER," + " V.RESULT_VALUE2,V.RESULT_VALUE3,V.RESULT_VALUE4,V" +
                ".RESULT_VALUE5,V.RESULT_VALUE1, " + " V.EFFECTIVE_DATE_FROM , E.ACTION_TYPE FROM CONTEXT_VALUE V " +
                "left join " + " (SELECT * FROM NAMED_OBJECT WHERE OBJECT='WFL' AND OBJECT_SUBTYPE='PROCEDURE') R " +
                "on TRIM(V.CONTEXT_KEY3)=R.INSTANCE_RRN left join " +
                " (SELECT * FROM NAMED_OBJECT WHERE OBJECT='OPERATION') O on TRIM(V.CONTEXT_KEY4)" + "=O" +
                ".INSTANCE_RRN left join EEN_ACTION E on V.RESULT_VALUE1=E.ACTION_RRN " +
                " WHERE V.CONTEXT_RRN = ? AND V.CONTEXT_KEY1=? ";

        if (processRrn > 0) {
            sql = sql + " AND V.CONTEXT_KEY2=?";
            args.add(processRrn);
        }
        sql = sql + " ORDER BY R.INSTANCE_ID, O.INSTANCE_ID ";

        futureHoldList = jdbcTemplate.query(sql, args.toArray(), new RowMapper<Map>() {
            @Override
            public Map mapRow(ResultSet rs, int rowNum) throws SQLException {
                // TODO: fix me
                Map futureHoldMap = new HashMap();
                futureHoldMap.put("processRrn", NumberUtils.toLong(rs.getString("CONTEXT_KEY2")));
                futureHoldMap.put("routeRrn", NumberUtils.toLong(rs.getString("CONTEXT_KEY3")));
                futureHoldMap.put("operationRrn", NumberUtils.toLong(rs.getString("CONTEXT_KEY4")));

                Map tempInfo = new HashMap();
                tempInfo.put("operationRrn",
                             new Long(Long.parseLong(StringUtils.trimToEmpty(rs.getString("CONTEXT_KEY4")))));
                tempInfo.put("productRrn", new Long(productRrn));
                tempInfo.put("routeRrn", StringUtils.trimToEmpty(rs.getString("CONTEXT_KEY3")));
                tempInfo.put("technologyRrn",
                             new Long(Long.parseLong(StringUtils.trimToEmpty(rs.getString("CONTEXT_KEY2")))));
                tempInfo.put("processRrn",
                             new Long(Long.parseLong(StringUtils.trimToEmpty(rs.getString("CONTEXT_KEY2")))));
                tempInfo.put("recipeRrn", null);

                tempInfo.put("lotRrn", null);

                tempInfo.put("equipmentModel", null);
                tempInfo.put("lotId", null);
                tempInfo.put("facilityRrn", null);
                tempInfo.put("entityRrn", null);
                tempInfo.put("productLayer", null);

                futureHoldMap.putAll(tempInfo);

                futureHoldMap.put("userNamed", rs.getString("RESULT_VALUE2"));
                futureHoldMap.put("holdGroup", rs.getString("RESULT_VALUE3"));
                futureHoldMap.put("holdCode", rs.getString("RESULT_VALUE4"));
                futureHoldMap.put("holdReason", rs.getString("RESULT_VALUE5"));
                futureHoldMap.put("actionRrn", rs.getString("RESULT_VALUE1"));
                futureHoldMap.put("operationRrn",
                                  new Long(Long.parseLong(StringUtils.trimToEmpty(rs.getString("CONTEXT_KEY4")))));
                futureHoldMap.put("routeRrn", StringUtils.trimToEmpty(rs.getString("CONTEXT_KEY3")));

                java.sql.Date db_Date = rs.getDate("EFFECTIVE_DATE_FROM");
                String dbDate = DateUtils.formatDate(db_Date, DateUtils.DATE_FORMAT4DAY);
                futureHoldMap.put("futureholdsetupdate", dbDate);
                futureHoldMap.put("seqNum", new Long(rs.getLong("SEQUENCE_NUMBER")));
                futureHoldMap.put("flag", rs.getString("ACTION_TYPE"));
                Collection executedLotList = new ArrayList();
                if ((rs.getString("CONTEXT_KEY3") != null) && (rs.getString("CONTEXT_KEY4") != null) &&
                        productRrn != 0 && lotRrn != 0) {
                    executedLotList = getLotExecutedForProductFH(productRrn, Long.parseLong(
                            StringUtils.trimToEmpty(rs.getString("CONTEXT_KEY2"))), Long.parseLong(
                            StringUtils.trimToEmpty(rs.getString("CONTEXT_KEY4"))), lotRrn, Long.parseLong(
                            StringUtils.trimToEmpty(rs.getString("RESULT_VALUE1"))));
                    if (!executedLotList.isEmpty()) {
                        futureHoldMap.put("executedFlag", "EXECUTED");
                    } else {
                        futureHoldMap.put("executedFlag", "");
                    }
                } else {
                    futureHoldMap.put("executedFlag", "");
                }
                return futureHoldMap;
            }
        });
        return futureHoldList;
    }

    @Override
    public List<Map> getFutureHoldListbyOperation(long refRrn, long operationRrn) {
        String sql = "SELECT V.CONTEXT_KEY1,V.CONTEXT_KEY2,V.CONTEXT_KEY3, V.CONTEXT_KEY4,V.SEQUENCE_NUMBER, " + " V" +
                ".RESULT_VALUE2,V.RESULT_VALUE3,V.RESULT_VALUE4,V.RESULT_VALUE5,V.RESULT_VALUE1, " + " V" +
                ".EFFECTIVE_DATE_FROM FROM CONTEXT_VALUE V WHERE V.CONTEXT_RRN = ? AND V" + ".CONTEXT_KEY1=?";
        Object[] args = new Object[]{refRrn, String.valueOf(operationRrn)};
        List futureHoldList = jdbcTemplate.query(sql, args, new RowMapper<Map<String, Object>>() {

            @Override
            public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {

                Map futureHoldMap = new HashMap();
                // futureHoldMap.put("processId",
                // this.getInstanceId(Long.parseLong(rs.getString("CONTEXT_KEY2").trim())));
                // futureHoldMap.put("routeId",
                // this.getInstanceId(Long.parseLong(rs.getString("CONTEXT_KEY3").trim())));
                // futureHoldMap.put("operationId",
                // this.getInstanceId(Long.parseLong(rs.getString("CONTEXT_KEY4").trim())));
                // futureHoldMap.put("operationDesc",
                // this.getInstanceDesc(Long.parseLong(rs.getString("CONTEXT_KEY4").trim())));
                /*Map tempInfo = new HashMap();
                tempInfo.put("operationRrn",
                             new Long(Long.parseLong(StringUtils.trimToEmpty(rs.getString("CONTEXT_KEY1")))));
                tempInfo.put("productRrn", null);
                tempInfo.put("routeRrn", null);
                tempInfo.put("technologyRrn", null);
                tempInfo.put("recipeRrn", null);

                tempInfo.put("lotRrn", null);

                tempInfo.put("equipmentModel", null);
                tempInfo.put("lotId", null);
                tempInfo.put("facilityRrn", null);
                tempInfo.put("entityRrn", null);
                tempInfo.put("productLayer", null);
                String recipeString = getRecipeString(tempInfo);

                String recipeId = parseRecipeId(recipeString);
                futureHoldMap.put("recipeId", recipeId);*/
                futureHoldMap.put("operationRrn",
                                  new Long(Long.parseLong(StringUtils.trimToEmpty(rs.getString("CONTEXT_KEY1")))));

                String transName = getTransByName(rs.getString("RESULT_VALUE2"));
                if (transName != null) {
                    futureHoldMap.put("userNamed", rs.getString("RESULT_VALUE2") + " " + transName);
                } else {
                    futureHoldMap.put("userNamed", rs.getString("RESULT_VALUE2"));
                }
                futureHoldMap.put("holdGroup", rs.getString("RESULT_VALUE3"));
                futureHoldMap.put("holdCode", rs.getString("RESULT_VALUE4"));
                futureHoldMap.put("holdReason", rs.getString("RESULT_VALUE5"));
                futureHoldMap.put("actionRrn", rs.getString("RESULT_VALUE1"));
                java.sql.Date db_Date = rs.getDate("EFFECTIVE_DATE_FROM");
                String dbDate = timestampToString(db_Date);
                futureHoldMap.put("futureholdsetupdate", dbDate);
                futureHoldMap.put("seqNum", new Long(rs.getLong("SEQUENCE_NUMBER")));
                return futureHoldMap;
            }
        });
        return futureHoldList;

    }

    @Override
    public List getFutureHoldLotList(Long refRrn, Long routeRrn, Long operationRrn, Long lotRrn, Long routeSeq,
                                     Long operationSeq) {
        String sql =
                "SELECT V.STATUS,V.CONTEXT_KEY1,V.CONTEXT_KEY2,V.CONTEXT_KEY3,V.CONTEXT_KEY4,V.CONTEXT_KEY5, " + " V" +
                        ".RESULT_VALUE2,V.RESULT_VALUE3,V.RESULT_VALUE4,V.RESULT_VALUE5,V.RESULT_VALUE6,V" +
                        ".RESULT_VALUE1, " + " V.EFFECTIVE_DATE_FROM,E.ACTION_TYPE FROM CONTEXT_VALUE V,EEN_ACTION E " +
                        "WHERE V" + ".CONTEXT_RRN = ? AND " + " V.CONTEXT_KEY1=? AND V.CONTEXT_KEY2=? AND V" +
                        ".CONTEXT_KEY3=? AND V.CONTEXT_KEY4=? AND V" + ".CONTEXT_KEY5=? AND V.STATUS=?" + " AND V" +
                        ".RESULT_VALUE1 =E.ACTION_RRN";

        Object[] args = new Object[]{refRrn,
                routeRrn == null ? " " : routeRrn.toString(),
                operationRrn == null ? " " : operationRrn.toString(),
                lotRrn == null ? " " : lotRrn.toString(),
                routeSeq == null ? " " : routeSeq.toString(),
                operationSeq == null ? " " : operationSeq.toString(), VersionStatus.ACTIVE_KEY};

        List futureHoldList = jdbcTemplate.query(sql, args, new RowMapper<Map>() {

            @Override
            public Map mapRow(ResultSet rs, int rowNum) throws SQLException {
                Map futureHoldMap = new HashMap();
                futureHoldMap.put("routeRrn", NumberUtils.toLong(rs.getString("CONTEXT_KEY1")));
                futureHoldMap.put("operationRrn", NumberUtils.toLong(rs.getString("CONTEXT_KEY2")));

                futureHoldMap.put("routeSeq", rs.getString("CONTEXT_KEY4"));
                futureHoldMap.put("operationSeq", rs.getString("CONTEXT_KEY5"));
                futureHoldMap.put("userNamed", rs.getString("RESULT_VALUE2"));
                futureHoldMap.put("holdGroup", rs.getString("RESULT_VALUE3"));
                futureHoldMap.put("holdCode", rs.getString("RESULT_VALUE4"));
                futureHoldMap.put("holdReason", rs.getString("RESULT_VALUE5"));
                futureHoldMap.put("effectCount", rs.getString("RESULT_VALUE6"));
                futureHoldMap.put("status", rs.getString("STATUS"));
                futureHoldMap.put("actionRrn", rs.getString("RESULT_VALUE1"));
                futureHoldMap.put("futureholdsetupdate", DateUtils.formatDate(rs.getDate("EFFECTIVE_DATE_FROM")));
                futureHoldMap.put("flag", rs.getString("ACTION_TYPE"));
                if (hasExecuted(lotRrn, routeRrn, operationRrn)) {
                    futureHoldMap.put("executedFlag", "EXECUTED");
                } else {
                    futureHoldMap.put("executedFlag", "");
                }

                return futureHoldMap;
            }
        });
        List oldFutureHoldList = getFutureHoldLotListByOldData(refRrn, routeRrn, operationRrn, lotRrn);
        if (oldFutureHoldList.size() > 0) {
            futureHoldList = oldFutureHoldList;
        }
        return futureHoldList;
    }

    @Override
    public List getFutureHoldProductList(Long refRrn, Long routeRrn, Long operationRrn, Long lotRrn, Long productRrn,
                                         Long processRrn) {
        String sql = "SELECT V.CONTEXT_KEY1,V.CONTEXT_KEY2,V.CONTEXT_KEY3, V.CONTEXT_KEY4, " + " V.RESULT_VALUE2,V" +
                ".RESULT_VALUE3,V.RESULT_VALUE4,V.RESULT_VALUE5,V.RESULT_VALUE1, " + " V.EFFECTIVE_DATE_FROM FROM " +
                "CONTEXT_VALUE V WHERE V.CONTEXT_RRN = ? AND V" + ".CONTEXT_KEY1=? " + " AND V.CONTEXT_KEY2=? AND V" +
                ".CONTEXT_KEY3=? AND V.CONTEXT_KEY4=? ";

        List futureHoldList = jdbcTemplate.query(sql, new Object[]{refRrn,
                                                         productRrn == null ? " " : productRrn.toString(),
                                                         processRrn == null ? " " : processRrn.toString(),
                                                         routeRrn == null ? " " : routeRrn.toString(),
                                                         operationRrn == null ? " " : operationRrn.toString()},
                                                 new RowMapper<Map>() {
                                                     @Override
                                                     public Map mapRow(ResultSet rs, int rowNum) throws SQLException {
                                                         Map futureHoldMap = new HashMap();
                                                         futureHoldMap.put("processRrn", NumberUtils
                                                                 .toLong(rs.getString("CONTEXT_KEY2")));
                                                         futureHoldMap.put("routeRrn", NumberUtils
                                                                 .toLong(rs.getString("CONTEXT_KEY3")));
                                                         futureHoldMap.put("operationRrn", NumberUtils
                                                                 .toLong(rs.getString("CONTEXT_KEY4")));

                                                         Lot lot = new Lot();

                                                         lot.setOperationRrn(Long.parseLong(StringUtils.trimToEmpty(
                                                                 rs.getString("CONTEXT_KEY4"))));
                                                         lot.setProductRrn(productRrn);
                                                         lot.setRouteRrn(Long.parseLong(StringUtils.trimToEmpty(
                                                                 rs.getString("CONTEXT_KEY3"))));
                                                         lot.setProcessRrn(Long.parseLong(StringUtils.trimToEmpty(
                                                                 rs.getString("CONTEXT_KEY2"))));

                                                         futureHoldMap.put("recipeId", lot);

                                                         futureHoldMap.put("userNamed", rs.getString("RESULT_VALUE2"));
                                                         futureHoldMap.put("holdGroup", rs.getString("RESULT_VALUE3"));
                                                         futureHoldMap.put("holdCode", rs.getString("RESULT_VALUE4"));
                                                         futureHoldMap.put("holdReason", rs.getString("RESULT_VALUE5"));
                                                         futureHoldMap.put("actionRrn", rs.getString("RESULT_VALUE1"));
                                                         futureHoldMap.put("futureholdsetupdate", DateUtils
                                                                 .formatDate(rs.getDate("EFFECTIVE_DATE_FROM")));
                                                         futureHoldMap.put("flag", "FUTURE HOLD BY PRODUCT");
                                                         if ((rs.getString("CONTEXT_KEY3") != null) &&
                                                                 (rs.getString("CONTEXT_KEY4") != null) &&
                                                                 (productRrn != null) && (lotRrn != null)) {
                                                             List executedLotList = getLotExecutedForProductFH(
                                                                     productRrn, Long.parseLong(StringUtils.trimToEmpty(
                                                                             rs.getString("CONTEXT_KEY2"))),
                                                                     Long.parseLong(StringUtils.trimToEmpty(
                                                                             rs.getString("CONTEXT_KEY4"))), lotRrn);
                                                             if (!executedLotList.isEmpty()) {
                                                                 futureHoldMap.put("executedFlag", "EXECUTED");
                                                             } else {
                                                                 futureHoldMap.put("executedFlag", "");
                                                             }
                                                         } else {
                                                             futureHoldMap.put("executedFlag", "");
                                                         }
                                                         return futureHoldMap;
                                                     }
                                                 });
        return futureHoldList;
    }

    @Override
    public Page getFutureHoldPage(Page page, Map<String, Object> condition) {
        String userId = MapUtils.getString(condition, "userId");
        String userName = MapUtils.getString(condition, "userName");
        String holdType = MapUtils.getString(condition, "holdType");
        List args = new ArrayList();
        StringBuilder sql = new StringBuilder();
        sql.append(" select v.context_rrn,e.action_type,v.result_value2 userid, ");
        sql.append(" v.status,v.context_key1,v.context_key2,v.context_key3,v.context_key4, ");
        sql.append(" v.sequence_number,v.result_value3,v.result_value4, ");
        sql.append(" v.result_value5,v.result_value6,v.result_value1,v.result_value2, ");
        sql.append(" v.effective_date_from from context_value v,named_object n,een_action e, ");
        sql.append(" user_profile u where v.result_value1 = e.action_rrn  ");
        sql.append(" and v.result_value2 = n.instance_id and u.user_rrn = n.instance_rrn");
        if (StringUtils.isNotBlank(userId)) {
            sql.append(" and v.result_value2 = ?");
            args.add(userId);
        }
        if (StringUtils.isNotBlank(userName)) {
            sql.append(" and u.user_name = ? ");
            args.add(userName);
        }
        if (StringUtils.isNotBlank(holdType)) {
            sql.append(" and v.context_rrn in ( select instance_rrn from ");
            sql.append(" named_object where instance_id in ('" + holdType + "') )");
        }

        sql.append(" order by v.effective_date_from desc ");
        return jdbcTemplate
                .queryForPage(page, sql.toString(), args.toArray(), (RowMapper<Map<String, Object>>) (rs, rowNum) -> {
                    Map futureHoldMap = new HashMap();
                    String actionType = rs.getString("action_type");
                    if (StringUtils.equalsIgnoreCase(EenActionType.FUTURE_HOLD_LOT_KEY, actionType)) {
                        long routeRrn = NumberUtils.toLong(rs.getString("context_key1"));
                        long operationRrn = NumberUtils.toLong(rs.getString("context_key2"));
                        long lotRrn = NumberUtils.toLong(rs.getString("context_key3"));
                        futureHoldMap.put("routeRrn", routeRrn);
                        futureHoldMap.put("operationRrn", operationRrn);
                        futureHoldMap.put("lotRrn", lotRrn);
                        List<Long> executedLotList = getLotExecutedForLotFH(lotRrn, routeRrn, operationRrn,
                                                                            rs.getString("result_value1"));
                        if (!executedLotList.isEmpty()) {
                            futureHoldMap.put("executedFlag", "EXECUTED");
                        } else {
                            futureHoldMap.put("executedFlag", "");
                        }

                    } else if (StringUtils.equalsIgnoreCase(EenActionType.FUTURE_HOLD_PRODUCT_KEY, actionType)) {
                        long productRrn = NumberUtils.toLong(rs.getString("context_key1"));
                        long processRrn = NumberUtils.toLong(rs.getString("context_key2"));
                        long routeRrn = NumberUtils.toLong(rs.getString("context_key3"));
                        long operationRrn = NumberUtils.toLong(rs.getString("context_key4"));
                        futureHoldMap.put("productRrn", productRrn);
                        futureHoldMap.put("processRrn", processRrn);
                        futureHoldMap.put("routeRrn", routeRrn);
                        futureHoldMap.put("operationRrn", operationRrn);
                    }
                    String transByName = getTransByName(rs.getString("result_value2"));
                    futureHoldMap.put("userNamed", transByName);
                    futureHoldMap.put("userId", rs.getString("result_value2"));
                    futureHoldMap.put("holdGroup", rs.getString("result_value3"));
                    futureHoldMap.put("holdCode", rs.getString("result_value4"));
                    futureHoldMap.put("holdReason", rs.getString("result_value5"));
                    futureHoldMap.put("effectCount", rs.getString("result_value6"));
                    futureHoldMap.put("actionRrn", rs.getString("result_value1"));
                    Date db_Date = rs.getDate("effective_date_from");
                    String dbDate = DateUtils.formatDate(db_Date, DateUtils.DATE_FORMAT4DAY);
                    futureHoldMap.put("futureholdsetupdate", dbDate);
                    futureHoldMap.put("seqNum", new Long(rs.getLong("sequence_number")));
                    futureHoldMap.put("flag", actionType);
                    futureHoldMap.put("lotStatus", rs.getString("status"));
                    return futureHoldMap;
                });
    }

    public String timestampToString(Date date) {
        String dateString = "";

        if (date != null) {
            SimpleDateFormat formatter = new SimpleDateFormat(DateUtils.DATE_FORMAT4DAY);

            // formatter= new SimpleDateFormat("dd/MM/yyyy");
            dateString = formatter.format(date);
        }

        return dateString;
    }

    private List<Long> getLotExecutedForProductFH(long productRrn, long processRrn, long operationRrn, long lotRrn) {
        Collection executedLotList = new ArrayList();
        String sql = "SELECT L.LOT_RRN FROM LOT_TRANS_HISTORY L, LOT_STEP_HISTORY H, TRANS_REASON R," + "(SELECT V" +
                ".CONTEXT_KEY1 AS PRODUCT_RRN, V.CONTEXT_KEY2 AS PROCESS_RRN,V.CONTEXT_KEY3" + " AS ROUTE_RRN, " + "V" +
                ".CONTEXT_KEY4 AS OPERATION_RRN, V.SEQUENCE_NUMBER, V.RESULT_VALUE2, V" + ".RESULT_VALUE3 AS " +
                "HOLDGROUP," + " V.RESULT_VALUE4 AS HOLDCODE, V.RESULT_VALUE5 AS HOLDREASON, V.RESULT_VALUE1 AS " +
                "ACTIONRRN  " + "FROM CONTEXT_VALUE V WHERE V.CONTEXT_RRN = (SELECT L.INSTANCE_RRN FROM NAMED_OBJECT" +
                " L " + "WHERE L.INSTANCE_ID='EEN_CONTEXT_HOLDPRODUCT' AND L.NAMED_SPACE='MYCIM2') AND V" +
                ".CONTEXT_KEY1 = ?)C " + "WHERE L.LOT_RRN = H.LOT_RRN AND L.TRANS_ID = 'HOLD' AND H.STEP_SEQUENCE = L" +
                ".STEP_SEQUENCE " + "AND L.TRANS_RRN = R.TRANS_RRN AND R.REASON LIKE '%(FH)%' AND H.PRODUCT_RRN = C" +
                ".PRODUCT_RRN " + "AND H.PROCESS_RRN = C.PROCESS_RRN AND H.OPERATION_RRN = C.OPERATION_RRN " +
                "AND C.ACTIONRRN = L.ACTION_RRN "
                //+ "AND R.REASON_CODE = C.HOLDCODE AND R.REASON='(FH)'||C.HOLDREASON "
                + "AND H.PRODUCT_RRN = ? " + "AND H.PROCESS_RRN = ? AND H.OPERATION_RRN = ? AND L.LOT_RRN = ?";
        List<Long> executedLotRrns = jdbcTemplate
                .query(sql, new Object[]{String.valueOf(productRrn), productRrn, processRrn, operationRrn, lotRrn},
                       Long.class);
        return executedLotRrns;

    }

    private List<Long> getLotExecutedForProductFH(long productRrn, long processRrn, long operationRrn, long lotRrn,
                                                  long actionRrn) {
        Collection executedLotList = new ArrayList();
        String sql = "SELECT L.LOT_RRN FROM LOT_TRANS_HISTORY L, LOT_STEP_HISTORY H, TRANS_REASON R," + "(SELECT V" +
                ".CONTEXT_KEY1 AS PRODUCT_RRN, V.CONTEXT_KEY2 AS PROCESS_RRN,V.CONTEXT_KEY3" + " AS ROUTE_RRN, " + "V" +
                ".CONTEXT_KEY4 AS OPERATION_RRN, V.SEQUENCE_NUMBER, V.RESULT_VALUE2, V" + ".RESULT_VALUE3 AS " +
                "HOLDGROUP," + " V.RESULT_VALUE4 AS HOLDCODE, V.RESULT_VALUE5 AS HOLDREASON, V.RESULT_VALUE1 AS " +
                "ACTIONRRN  " + "FROM CONTEXT_VALUE V WHERE V.CONTEXT_RRN = (SELECT L.INSTANCE_RRN FROM NAMED_OBJECT" +
                " L " + "WHERE L.INSTANCE_ID='EEN_CONTEXT_HOLDPRODUCT' AND L.NAMED_SPACE='MYCIM2') AND V" +
                ".CONTEXT_KEY1 = ?)C " + "WHERE L.LOT_RRN = H.LOT_RRN AND L.TRANS_ID = 'HOLD' AND H.STEP_SEQUENCE = L" +
                ".STEP_SEQUENCE " + "AND L.TRANS_RRN = R.TRANS_RRN AND R.REASON LIKE '%(FH)%' AND H.PRODUCT_RRN = C" +
                ".PRODUCT_RRN AND H.PROCESS_RRN = C.PROCESS_RRN " +
                " AND H.OPERATION_RRN = C.OPERATION_RRN AND C.ACTIONRRN = L.ACTION_RRN "
                //+ "AND R.REASON_CODE = C.HOLDCODE AND R.REASON='(FH)'||C.HOLDREASON "
                + "AND H.PRODUCT_RRN = ? AND H.PROCESS_RRN = ? AND H.OPERATION_RRN = ? " + "AND L.LOT_RRN = ? AND C" +
                ".ACTIONRRN = L.ACTION_RRN  AND L.ACTION_RRN = ?";
        List<Long> executedLotRrns = jdbcTemplate
                .query(sql, new Object[]{productRrn, productRrn, processRrn, operationRrn, lotRrn, actionRrn},
                       Long.class);
        return executedLotRrns;

    }

    private String getTransByName(String transBy) {
        String transByName = "";
        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'";
        List<String> results = jdbcTemplate.query(sql, String.class);
        if (results != null && results.size() > 0) {
            transByName = results.get(0);
        }
        return transByName;
    }

    private List<Long> getLotExecutedForLotFH(long lotRrn, long routeRrn, long operationRrn, String actionRrn) {
        List<Long> executedLotList = new ArrayList<Long>();
        String sql = "SELECT L.LOT_RRN  FROM LOT_TRANS_HISTORY L,LOT_STEP_HISTORY H " + " WHERE L.LOT_RRN = H.LOT_RRN" +
                " " + " AND L.TRANS_ID = 'HOLD' AND H.STEP_SEQUENCE = L.STEP_SEQUENCE AND L.LOT_RRN =? " + " AND H" +
                ".OPERATION_RRN= ? AND H.PROCESS_STEP_VERSION LIKE ?" + " AND L.ACTION_RRN = ?";

        List<Long> list = jdbcTemplate
                .query(sql, new Object[]{lotRrn, operationRrn, "%" + routeRrn + "%", actionRrn}, Long.class);
        if (list != null) {
            executedLotList = list;
        }
        return executedLotList;
    }

    private List getFutureHoldLotListByOldData(Long refRrn, Long routeRrn, Long operationRrn, Long lotRrn) {
        String routeSeq = " ";
        String operationSeq = " ";

        String sql =
                "SELECT V.STATUS,V.CONTEXT_KEY1,V.CONTEXT_KEY2,V.CONTEXT_KEY3,V.CONTEXT_KEY4,V.CONTEXT_KEY5, " + " V" +
                        ".RESULT_VALUE2,V.RESULT_VALUE3,V.RESULT_VALUE4,V.RESULT_VALUE5,V.RESULT_VALUE6,V" +
                        ".RESULT_VALUE1, " + " V.EFFECTIVE_DATE_FROM,E.ACTION_TYPE FROM CONTEXT_VALUE V,EEN_ACTION E " +
                        "WHERE V" + ".CONTEXT_RRN = ? AND " + " V.CONTEXT_KEY1=? AND V.CONTEXT_KEY2=? AND V" +
                        ".CONTEXT_KEY3=? AND " + "V.CONTEXT_KEY4=? AND V" + ".CONTEXT_KEY5=? AND V.STATUS=?" + " AND " +
                        "V.RESULT_VALUE1 = E.ACTION_RRN";

        Object[] args = new Object[]{refRrn, routeRrn, operationRrn, lotRrn, routeSeq, operationSeq,
                VersionStatus.ACTIVE_KEY};
        List oldFutureHoldList = jdbcTemplate.query(sql, args, new RowMapper<Map>() {

            @Override
            public Map mapRow(ResultSet rs, int rowNum) throws SQLException {
                Map futureHoldMap = new HashMap();
                futureHoldMap.put("routeRrn", NumberUtils.toLong(rs.getString("CONTEXT_KEY1")));
                futureHoldMap.put("operationRrn", NumberUtils.toLong(rs.getString("CONTEXT_KEY2")));
                futureHoldMap.put("routeSeq", rs.getString("CONTEXT_KEY4"));
                futureHoldMap.put("operationSeq", rs.getString("CONTEXT_KEY5"));
                futureHoldMap.put("userNamed", rs.getString("RESULT_VALUE2"));
                futureHoldMap.put("holdGroup", rs.getString("RESULT_VALUE3"));
                futureHoldMap.put("holdCode", rs.getString("RESULT_VALUE4"));
                futureHoldMap.put("holdReason", rs.getString("RESULT_VALUE5"));
                futureHoldMap.put("effectCount", rs.getString("RESULT_VALUE6"));
                futureHoldMap.put("status", rs.getString("STATUS"));
                futureHoldMap.put("actionRrn", rs.getString("RESULT_VALUE1"));
                futureHoldMap.put("futureholdsetupdate", DateUtils.formatDate(rs.getDate("EFFECTIVE_DATE_FROM")));
                futureHoldMap.put("flag", rs.getString("ACTION_TYPE"));
                if (hasExecuted(lotRrn, routeRrn, operationRrn)) {
                    futureHoldMap.put("executedFlag", "EXECUTED");
                } else {
                    futureHoldMap.put("executedFlag", "");
                }

                return futureHoldMap;
            }
        });
        return oldFutureHoldList;
    }

    private boolean hasExecuted(long lotRrn, long routeRrn, long operationRrn) {
        String sql = "select count(l.lot_rrn)  from lot_trans_history l,lot_step_history h where l.lot_rrn = h" +
                ".lot_rrn " + " and l.trans_id = 'HOLD' and h.step_sequence = l.step_sequence and l.lot_rrn =? " +
                "and h.operation_rrn=? and h.process_step_version like ?";

        return jdbcTemplate.queryForObject(sql, new Object[]{lotRrn, operationRrn, "%" + routeRrn + "%"}, int.class) >
                0;
    }

    @Override
    public List<FutureHold> getAllFutureHoldListByLot(long contextRrn, long lotRrn) {
        String sql = " SELECT STATUS,CONTEXT_KEY1,CONTEXT_KEY2,CONTEXT_KEY3,CONTEXT_KEY4,CONTEXT_KEY5,RESULT_VALUE2, " +
                " RESULT_VALUE3,RESULT_VALUE4,RESULT_VALUE5,RESULT_VALUE6,RESULT_VALUE1,EFFECTIVE_DATE_FROM " +
                " FROM "+ DataBaseNames.CONTEXT_VALUE +" WHERE CONTEXT_RRN = ? AND CONTEXT_KEY3 = ? AND STATUS='"+ VersionStatus.ACTIVE_KEY +"' " ;

        return jdbcTemplate.query(sql, new Object[]{contextRrn, StringUtils.toString(lotRrn)}, new RowMapper<FutureHold>() {
            @Override
            public FutureHold mapRow(ResultSet rs, int rowNum) throws SQLException {
                FutureHold futureHold = new FutureHold();
                futureHold.setStatus(rs.getString("STATUS"));
                futureHold.setRouteRrn(rs.getLong("CONTEXT_KEY1"));
                futureHold.setOperationRrn(rs.getLong("CONTEXT_KEY2"));
                futureHold.setLotRrn(rs.getLong("CONTEXT_KEY3"));
                futureHold.setCreateUserId(rs.getString("RESULT_VALUE2"));
                futureHold.setHoldGroup(rs.getString("RESULT_VALUE3"));
                futureHold.setHoldCode(rs.getString("RESULT_VALUE4"));
                futureHold.setHoldReason(rs.getString("RESULT_VALUE5"));
                futureHold.setEffictiveCount(rs.getLong("RESULT_VALUE6"));
                futureHold.setCreateTime(rs.getTimestamp("EFFECTIVE_DATE_FROM"));
                futureHold.setFlag(VersionStatus.ACTIVE_KEY);
                return futureHold;
            }
        });
    }

    @Override
    public List<FutureHold> getAllFutureHoldListByProduct(long contextRrn, Long productRrn, Long processRrn) {
        String sql = " SELECT CONTEXT_KEY1,CONTEXT_KEY2,CONTEXT_KEY3,CONTEXT_KEY4,RESULT_VALUE2, " +
                " RESULT_VALUE3,RESULT_VALUE4,RESULT_VALUE5,RESULT_VALUE1,EFFECTIVE_DATE_FROM FROM "+
                DataBaseNames.CONTEXT_VALUE + " WHERE CONTEXT_RRN = ? AND CONTEXT_KEY1=? AND CONTEXT_KEY2=? ";
        return jdbcTemplate.query(sql, new Object[]{contextRrn, StringUtils.toString(productRrn),StringUtils.toString(processRrn)}, new RowMapper<FutureHold>() {
            @Override
            public FutureHold mapRow(ResultSet rs, int rowNum) throws SQLException {
                FutureHold futureHold = new FutureHold();
                futureHold.setProductRrn(rs.getLong("CONTEXT_KEY1"));
                futureHold.setProcessRrn(rs.getLong("CONTEXT_KEY2"));
                futureHold.setRouteRrn(rs.getLong("CONTEXT_KEY3"));
                futureHold.setOperationRrn(rs.getLong("CONTEXT_KEY4"));
                futureHold.setCreateUserId(rs.getString("RESULT_VALUE2"));
                futureHold.setHoldGroup(rs.getString("RESULT_VALUE3"));
                futureHold.setHoldCode(rs.getString("RESULT_VALUE4"));
                futureHold.setHoldReason(rs.getString("RESULT_VALUE5"));
                futureHold.setCreateTime(rs.getTimestamp("EFFECTIVE_DATE_FROM"));
                futureHold.setFlag(VersionStatus.ACTIVE_KEY);
                return futureHold;
            }
        });
    }
}