StatusDAOImpl.java

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

import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.jdbc.JdbcTemplate;
import com.mycim.framework.utils.MiscUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.server.status.dao.StatusDAO;
import com.mycim.valueobject.bas.TransactionLog;
import com.mycim.valueobject.consts.Constants;
import com.mycim.valueobject.consts.DataBaseNames;
import com.mycim.valueobject.ems.EntityStatus;
import com.mycim.valueobject.ems.Event;
import com.mycim.valueobject.table.SubEntityTable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

@Repository
public class StatusDAOImpl implements StatusDAO {

    public static final String DATE_FORMAT = "YYYY/MM/DD HH24:MI:SS";

    private static final String NUMBER_2 = "2";

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Override
    public void updateStatusEndTime(long transRrn, String statusEndTime) {
        String sql = "update transaction_log set trans_start_timestamp=to_timestamp('" + statusEndTime + "', '" +
                DATE_FORMAT + "'),trans_end_timestamp=to_timestamp('" + statusEndTime + "', '" + DATE_FORMAT + "') " +
                " where trans_rrn=" + transRrn;
        jdbcTemplate.update(sql);
    }

    @Override
    public void updateAllEntityStatus(Collection entityStatuss, Event event, long entityRrn, long transRrn) {
        String sql = "Update  " + DataBaseNames.ENTITY + " SET AVAILABILITY=" +
                StringUtils.wrapWithApostropheIfMissing(event.getTargetAvailability()) + " WHERE ENTITY_RRN=" +
                entityRrn;

        String sqlEqpt = "Update  " + DataBaseNames.EQUIPMENT + " SET AVAILABILITY=" +
                StringUtils.wrapWithApostropheIfMissing(event.getTargetAvailability()) + " WHERE EQPT_RRN=" + entityRrn;

        String sqlH = "";
       /* if (event.getTargetAvailability() != null && NUMBER_2.equalsIgnoreCase(
                event.getTargetAvailability())) {

            // not to update
        } else {*/
        jdbcTemplate.update(sql);
        jdbcTemplate.update(sqlEqpt);
        //  }

        Iterator it = entityStatuss.iterator();

        while (it.hasNext()) {
            EntityStatus entityStatus = (EntityStatus) it.next();

            sql = "UPDATE " + DataBaseNames.ENTITY_STATUS + " SET CURRENT_STATUS = " +
                    StringUtils.wrapWithApostropheIfMissing(entityStatus.getCurrentStatus()) +
                    ",LAST_EVENT_TRANS_RRN =" + (transRrn) + " WHERE ENTITY_RRN = " + entityStatus.getEntityRrn() +
                    " AND STATUS_GROUP_ID = " +
                    StringUtils.wrapWithApostropheIfMissing(entityStatus.getStatusGroupId());
            if (entityStatus.getCurrentStatus() != null && !"SAME".equalsIgnoreCase(entityStatus.getCurrentStatus())) {

                Object[] obj = {entityStatus.getStatusGroupId(), entityStatus.getStatusBefore(),
                        entityStatus.getCurrentStatus()};

                sqlH = " INSERT INTO " + DataBaseNames.ENTITY_STATUS_HISTORY + "(TRANS_RRN,STATUS_GROUP_ID," +
                        "STATUS_BEFORE,STATUS_AFTER)" + " VALUES(" + transRrn + "," + MiscUtils.parseSQL(obj) + ")";

            } else {
                Object[] obj = {entityStatus.getStatusGroupId(), entityStatus.getStatusBefore(),
                        entityStatus.getStatusBefore()};

                sqlH = " INSERT INTO " + DataBaseNames.ENTITY_STATUS_HISTORY + "(TRANS_RRN,STATUS_GROUP_ID," +
                        "STATUS_BEFORE,STATUS_AFTER)" + " VALUES(" + transRrn + "," + MiscUtils.parseSQL(obj) + ")";

            }

            jdbcTemplate.batchUpdate(sql, sqlH);
        }
    }


