WorkOrderDaoImpl.java

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

import com.mycim.framework.jdbc.BatchPreparedStatementSetter;
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.CollectionUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.server.workorder.dao.WorkOrderDao;
import com.mycim.valueobject.erp.workOrder.SdsWorkOrderInfo;
import com.mycim.valueobject.erp.workOrder.SdsWorkOrderMaterialInfo;
import com.mycim.valueobject.erp.workOrder.WorkOrderImpSourceWaferDb;
import com.mycim.valueobject.prp.WorkOrder;
import com.mycim.valueobject.prp.WorkOrderLine;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.stereotype.Repository;

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

@Repository
public class WorkOrderDaoImpl implements WorkOrderDao {

    private final JdbcTemplate jdbcTemplate;

    public WorkOrderDaoImpl(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public WorkOrder getWorkOrderById(String orderId) {
        String sql = "SELECT WORKORDER_RRN,WORKORDER_ID,PRODUCT_ID,PLANNED_YIELD,STATUS,COMMENTS,CREATE_USER," +
                "CUSTOMER,PLAN_TIME," + "WORKORDER_PRIORITY,ORDER_DIE_QTY,START_DAY,REQUIRE_DAY," +
                "DAY_DAY,DUE_DATE,CUSTOMER_ORDER,CUSTOMER_ORDER_NO,SHIPPED_QTY,WORKORDER_TYPE,ERP_CLIENT,ERP_FACTORY," +
                "START_QTY" +
                " FROM WORKORDER WHERE WORKORDER_ID=? ";
        return jdbcTemplate.queryForObjectWithNull(sql, new Object[]{orderId}, new RowMapper<WorkOrder>() {
            @Override
            public WorkOrder mapRow(ResultSet rs, int rowNum) throws SQLException {
                WorkOrder order = new WorkOrder();
                order.mapRow(rs, rowNum);
                return order;
            }
        });
    }

    @Override
    public void insertWorkOrder(WorkOrder workOrder) {

        String sql = "INSERT INTO WORKORDER (WORKORDER_RRN,WORKORDER_ID,PRODUCT_ID,PLANNED_YIELD,STATUS," +
                "COMMENTS,CREATE_USER," + " CUSTOMER,PLAN_TIME,WORKORDER_PRIORITY,ORDER_DIE_QTY," + "START_DAY," +
                "REQUIRE_DAY,DAY_DAY,DUE_DATE,CUSTOMER_ORDER,CUSTOMER_ORDER_NO,WORKORDER_TYPE,ERP_CLIENT," +
                "ERP_FACTORY)" +
                " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        Object[] args = {workOrder.getWorkorderRrn(), workOrder.getWorkorderId(), workOrder.getProductId(),
                workOrder.getPlannedYield(), workOrder.getStatus(), workOrder.getComments(),
                workOrder.getCreateUser(), workOrder.getCustomer(), workOrder.getPlanTime(),
                workOrder.getWorkorderPriority(), workOrder.getOrderDieQty(), workOrder.getStartDay(), workOrder.getRequireDay(), workOrder.getDayDay(), workOrder.getDueDate(), workOrder.getCustomerOrder(), workOrder.getCustomerOrderNo(), workOrder.getWorkorderType(), workOrder.getErpClient(), workOrder.getErpFactory()};
        jdbcTemplate.update(sql, args);

    }

    @Override
    public void updateWorkOrder(WorkOrder workOrder) {
        String sql = "UPDATE WORKORDER SET PLANNED_YIELD=?,STATUS=?,COMMENTS=?,CUSTOMER=?,PLAN_TIME=?," + "PRODUCT_ID" +
                "=?,WORKORDER_PRIORITY=?,ORDER_DIE_QTY=?," + "START_DAY=? ,REQUIRE_DAY=?,DAY_DAY=?,DUE_DATE=? WHERE " +
                "WORKORDER_RRN=?";
        Object[] args = {workOrder.getPlannedYield(), workOrder.getStatus(), workOrder.getComments(),
                workOrder.getCustomer(), workOrder.getPlanTime(), workOrder.getProductId(),
                workOrder.getWorkorderPriority(), workOrder.getOrderDieQty(), workOrder.getStartDay(),
                workOrder.getRequireDay(), workOrder.getDayDay(), workOrder.getDueDate(), workOrder.getWorkorderRrn()};
        jdbcTemplate.update(sql, args);
    }

