PcdAssemblyAction.java

package com.mycim.webapp.actions.pcd;

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.utils.lang.ObjectUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.framework.utils.lang.math.NumberUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.consts.PcdStatus;
import com.mycim.valueobject.ems.Carrier;
import com.mycim.valueobject.ems.Door;
import com.mycim.valueobject.ems.POD;
import com.mycim.valueobject.ems.PcdAssembly;
import com.mycim.valueobject.wip.Lot;
import com.mycim.webapp.actions.CarrierSetupAction;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 组装
 *
 * @author yanbing.chen
 * @version 6.0.0
 * @date 2019/8/27
 **/
public class PcdAssemblyAction extends CarrierSetupAction {


    public Map getPcdAssembly(Map map) {
        Long carrierRrn = NumberUtils.toLong(map.get("carrierRrn").toString());
        PcdAssembly pcdAssembly = carrierService.getPcdAssembly(carrierRrn, null, null);
        String pcdStatus = "DEASSEMBLY";
        String podId = "";
        String doorId = "";
        if (pcdAssembly != null) {
            pcdStatus = "ASSEMBLY";
            podId = pcdAssembly.getPodId();
            doorId = pcdAssembly.getDoorId();
        }
        Map result = new HashMap();
        result.put("pcdStatus", pcdStatus);
        result.put("podId", podId);
        result.put("doorId", doorId);
        return result;
    }

    public void assemblyPcd(Map map) {
        Long facilityRrn = LocalContext.getFacilityRrn();
        String user = LocalContext.getUserId();
        String carrierId = map.get("carrierId").toString();
        Assert.isFalse(StringUtils.isBlank(carrierId),
                       Errors.create().key(MessageIdList.CARRIER_CASSETTE_EMPTY).content("晶舟号不能为空!").build());

        String podId = map.get("podId").toString();
        String doorId = map.get("doorId").toString();
        Assert.isFalse(StringUtils.isBlank(podId) && StringUtils.isBlank(doorId),
                       Errors.create().key(MessageIdList.PCD_POD_AND_DOOR_ALL_EMPTY).content("Pod号和Door号不能同时为空!")
                             .build());

        String entityNamedSpace = getNamedSpace(ObjectList.ENTITY_KEY, facilityRrn);
        long carrierRrn = baseService
                .getNamedObjectRrn(carrierId, entityNamedSpace, ObjectList.ENTITY_KEY, ObjectList.CARRIER_KEY);
        Assert.isFalse(carrierRrn <= 0,
                       Errors.create().key(MessageIdList.CARRIER_CASSETTE_ID_MISSING).content("No such Cassette ID!")
                             .build());

        //通过carrierId获取批次
        List<Lot> carrierLotList = lotInqService.getLotListByCarrierId(carrierId);
        // Lot carrierLot = lotQueryService.getLotByCarrierId(carrierId, LocalContext.getFacilityRrn());

        //如果carrierLot不为空并且rrn大于零说明晶舟已经被占用
        Assert.state(CollectionUtils.isEmpty(carrierLotList),
                     Errors.create().key(MessageIdList.CARRIER_CASSETTE_IN_USED)
                           .content("Cassette is in used cassette!").build());
        /**
         * 需求 #45007 将POD改为选填
         * 兼容操作
         */
        Long podRrn = null;
        if (StringUtils.isNotEmpty(podId)) {
            podRrn = baseService.getNamedObjectRrn(podId, entityNamedSpace, ObjectList.ENTITY_KEY, ObjectList.POD_KEY);
            Assert.state(podRrn > 0, Errors.create().key(MessageIdList.POD_POD_ID_MISSING).content("Pod号不存在!").build());
        }

        /**
         * 需求 #40125 要求无视door的存在
         * 兼容操作
         */
         /** by #40125 */
         Long doorRrn =null;
        if(StringUtils.isNotEmpty(doorId)){
            doorRrn = baseService
                    .getNamedObjectRrn(doorId, entityNamedSpace, ObjectList.ENTITY_KEY, ObjectList.DOOR_KEY);
            Assert.isFalse(doorRrn <= 0,
                           Errors.create().key(MessageIdList.DOOR_DOOR_ID_MISSING).content("Door号不存在!").build());
            // PcdAssembly pcdAssembly = carrierService.getPcdAssembly(carrierRrn, podRrn, doorRrn);
        }
        //查询数据库中是否存在
        PcdAssembly pcdAssembly = carrierService.getPcdAssembly(carrierRrn, podRrn, doorRrn);
        if (pcdAssembly != null) {
            // String msg = "";
            Assert.isFalse(StringUtils.equals(pcdAssembly.getCarrierId(), carrierId),
                           Errors.create().key(MessageIdList.CARRIER_HAD_BEEN_ASSEMBLED).content("晶舟:{} 已经被组装!")
                                 .args(carrierId).build());

            Assert.isFalse(StringUtils.equals(pcdAssembly.getPodId(), podId),
                           Errors.create().key(MessageIdList.POD_HAD_BEEN_ASSEMBLED).content("Pod:{} 已经被组装!")
                                 .args(podId).build());
            Assert.isFalse(StringUtils.equals(pcdAssembly.getDoorId(), doorId),
                           Errors.create().key(MessageIdList.DOOR_HAD_BEEN_ASSEMBLED).content("Door:{} 已经被组装!")
                                 .args(doorId).build());
        }

        Carrier carrier = carrierService.getCarrier(carrierRrn);
        POD pod = podRrn == null ? null : carrierService.getPod(podRrn);
        Door door =doorRrn==null?null:carrierService.getDoor(doorRrn);
        Assert.isTrue((ObjectUtils.isEmpty(pod) || StringUtils.equalsIgnoreCase(carrier.getFlagType(), pod.getFlagType()))
                              && (door == null || StringUtils.equalsIgnoreCase(carrier.getFlagType(), door.getFlagType())),
                      Errors.create().key(MessageIdList.PCD_CASSETTE_POD_DOOR_MUST_SAME).content( String.format("晶舟,Pod%s类别需一致!",",Door") )
                            .build());

        Assert.isTrue(StringUtils.equalsIgnoreCase(carrier.getCarrierStatus(), PcdStatus.FREE_KEY),
                      Errors.create().key(MessageIdList.CARRIER_MUST_FREE_FOR_ASSEMBLY)
                            .content("Cassette 在free 状态下才可以组装!").build());
        Assert.isTrue(door==null||StringUtils.equalsIgnoreCase(door.getDoorStatus(), PcdStatus.FREE_KEY),
                      Errors.create().key(MessageIdList.DOOR_MUST_FREE_FOR_ASSEMBLY).content("Door 在free 状态下才可以组装!")
                            .build());

        Assert.state(ObjectUtils.isEmpty(pod) || StringUtils.equalsIgnoreCase(pod.getPodStatus(), PcdStatus.FREE_KEY),
                      Errors.create().key(MessageIdList.POD_MUST_FREE_FOR_ASSEMBLY).content("Pod 在free 状态下才可以组装!")
                            .build());

        // check清洗有效期是否过期
        Assert.isTrue(carrierService.checkPcdOverClean(carrierRrn),
                      Errors.create().key(MessageIdList.CARRIER_OUT_OF_CLEAN_DATE).content("Cassette 超过清洗时间").build());

        Assert.state(ObjectUtils.isEmpty(pod) || carrierService.checkPcdOverClean(podRrn),
                      Errors.create().key(MessageIdList.POD_OUT_OF_CLEAN_DATE).content("Pod 超过清洗时间").build());

        Assert.isTrue(door==null||carrierService.checkPcdOverClean(doorRrn),
                      Errors.create().key(MessageIdList.DOOR_OUT_OF_CLEAN_DATE).content("Door  超过清洗时间").build());
        //line 110 已经判断过了 直接注释
        // Assert.isTrue(StringUtils.equalsIgnoreCase(carrier.getObjectSubtype(), pod.getObjectSubtype()) ,
        //                         /** by #40125 */
        //                       // && StringUtils.equalsIgnoreCase(carrier.getObjectSubtype(), door.getObjectSubtype()),
        //               Errors.create().key(MessageIdList.PCD_CASSETTE_POD_DOOR_MUST_SAME).content("晶舟,Pod,door 类别需一致!")
        //                     .build());

        carrierService.assemblyPcd(carrierRrn, podRrn, doorRrn, user, facilityRrn);
    }

