SorterDAOImpl.java

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

import com.mycim.framework.jdbc.BatchPreparedStatementSetter;
import com.mycim.framework.jdbc.JdbcTemplate;
import com.mycim.framework.utils.beans.BeanUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.server.sorter.dao.SorterDAO;
import com.mycim.valueobject.consts.DataBaseNames;
import com.mycim.valueobject.consts.SorterEnum;
import com.mycim.valueobject.consts.SystemConstants;
import com.mycim.valueobject.sorter.SortJobBean;
import com.mycim.valueobject.sorter.SorterBean;
import com.mycim.valueobject.sorter.SorterCarrierMap;
import com.mycim.valueobject.sorter.SorterDetailBean;
import com.mycim.valueobject.wip.Unit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.stereotype.Repository;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


/**
 * @author yibing.liu
 * @version 1.0
 * @date 2021/06/29
 */
@Repository
public class SorterDAOImpl implements SorterDAO {

    @Autowired
    JdbcTemplate jdbcTemplate;


    @Override
    public void addSorter(SorterBean sorterBean, long transRrn) {
        //1、先插入 SORTER_JOB 表
        insertSorter(sorterBean);
        //2、在批量插入 SORTER_JOB_MAPPING 表
        insertSorterDetail(sorterBean.getSorterDetailBeanList());
        //3、批量插入 SORTER_JOB_MAPPING_H 历史表
        insertSorterDetailH(sorterBean, transRrn);
    }

    @Override
    public void updateSorter(SortJobBean sortJob) {
        //暂无需要修改的属性
        String sql;
        Object[] args;
        if (sortJob.getMainJobRrn() > 0) {
            sql = "UPDATE SORTER_JOB SET STATUS=?, EXECUTION_RRN=? WHERE MAIN_JOB_RRN=? ";
            args = new Object[]{sortJob.getStatus(), sortJob.getExecutionRrn(), sortJob.getMainJobRrn()};
        } else {
            sql = "UPDATE SORTER_JOB SET STATUS=?, EXECUTION_RRN=? WHERE SUB_JOB_RRN IN (SELECT SUB_JOB_RRN FROM " +
                    "SORTER_JOB " + " WHERE SOURCE_CARRIER_RRN=? AND TARGET_CARRIER_RRN=? AND STATUS=?) ";
            args = new Object[]{sortJob.getStatus(), sortJob.getExecutionRrn(), sortJob.getSourceCarrierRrn(),
                                sortJob.getTargetCarrierRrn(), SorterEnum.Constant.CREATE};
        }
        jdbcTemplate.update(sql, args);
    }

    @Override
    public void updateSorterBean(SorterBean sb) {
        if (sb == null) {
            return;
        }
        if (sb.getMainJobRrn() <= 0 && sb.getSubJobRrn() <= 0) {
            return;
        }
        String sql = " UPDATE SORTER_JOB SET ";
        String sqlUpdate = "";
        String whereSql = " WHERE ";
        List<Object> args = new ArrayList<>();
        if (StringUtils.isNotBlank(sb.getTargetCarrierId())) {
            sqlUpdate += ",TARGET_CARRIER_ID = ? ";
            args.add(sb.getTargetCarrierId());
        }
        if (sb.getTargetCarrierRrn() > 0) {
            sqlUpdate += ",TARGET_CARRIER_RRN = ? ";
            args.add(sb.getTargetCarrierRrn());
        }
        if (StringUtils.isNotEmpty(sb.getStatus())) {
            sqlUpdate += ",STATUS = ? ";
            args.add(sb.getStatus());
        }
        if (StringUtils.isNotEmpty(sb.getJsonAttributeData1())) {
            sqlUpdate += ",ATTRIBUTE_DATA1 = ? ";
            args.add(sb.getJsonAttributeData1());
        }
        if (StringUtils.isNotEmpty(sb.getJsonAttributeData2())) {
            sqlUpdate += ",ATTRIBUTE_DATA2 = ? ";
            args.add(sb.getJsonAttributeData2());
        }
        if (StringUtils.isNotEmpty(sb.getJsonAttributeData3())) {
            sqlUpdate += ",ATTRIBUTE_DATA3 = ? ";
            args.add(sb.getJsonAttributeData3());
        }
        if (StringUtils.isNotEmpty(sb.getJsonAttributeData4())) {
            sqlUpdate += ",ATTRIBUTE_DATA4 = ? ";
            args.add(sb.getJsonAttributeData4());
        }
        if (StringUtils.isNotEmpty(sb.getJsonAttributeData5())) {
            sqlUpdate += ",ATTRIBUTE_DATA5 = ? ";
            args.add(sb.getJsonAttributeData5());
        }

        if (args.size() == 0) {
            return;
        }

        if (sb.getMainJobRrn() > 0 && sb.getSubJobRrn() > 0) {
            whereSql += " MAIN_JOB_RRN = ? AND SUB_JOB_RRN = ? ";
            args.add(sb.getMainJobRrn());
            args.add(sb.getSubJobRrn());
        } else {
            if (sb.getMainJobRrn() > 0) {
                whereSql += " MAIN_JOB_RRN = ? ";
                args.add(sb.getMainJobRrn());
            } else {
                whereSql += " SUB_JOB_RRN = ? ";
                args.add(sb.getSubJobRrn());
            }
        }
        jdbcTemplate.update(sql + sqlUpdate.substring(1) + whereSql, args.toArray());
    }