    @Override
    public List<WorkOrder> getWorkOrderByIdLike(String orderId) {
        String sql = "SELECT WORKORDER_RRN,WORKORDER_ID,PRODUCT_ID,PLANNED_YIELD,STATUS,COMMENTS,CREATE_USER," +
                "CUSTOMER,PLAN_TIME,WORKORDER_PRIORITY,ORDER_DIE_QTY,START_DAY," +
                "REQUIRE_DAY,DAY_DAY,DUE_DATE,CUSTOMER_ORDER,CUSTOMER_ORDER_NO,SHIPPED_QTY,WORKORDER_TYPE,ERP_CLIENT," +
                "ERP_FACTORY,START_QTY " +
                "FROM" +
                "  WORKORDER WHERE 1=1 ";
        Object[] args = new Object[]{};
        if (StringUtils.isNotEmpty(orderId)) {
            sql = sql + "  AND WORKORDER_ID LIKE ? ";
            args = new Object[]{"%" + orderId + "%"};
        }
        return jdbcTemplate.query(sql, args, new RowMapper<WorkOrder>() {
            @Override
            public WorkOrder mapRow(ResultSet rs, int rowNum) throws SQLException {
                WorkOrder order = new WorkOrder();
                order.mapRow(rs, rowNum);
                return order;
            }
        });
    }

    @Override
    public Page getWorkOrderImpDBByOrderRrn(Page page, long orderRrn) {
        String sql =
                "SELECT * FROM WORKORDER_IMPO_WAFER WHERE WORKORDER_RRN=? ORDER BY CARRIER_RRN," + "SOURCE_WAFER_ID";
        return jdbcTemplate.queryForPage(page, sql, new Object[]{orderRrn},
                                         new BeanPropertyRowMapper<>(WorkOrderImpSourceWaferDb.class));
    }

    @Override
    public WorkOrderImpSourceWaferDb getImportWkByImpRrn(String uniqueNum) {
        String sql = "SELECT * FROM WORKORDER_IMPO_WAFER WHERE UNIQUE_NUM=?";
        return jdbcTemplate.queryForObjectWithNull(sql, new Object[]{uniqueNum},
                                                   new BeanPropertyRowMapper<>(WorkOrderImpSourceWaferDb.class));
    }

    @Override
    public void workOrderImpCreateLotSuccess(List<WorkOrderImpSourceWaferDb> list) {
        String sql = "UPDATE WORKORDER_IMPO_WAFER SET CARRIER_RRN=?,CARRIER_ID=?,LOT_ID=?,LOT_RRN=?," + "STATUS=? " +
                "WHERE UNIQUE_NUM=?";

        jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                ps.setLong(1, list.get(i).getCarrierRrn());
                ps.setString(2, list.get(i).getCarrierId());
                ps.setString(3, list.get(i).getLotId());
                ps.setLong(4, list.get(i).getLotRrn());
                ps.setString(5, WorkOrderImpSourceWaferDb.COMPLETED);
                ps.setString(6, list.get(i).getUniqueNum());
            }

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

    @Override
    public WorkOrder getWorkOrderByRrn(Long workOrderRrn) {
        String sql = "SELECT WORKORDER_RRN,WORKORDER_ID,PRODUCT_ID,PLANNED_YIELD,STATUS,COMMENTS,CREATE_USER," +
                "CUSTOMER,PLAN_TIME,WORKORDER_PRIORITY,ORDER_DIE_QTY,START_DAY,REQUIRE_DAY," +
                "DAY_DAY,DUE_DATE,CUSTOMER_ORDER,CUSTOMER_ORDER_NO,SHIPPED_QTY,WORKORDER_TYPE,ERP_CLIENT,ERP_FACTORY,START_QTY FROM" +
                " WORKORDER WHERE WORKORDER_RRN=? ";
        return jdbcTemplate.queryForObjectWithNull(sql, new Object[]{workOrderRrn}, new RowMapper<WorkOrder>() {
            @Override
            public WorkOrder mapRow(ResultSet rs, int rowNum) throws SQLException {
                WorkOrder order = new WorkOrder();
                order.mapRow(rs, rowNum);
                return order;
            }
        });
    }