    public void deAssemblyPcd(Map map) {
        Long facilityRrn = LocalContext.getFacilityRrn();
        String user = LocalContext.getUserId();
        String carrierId = map.get("carrierId").toString();
        Assert.isFalse(StringUtils.isBlank(carrierId),
                       Errors.create().key(MessageIdList.CARRIER_CASSETTE_EMPTY).content("晶舟号不能为空!").build());

        String entityNamedSpace = getNamedSpace(ObjectList.ENTITY_KEY, facilityRrn);
        long carrierRrn = baseService
                .getNamedObjectRrn(carrierId, entityNamedSpace, ObjectList.ENTITY_KEY, ObjectList.CARRIER_KEY);
        Assert.isFalse(carrierRrn <= 0,
                       Errors.create().key(MessageIdList.CARRIER_CASSETTE_ID_MISSING).content("No such Cassette ID!")
                             .build());

        //通过carrierId获取批次
        List<Lot> carrierLotList = lotInqService.getLotListByCarrierId(carrierId);
        Assert.state(CollectionUtils.isEmpty(carrierLotList),
                     Errors.create().key(MessageIdList.CARRIER_CASSETTE_IN_USED).build());

        PcdAssembly pcdAssembly = carrierService.getPcdAssembly(carrierRrn, null, null);
        Assert.isFalse(pcdAssembly == null,
                       Errors.create().key(MessageIdList.CARRIER_CASSETTE_NOT_ASSEMBLED).content("该晶舟未被组装!").build());
        carrierService.deAssemblyPcd(carrierRrn, pcdAssembly.getPodRrn(), pcdAssembly.getDoorRrn(), user, facilityRrn);
    }

}