ViewLotBuildTask.java

package com.mycim.webapp.actions.operation.query.threadtask;

import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.valueobject.wip.Lot;
import com.mycim.webapp.actions.WipSetupAction;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;

public class ViewLotBuildTask extends WipSetupAction implements Callable<Map<String,Object>> {
    final private Map<String,Object> lot;
    final private Map<String,Object> params;

    public ViewLotBuildTask(Map<String, Object> lot,
                            Map<String, Object> params) {
        this.lot = lot;
        this.params = params;
    }

    @Override
    public Map<String, Object> call(){
        Long lotRrn = MapUtils.getLongValue(lot, "lotRrn");
        String recipeString = MapUtils.getString(lot, "contextRecipeId", StringUtils.EMPTY);

        if (StringUtils.isBlank(recipeString)) {
            lotService.insertLotRecipe(lotRrn, StringUtils.EMPTY);
        } else {
            lotService.insertLotRecipe(lotRrn, recipeString);
        }

        Map<String, Object> jsonObject = new HashMap<>();
        jsonObject.put("batchId", lot.get("batchId"));
        jsonObject.put("LotRRN", lot.get("lotRrn"));// 批次RRN
        jsonObject.put("LotID", lot.get("lotId"));// 批次号
        jsonObject.put("CarrierID", lot.get("carrierId"));// 晶舟号
        jsonObject.put("LotCategory", lot.get("lotType"));// 批次类型
        jsonObject.put("LotPiority", MapUtils.getStringCheckNull(lot, "hotFalg_priority"));// 优先级
        jsonObject.put("Qty1", lot.get("qty1"));// 数量
        jsonObject.put("ProductID", lot.get("productId"));// 产品号
        jsonObject.put("StageID", MapUtils.getStringCheckNull(lot, "contextStageId"));
        jsonObject.put("RouteID", lot.get("routeId"));// 路径号
        jsonObject.put("RouteDesc", MapUtils.getStringCheckNull(lot, "routeDesc"));// 路径描述
        jsonObject.put("OperationID", lot.get("operationId"));// 步骤号
        jsonObject.put("operationDesc", MapUtils.getStringCheckNull(lot, "contextOperationDesc"));// 步骤描述

        jsonObject.put("RecipeID", MapUtils.getStringCheckNull(lot, "recipeId"));// 工艺菜单号

        // update by pinyan.song 使用recipeId替换掉
        //            String recipePhysicalId = MapUtils.getStringCheckNull(lot, "recipePhysicalId");
        String recipePhysicalId = MapUtils.getStringCheckNull(lot, "recipeId");
        jsonObject.put("physicalRecipeID", StringUtils.isEmpty(recipePhysicalId) ? "" : recipePhysicalId);

        jsonObject.put("documentFile", MapUtils.getStringCheckNull(lot, "recipeDocFile"));
        jsonObject.put("documentFileCompulsorydisplay",
                       MapUtils.getStringCheckNull(lot, "recipeDocFileCompulsorydisplay"));
        jsonObject.put("RecipePara", lot.get("recipeParam"));// 工艺规格

        jsonObject.put("QueueTime", lot.get("queueTimestamp"));// 等待时间
        jsonObject.put("equipRRN", lot.get("equipmentRrn"));
        jsonObject.put("pollutionLevel", lot.get("pollutionLevel"));// 污染等级
            /*
            String maxQTime = MapUtils.getStringCheckNull(lot, "operationMaxQueueTime");
            if (StringUtils.isNotBlank(maxQTime) && !StringUtils.isEqual(maxQTime, "0")) {
                // 剩余时间=最大等待时间-等待时间
                int maxMinutesTime  = DateUtils.getMinutesTime(maxQTime);
                int waitMinutesTime = Integer.parseInt(lot.get("queueTimestamp").toString());
                jsonObject.put("timeLimit", maxMinutesTime - waitMinutesTime);
            }// 剩余时间
             */
        String timeLimitStr = MapUtils.getString(lot, "qTime");
        double timeLimitDouble = StringUtils.isBlank(timeLimitStr) ? 0 : Double
                .parseDouble(MapUtils.getString(lot, "qTime"));
        jsonObject.put("timeLimit", timeLimitStr);
        jsonObject.put("statusFlag", MapUtils.getString(lot, "lotStatus"));
        if (timeLimitStr != null && timeLimitStr.substring(0, 1).equals(".")) {
            timeLimitStr = "0" + timeLimitStr;
            jsonObject.put("timeLimit", timeLimitStr);
        } else if (timeLimitStr != null && timeLimitStr.length() > 2 && timeLimitStr.substring(0, 1).equals("-") &&
                timeLimitStr.substring(1, 2).equals(".")) {
            timeLimitStr = timeLimitStr.substring(0, 1) + "0" + timeLimitStr.substring(1, timeLimitStr.length());
            jsonObject.put("timeLimit", timeLimitStr);
        }
        Lot realLot = lotQueryService.getLot(MapUtils.getLongValue(lot, "lotRrn"));
        Map minTime = wipCheckService.getLotMinTimeForQueueTime(realLot);
        if (StringUtils.isNotEmpty(MapUtils.getString(minTime, "MIN_TIME"))) {
            jsonObject.put("timeLimit", MapUtils.getString(minTime, "MIN_TIME"));
            jsonObject.put("statusFlag", "QTIME");
            if (StringUtils.equalsIgnoreCase(MapUtils.getString(lot, "lotStatus"), "HOLD")) {
                jsonObject.put("statusFlag", "QTIMEHOLD");
            }
        }
        if (timeLimitDouble != -10000) {
            jsonObject.put("statusFlag", "QTIME");
            if (StringUtils.equalsIgnoreCase(MapUtils.getString(lot, "lotStatus"), "HOLD")) {
                jsonObject.put("statusFlag", "QTIMEHOLD");
            }
        }
        jsonObject.put("jobRrn", lot.get("jobRrn"));
        jsonObject.put("LotStatus", lot.get("lotStatus"));
        jsonObject.put("flowSeq", MapUtils.getStringCheckNull(lot, "contextFlowSeq"));
        jsonObject.put("routeSeq", MapUtils.getStringCheckNull(lot, "routeSeq"));
        jsonObject.put("operationSeq", MapUtils.getStringCheckNull(lot, "operationSeq"));
        jsonObject.put("operationRrn", lot.get("operationRrn"));
        jsonObject.put("workArea", MapUtils.getStringCheckNull(lot, "operationWorkArea"));
        String lotDoJobFlag = "YES";
        String constrainFlag = "NO";
        String constrainMsg = "";
        // if (StringUtils.isNotBlank(equipmentId)) {
        //     Lot lotTemp = buildLotFromMap(lot);
        //     // start: 检查批次在当前设备是否有constrain
        //     ErrorMsg errorMsg = constrainService.checkLotConstrain(constrainMap, equipmentId, lotTemp);
        //     if (errorMsg.getError()) {
        //         constrainFlag = "YES";
        //         constrainMsg = errorMsg.getErrorMsg();
        //     }
        //     // end: 检查批次在当前设备是否有constrain
        //
        //     // start:检测批次是否有可用的recipe
        //     String recipeId = MapUtils.getString(lot, "recipeId");
        //     boolean recipeFAvailableFlag = false;
        //     if (StringUtils.isNotBlank(recipeId)) {
        //         recipeFAvailableFlag =checkEqptRecipeAvailable(equipmentRecipes, recipeId);
        //     }
        //     jsonObject.put("eqptRecipeAvailableFlag", recipeFAvailableFlag);
        //     // end:检测批次是否有可用的recipe
        //
        //     // 检查批次在当前设备是否可以do job
        //     if (errorMsg.getError()) {
        //         lotDoJobFlag = "NO";
        //     } else {
        //         if (StringUtils.isNotBlank(wipCheckService
        //                                            .checkHasAvailableDispatchRecipe(lotTemp, equipmentRrn, recipeId,
        //                                                                             lotTemp.getQty1()))) {
        //             lotDoJobFlag = "NO";
        //         } else {
        //             if (StringUtils.isNotBlank(wipCheckService.checkAvailableEquipment(lotTemp, equipmentRrn,
        //                                                                                user.getInstanceRrn()))) {
        //                 lotDoJobFlag = "NO";
        //             }
        //         }
        //     }
        // }
        jsonObject.put("lotDoJobFlag", lotDoJobFlag);
        jsonObject.put("constrainFlag", constrainFlag);
        jsonObject.put("constrainMsg", constrainMsg);

        jsonObject.put("pilot", MapUtils.getStringCheckNull(lot, "piLot"));

        String sapphire = MapUtils.getString(params, "Sapphire");
        if (StringUtils.isNotBlank(sapphire) && sapphire.equalsIgnoreCase("isSapphire")) {
            jsonObject.put("isSapphire", "Y");
        } else {
            jsonObject.put("isSapphire", "N");
        }
        jsonObject.put("rcFlag", MapUtils.getStringCheckNull(lot, "rcFlag"));
        jsonObject.put("rcLotId", MapUtils.getStringCheckNull(lot, "rcLotId"));
        return jsonObject;
    }
    private Lot buildLotFromMap(Map<String, Object> lotMap) {
        Lot lotTemp = new Lot();
        //        BeanUtils.copyMapToBean(lotTemp, lotMap);
        lotTemp.setLotRrn(MapUtils.getLongValue(lotMap, "lotRrn"));
        lotTemp.setLotId(MapUtils.getStringCheckNull(lotMap, "lotId"));
        lotTemp.setProductId(MapUtils.getStringCheckNull(lotMap, "productId"));
        lotTemp.setProcessId(MapUtils.getStringCheckNull(lotMap, "processId"));
        lotTemp.setRouteId(MapUtils.getStringCheckNull(lotMap, "routeId"));
        lotTemp.setOperationId(MapUtils.getStringCheckNull(lotMap, "operationId"));
        lotTemp.setRecipeId(MapUtils.getStringCheckNull(lotMap, "recipeId"));
        lotTemp.setStageId(MapUtils.getStringCheckNull(lotMap, "contextStageId"));
        lotTemp.setCustomerId(MapUtils.getStringCheckNull(lotMap, "customerId"));

        lotTemp.setQty1(MapUtils.getDoubleValue(lotMap, "qty1"));
        lotTemp.setQty2(MapUtils.getDoubleValue(lotMap, "qty2"));
        lotTemp.setCreateCategory(MapUtils.getStringCheckNull(lotMap, "createCategory"));
        lotTemp.setFacilityRrn(MapUtils.getLongValue(lotMap, "facilityRrn"));
        lotTemp.setRouteSeq(MapUtils.getStringCheckNull(lotMap, "routeSeq"));
        lotTemp.setOperationSeq(MapUtils.getStringCheckNull(lotMap, "operationSeq"));
        lotTemp.setProductRrn(MapUtils.getLongValue(lotMap, "productRrn"));
        lotTemp.setProcessRrn(MapUtils.getLongValue(lotMap, "processRrn"));
        lotTemp.setRouteRrn(MapUtils.getLongValue(lotMap, "routeRrn"));
        lotTemp.setOperationRrn(MapUtils.getLongValue(lotMap, "operationRrn"));
        lotTemp.setRecipeRrn(MapUtils.getLongValue(lotMap, "recipeRrn"));
        lotTemp.setExecutionRrn(MapUtils.getLongValue(lotMap, "executionRrn"));
        lotTemp.setPrevOperationRrn(MapUtils.getLongValue(lotMap, "prevOperationRrn"));
        return lotTemp;
    }
}