    @Override
    public void updatePodStatus(Long podRrn, Long transRrn, String status, String comments) {
        String sql = " UPDATE POD SET STATUS = ? WHERE POD_RRN=?";
        jdbcTemplate.update(sql, new Object[]{status, podRrn});
    }

    @Override
    public void updateCarrierStatus(Long carrierRrn, Long transRrn, String status, String comments) {
        String sql1 = " UPDATE CARRIER SET STATUS = ? WHERE CARRIER_RRN=?";
        jdbcTemplate.update(sql1, new Object[]{status, carrierRrn});
    }

    @Override
    public void updateDoorStatus(Long doorRrn, Long transRrn, String status, String comments) {
        String sql = " UPDATE DOOR SET STATUS = ? WHERE DOOR_RRN=?";
        jdbcTemplate.update(sql, new Object[]{status, doorRrn});
    }

    @Override
    public void updateEntityStatus(EntityStatus entityStatus, SubEntityTable set, TransactionLog tl) {
        String mainTable = set.getSubEntityTableName();
        String differentPk = set.getTableDifferentPrimaryKey();

        String sql = "UPDATE " + mainTable + " SET CURRENT_STATUS = ?, LAST_EVENT_TRANS_RRN =? ,UPDATE_USER_RRN=?, UPDATE_TIME= ? "
                + " WHERE " + differentPk + " = ? AND STATUS_GROUP_ID = ? " ;
        jdbcTemplate.update(sql, entityStatus.getCurrentStatus(), tl.getTransRrn(), LocalContext.getUserRrn(),
                            tl.getTransStartTimestamp(), entityStatus.getEntityRrn(), entityStatus.getStatusGroupId());

    }

    @Override
    public void insertEntityStatusHistory(EntityStatus entityStatus, SubEntityTable set, TransactionLog tl) {
        String hisTable = set.getSubEntityHistoryTableName();
        String differentPk = set.getTableDifferentPrimaryKey();

        String sqlH = " INSERT INTO " + hisTable + "(TRANS_RRN,STATUS_GROUP_ID,STATUS_BEFORE,STATUS_AFTER,"
                + "TRANS_ID,TRANS_USER_RRN,TRANS_TIME," + differentPk + ") VALUES(?,?,?,?,?,?,?,?)";
        Object[] obj;
        if (!StringUtils.equalsIgnoreCase("SAME", entityStatus.getCurrentStatus())) {
            obj = new Object[]{tl.getTransRrn(), entityStatus.getStatusGroupId(), entityStatus.getStatusBefore(), entityStatus.getCurrentStatus(),
                            tl.getTransId(), LocalContext.getUserRrn(), tl.getTransStartTimestamp(), entityStatus.getEntityRrn()};
        } else {
            obj = new Object[]{tl.getTransRrn(), entityStatus.getStatusGroupId(), entityStatus.getStatusBefore(), entityStatus.getStatusBefore(),
                            tl.getTransId(), LocalContext.getUserRrn(), tl.getTransStartTimestamp(), entityStatus.getEntityRrn()};
        }
        jdbcTemplate.update(sqlH, obj);

    }

    @Override
    public boolean checkChamberAllInTheSameState(long parentRrn, List<Long> excludeChamberRrns,String state) {
        String sql = " SELECT COUNT(ET.ENTITY_RRN) FROM ENTITY ET LEFT JOIN ENTITY_STATUS ES ON ET.ENTITY_RRN = ES.ENTITY_RRN";
        sql += " WHERE ET.PARENT_ENTITY_RRN =?  AND ES.CURRENT_STATUS !=?   ";
        if(CollectionUtils.isNotEmpty(excludeChamberRrns)){
            //基本数据类型 不牵扯 双引号直接取
            String inParam=StringUtils.join(excludeChamberRrns,",");
            sql+= String.format(" AND ES.ENTITY_RRN NOT IN (%s) ",inParam);
        }
        return jdbcTemplate.queryForObjectWithNull(sql, new Object[]{parentRrn, state}, long.class)==0;
    }

}