    @Override
    public List<WorkOrder> getWorkOrderByCondition(Map<String, Object> condition) {
        StringBuffer sql = new StringBuffer(
                "SELECT WORKORDER_RRN,WORKORDER_ID,PRODUCT_ID,PLANNED_YIELD,STATUS,COMMENTS,CREATE_USER," +
                        "CUSTOMER," + "PLAN_TIME,WORKORDER_PRIORITY,ORDER_DIE_QTY,START_DAY," + "REQUIRE_DAY,DAY_DAY," +
                        "DUE_DATE,CUSTOMER_ORDER,CUSTOMER_ORDER_NO,SHIPPED_QTY,WORKORDER_TYPE,ERP_CLIENT,ERP_FACTORY,START_QTY " +
                        "FROM  WORKORDER WHERE 1=1 ");
        List<Object> args = new ArrayList<Object>();
        if (StringUtils.isNotEmpty(MapUtils.getString(condition, "workOrderId"))) {
            sql.append("  AND WORKORDER_ID = ? ");
            args.add(MapUtils.getString(condition, "workOrderId"));
        }
        if (StringUtils.isNotEmpty(MapUtils.getString(condition, "status"))) {
            sql.append("  AND STATUS = ? ");
            args.add(MapUtils.getString(condition, "status"));
        }
        if (StringUtils.isNotEmpty(MapUtils.getString(condition, "startDay"))) {
            sql.append("  AND START_DAY > ? ");
            args.add(condition.get("startDay"));
        }
        sql.append("  ORDER BY WORKORDER_RRN DESC ");
        return jdbcTemplate.query(sql.toString(), args.toArray(), new RowMapper<WorkOrder>() {
            @Override
            public WorkOrder mapRow(ResultSet rs, int rowNum) throws SQLException {
                WorkOrder order = new WorkOrder();
                order.mapRow(rs, rowNum);
                return order;
            }
        });
    }

    @Override
    public int getCompleteDieQtyByWorkOrderRrn(Long workOrderRrn) {
        String sql = "SELECT SUM(PU.SOURCE_QUANTITY) FROM ERP_PACKAGE P JOIN ERP_PACKAGE_UNIT PU ON P" + ".TRANS_RRN" +
                "=PU.TRANS_RRN" + " JOIN WORKORDER W ON W.WORKORDER_ID=P.WORK_ORDER_ID WHERE W.WORKORDER_RRN=?";
        return jdbcTemplate.queryForObject(sql, new Object[]{workOrderRrn}, Integer.class);
    }

    @Override
    public void completeWorkOrder(Long workOrderRrn) {
        String sql = "UPDATE WORKORDER SET STATUS=? WHERE WORKORDER_RRN=?";
        Object[] args = {WorkOrderImpSourceWaferDb.COMPLETED, workOrderRrn};
        jdbcTemplate.update(sql, args);
    }

    @Override
    public List<String> getMesProductIdBySdsProductId(String sdsProductId) {
        String sql = "SELECT T.MES_PRODUCT_ID FROM T_SDS_MES_PRODUCT_MAPPING T WHERE T.SDS_PRODUCT_ID = ? ";
        return jdbcTemplate.query(sql, new Object[]{sdsProductId}, String.class);
    }

    @Override
    public boolean checkMesProSdsProMapping(String productId, String sdsProductId) {
        String sql = "SELECT count(*) FROM t_sds_mes_product_mapping WHERE mes_product_id = ? and " + "sds_product_id" +
                "=?";
        int count = jdbcTemplate.queryForObjectWithNull(sql, new Object[]{productId, sdsProductId}, int.class);
        if (count > 0) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public void storeWorkOrderImpDBList(List<WorkOrderImpSourceWaferDb> dataList) {
        String sql = "INSERT INTO WORKORDER_IMPO_WAFER " + " (UNIQUE_NUM,WORKORDER_RRN,CARRIER_RRN,CARRIER_ID,LOT_ID," +
                "LOT_RRN,MATERIAL_ID," + "	MATERIAL_LOT_NUM,MATERIAL_LOT_BIN,SOURCE_WAFER_ID," + " " +
                "SOURCE_WAFER_DIE_QTY,STATUS,sds_product)" + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";

        jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                ps.setString(1, dataList.get(i).getUniqueNum());
                ps.setLong(2, dataList.get(i).getWorkorderRrn());
                ps.setLong(3, dataList.get(i).getCarrierRrn());
                ps.setString(4, dataList.get(i).getCarrierId());
                ps.setString(5, dataList.get(i).getLotId());
                ps.setLong(6, dataList.get(i).getLotRrn());
                ps.setString(7, dataList.get(i).getMaterialId());
                ps.setString(8, dataList.get(i).getMaterialLotNum());
                ps.setString(9, dataList.get(i).getMaterialLotBin());
                ps.setString(10, dataList.get(i).getSourceWaferId());
                ps.setInt(11, dataList.get(i).getSourceWaferDieQty());
                ps.setString(12, dataList.get(i).getStatus());
                ps.setString(13, dataList.get(i).getSdsProduct());
            }

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

    }

