BatchHoldLotEditAction.java

package com.mycim.webapp.actions.lot.batchhold;

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.threadlocal.LocalContext;
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.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.consts.SessionNames;
import com.mycim.valueobject.prp.ProcessPlanning;
import com.mycim.valueobject.prp.ProcessVersion;
import com.mycim.valueobject.wip.Lot;
import com.mycim.valueobject.wip.LotStatus;
import com.mycim.valueobject.wip.TransReason;
import com.mycim.webapp.WebUtils;
import com.mycim.webapp.actions.WipSetupAction;
import com.mycim.webapp.forms.lot.HoldReleaseLotInfoForm;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author liuji.li
 * @version 6.0.0
 * @date 2019/11/13
 **/
public class BatchHoldLotEditAction extends WipSetupAction {

    @Override
    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                              HttpServletResponse response) throws Exception {
        request.setAttribute(SessionNames.LOTS_LIST_KEY, new ArrayList<>());
        return mapping.getInputForward();
    }

    public Map<String, Object> queryLots(Map map) throws ParseException {
        long facilityRrn = LocalContext.getFacilityRrn();
        Map actionMap = new HashMap();
        String productId = MapUtils.getString(map, "productId");
        if (StringUtils.isNotEmptyTrim(productId)) {
            productId = productId.trim();
            long productRrn = this.getInstanceRrn(productId, facilityRrn, ObjectList.PRODUCT_KEY);
            Assert.isFalse(productRrn <= 0,
                           Errors.create().key(MessageIdList.PRODUCT_PRODUCT_MISSING).content("产品不存在!").build());
            actionMap.put("productRrn", new Long(productRrn));
        }
        String processId = MapUtils.getString(map, "processId");
        if (StringUtils.isNotEmptyTrim(processId)) {
            processId = processId.trim();
            long processRrn = this.getInstanceRrn(processId, this.getNamedSpace("WFL", facilityRrn), "WFL", "ROUTE");
            Assert.isFalse(processRrn <= 0,
                           Errors.create().key(MessageIdList.PROCESS_PROCESS_MISSING).content("流程不存在!").build());
            actionMap.put("processRrn", new Long(processRrn));
        }
        String routeId = MapUtils.getString(map, "routeId");
        if (StringUtils.isNotEmptyTrim(routeId)) {
            routeId = routeId.trim();
            long routeRrn = this.getInstanceRrn(routeId, this.getNamedSpace("WFL", facilityRrn), "WFL", "ROUTE");
            Assert.isFalse(routeRrn <= 0,
                           Errors.create().key(MessageIdList.ROUTE_ROUTE_MISSING).content("路径号不存在!").build());
            actionMap.put("routeRrn", new Long(routeRrn));
        }
        String operationId = MapUtils.getString(map, "operationId");
        if (StringUtils.isNotEmptyTrim(operationId)) {
            operationId = operationId.trim();
            long operationRrn = this
                    .getInstanceRrn(operationId, this.getNamedSpace("OPERATION", facilityRrn), "OPERATION");
            Assert.isFalse(operationRrn <= 0,
                           Errors.create().key(MessageIdList.INSTRUCTIONEDIT_OPERATION_MISSING).content("步骤号不存在!")
                                 .build());
            actionMap.put("operationRrn", new Long(operationRrn));
        }

        String equipmentId = MapUtils.getString(map, "eqpId");
        if (StringUtils.isNotEmptyTrim(equipmentId)) {
            equipmentId = equipmentId.trim();
            long equipmentRrn = this
                    .getInstanceRrn(equipmentId, this.getNamedSpace("ENTITY", facilityRrn), "ENTITY","MAINEQPT");
            Assert.isFalse(equipmentRrn <= 0,
                           Errors.create().key(MessageIdList.INSTRUCTIONEDIT_EQPT_MISSING).content("设备不存在!")
                                 .build());
            actionMap.put("equipmentId", equipmentId);
        }

        // 处理时间
        String dueDateS = MapUtils.getString(map, "dueDateS");
        if(StringUtils.isNotEmptyTrim(dueDateS)){
            actionMap.put("dueDateS", dueDateS);
        }
        String dueDateE = MapUtils.getString(map, "dueDateE");
        if(StringUtils.isNotEmptyTrim(dueDateE)){
            SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
            Date _dueDateE = format.parse(dueDateE);
            Calendar c = Calendar.getInstance();
            c.setTime(_dueDateE);
            c.add(Calendar.DAY_OF_MONTH, 1);
            _dueDateE = c.getTime();
            actionMap.put("dueDateE", format.format(_dueDateE));
        }

        Assert.isTrue((StringUtils.isEmpty(equipmentId)&&StringUtils.isEmpty(dueDateS)&&StringUtils.isEmpty(dueDateE))||
                               (StringUtils.isNotEmptyTrim(equipmentId)&&StringUtils.isNotEmptyTrim(dueDateS)&&StringUtils.isNotEmptyTrim(dueDateE)),
                       Errors.create().key(MessageIdList.EQPT_AND_DUEDATE).content("设备和日期必须全选或全不选!")
                             .build());

        Assert.isFalse(MapUtils.isEmpty(actionMap),
                       Errors.create().key(MessageIdList.BATCHHOLDLOT_MUST_ITEM).content("Must select one Item!")
                             .build());

        List<Map> lotsList = lotQueryService.getLotsList(actionMap);
        Map<String, Object> result = new HashMap();
        result.put("lots", lotsList);
        return result;
    }

    public Map<String, Object> batchHoldLotInfo(ActionMapping mapping, HttpServletRequest request, Map map) {
        List<Map> holdLots = (List<Map>) map.get("dataArray");
        Assert.isFalse(holdLots.size() <= 0,
                       Errors.create().key(MessageIdList.BATCHHOLDLOT_SELECT_LOT).content("Please select lot id!")
                             .build());
        String user = LocalContext.getUserId();
        List<Map> batchHoldInfo = new ArrayList<>();
        // List<Object[]> argsList = new ArrayList<>();
        long batchRrn = lotQueryService.getBatchRrn();
        String batchId = StringUtils.toString(batchRrn);

        String userName = MapUtils.getString(map, "userId");
        String reasonCode = MapUtils.getString(map, "reasonCode");
        checkRCHoldCode(reasonCode);
        String reason =
                MapUtils.getString(map, "department") + " " + userName + " Reason:" + "Holdcode is " + reasonCode +
                        ". " + MapUtils.getString(map, "reason");
        TransReason transReason = new TransReason();
        transReason.setReasonCode(reasonCode);
        transReason.setReason(reason);
        transReason.setReasonCategory("BATCHHOLD");
        transReason.setResponsibility(user);
        for (Map lots : holdLots) {
            long lotRrn = MapUtils.getLongValue(lots, "lotRrn");
            Lot lot = lotQueryService.getLot(lotRrn);
            transReason.setTransQty1(lot.getQty1());
            transReason.setTransQty2(lot.getQty2());
            Map holdInfoMap = new HashMap();
            //单步跟踪 323 batch hold 查询的时候就只有 waiting 条件 这里只有 WAITING 为合法状态
            if (LotStatus.isWaiting(lot.getLotStatus())) {
                holdInfoMap.put("lotRrn", lotRrn);
                holdInfoMap.put("lotId", lot.getLotId());
                holdInfoMap.put("lotStatus", lot.getLotStatus());
                holdInfoMap.put("transPerformedBy", user);
                holdInfoMap.put("holdBy", LocalContext.getUserRrn());
                holdInfoMap.put("transComments", MapUtils.getString(map, "reason"));
                holdInfoMap.put("holdcode", reasonCode);
                holdInfoMap.put("transReason", transReason);
                holdInfoMap.put("holdReason", reason);
                holdInfoMap.put("batchId", batchId);
                // List<Lot> lockLots = new ArrayList<>();
                // lockLots.add(lot);
                // checkAndCreateLotsTransLock(LocalContext.getUserRrn(), TransactionNames.LOCK_HOLD_LOT, lockLots,
                //                             "Batch hold lot in BatchHoldLoAction by: " + LocalContext.getUserId());
                lotService.batchHoldLot(holdInfoMap);
                holdInfoMap.put("stageId", lot.getStageId());
                holdInfoMap.put("operationDesc", lot.getOperationDesc());
                holdInfoMap.put("operation", lot.getOperationId());
                holdInfoMap.put("recipeId", lot.getRecipeId());
            }
            if(MapUtils.isNotEmpty(holdInfoMap)){
                batchHoldInfo.add(holdInfoMap);
            }
        }

        Map<String, Object> result = new HashMap();
        result.put("holdInfo", WebUtils.getCacheObj2String(batchHoldInfo));
        return result;
    }

    public ActionForward viewHoldInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                                      HttpServletResponse response) {
        HoldReleaseLotInfoForm thForm = (HoldReleaseLotInfoForm) form;
        List<Map> batchHoldInfo = (List<Map>) WebUtils.getCacheString2Obj(thForm.getCacheLot());
        request.setAttribute(SessionNames.BATCH_HOLD_INFO_KEY, batchHoldInfo);
        return mapping.findForward("viewHoldInfo");
    }

    public List<Map<String, String>> getProcessVersionByProcess(Map map) throws Exception {
        List<Map<String, String>> result = new ArrayList<>();
        String processId = MapUtils.getString(map, "processId");
        long processRrn = getInstanceRrn(processId, LocalContext.getFacilityRrn(), ObjectList.WFL_KEY);
        if (processRrn > 0) {
            ProcessPlanning processPlanning = new ProcessPlanning(processRrn);
            List<ProcessVersion> processVersions = prpService.getProcessVersions(processPlanning);
            Assert.isFalse(CollectionUtils.isEmpty(processVersions),
                           Errors.create().key(MessageIdList.PROCESS_NO_VERSION)
                                 .content("There is no version under the process!").build());
            processVersions.forEach(processVersion -> {
                String key = String.valueOf(processVersion.getInstanceVersion());
                String text = key + "(" + processVersion.getVersionStatus() + ")";
                Map<String, String> m = new LinkedHashMap<>(2);
                m.put("key", key);
                m.put("text", text);
                result.add(m);
            });
        }
        return result;
    }

    public Map<String, Object> queryProcess(Map map) {
        long facilityRrn = LocalContext.getFacilityRrn();
        String productId = StringUtils.trimToUpperCase(MapUtils.getString(map, "productId"));
        Assert.isFalse(StringUtils.isBlank(productId),
                       Errors.create().key(MessageIdList.BATCHFUTUREHOLDLOT_SELECT_PRODUCTID)
                             .content("The Part Have Not Select Or KeyIn!").build());

        long productRrn = getInstanceRrn(productId, getNamedSpace(ObjectList.PRODUCT_KEY, facilityRrn),
                                         ObjectList.PRODUCT_KEY);
        Assert.isFalse(productRrn <= 0,
                       Errors.create().key(MessageIdList.PRODUCT_PRODUCT_MISSING).content("产品不存在!").build());
        List<Map> processIdList = new ArrayList<>();
        List<String> processIds = prpService.getProcessIdsByProductRrn(productRrn);
        for (String processId : processIds) {
            Map processIdMap = new HashMap(processIds.size());
            processIdMap.put("processId", processId);
            processIdMap.put("processRrn", getInstanceRrn(processId, facilityRrn, ObjectList.WFL_KEY));
            processIdList.add(processIdMap);
        }
        Map<String, Object> result = new HashMap();
        result.put("processIds", processIdList);
        result.put("productId", productId);
        result.put("productRrn", productRrn);
        return result;
    }
}