    @Override
    public void deleteSorterByJobRrn(SorterBean sorterBean, long transRrn) {
        //先删除 SORTER_JOB_MAPPING 表的数据,然后在修改 SORTER_JOB 的状态
        deleteSorterDetail(sorterBean);
        //取消SortJob时,只能取消还未 FINISH 的SortJob
        transferData4Cancel(sorterBean, transRrn);
        cancelSorter(sorterBean);
    }

    @Override
    public void endSorter(SortJobBean sortJobBean, long transRrn) {
        for (SorterBean sorterBean : sortJobBean.getSorterBeans()) {
            //1 删除 SORTER_JOB_MAPPING 数据
            deleteSorterDetail(sorterBean);//TODO
            //2 修改 SORTER_JOB 状态
            sorterBean.setUpdateTime(sortJobBean.getLastUpdateTimestamp());
            sorterBean.setUpdateUser(sortJobBean.getLastUpdateUserId());
            sorterBean.setEquipmentId(sortJobBean.getEquipmentId());
            sorterBean.setExecutionRrn(sortJobBean.getExecutionRrn());
            transferData4Finish(sorterBean, transRrn);
            finishSorter(sorterBean);
        }
    }

    @Override
    public void insertSorterCarrierMapList(List<SorterCarrierMap> carrierMapList) {
        StringBuilder sql = new StringBuilder(DataBaseNames.INSERT_INTO);
        sql.append(DataBaseNames.SORTER_CARRIER_MAP_H);
        sql.append(" (MAIN_JOB_RRN, SUB_JOB_RRN, CARRIER_MAP_RRN, CARRIER_RRN, CARRIER_ID, LOT_RRN, LOT_ID,");
        sql.append("  UNIT_RRN, UNIT_ID, POSITION) ").append(" VALUES ");
        sql.append(" (:mainJobRrn, :subJobRrn, :carrierMapRrn, :carrierRrn, :carrierId, :lotRrn, :lotId,");
        sql.append("  :unitRrn, :unitId, :position) ");

        Map<String, Object>[] batchValues = carrierMapList.stream().map(map -> {
            return BeanUtils.copyBeanToMap(map);
        }).collect(Collectors.toList()).toArray(new Map[carrierMapList.size()]);

        jdbcTemplate.batchUpdate(sql.toString(), batchValues);
    }