    @Override
    public WorkOrderImpSourceWaferDb getWorkOrderImpDBByRrn(String importRrn) {
        String sql = "SELECT * FROM WORKORDER_IMPO_WAFER WHERE UNIQUE_NUM=?";
        Object[] args = new Object[]{importRrn};
        return jdbcTemplate.queryForObjectWithNull(sql, args, new BeanPropertyRowMapper<WorkOrderImpSourceWaferDb>(
                WorkOrderImpSourceWaferDb.class));
    }

    @Override
    public WorkOrderImpSourceWaferDb getWorkOrderImp(String lotId) {
        String sql = "SELECT * FROM WORKORDER_IMPO WHERE SOURCE_LOT_ID=?";
        Object[] args = new Object[]{lotId};
        //用list返回第一个,暂时先这样防止多个结果
        List<WorkOrderImpSourceWaferDb> list = jdbcTemplate.query(sql, args,
                                                                  new BeanPropertyRowMapper<WorkOrderImpSourceWaferDb>(
                                                                          WorkOrderImpSourceWaferDb.class));
        if (list == null || list.size() == 0) {
            return null;
        } else {
            return list.get(0);
        }

    }

    @Override
    public List<WorkOrderImpSourceWaferDb> getWorkOrderImpWaferByOrderRrn(long workOrderRrn) {
        String sql = "SELECT * FROM WORKORDER_IMPO_WAFER WHERE WORKORDER_RRN=?";
        Object[] args = new Object[]{workOrderRrn};
        return jdbcTemplate.query(sql, args, new BeanPropertyRowMapper<WorkOrderImpSourceWaferDb>(
                WorkOrderImpSourceWaferDb.class));
    }

    @Override
    public void insertProductMapping(String productId, String sdsProductId, String userId) {
        StringBuffer sql = new StringBuffer();
        sql.append(" insert into t_sds_mes_product_mapping  		     				");
        sql.append("   (sds_product_id, mes_product_id, create_time, create_user)   ");
        sql.append(" values                                                         ");
        sql.append("   (?, ?, sysdate, ?)                                           ");
        jdbcTemplate.update(sql.toString(), new Object[]{sdsProductId, productId, userId});
    }

    @Override
    public void updateProductMapping(String productId, String sdsProductId, String userId) {
        StringBuffer sql = new StringBuffer();
        sql.append(" update t_sds_mes_product_mapping 										");
        sql.append("    set sds_product_id = ?, update_time = sysdate, update_user = ?    ");
        sql.append("  where mes_product_id = ?                                                ");
        jdbcTemplate.update(sql.toString(), new Object[]{sdsProductId, userId, productId});
    }

