MaterialDAOImpl.java

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

import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.jdbc.JdbcTemplate;
import com.mycim.server.asm.dao.MaterialDAO;
import com.mycim.server.asm.dao.mapper.MaterialDORowMapper;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.bas.TransactionLog;
import com.mycim.valueobject.consts.DataBaseNames;
import com.mycim.valueobject.consts.LinkTypeList;
import com.mycim.valueobject.inv.LotStepBomHistoryDO;
import com.mycim.valueobject.inv.MaterialDO;
import com.mycim.valueobject.inv.value.WarehouseNames;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

@Repository
public class MaterialDAOImpl implements MaterialDAO {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Override
    public void insertMaterial(MaterialDO material) {
        StringBuilder sql = new StringBuilder("INSERT INTO ");

        sql.append(DataBaseNames.ITEM);
        sql.append(" (ITEM_RRN, ITEM_EXTEND_NUMBER, ITEM_CLASS, DEFAULT_WAREHOUSE_RRN, DEFAULT_LOCATION_RRN, ");
        sql.append(" OPENING_BALANCE, RECEIPT_QTY, ISSUE_QTY, ADJUST_QTY, STORE_UOM, PURCHASE_UOM, SALES_UOM, ");
        sql.append(" LOT_TRACKING_FLAG, PRODUCT_FAMILY_RRN, SUBPRODUCT_FLAG, PRODUCT_ENGINEER_RRN, ");
        sql.append(
                " HOLD_ON_LOW_YIELD, EXPIRATION_LENGTH, EXPIRATION_ALARM_ID, WAFER_SIZE, MASK_ID, " + "ITEM_OWNER, " +
                        "QUANTITY_OF_WARNING) ");
        sql.append(" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ");

        Object[] args = {material.getInstanceRrn(), material.getItemExtendNumber(), material.getItemClass(),
                material.getDefaultWarehouseRrn(), material.getDefaultLocationRrn(), material.getOpeningBalance(),
                material.getReceiptQty(), material.getIssueQty(), material.getAdjustQty(), material.getStoreUom(),
                material.getPurchaseUom(), material.getSalesUom(), material.getLotTrackingFlag(),
                material.getProductFamilyRrn(), material.getSubproductFlag(), material.getProductEngineerRrn(),
                material.getHoldOnLowYield(), material.getExpirationLength(), material.getExpirationAlarmId(),
                material.getWaferSize(), material.getMaskId(), material.getItemOwner(),
                material.getQuantityOfWarning()};

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

    @Override
    public void insertMaterial(MaterialDO m, Long userRrn) {
        String sql = "INSERT INTO " + DataBaseNames.MATERIAL + "(SYS_RRN,MATERIAL_ID,FACILITY_RRN,DESCRIPTION," +
                "OBJ_SPACE," + "OBJ_TYPE,OBJ_SUBTYPE,OBJ_STATUS,OBJ_CURRENT_VERSION,OBJ_ACTIVE_VERSION," +
                "ITEM_EXTEND_NUMBER,ITEM_CLASS,DEFAULT_WAREHOUSE_RRN,DEFAULT_LOCATION_RRN," + "OPENING_BALANCE," +
                "RECEIPT_QTY,ISSUE_QTY,ADJUST_QTY,STORE_UOM,PURCHASE_UOM," + "SALES_UOM,LOT_TRACKING_FLAG," +
                "PRODUCT_FAMILY_RRN,SUBPRODUCT_FLAG,PRODUCT_ENGINEER_RRN," + "HOLD_ON_LOW_YIELD,EXPIRATION_LENGTH," +
                "EXPIRATION_ALARM_ID,WAFER_SIZE,MASK_ID," + "ITEM_OWNER,QUANTITY_OF_WARNING,CREATE_TIME,UPDATE_TIME," +
                "CREATE_USER_RRN," + "UPDATE_USER_RRN,LOCK_VERSION )" + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?," +
                "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";

        Object[] args = {m.getInstanceRrn(), m.getInstanceId(), LocalContext.getFacilityRrn(), m.getInstanceDesc(),
                m.getNamedSpace(), m.getObjectType(), m.getObjectSubtype(), m.getInstanceStatus(),
                m.getCurrentVersion(), m.getActiveVersion(), m.getItemExtendNumber(), m.getItemClass(),
                m.getDefaultWarehouseRrn(), m.getDefaultLocationRrn(), m.getOpeningBalance(), m.getReceiptQty(),
                m.getIssueQty(), m.getAdjustQty(), m.getStoreUom(), m.getPurchaseUom(), m.getSalesUom(),
                m.getLotTrackingFlag(), m.getProductFamilyRrn(), m.getSubproductFlag(), m.getProductEngineerRrn(),
                m.getHoldOnLowYield(), m.getExpirationLength(), m.getExpirationAlarmId(), m.getWaferSize(),
                m.getMaskId(), m.getItemOwner(), m.getQuantityOfWarning(), m.getCreatedTimestamp(),
                m.getCreatedTimestamp(), LocalContext.getUserRrn(), LocalContext.getUserRrn(), m.getLockVersion()};
        jdbcTemplate.update(sql, args);
    }

    @Override
    public void deleteMaterial(Long materialRrn) {
        String sql = "DELETE FROM " + DataBaseNames.ITEM + " WHERE ITEM_RRN = ? ";

        jdbcTemplate.update(sql, materialRrn);
    }

    @Override
    public void deleteMaterial(MaterialDO material) {
        String sql = "DELETE FROM " + DataBaseNames.MATERIAL + " WHERE SYS_RRN = ? ";
        jdbcTemplate.update(sql, material.getInstanceRrn());
    }

    @Override
    public void updateMaterial(MaterialDO material) {
        StringBuilder sql = new StringBuilder("UPDATE ");

        sql.append(DataBaseNames.ITEM).append(" SET ");
        sql.append(" ITEM_EXTEND_NUMBER = ?, ITEM_CLASS = ?, STORE_UOM = ?, EXPIRATION_LENGTH = ?, ");
        sql.append(
                " EXPIRATION_ALARM_ID = ?, ITEM_OWNER = ?, MASK_ID = ?, WAFER_SIZE = ?, QUANTITY_OF_WARNING" + " = ? ");
        sql.append(" WHERE ITEM_RRN = ? ");

        Object[] args = new Object[]{material.getItemExtendNumber(), material.getItemClass(), material.getStoreUom(),
                material.getExpirationLength(), material.getExpirationAlarmId(), material.getItemOwner(),
                material.getMaskId(), material.getWaferSize(), material.getQuantityOfWarning(),
                material.getInstanceRrn()};

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

    @Override
    public void updateMaterial(MaterialDO mr, Long userRrn) {
        String sql = "UPDATE " + DataBaseNames.MATERIAL + " SET " + " ITEM_EXTEND_NUMBER = ?, ITEM_CLASS = ?, " +
                "STORE_UOM = ?, EXPIRATION_LENGTH = ?," + "EXPIRATION_ALARM_ID = ?, " + "ITEM_OWNER = ?, MASK_ID = ?," +
                " WAFER_SIZE = ?, QUANTITY_OF_WARNING = ? , " + "UPDATE_USER_RRN=?," + " UPDATE_TIME=?, " +
                "DESCRIPTION=?, OBJ_SUBTYPE=?" + " WHERE SYS_RRN = ? ";
        Object[] args = new Object[]{mr.getItemExtendNumber(), mr.getItemClass(), mr.getStoreUom(),
                mr.getExpirationLength(), mr.getExpirationAlarmId(), mr.getItemOwner(), mr.getMaskId(),
                mr.getWaferSize(), mr.getQuantityOfWarning(), userRrn, mr.getLastUpdateTimestamp(),
                mr.getInstanceDesc(), mr.getObjectSubtype(), mr.getInstanceRrn()};
        jdbcTemplate.update(sql, args);
    }

    @Override
    public MaterialDO getMaterial(Long materialRrn) {
        StringBuilder sql = new StringBuilder("SELECT ");

        sql.append(" i.ITEM_RRN, i.ITEM_EXTEND_NUMBER, i.ITEM_CLASS, i.DEFAULT_WAREHOUSE_RRN, i" +
                           ".DEFAULT_LOCATION_RRN, ");
        sql.append(" i.OPENING_BALANCE, i.RECEIPT_QTY, i.ISSUE_QTY, i.ADJUST_QTY, i.STORE_UOM, i.PURCHASE_UOM," + " i" +
                           ".SALES_UOM, ");
        sql.append(" i.LOT_TRACKING_FLAG, i.PRODUCT_FAMILY_RRN, i.SUBPRODUCT_FLAG, i.PRODUCT_ENGINEER_RRN, ");
        sql.append(" i.HOLD_ON_LOW_YIELD, i.EXPIRATION_LENGTH, i.EXPIRATION_ALARM_ID, i.WAFER_SIZE, i.MASK_ID," + " i" +
                           ".ITEM_OWNER, i.QUANTITY_OF_WARNING ");
        sql.append(" FROM ").append(DataBaseNames.ITEM).append(" i ");
        sql.append(" WHERE i.ITEM_RRN = ? ");

        return jdbcTemplate
                .queryForObjectWithNull(sql.toString(), new Object[]{materialRrn}, new MaterialDORowMapper());
    }

    @Override
    public List<Long> getMaterialInWarehouse(Long materialRrn) {
        String sql = "SELECT DISTINCT WAREHOUSE_RRN FROM " + DataBaseNames.WAREHOUSE_INVENTORY + " WHERE ITEM_RRN =" +
                materialRrn;

        return jdbcTemplate.query(sql, Long.class);
    }

    @Override
    public boolean hasMaterialExtNumber(Long materialRrn, String itemExtendNumber) {
        String sql = "SELECT DISTINCT ITEM_EXTEND_NUMBER FROM " + DataBaseNames.ITEM + " WHERE ITEM_EXTEND_NUMBER = ?" +
                " AND ITEM_RRN <> ?";

        Object[] args = new Object[]{itemExtendNumber, materialRrn};

        List items = jdbcTemplate.query(sql, args, String.class);

        if (!CollectionUtils.isEmpty(items)) {
            return true;
        }

        return false;
    }

    @Override
    public List<Long> getMaterialInBor(Long materialRrn) {
        String sql = "SELECT DISTINCT BOR_RRN FROM " + DataBaseNames.BILL_OF_RESOURCE + " WHERE RESOURCE_RRN =" +
                materialRrn;

        return jdbcTemplate.query(sql, Long.class);
    }

    @Override
    public void insertMaterialHistory(Long materialRrn, Long transRrn, Long transSequence, Double transQty) {
        StringBuilder sql = new StringBuilder("INSERT INTO ");

        sql.append(DataBaseNames.ITEM_H);
        sql.append(" (ITEM_RRN, ITEM_EXTEND_NUMBER, ITEM_CLASS, DEFAULT_WAREHOUSE_RRN, DEFAULT_LOCATION_RRN, ");
        sql.append(" OPENING_BALANCE, RECEIPT_QTY, ISSUE_QTY, ADJUST_QTY, STORE_UOM, PURCHASE_UOM, SALES_UOM, ");
        sql.append(" LOT_TRACKING_FLAG, PRODUCT_FAMILY_RRN, SUBPRODUCT_FLAG, PRODUCT_ENGINEER_RRN, ");
        sql.append(
                " HOLD_ON_LOW_YIELD, EXPIRATION_LENGTH, EXPIRATION_ALARM_ID, WAFER_SIZE, MASK_ID, " + "ITEM_OWNER, " +
                        "QUANTITY_OF_WARNING, ");
        sql.append(" TRANS_RRN, TRANS_SEQUENCE, TRANS_QTY) ");
        sql.append(" SELECT ");
        sql.append(" i.ITEM_RRN, i.ITEM_EXTEND_NUMBER, i.ITEM_CLASS, i.DEFAULT_WAREHOUSE_RRN, i" +
                           ".DEFAULT_LOCATION_RRN, ");
        sql.append(" i.OPENING_BALANCE, i.RECEIPT_QTY, i.ISSUE_QTY, i.ADJUST_QTY, i.STORE_UOM, i.PURCHASE_UOM," + " i" +
                           ".SALES_UOM, ");
        sql.append(" i.LOT_TRACKING_FLAG, i.PRODUCT_FAMILY_RRN, i.SUBPRODUCT_FLAG, i.PRODUCT_ENGINEER_RRN, ");
        sql.append(" i.HOLD_ON_LOW_YIELD, i.EXPIRATION_LENGTH, i.EXPIRATION_ALARM_ID, i.WAFER_SIZE, i.MASK_ID," + " i" +
                           ".ITEM_OWNER, i.QUANTITY_OF_WARNING, ");
        sql.append(transRrn).append(", ").append(transSequence).append(", ").append(transQty);
        sql.append(" FROM ").append(DataBaseNames.ITEM).append(" i ");
        sql.append(" WHERE i.ITEM_RRN = ? ");

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

    @Override
    public void insertMaterialHistory(MaterialDO m, TransactionLog tr) {
        String sql = "INSERT INTO " + DataBaseNames.MATERIAL_H + "(TRANS_RRN,TRANS_SEQUENCE,TRANS_ID,SYS_RRN," +
                "MATERIAL_ID,FACILITY_RRN,DESCRIPTION," + "OBJ_SPACE," + "OBJ_TYPE,OBJ_SUBTYPE,OBJ_STATUS," +
                "OBJ_CURRENT_VERSION,OBJ_ACTIVE_VERSION," + "ITEM_EXTEND_NUMBER,ITEM_CLASS,DEFAULT_WAREHOUSE_RRN," +
                "DEFAULT_LOCATION_RRN," + "OPENING_BALANCE," + "RECEIPT_QTY,ISSUE_QTY,ADJUST_QTY,STORE_UOM," +
                "PURCHASE_UOM," + "SALES_UOM,LOT_TRACKING_FLAG,PRODUCT_FAMILY_RRN,SUBPRODUCT_FLAG," +
                "PRODUCT_ENGINEER_RRN," + "HOLD_ON_LOW_YIELD,EXPIRATION_LENGTH,EXPIRATION_ALARM_ID,WAFER_SIZE," +
                "MASK_ID," + "ITEM_OWNER,QUANTITY_OF_WARNING,TRANS_TIME,TRANS_USER_RRN)" + " SELECT ?,?,?,SYS_RRN," +
                "MATERIAL_ID,FACILITY_RRN,DESCRIPTION,OBJ_SPACE," + "OBJ_TYPE,OBJ_SUBTYPE,OBJ_STATUS," +
                "OBJ_CURRENT_VERSION,OBJ_ACTIVE_VERSION," + "ITEM_EXTEND_NUMBER,ITEM_CLASS,DEFAULT_WAREHOUSE_RRN," +
                "DEFAULT_LOCATION_RRN," + "OPENING_BALANCE," + "RECEIPT_QTY,ISSUE_QTY,ADJUST_QTY,STORE_UOM," +
                "PURCHASE_UOM," + "SALES_UOM,LOT_TRACKING_FLAG,PRODUCT_FAMILY_RRN,SUBPRODUCT_FLAG," +
                "PRODUCT_ENGINEER_RRN," + "HOLD_ON_LOW_YIELD,EXPIRATION_LENGTH,EXPIRATION_ALARM_ID,WAFER_SIZE," +
                "MASK_ID," + "ITEM_OWNER,QUANTITY_OF_WARNING,?,? " + " FROM " + DataBaseNames.MATERIAL + " WHERE " +
                "SYS_RRN=?";
        jdbcTemplate.update(sql, tr.getTransRrn(), tr.getTransSequence(), tr.getTransId(), tr.getTransStartTimestamp(),
                            LocalContext.getUserRrn(), m.getInstanceRrn());
    }

    @Override
    public void updateMaterialForReceiptQty(Long materialRrn, Double receiptQty) {
        updateMaterialForQty(materialRrn, receiptQty, 0D, 0D);
    }

    @Override
    public void updateMaterialForIssueQty(Long materialRrn, Double issueQty) {
        updateMaterialForQty(materialRrn, 0D, issueQty, 0D);
    }

    @Override
    public void updateMaterialForAdjustQty(Long materialRrn, Double adjustQty) {
        updateMaterialForQty(materialRrn, 0D, 0D, adjustQty);
    }

    @Override
    public String getMaterials4lot(Long warehouseRrn, Long productRrn) {
        StringBuilder sb = new StringBuilder();
        sb.append(" SELECT LISTAGG(INSTANCE_ID, ',') WITHIN GROUP (ORDER BY INSTANCE_ID) AS RESULTS");
        sb.append(" FROM WAREHOUSE_INVENTORY W, NAMED_OBJECT OI ");
        sb.append(" WHERE W.ITEM_RRN = OI.INSTANCE_RRN ");
        sb.append(" AND OI.OBJECT = ? ");
        sb.append(" AND OI.OBJECT_TYPE = ? ");
        sb.append(" AND W.WAREHOUSE_RRN = ? ");
        sb.append(" AND OI.INSTANCE_RRN IN (SELECT TO_RRN ");
        sb.append(" FROM RELATION ");
        sb.append(" WHERE LINK_TYPE = ? ");
        sb.append(" AND FROM_RRN = ?) ");

        return jdbcTemplate.queryForObjectWithNull(sb.toString(),
                                                   new Object[]{ObjectList.ITEM_KEY, ObjectList.ITEM_MATERIAL_KEY,
                                                           warehouseRrn, LinkTypeList.PRODUCT_TO_MATERIAL_KEY,
                                                           productRrn},
                                                   String.class);
    }

    @Override
    public int getMaterialTotalQuantity(long materialRrn) {
        String sql = "SELECT SUM(RECEIPT_QTY + ADJUST_QTY - ISSUE_QTY) FROM  LOT_INVENTORY "
                + "WHERE RECEIPT_QTY + ADJUST_QTY - ISSUE_QTY > 0 AND INSTR(LOT_NUMBER,'"+ WarehouseNames.TYPE + "') <=0 "
                + "AND ITEM_RRN = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{materialRrn}, int.class);
    }

    @Override
    public void insertLotStepBomDao(LotStepBomHistoryDO lotStepBomHistoryDO) {
        StringBuilder sql = new StringBuilder(" INSERT INTO ");
        sql.append(DataBaseNames.LOT_STEP_BOM_H);
        sql.append("(TRANS_RRN, TRANS_SEQUENCE, TRANS_ID, TRANS_QTY, TRANS_TIME, WAREHOUSE_RRN, WAREHOUSE_ID, ITEM_RRN,");
        sql.append("MATERIAL_LOT_NUMBER, LOT_RRN, STEP_SEQUENCE, BATCH_ID, BOM_CONSUME_TYPE, BOM_CONSUME_MODE, ");
        sql.append("COMMENTS, FACILITY_RRN ) ");
        sql.append("VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)");
        List args = new ArrayList();
        args.add(lotStepBomHistoryDO.getTransRrn());
        args.add(lotStepBomHistoryDO.getTransSequence());
        args.add(lotStepBomHistoryDO.getTransId());
        args.add(lotStepBomHistoryDO.getTransQty());
        args.add(lotStepBomHistoryDO.getTransTime());
        args.add(lotStepBomHistoryDO.getWarehouseRrn());
        args.add(lotStepBomHistoryDO.getWarehouseId());
        args.add(lotStepBomHistoryDO.getItemRrn());
        args.add(lotStepBomHistoryDO.getMaterialLotNumber());
        args.add(lotStepBomHistoryDO.getLotRrn());
        args.add(lotStepBomHistoryDO.getStepSequence());
        args.add(lotStepBomHistoryDO.getBatchId());
        args.add(lotStepBomHistoryDO.getBomConsumeType());
        args.add(lotStepBomHistoryDO.getBomConsumeMode());
        args.add(lotStepBomHistoryDO.getComments());
        args.add(lotStepBomHistoryDO.getFacilityRrn());
        jdbcTemplate.update(sql.toString(), args.toArray());
    }

    private void updateMaterialForQty(Long materialRrn, Double receiptQty, Double issueQty, Double adjustQty) {
        StringBuilder sql = new StringBuilder("UPDATE ITEM SET ");
        sql.append(" RECEIPT_QTY = NVL(RECEIPT_QTY, 0) + ?, ");
        sql.append(" ISSUE_QTY = NVL(ISSUE_QTY, 0) + ?, ");
        sql.append(" ADJUST_QTY = NVL(ADJUST_QTY, 0) + ? ");
        sql.append(" WHERE ITEM_RRN = ? ");
        jdbcTemplate.update(sql.toString(), receiptQty, issueQty, adjustQty, materialRrn);
        //同步新表中的数据
        String sqlNewTable = "UPDATE " + DataBaseNames.MATERIAL + " SET RECEIPT_QTY = NVL(RECEIPT_QTY, 0) + ?," +
                "ISSUE_QTY = NVL(ISSUE_QTY, 0) + ?, ADJUST_QTY = NVL(ADJUST_QTY, 0) + ? " + " WHERE SYS_RRN = ? ";
        jdbcTemplate.update(sqlNewTable, receiptQty, issueQty, adjustQty, materialRrn);
    }

}