    private void insertSorter(SorterBean s) {
        String sql = "INSERT INTO SORTER_JOB (MAIN_JOB_RRN, SUB_JOB_RRN, SOURCE_CARRIER_RRN, SOURCE_CARRIER_ID, " +
                "TARGET_CARRIER_RRN," + "TARGET_CARRIER_ID, STATUS, EXCHANGE_TOTAL_QTY, JOB_TYPE, JOB_RRN," +
                "EXECUTION_RRN, PORT_NUM, ATTRIBUTE_DATA1, ATTRIBUTE_DATA2, ATTRIBUTE_DATA3," +
                "ATTRIBUTE_DATA4, ATTRIBUTE_DATA5, CREATE_TIME, CREATE_USER, UPDATE_TIME," +
                "UPDATE_USER, LOCK_VERSION, SORTER_TYPE)" + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        jdbcTemplate.update(sql, s.getMainJobRrn(), s.getSubJobRrn(), s.getSourceCarrierRrn(), s.getSourceCarrierId(),
                            s.getTargetCarrierRrn(), s.getTargetCarrierId(), s.getStatus(), s.getExchangeTotalQty(),
                            s.getJobType(), s.getJobRrn(), s.getExecutionRrn(), s.getPortNum(),
                            s.getJsonAttributeData1(), s.getJsonAttributeData2(), s.getJsonAttributeData3(),
                            s.getJsonAttributeData4(), s.getJsonAttributeData5(), s.getCreateTime(), s.getCreateUser(),
                            s.getUpdateTime(), s.getUpdateUser(), s.getLockVersion(), s.getSorterType());
    }

    private void insertSorterDetail(List<SorterDetailBean> sorterDetailBeanList) {
        String sql = "INSERT INTO SORTER_JOB_MAPPING (SUB_JOB_RRN,LOT_RRN,LOT_ID,UNIT_RRN,UNIT_ID,SOURCE_POSITION," +
                "TARGET_POSITION)" + " VALUES(?,?,?,?,?,?,?)";

        jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
            SorterDetailBean sd;

            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                sd = sorterDetailBeanList.get(i);
                ps.setLong(1, sd.getSubJobRrn());
                ps.setLong(2, sd.getLotRrn());
                ps.setString(3, sd.getLotId());
                ps.setLong(4, sd.getUnitRrn());
                ps.setString(5, sd.getUnitId());
                ps.setInt(6, sd.getSourcePosition());
                ps.setInt(7, sd.getTargetPosition());
            }