    @Override
    public List<SdsWorkOrderInfo> getSdsWorkOrderInfoByWorkOrderId(String workorderId) {
        String sql = "SELECT * FROM T_SDS_WORKORDER_INFO WHERE RECEIVE_STATUS = '0' ";
        if (StringUtils.isNotBlank(workorderId)) {
            sql += " AND  WORKORDER_ID = '" + workorderId + "'";
        }
        sql += " order by WORKORDER_ID ";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<SdsWorkOrderInfo>(SdsWorkOrderInfo.class));
    }

    @Override
    public List<SdsWorkOrderMaterialInfo> getSdsWorkOrderMaterialInfoByWorkOrderRrn(long workorderRrn) {
        String sql = "SELECT * FROM T_SDS_WORKORDER_MATERIAL_INFO T WHERE T.WORKORDER_RRN = ? ";
        return jdbcTemplate.query(sql, new Object[]{workorderRrn},
                                  new BeanPropertyRowMapper<SdsWorkOrderMaterialInfo>(SdsWorkOrderMaterialInfo.class));
    }

    @Override
    public void updateProductMappingStatus(long workorderRrn, String receiveStatus) {
        String sql = " UPDATE T_SDS_WORKORDER_INFO  SET RECEIVE_STATUS = ? WHERE WORKORDER_RRN = ? ";
        jdbcTemplate.update(sql, new Object[]{receiveStatus, workorderRrn});
    }

    @Override
    public List<Map> getSdsMesMappingInfoByProductId(String productId) {
        StringBuffer sql = new StringBuffer();
        sql.append(" select t.sds_product_id,               ");
        sql.append("        t.mes_product_id,               ");
        sql.append("        t.create_user,                  ");
        sql.append("        t.create_time,                  ");
        sql.append("        t.update_user,                  ");
        sql.append("        t.update_time                   ");
        sql.append("   from t_sds_mes_product_mapping t     ");
        if (StringUtils.isNotBlank(productId)) {
            sql.append("  where t.mes_product_id = '" + productId + "'");
        }

        return jdbcTemplate.query(sql.toString(), new Object[]{}, new RowMapper() {

            @Override
            public Map mapRow(ResultSet rs, int rowNum) throws SQLException {
                Map<String, Object> dataMap = new HashMap<>();
                dataMap.put("productId", rs.getString("mes_product_id"));
                dataMap.put("sdsProductId", rs.getString("sds_product_id"));
                dataMap.put("createUser", rs.getString("create_user"));
                dataMap.put("createTime", rs.getTimestamp("create_time"));
                dataMap.put("updateUser", rs.getString("update_user"));
                dataMap.put("updateTime", rs.getTimestamp("update_time"));
                return dataMap;
            }
        });
    }

    @Override
    public List<String> getWorkOrderImpWaferByWaferId(List<String> collect) {
        if (CollectionUtils.isEmpty(collect)) {
            return new ArrayList<String>();
        }
        String sql = "SELECT source_wafer_id FROM WORKORDER_IMPO_WAFER WHERE source_wafer_id " + "in (:ids)";
        Map<String, Object> regs = new HashMap<String, Object>();
        regs.put("ids", collect);
        return jdbcTemplate.query(sql, regs, String.class);
    }

    @Override
    public int getAreadySdsProReceiveCount(String deleteProductMapping) {
        String sql = "SELECT count(*) FROM workorder_impo_wafer WHERE sds_product=?";
        Object[] args = new Object[]{deleteProductMapping};
        return jdbcTemplate.queryForObjectWithNull(sql, args, int.class);
    }

    @Override
    public void deleteProductMapping(String mesproduct, String sdsproduct) {
        String sql = "DELETE FROM t_sds_mes_product_mapping WHERE mes_product_id=? and sds_product_id=?";
        Object[] args = new Object[]{mesproduct, sdsproduct};
        jdbcTemplate.update(sql, args);
    }

    @Override
    public List<SdsWorkOrderMaterialInfo> getSdsMaterialInfoByWorkOrderId(long workorderRrn) {
        String sql = "SELECT * from t_sds_workorder_material_info WHERE workorder_rrn=?";
        return jdbcTemplate
                .query(sql, new Object[]{workorderRrn}, new BeanPropertyRowMapper(SdsWorkOrderMaterialInfo.class));
    }

    @Override
    public SdsWorkOrderInfo getNotReceiveSdsWorkOrderByWorkOrderRrn(long sdsWorkorderRrn) {
        String sql = "SELECT * FROM T_SDS_WORKORDER_INFO WHERE RECEIVE_STATUS = '0' and workorder_rrn=?";
        return jdbcTemplate.queryForObjectWithNull(sql, new Object[]{sdsWorkorderRrn},
                                                   new BeanPropertyRowMapper<SdsWorkOrderInfo>(SdsWorkOrderInfo.class));
    }

    @Override
    public List<SdsWorkOrderInfo> getSdsWorkOrderTmpById(String workorderId) {
        String sql = "SELECT * FROM T_SDS_WORKORDER_INFO WHERE workorder_id=?";
        return jdbcTemplate.query(sql, new Object[]{workorderId},
                                  new BeanPropertyRowMapper<SdsWorkOrderInfo>(SdsWorkOrderInfo.class));
    }

    @Override
    public void insertWorkOrderLines(List<WorkOrderLine> workOrderLines) {

        String sql = "INSERT INTO WORKORDER_LINE (WORKORDER_LINE_RRN, WORKORDER_RRN ," +
                " MATERIAL_ID, MATERIAL_TYPE , REQUIRE_QTY) VALUES(?,?,?,?,?)";

        List<Object[]> args = workOrderLines.stream().map(workOrderLine -> {
            Object[] arg = {workOrderLine.getWorkorderLineRrn(), workOrderLine.getWorkorderRrn(),
                    workOrderLine.getMaterialId(), workOrderLine.getMaterialType(), workOrderLine.getRequireQty()};

            return arg;
        }).collect(Collectors.toList());


        jdbcTemplate.batchUpdate(sql, args);

    }

    @Override
    public void updateShipQty4WorkOrder(Long workorderRrn, Integer shipQty) {
        String sql = "UPDATE WORKORDER SET SHIPPED_QTY = ? WHERE WORKORDER_RRN=?";
        Object[] args = {shipQty, workorderRrn};
        jdbcTemplate.update(sql, args);
    }

    @Override
    public void updateStartQty4WorkOrder(Long workorderRrn, Integer startQty) {
        String sql = "UPDATE WORKORDER SET START_QTY = ? WHERE WORKORDER_RRN=?";
        Object[] args = {startQty, workorderRrn};
        jdbcTemplate.update(sql, args);
    }

}