自动化立体仓库 - WMS系统
pang.jiabao
1 天以前 259e38eb55c12b501427702d551d4de61182406c
src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
@@ -1,6 +1,5 @@
package com.zy.asrs.service.impl;
import com.alibaba.excel.util.DateUtils;
import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -10,14 +9,12 @@
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.mes.*;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.entity.param.EmptyPlateOutParam;
import com.zy.asrs.entity.rcs.*;
import com.zy.asrs.mapper.AgvInfoMapper;
import com.zy.asrs.mapper.MatItemBarcodeMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.OrderInAndOutUtil;
import com.zy.common.model.DetlDto;
import com.zy.common.model.LocDetlDto;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import lombok.extern.slf4j.Slf4j;
@@ -29,9 +26,7 @@
import javax.annotation.Resource;
import java.text.ParseException;
import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Slf4j
@Service
@@ -91,6 +86,12 @@
    @Resource
    private MobileService mobileService;
    @Resource
    private WrkMastService wrkMastService;
    @Resource
    private WrkDetlService wrkDetlService;
    // region MES接口
@@ -108,10 +109,8 @@
        MesReturn mesReturn = new MesReturn();
        // 1、物料信息同步
        int matSuccess = 0;
        for (MesMatInfo mesMatInfo : matRecvForm.getItemdata()) {
            if (synMatInfo(mesMatInfo) == 1) {
                matSuccess++;
            } else {
                throw new CoolException("同步物料信息失败");
            }
@@ -273,7 +272,7 @@
                orderDetlPakin.setMaktx(mat.getMaktx());
                orderDetlPakin.setSpecs(mat.getSpecs());
                orderDetlPakin.setModel(mat.getModel());
                orderDetlPakin.setStandby1(JSONObject.toJSONString(mesMat.getItemBarcode()));   // 零件二维码
                orderDetlPakin.setStandby1(barCodeListToStr(mesMat.getItemBarcode()));   // 零件二维码
                orderDetlPakin.setStandby2("1");  //保存齐套性检查标识,1 检查;0 不检查;
                orderDetlPakin.setCreateBy(defaultUserId);
                orderDetlPakin.setCreateTime(now);
@@ -367,48 +366,59 @@
     * @param mesOutApply
     * @return 1 成功;-1 订单重复;
     */
    @Transactional
    public int outBoundOrder(MesOutApply mesOutApply){
        // 空托出库
        if (StringUtils.isEmpty(mesOutApply.getOrderNo()) && "01".equals(mesOutApply.getTransType())) {
            // 生成空托出库任务
            mobileService.callEmptyBinOutBound(WMS_TRANS_START_STATION_1,"1",defaultUserId);
            mobileService.callEmptyBinOutBound(mesOutApply,WMS_TRANS_START_STATION_1,"1",defaultUserId);
            try {
                if (!StringUtils.isEmpty(mesOutApply.getTaskno()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
                    TransTask transTask = new TransTask();
                    transTask.setTaskno(mesOutApply.getTaskno());
                    transTask.setTaskname(mesOutApply.getTaskname());
                    transTask.setOrderNo(mesOutApply.getOrderNo());
                    transTask.setTransType(mesOutApply.getTransType());
                    transTask.setCurStationId(WMS_TRANS_START_STATION_1);
                    transTask.setNextProcess(mesOutApply.getProductLineId());
                    transTask.setNextStationId(mesOutApply.getStationId());
                    transTask.setItemno(WMS_ZPALLET_ID);  // 固定为空托的编码
                    transTask.setQty(1);    // 空托只出1个
                    transTask.setProductLineId(mesOutApply.getProductLineId());
                    transTask.setOperateType(1);
                    transTask.setAgvFactory(1);
                    JSONObject sendAgvTask = submitTask(transTask);
                    if (!"1".equals(sendAgvTask.getString("Success"))) {
                        log.error("出库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));
                    }
                }
            } catch (Exception e) {
                log.error("下发AGV运输任务失败", e);
            }
//            try {
//                if (!StringUtils.isEmpty(mesOutApply.getTaskno()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
//                    TransTask transTask = new TransTask();
//                    transTask.setTaskno(mesOutApply.getTaskno());
//                    transTask.setTaskname(mesOutApply.getTaskname());
//                    transTask.setOrderNo(mesOutApply.getOrderNo());
//                    transTask.setTransType(mesOutApply.getTransType());
//                    transTask.setCurStationId(WMS_TRANS_START_STATION_1);
//                    transTask.setNextProcess(mesOutApply.getProductLineId());
//                    transTask.setNextStationId(mesOutApply.getStationId());
//                    transTask.setItemno(WMS_ZPALLET_ID);  // 固定为空托的编码
//                    transTask.setQty(1);    // 空托只出1个
//                    transTask.setProductLineId(mesOutApply.getProductLineId());
//                    transTask.setOperateType(1);
//                    transTask.setAgvFactory(1);
//                    JSONObject sendAgvTask = submitTask(transTask);
//                    if (!"1".equals(sendAgvTask.getString("Success"))) {
//                        log.error("出库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));
//                    }
//                }
//            } catch (Exception e) {
//                log.error("下发AGV运输任务失败", e);
//            }
            return 1;
        } else {    // 毛坯(物料)出库
            // docType根据库类型确定
            long docType = 7;
            long settle = 1;
            long settle = 2;
            // 校验订单是否重复
            OrderPakout order = orderPakoutService.selectByNo(mesOutApply.getOrderNo());
            if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
                log.error("出库订单号重复:{}",mesOutApply.getOrderNo());
                return -1;
            }
            String itemBarcode = barCodeListToStr(mesOutApply.getItemBarcode());
            // 自动出库
            LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("standby1", itemBarcode));
            if (locDetl == null) {
                throw new CoolException("零件二维码没有匹配到库存:" +itemBarcode );
            }
            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo()));
            if (!locMast.getLocSts().equals("F")) {
                throw new CoolException("库位状态不为F:" +locMast.getLocNo() );
            }
            // 生成订单
@@ -426,6 +436,7 @@
            orderPakout.setUpdateTime(now);
            orderPakout.setMemo(JSONObject.toJSONString(mesOutApply));
            orderPakout.setPakinPakoutStatus(2);
            orderPakout.setNumber(locMast.getBarcode()); // 托盘条码,上报时用
            if (!orderPakoutService.insert(orderPakout)) {
                log.error("MES保存出库订单主档失败");
                throw new CoolException("保存出库订单主档失败");
@@ -437,12 +448,14 @@
            orderDetlPakout.setOrderId(orderPakout.getId());
            orderDetlPakout.setOrderNo(orderPakout.getOrderNo());
            orderDetlPakout.setAnfme(Double.valueOf(mesOutApply.getQty()));
            orderDetlPakout.setWorkQty(orderDetlPakout.getAnfme());
            orderDetlPakout.setQty(0.0);
            orderDetlPakout.setMatnr(mat.getMatnr());
            orderDetlPakout.setMaktx(mat.getMaktx());
            orderDetlPakout.setSpecs(mat.getSpecs());
            orderDetlPakout.setModel(mat.getModel());
            orderDetlPakout.setStandby1(barCodeListToStr(mesOutApply.getItemBarcode()));
            orderDetlPakout.setStandby1(itemBarcode);
            orderDetlPakout.setCreateBy(defaultUserId);
            orderDetlPakout.setCreateTime(now);
            orderDetlPakout.setUpdateBy(defaultUserId);
@@ -454,49 +467,102 @@
                throw new CoolException("保存出库订单明细档失败");
            }
            // TODO:若AGV和输送线没有安全交互,则要保证立库出货完成后再呼叫AGV。
            // 立库生成订单后,自动调度AGV运送到站点,目前多托生成多个。
            try {
                if (!StringUtils.isEmpty(mesOutApply.getTaskno()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
                    // 按零件二维码查询有几个托,多托生成多个任务,每托对应零件二维码
                    String barCode = barCodeListToStr(mesOutApply.getItemBarcode());
                    EntityWrapper<MatItemBarcode> matItemBarcodeEntityWrapper = new EntityWrapper<>();
                    matItemBarcodeEntityWrapper.in("item_barcode", barCode);
                    List<MatItemBarcode> barcodes = matItemBarcodeMapper.selectList(matItemBarcodeEntityWrapper);
                     if (barcodes != null) {
                        Map<String, List<MatItemBarcode>> map = barcodes.stream().collect(Collectors.groupingBy(MatItemBarcode::getZapplet));
                        for (Map.Entry<String, List<MatItemBarcode>> entry : map.entrySet()) {
                            List<MatItemBarcode> list = entry.getValue();
                            List<String> codes = new ArrayList<>();
                            for (MatItemBarcode zapllet : list) {
                                codes.add(zapllet.getItemBarcode());
                            }
            // 生成工作号
            int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(101));
            // 生成工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(101); // 入出库状态
            wrkMast.setIoPri(13D); // 优先级:13
            wrkMast.setCrnNo(1);
            wrkMast.setSourceStaNo("203"); // 源站
            wrkMast.setStaNo("204"); // 目标站
            wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位
            wrkMast.setFullPlt("Y"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("N"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setBarcode(locMast.getBarcode());
            wrkMast.setAppeUser(defaultUserId); // 操作人员数据
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(defaultUserId);
            wrkMast.setModiTime(now);
            wrkMast.setMemo(JSONObject.toJSONString(mesOutApply));
            wrkMast.setTaskNo(mesOutApply.getTaskno());
            wrkMast.setAgvSta(mesOutApply.getStationId());
            wrkMastService.insert(wrkMast);
            // 生成工作档明细
                WrkDetl wrkDetl = new WrkDetl();
                wrkDetl.sync(locDetl);
                wrkDetl.setOrderNo(orderPakout.getOrderNo()); // 手动出库不需要带出库存中的单据编号
                wrkDetl.setWrkNo(workNo);
                wrkDetl.setIoTime(now);
                wrkDetl.setAnfme(orderDetlPakout.getAnfme()); // 数量
                wrkDetl.setAppeTime(now);
                wrkDetl.setAppeUser(defaultUserId);
                wrkDetl.setModiTime(now);
                wrkDetl.setModiUser(defaultUserId);
//                wrkDetl.setMatnr(detlDto.getLocDetl().getMatnr());
//                wrkDetl.setMaktx(detlDto.getLocDetl().getMaktx());
//                wrkDetl.setUnit(detlDto.getLocDetl().getUnit());
//                wrkDetl.setSpecs(detlDto.getLocDetl().getSpecs());
//                wrkDetl.setUnit(detlDto.getLocDetl().getUnit());
//                wrkDetl.setModel(detlDto.getLocDetl().getModel());
                wrkDetlService.insert(wrkDetl);
                            TransTask transTask = new TransTask();
                            transTask.setTaskno(mesOutApply.getTaskno());
                            transTask.setTaskname(mesOutApply.getTaskname());
                            transTask.setOrderNo(mesOutApply.getOrderNo());
                            transTask.setTransType(mesOutApply.getTransType());
                            transTask.setCurStationId(WMS_TRANS_START_STATION_3);
                            transTask.setNextProcess(mesOutApply.getProductLineId());
                            transTask.setNextStationId(mesOutApply.getStationId());
                            transTask.setItemno(mesOutApply.getItemno());
                            transTask.setQty(list.size());
                            transTask.setProductLineId(mesOutApply.getProductLineId());
                            transTask.setItemBarcode(codes);
                            transTask.setTuoPanId(entry.getKey());
                            transTask.setOperateType(1);
                            transTask.setAgvFactory(1);
                            JSONObject sendAgvTask = submitTask(transTask);
                            if (!"1".equals(sendAgvTask.getString("Success"))) {
                                log.error("出库下发agv运输任务失败", JSONObject.toJSONString(transTask));
                            }
                        }
                    }
                }
            } catch (Exception e) {
                log.error("下发AGV运输任务失败", e);
            // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
            if (locMast.getLocSts().equals("F")) {
                locMast.setLocSts("R");
                locMast.setModiUser(defaultUserId);
                locMast.setModiTime(now);
                locMastService.updateById(locMast);
            }
            log.info("出库任务生成成功,任务号:{}",workNo);
            // 立库生成订单后,自动调度AGV运送到站点,目前多托生成多个。
//            try {
//                if (!StringUtils.isEmpty(mesOutApply.getTaskno()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
//                    // 按零件二维码查询有几个托,多托生成多个任务,每托对应零件二维码
////                    String barCode = barCodeListToStr(mesOutApply.getItemBarcode());
////                    EntityWrapper<MatItemBarcode> matItemBarcodeEntityWrapper = new EntityWrapper<>();
////                    matItemBarcodeEntityWrapper.in("item_barcode", barCode);
////                    List<MatItemBarcode> barcodes = matItemBarcodeMapper.selectList(matItemBarcodeEntityWrapper);
////                     if (barcodes != null) {
////                        Map<String, List<MatItemBarcode>> map = barcodes.stream().collect(Collectors.groupingBy(MatItemBarcode::getZapplet));
////                        for (Map.Entry<String, List<MatItemBarcode>> entry : map.entrySet()) {
////                            List<MatItemBarcode> list = entry.getValue();
////                            List<String> codes = new ArrayList<>();
////                            for (MatItemBarcode zapllet : list) {
////                                codes.add(zapllet.getItemBarcode());
////                            }
//
//                            TransTask transTask = new TransTask();
//                            transTask.setTaskno(mesOutApply.getTaskno());
//                            transTask.setTaskname(mesOutApply.getTaskname());
//                            transTask.setOrderNo(mesOutApply.getOrderNo());
//                            transTask.setTransType(mesOutApply.getTransType());
//                            transTask.setCurStationId(WMS_TRANS_START_STATION_3);
//                            transTask.setNextProcess(mesOutApply.getProductLineId());
//                            transTask.setNextStationId(mesOutApply.getStationId());
//                            transTask.setItemno(mesOutApply.getItemno());
//                            transTask.setQty(mesOutApply.getQty());
//                            transTask.setProductLineId(mesOutApply.getProductLineId());
//                            transTask.setItemBarcode(mesOutApply.getItemBarcode());
//                            transTask.setTuoPanId(locDetl.getZpallet());
//                            transTask.setOperateType(1);
//                            transTask.setAgvFactory(1);
//                            JSONObject sendAgvTask = submitTask(transTask);
//                            if (!"1".equals(sendAgvTask.getString("Success"))) {
//                                log.error("出库下发agv运输任务失败", JSONObject.toJSONString(transTask));
//                            }
////                        }
////                    }
//                }
//            } catch (Exception e) {
//                log.error("下发AGV运输任务失败", e);
//            }
        }
        return 1;
@@ -520,8 +586,8 @@
                    transTask.setOrderNo(mesInApply.getOrderNo());
                    transTask.setTransType(mesInApply.getTransType());
                    transTask.setCurProcess(mesInApply.getProductLineId());
                    transTask.setCurStationId(mesInApply.getStationID());
                    transTask.setNextStationId(WMS_TRANS_START_STATION_2);
                    transTask.setCurStationId("A3");
                    transTask.setNextStationId("A4");
                    transTask.setItemno(WMS_ZPALLET_ID);  // 固定为空托的编码
                    transTask.setQty(1);    // 空托只回1个
                    transTask.setProductLineId(mesInApply.getProductLineId());
@@ -578,9 +644,9 @@
            orderDetlPakin.setMaktx(mat.getMaktx());
            orderDetlPakin.setSpecs(mat.getSpecs());
            orderDetlPakin.setModel(mat.getModel());
            if (mesInApply.getProductInfo() != null) {
                orderDetlPakin.setStandby1(JSONObject.toJSONString(mesInApply.getProductInfo())); //零件详情存在1
            }
            List<String> itemBarcode = mesInApply.getProductInfo().stream().map(MesInApply.ProductInfo::getItemBarcode).collect(Collectors.toList());
            orderDetlPakin.setStandby1(barCodeListToStr(itemBarcode)); //零件详情存在1
            orderDetlPakin.setStandby2("0");  //保存齐套性检查标识,1 检查;0 不检查;
            orderDetlPakin.setCreateBy(defaultUserId);
            orderDetlPakin.setCreateTime(now);
@@ -604,7 +670,6 @@
            waitPakin.setAppeTime(now);
            waitPakin.setModiUser(defaultUserId);
            waitPakin.setModiTime(now);
            List<String> itemBarcode = mesInApply.getProductInfo().stream().map(MesInApply.ProductInfo::getItemBarcode).collect(Collectors.toList());
            waitPakin.setStandby1(barCodeListToStr(itemBarcode));
            waitPakinService.insert(waitPakin);
            OrderInAndOutUtil.increaseWorkQty(Boolean.TRUE, orderPakin.getId(), orderDetlPakin.getMatnr(), orderDetlPakin.getBatch(),
@@ -708,7 +773,7 @@
            mesOutFeedback.setStationId(dbMemo.getString("StationId"));
            mesOutFeedback.setItemno(dbMemo.getString("Itemno"));
            mesOutFeedback.setTuoPanId(zpalletId);
            if (itemBarCode != null && itemBarCode.size() > 0) {
            if (itemBarCode.size() > 0) {
                mesOutFeedback.setQty(itemBarCode.size());
                mesOutFeedback.setItemBarcode(itemBarCode);
            }
@@ -777,6 +842,9 @@
     * @return
     */
    public static String barCodeListToStr(List<String> list) {
        if(list.isEmpty()) {
            return "";
        }
        StringBuilder stringBuilder = new StringBuilder();
        for (String str : list) {
            stringBuilder.append(str).append(",");
@@ -1030,6 +1098,14 @@
        // 下发给RCS
        RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
        // 模板名
        if(transTask.getCurStationId().startsWith("LL") || transTask.getCurStationId().startsWith("LG")) { // 起点产线
            rcsTaskSubmit.setTaskType("CS2");
        } else if(transTask.getNextStationId().startsWith("LL") || transTask.getNextStationId().startsWith("LG")) { // 终点产线
            rcsTaskSubmit.setTaskType("CS");
        } else { // 不涉及产线
            rcsTaskSubmit.setTaskType("CS3");
        }
        rcsTaskSubmit.setRobotTaskCode(transTask.getTaskno());
        rcsTaskSubmit.setInitPriority(10);  //默认10
        List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
@@ -1046,9 +1122,14 @@
        rcsTaskSubmit.setTargetRoute(targetRouteList);
        // 转发给海康或华晓RCS
//        int success = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
        int success = 1;
        if (success == 1) {
        RcsReturn rcsReturn = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
        if (rcsReturn.getCode().equals("SUCCESS")) {
            JSONObject data = rcsReturn.getData();
            String robotTaskCode = data.getString("robotTaskCode");
            if (Cools.isEmpty(transTask.getTaskno())) {
                transTask.setTaskno(robotTaskCode);
                result.put("taskno", transTask.getTaskno());
            }
            int workNo = commonService.getWorkNo(WorkNoType.OTHER.type);
            Date now = new Date();
            Task task = new Task();
@@ -1075,12 +1156,12 @@
            taskDetl.setIoTime(task.getIoTime());
            taskDetl.setMatnr(transTask.getItemno());
            taskDetl.setAnfme(0.0);
            taskDetl.setStandby1(String.valueOf(transTask.getQty()));
//            taskDetl.setStandby1(String.valueOf(transTask.getQty()));
            taskDetl.setMaktx(mat.getMaktx());
            taskDetl.setSpecs(mat.getSpecs());
            taskDetl.setOrderNo(transTask.getOrderNo());
            taskDetl.setZpallet(transTask.getTuoPanId());
            taskDetl.setMemo(JSONObject.toJSONString(transTask.getItemBarcode()));
            taskDetl.setMemo(barCodeListToStr(transTask.getItemBarcode()));
            taskDetl.setModiUser(defaultUserId);
            taskDetl.setModiTime(now);
            taskDetl.setAppeUser(defaultUserId);
@@ -1163,7 +1244,7 @@
     * @return
     */
    public int applyInStation(TransParent apply) {
        String path = ("LL").equals(apply.getProductLineId()) ? "AGVTransportPalletNotice" : "AprsAGVTransportPalletNotice";
        String path = ("LL").equals(apply.getProductLineId()) ? "AGVTransportPalletNotice" : "Aprs/AGVTransportPalletNotice";
        String url = MES_URL + path;
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
        if (!StringUtils.isEmpty(response) && response.contains("Success")){
@@ -1195,7 +1276,7 @@
//            rcsTaskContinue.setTriggerType("ROBOT");
//            rcsTaskContinue.setTriggerCode(allow.getAgvCode());
            int success = rcsService.continueTask(rcsTaskContinue, checkRcsFactory(allow.getAgvCode()));
            int success = rcsService.continueTask(rcsTaskContinue, 1);
            mesReturn.setSuccess(success == 1 ? "1" : "2");
            mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");
        }
@@ -1217,7 +1298,8 @@
            arrivalStation.setOrderNo(null);
        }
        String url = MES_URL + "AGVArrivalCompleted";
        String path = ("LL").equals(arrivalStation.getProductLineId()) ? "AGVArrivalCompleted" : "Aprs/AGVArrivalCompleted";
        String url = MES_URL + path;
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(arrivalStation));
        if (!StringUtils.isEmpty(response) && response.contains("Success")){
            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
@@ -1282,7 +1364,8 @@
     */
    public int outStation(TransParent apply) {
        String url = MES_URL + "AGVDepartureCompleted";
        String path = ("LL").equals(apply.getProductLineId()) ? "AGVDepartureCompleted" : "Aprs/AGVDepartureCompleted";
        String url = MES_URL + path;
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
        if (!StringUtils.isEmpty(response) && response.contains("Success")){
            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);