            @Override
            public int getBatchSize() {
                return sorterDetailBeanList.size();
            }
        });
    }

    private void insertSorterDetailH(SorterBean sd, long transRrn) {
        String sql = "INSERT INTO SORTER_JOB_MAPPING_H (SUB_JOB_RRN,TRANS_RRN,LOT_RRN,LOT_ID,UNIT_RRN,UNIT_ID," +
                "SOURCE_POSITION,TARGET_POSITION)" +
                " SELECT SUB_JOB_RRN,?,LOT_RRN,LOT_ID,UNIT_RRN,UNIT_ID,SOURCE_POSITION,TARGET_POSITION " +
                " FROM SORTER_JOB_MAPPING WHERE SUB_JOB_RRN=?";
        jdbcTemplate.update(sql, transRrn, sd.getSubJobRrn());
    }

    private void finishSorter(SorterBean sorterBean) {
        String sql = "DELETE FROM SORTER_JOB WHERE MAIN_JOB_RRN=? AND SUB_JOB_RRN=?";
        jdbcTemplate.update(sql, sorterBean.getMainJobRrn(), sorterBean.getSubJobRrn());
    }

    private void cancelSorter(SorterBean sorterBean) {
        String sql = "DELETE FROM SORTER_JOB WHERE MAIN_JOB_RRN=? ";
        jdbcTemplate.update(sql, sorterBean.getMainJobRrn());
    }

    private void transferData4Finish(SorterBean sorterBean, long transRrn) {
        String sql = "INSERT INTO SORTER_JOB_H (MAIN_JOB_RRN, SUB_JOB_RRN, TRANS_RRN, SOURCE_CARRIER_RRN, " +
                "SOURCE_CARRIER_ID, TARGET_CARRIER_RRN," +
                "TARGET_CARRIER_ID, STATUS, EQUIPMENT_ID, EXCHANGE_TOTAL_QTY, JOB_TYPE, JOB_RRN," +
                "EXECUTION_RRN, PORT_NUM, ATTRIBUTE_DATA1, ATTRIBUTE_DATA2, ATTRIBUTE_DATA3," +
                "ATTRIBUTE_DATA4, ATTRIBUTE_DATA5, CREATE_TIME, CREATE_USER, UPDATE_TIME," +
                "UPDATE_USER, LOCK_VERSION, SORTER_TYPE)" +
                " SELECT MAIN_JOB_RRN, SUB_JOB_RRN, ?, SOURCE_CARRIER_RRN, SOURCE_CARRIER_ID, " +
                "TARGET_CARRIER_RRN," + "TARGET_CARRIER_ID, ?, ?, EXCHANGE_TOTAL_QTY, JOB_TYPE, JOB_RRN," +
                " ?, PORT_NUM, ATTRIBUTE_DATA1, ATTRIBUTE_DATA2, ATTRIBUTE_DATA3," +
                " ATTRIBUTE_DATA4, ATTRIBUTE_DATA5, CREATE_TIME, CREATE_USER, ?, ?, LOCK_VERSION, SORTER_TYPE" +
                " FROM SORTER_JOB WHERE MAIN_JOB_RRN=? AND SUB_JOB_RRN=? ";
        jdbcTemplate.update(sql, transRrn, SorterEnum.Status.FINISH.getStatus(), sorterBean.getEquipmentId(),
                            sorterBean.getExecutionRrn(), sorterBean.getUpdateTime(), sorterBean.getUpdateUser(),
                            sorterBean.getMainJobRrn(), sorterBean.getSubJobRrn());
    }

    private void transferData4Cancel(SorterBean sorterBean, long transRrn) {
        String sql = "INSERT INTO SORTER_JOB_H (MAIN_JOB_RRN, SUB_JOB_RRN, TRANS_RRN, SOURCE_CARRIER_RRN, " +
                "SOURCE_CARRIER_ID, TARGET_CARRIER_RRN," +
                "TARGET_CARRIER_ID, STATUS, EQUIPMENT_ID, EXCHANGE_TOTAL_QTY, JOB_TYPE, JOB_RRN," +
                "EXECUTION_RRN, PORT_NUM, ATTRIBUTE_DATA1, ATTRIBUTE_DATA2, ATTRIBUTE_DATA3," +
                "ATTRIBUTE_DATA4, ATTRIBUTE_DATA5, CREATE_TIME, CREATE_USER, UPDATE_TIME," +
                "UPDATE_USER, LOCK_VERSION, SORTER_TYPE)" +
                " SELECT MAIN_JOB_RRN, SUB_JOB_RRN, ?, SOURCE_CARRIER_RRN, SOURCE_CARRIER_ID, " +
                "TARGET_CARRIER_RRN," + "TARGET_CARRIER_ID, ?, '', EXCHANGE_TOTAL_QTY, JOB_TYPE, JOB_RRN," +
                " EXECUTION_RRN, PORT_NUM, ATTRIBUTE_DATA1, ATTRIBUTE_DATA2, ATTRIBUTE_DATA3," +
                " ATTRIBUTE_DATA4, ATTRIBUTE_DATA5, CREATE_TIME, CREATE_USER, ?, ?, LOCK_VERSION, SORTER_TYPE" +
                " FROM SORTER_JOB WHERE MAIN_JOB_RRN=? AND STATUS IN (?,?)";
        jdbcTemplate.update(sql, transRrn, SorterEnum.Status.CANCEL.getStatus(), sorterBean.getUpdateTime(),
                            sorterBean.getUpdateUser(), sorterBean.getMainJobRrn(),
                            SorterEnum.Status.CREATE.getStatus(), SorterEnum.Status.DISPATCH.getStatus());
    }

    private void deleteSorterDetail(SorterBean sorterBean) {
        String sql = "DELETE FROM SORTER_JOB_MAPPING WHERE  ";
        if (sorterBean.getSubJobRrn() > 0) {
            sql += " SUB_JOB_RRN = ? ";
            jdbcTemplate.update(sql, sorterBean.getSubJobRrn());
        } else {
            sql += " SUB_JOB_RRN IN (SELECT SUB_JOB_RRN FROM SORTER_JOB WHERE MAIN_JOB_RRN = ?) ";
            jdbcTemplate.update(sql, sorterBean.getMainJobRrn());
        }
    }


}