自动化立体仓库 - WMS系统
pang.jiabao
8 天以前 facf104ca0830f96fe11d54048d17f4b646032e0
1
package com.zy.asrs.service.impl; import com.alibaba.excel.util.StringUtils; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.SnowflakeIdWorker; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.entity.mes.*; import com.zy.asrs.entity.rcs.*; import com.zy.asrs.mapper.AgvInfoMapper; import com.zy.asrs.mapper.BasDevpMapper; import com.zy.asrs.mapper.MatItemBarcodeMapper; import com.zy.asrs.service.*; import com.zy.asrs.utils.OrderInAndOutUtil; import com.zy.common.model.LocDetlDto; import com.zy.common.model.enums.WorkNoType; import com.zy.common.service.CommonService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.text.ParseException; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service public class MesServiceImpl implements MesService {     @Value("${mes.url}")     public String MES_URL;     @Value("${wms.currentName}")     public String WMS_CURRENT_NAME;     @Value("${wms.wmsTransStartStation1}")     public String WMS_TRANS_START_STATION_1;     @Value("${wms.wmsTransStartStation2}")     public String WMS_TRANS_START_STATION_2;     @Value("${wms.wmsTransStartStation3}")     public String WMS_TRANS_START_STATION_3;     @Value("${mes.defaultUserId}")     public long defaultUserId;     @Value("${wms.zpalletId}")     public String WMS_ZPALLET_ID;     @Resource     private RcsService rcsService;     @Resource     private MatService matService;     @Resource     private TagService tagService;     @Resource     private OrderPakinService orderPakinService;     @Resource     private OrderDetlPakinService orderDetlPakinService;     @Resource     private OrderPakoutService orderPakoutService;     @Resource     private OrderDetlPakoutService orderDetlPakoutService;     @Resource     private WaitPakinService waitPakinService;     @Resource     private TaskService taskService;     @Resource     private TaskDetlService taskDetlService;     @Resource     private SnowflakeIdWorker snowflakeIdWorker;     @Resource     private CommonService commonService;     @Resource     private AgvInfoMapper agvInfoMapper;     @Resource     private WorkService workService;     @Resource     private MatItemBarcodeMapper matItemBarcodeMapper;     @Resource     private LocMastService locMastService;     @Resource     private LocDetlService locDetlService;     @Resource     private MobileService mobileService;     @Resource     private WrkMastService wrkMastService;     @Resource     private WrkDetlService wrkDetlService;     // region MES接口     /**      * 物料信息同步,MES->WMS      * 功能:同步物料信息->生成入库单      * 后续流程:入库时,需要实时调用recvFeedback返回入库数量      *      * @param matRecvForm      * @return      */     @Transactional(rollbackFor = Exception.class)     public MesReturn matInfoAndInBound(MesMatRecvForm matRecvForm) throws CoolException {         MesReturn mesReturn = new MesReturn();         // 1、物料信息同步         for (MesMatInfo mesMatInfo : matRecvForm.getItemdata()) {             if (synMatInfo(mesMatInfo) == 1) {             } else {                 throw new CoolException("同步物料信息失败");             }         }         // 2、生成入库单         if (inBoundOrder_List(matRecvForm) == 1) {             mesReturn.setSuccess("1");             mesReturn.setMessage("");         } else {             throw new CoolException("同步物料信息,生成入库单失败");         }         return mesReturn;     }     /**      * 新增、修改物料信息      *      * @param mesMatInfo      * @return 1 成功;-1 保存物料类型失败;-2 保存物料失败;      * @throws ParseException      */     public int synMatInfo(MesMatInfo mesMatInfo) {         // 规则定义:默认第2层为库名(如:加工库),第3层为同步的物料类型         long secondPath = 2;         String secondParentName = WMS_CURRENT_NAME;         Date now = new Date();         // 物料类型更新         long tagId = 0;         EntityWrapper<Tag> wrapper = new EntityWrapper<>();         wrapper.eq("name", mesMatInfo.getItemType());         Tag tag = tagService.selectByName(mesMatInfo.getItemType(), 3);         if (tag == null || StringUtils.isEmpty(tag.getName())) {             Tag newTag = new Tag();             newTag.setName(mesMatInfo.getItemType());             newTag.setParentId(secondPath);             newTag.setParentName(secondParentName);             newTag.setPath("2");             newTag.setPathName(secondParentName);             newTag.setLevel(3);             newTag.setStatus(1);             newTag.setCreateBy(defaultUserId);             newTag.setCreateTime(now);             newTag.setUpdateBy(defaultUserId);             newTag.setUpdateTime(now);             if (!tagService.insert(newTag))                 return -1;             tagId = newTag.getId();         } else {             tagId = tag.getId();         }         // 物料更新         if (tagId > 0) {             //        tagId = tagService.selectByName(mesMatInfo.getItem_type(), 3).getId();             Mat mat = matService.selectByMatnr(mesMatInfo.getItemNo());             Mat newMat = new Mat();             newMat.setMatnr(mesMatInfo.getItemNo());             newMat.setMaktx(mesMatInfo.getDescription());             newMat.setTagId(tagId);             newMat.setLocType(tagId);   //locType             newMat.setSpecs(mesMatInfo.getSpecification());             newMat.setUnit(mesMatInfo.getUnitOfMeasure());             newMat.setModel(mesMatInfo.getClassificationCode());             newMat.setMemo(JSONObject.toJSONString(mesMatInfo));             newMat.setCreateBy(defaultUserId);             newMat.setCreateTime(now);             newMat.setUpdateBy(defaultUserId);             newMat.setUpdateTime(now);             newMat.setStatus(1);             if (mat == null) {                 if (!matService.insert(newMat))                     return -2;             } else {                 JSONObject dbMemo = JSONObject.parseObject(mat.getMemo());                 dbMemo.remove("OrderNo");                 dbMemo.remove("qty");                 dbMemo.remove("ItemBarcode");                 JSONObject newMemo = JSONObject.parseObject(newMat.getMemo());                 newMemo.remove("OrderNo");                 newMemo.remove("qty");                 dbMemo.remove("ItemBarcode");                 if (!dbMemo.equals(newMemo)) {                     newMat.setId(mat.getId());                     if (!matService.updateById(newMat))                         return -2;                 }             }         } else {             return -1;         }         return 1;     }     /**      * 物料同步入库单,按OrderNo生成多个订单      *      *      * @param matRecvForm      * @return      */     public int inBoundOrder_List(MesMatRecvForm matRecvForm){         long docType = 4;   // docType根据库类型确定         long settle = 1;         Date now = new Date();         // 按OrderNo分组,然后再生成入库单         List<MesMatInfo> mesInApply = matRecvForm.getItemdata();         Map<String, List<MesMatInfo>> map = mesInApply.stream().collect(Collectors.groupingBy(MesMatInfo::getOrderNo));         for (Map.Entry<String, List<MesMatInfo>> entry : map.entrySet()) {             List<MesMatInfo> list = entry.getValue();             // 校验订单是否重复             OrderPakin order = orderPakinService.selectByNo(entry.getKey());             if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {                 return -1;             }             // 生成订单             JSONObject newMemo = new JSONObject();             newMemo.put("sourceNo", matRecvForm.getSourceNo());             newMemo.put("sourceName", matRecvForm.getSourceName());             newMemo.put("operuser", matRecvForm.getOperuser());             newMemo.put("itemdata", list);             OrderPakin orderPakin = new OrderPakin();             orderPakin.setUuid(String.valueOf(snowflakeIdWorker.nextId()));             orderPakin.setOrderNo(entry.getKey());             orderPakin.setOrderTime(com.core.common.DateUtils.convert(now));             orderPakin.setDocType(docType);             orderPakin.setSettle(settle);             orderPakin.setStatus(1);             orderPakin.setCreateBy(defaultUserId);             orderPakin.setCreateTime(now);             orderPakin.setUpdateBy(defaultUserId);             orderPakin.setUpdateTime(now);             orderPakin.setMemo(newMemo.toJSONString());  //为领料入库完成反馈保存   JSONObject.toJSONString(matRecvForm)             orderPakin.setPakinPakoutStatus(1);             if (!orderPakinService.insert(orderPakin)) {                 log.error("MES保存入库订单主档失败");                 throw new CoolException("保存入库订单主档失败");             }             // 生成明细             for (MesMatInfo mesMat : list) {                 Mat mat = matService.selectByMatnr(mesMat.getItemNo());                 OrderDetlPakin orderDetlPakin = new OrderDetlPakin();                 orderDetlPakin.setOrderId(orderPakin.getId());                 orderDetlPakin.setOrderNo(orderPakin.getOrderNo());                 orderDetlPakin.setAnfme(Double.valueOf(mesMat.getQty()));                 orderDetlPakin.setQty(0.0);                 orderDetlPakin.setMatnr(mat.getMatnr());                 orderDetlPakin.setMaktx(mat.getMaktx());                 orderDetlPakin.setSpecs(mat.getSpecs());                 orderDetlPakin.setModel(mat.getModel());                 orderDetlPakin.setStandby1(barCodeListToStr(mesMat.getItemBarcode()));   // 零件二维码                 orderDetlPakin.setStandby2("1");  //保存齐套性检查标识,1 检查;0 不检查;                 orderDetlPakin.setCreateBy(defaultUserId);                 orderDetlPakin.setCreateTime(now);                 orderDetlPakin.setUpdateBy(defaultUserId);                 orderDetlPakin.setUpdateTime(now);                 orderDetlPakin.setStatus(1);                 orderDetlPakin.setPakinPakoutStatus(1);                 if (!orderDetlPakinService.insert(orderDetlPakin)) {                     log.error("MES保存入库订单明细档失败1");                     throw new CoolException("保存入库订单明细档失败1");                 }             }         }         return 1;     }     /**      * 领料入库反馈      * 触发条件:物料同步接口入库单,入库后      * 推送时机:当订单中有物料入库后(应该在每托入库完成后,可以在更新OrderDetlPakin之后)则推送,不等全部订单完成      *      * @param orderNo      * @param zapplet      * @return      */     public int recvFeedback(String orderNo, String zapplet) {         OrderPakin order = orderPakinService.selectByNo(orderNo);         if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {             List<MesRecvFeedback.MesRecvFeedbackItem> list = new ArrayList<>();             JSONObject dbMemo = JSONObject.parseObject(order.getMemo());             // 从组托信息中查询入库的信息             EntityWrapper<WaitPakin> waitPakinEntityWrapper = new EntityWrapper<>();             waitPakinEntityWrapper.eq("zpallet", zapplet);             List<WaitPakin> zpalletMat = waitPakinService.selectList(waitPakinEntityWrapper);             EntityWrapper<OrderDetlPakin> wrapper = new EntityWrapper<>();             wrapper.eq("order_no", orderNo);             List<OrderDetlPakin> orderDetlPakins = orderDetlPakinService.selectList(wrapper);             if (orderDetlPakins != null && !orderDetlPakins.isEmpty()) {                 for (OrderDetlPakin orderDetl : orderDetlPakins) {                     for (WaitPakin zMat : zpalletMat) {                         if (orderDetl.getMatnr().equals(zMat.getMatnr())) {                             MesRecvFeedback.MesRecvFeedbackItem item = new MesRecvFeedback.MesRecvFeedbackItem();                             item.setItemNo(orderDetl.getMatnr());                             item.setOrderNo(orderNo);                             item.setQty(orderDetl.getAnfme().intValue());                             item.setRealQty(zMat.getAnfme().intValue());                             // 回传托盘绑定的零件二维码                             EntityWrapper<MatItemBarcode> matItemBarcodeEntityWrapper = new EntityWrapper<>();                             matItemBarcodeEntityWrapper.eq("zapplet", zapplet).eq("status", 1);                             List<MatItemBarcode> barcodes = matItemBarcodeMapper.selectList(matItemBarcodeEntityWrapper);                             if (barcodes != null) {                                 List<String> itemBarcode = new ArrayList<>();                                 for (MatItemBarcode barcode : barcodes) {                                     itemBarcode.add(barcode.getItemBarcode());                                 }                                 item.setItemBarcode(itemBarcode);                                 list.add(item);                             }                         }                     }                 }             }             MesRecvFeedback mesRecvFeedback = new MesRecvFeedback();             mesRecvFeedback.setSourceNo(dbMemo.getString("sourceNo"));             mesRecvFeedback.setOperuser(dbMemo.getString("operuser"));             mesRecvFeedback.setItemdata(list);             String url = MES_URL + "MaterialReceiptAndReturn";             String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(mesRecvFeedback));             if (!StringUtils.isEmpty(response) && response.contains("Success")){                 MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);                 if("1".equals(mesReturn.getSuccess())) {                     return 1;                 }             }         }         return 0;     }     /**      * 出库申请,加工库、刀具库      * 出库后需要自动呼叫AGV送货      * 出库规则:需要按零件二维码(一件一码)出库,整托出库,该托上有其他物料也一起出库,他们后期会再入库      *      * @param mesOutApply      * @return 1 成功;-1 订单重复;      */     @Transactional     public int outBoundOrder(MesOutApply mesOutApply){         // 空托出库         if (StringUtils.isEmpty(mesOutApply.getOrderNo()) && "01".equals(mesOutApply.getTransType())) {             // 生成空托出库任务             mobileService.callEmptyBinOutBound(mesOutApply,mesOutApply.getStationId().startsWith("LJ") ? WMS_TRANS_START_STATION_1 : WMS_TRANS_START_STATION_3,mesOutApply.getPalletType(),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); //            }             return 1;         } else {    // 毛坯(物料)出库             // docType根据库类型确定             long docType = 7;             long settle = 2;             // 校验订单是否重复             OrderPakout order = orderPakoutService.selectByNo(mesOutApply.getOrderNo());             if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {                 log.error("出库订单号重复:{}",mesOutApply.getOrderNo());                 return -1;             }             if (Cools.isEmpty(mesOutApply.getItemBarcode())) {                 log.error("出库零件二维码为空:" +mesOutApply.getItemBarcode());                 return 2;             }             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() );             }             // 生成订单             Date now = new Date();             OrderPakout orderPakout = new OrderPakout();             orderPakout.setUuid( String.valueOf(snowflakeIdWorker.nextId()));             orderPakout.setOrderNo(mesOutApply.getOrderNo());             orderPakout.setOrderTime(com.core.common.DateUtils.convert(now));             orderPakout.setDocType(docType);             orderPakout.setSettle(settle);             orderPakout.setStatus(1);             orderPakout.setCreateBy(defaultUserId);             orderPakout.setCreateTime(now);             orderPakout.setUpdateBy(defaultUserId);             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("保存出库订单主档失败");             }             // 生成明细             Mat mat = matService.selectByMatnr(mesOutApply.getItemno());             OrderDetlPakout orderDetlPakout = new OrderDetlPakout();             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(itemBarcode);             orderDetlPakout.setCreateBy(defaultUserId);             orderDetlPakout.setCreateTime(now);             orderDetlPakout.setUpdateBy(defaultUserId);             orderDetlPakout.setUpdateTime(now);             orderDetlPakout.setStatus(1);             orderDetlPakout.setPakinPakoutStatus(2);             if (!orderDetlPakoutService.insert(orderDetlPakout)) {                 log.error("MES保存出库订单明细档失败");                 throw new CoolException("保存出库订单明细档失败");             }             // 生成工作号             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);             if(mesOutApply.getStationId().startsWith("LJ")) {                 wrkMast.setSourceStaNo("205"); // 源站                 wrkMast.setStaNo("205"); // 目标站             } else {                 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);             // 修改库位状态:   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;     }     /**      * 入库申请      * 收到入库申请后自动呼叫AGV取货      *      * @param mesInApply      */     @Transactional     public int inBoundOrder(MesInApply mesInApply){         // 出入库任务控制 入库前判断是否有出库任务         if(mesInApply.getStationID().startsWith("LG") || mesInApply.getStationID().startsWith("LT")) { // 侧面只能螺杆线出入,205口             int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().in("io_type", 101, 103, 107, 110).eq("sta_no", 205));             if(count >0) {                 log.warn("该入库站点:{},存在执行的出库任务:{}条", 205, count);                 return 2;             }         }         // 空托回库         if (StringUtils.isEmpty(mesInApply.getOrderNo()) && StringUtils.isEmpty(mesInApply.getItemno())) {                 if (!StringUtils.isEmpty(mesInApply.getTaskno()) && !StringUtils.isEmpty(mesInApply.getStationID())) {                     TransTask transTask = new TransTask();                     transTask.setTaskno(mesInApply.getTaskno());                     transTask.setTaskname(mesInApply.getTaskname());                     transTask.setOrderNo(mesInApply.getOrderNo());                     transTask.setTransType(mesInApply.getTransType());                     transTask.setCurProcess(mesInApply.getProductLineId());                     transTask.setCurStationId(mesInApply.getStationID());                     transTask.setNextStationId(mesInApply.getStationID().startsWith("LJ") ? WMS_TRANS_START_STATION_1 : WMS_TRANS_START_STATION_2);                     transTask.setItemno(WMS_ZPALLET_ID);  // 固定为空托的编码                     transTask.setQty(1);    // 空托只回1个                     transTask.setProductLineId(mesInApply.getProductLineId());                     transTask.setOperateType(1);                     transTask.setAgvFactory(1);                     transTask.setTuoPanId(mesInApply.getTuoPanId());                     JSONObject sendAgvTask = submitTask(transTask);                     if (!"1".equals(sendAgvTask.getString("Success"))) {                         log.error("入库下发agv运输任务失败,{}", JSONObject.toJSONString(transTask));                         return 2;                     }                 } else {                     log.error("无任务号:{},或无物料编码:{}",mesInApply.getTaskno(),mesInApply.getItemno() );                     return 2;                 }             return 1;         } else {    // 毛坯、成品回库             // docType根据库类型确定             long docType = 3;             long settle = 1;             // 校验订单是否重复             OrderPakin order = orderPakinService.selectByNo(mesInApply.getOrderNo());             if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {                 log.error("订单重复:{}", mesInApply.getOrderNo());                 return 2;             }             // 生成订单             Date now = new Date();             OrderPakin orderPakin = new OrderPakin();             orderPakin.setUuid(String.valueOf(snowflakeIdWorker.nextId()));             orderPakin.setOrderNo(mesInApply.getOrderNo());             orderPakin.setOrderTime(com.core.common.DateUtils.convert(now));             orderPakin.setDocType(docType);             orderPakin.setSettle(settle);             orderPakin.setStatus(1);             orderPakin.setCreateBy(defaultUserId);             orderPakin.setCreateTime(now);             orderPakin.setUpdateBy(defaultUserId);             orderPakin.setUpdateTime(now);             orderPakin.setMemo(JSONObject.toJSONString(mesInApply));  //为出库完成反馈保存             orderPakin.setPakinPakoutStatus(1);             orderPakinService.insert(orderPakin);             // 生成明细             Mat mat = matService.selectByMatnr(mesInApply.getItemno());             OrderDetlPakin orderDetlPakin = new OrderDetlPakin();             orderDetlPakin.setOrderId(orderPakin.getId());             orderDetlPakin.setOrderNo(orderPakin.getOrderNo());             orderDetlPakin.setAnfme(Double.valueOf(mesInApply.getQty()));             orderDetlPakin.setQty(0.0);             orderDetlPakin.setMatnr(mat.getMatnr());             orderDetlPakin.setMaktx(mat.getMaktx());             orderDetlPakin.setSpecs(mat.getSpecs());             orderDetlPakin.setModel(mat.getModel());             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);             orderDetlPakin.setUpdateBy(defaultUserId);             orderDetlPakin.setUpdateTime(now);             orderDetlPakin.setStatus(1);             orderDetlPakin.setPakinPakoutStatus(1);             orderDetlPakinService.insert(orderDetlPakin);             // 生成入库通知档             WaitPakin waitPakin = new WaitPakin();             BeanUtils.copyProperties(mat, waitPakin); //                waitPakin.sync(mat);             waitPakin.setOrderNo(orderPakin.getOrderNo());   // 单据编号             waitPakin.setOrderId(orderPakin.getId());             waitPakin.setZpallet(mesInApply.getTuoPanId());   // 托盘码             waitPakin.setIoStatus("N");     // 入出状态             waitPakin.setAnfme(orderDetlPakin.getAnfme());  // 数量             waitPakin.setStatus("Y");    // 状态             waitPakin.setAppeUser(defaultUserId);             waitPakin.setAppeTime(now);             waitPakin.setModiUser(defaultUserId);             waitPakin.setModiTime(now);             waitPakin.setStandby1(barCodeListToStr(itemBarcode));             waitPakinService.insert(waitPakin);             OrderInAndOutUtil.increaseWorkQty(Boolean.TRUE, orderPakin.getId(), orderDetlPakin.getMatnr(), orderDetlPakin.getBatch(),                     orderDetlPakin.getBrand(), orderDetlPakin.getStandby1(), orderDetlPakin.getStandby2(), orderDetlPakin.getStandby3(),                     orderDetlPakin.getBoxType1(), orderDetlPakin.getBoxType2(), orderDetlPakin.getBoxType3(), orderDetlPakin.getAnfme());             OrderInAndOutUtil.updateOrder(Boolean.TRUE, orderPakin.getId(), 2L, defaultUserId);             // 呼叫AGV从产线运回立库                 if (!StringUtils.isEmpty(mesInApply.getTaskno())) {                     TransTask transTask = new TransTask();                     transTask.setTaskno(mesInApply.getTaskno());                     transTask.setTaskname(mesInApply.getTaskname());                     transTask.setOrderNo(mesInApply.getOrderNo());                     transTask.setTransType(mesInApply.getTransType());                     transTask.setCurProcess(mesInApply.getProductLineId());                     transTask.setCurStationId(mesInApply.getStationID());                     transTask.setNextStationId(mesInApply.getStationID().startsWith("LJ") ? WMS_TRANS_START_STATION_1 : WMS_TRANS_START_STATION_2);                     transTask.setItemno(mesInApply.getItemno());                     transTask.setQty(mesInApply.getQty());                     transTask.setProductLineId(mesInApply.getProductLineId());                     transTask.setItemBarcode(itemBarcode);                     transTask.setTuoPanId(mesInApply.getTuoPanId());                     transTask.setOperateType(1);                     transTask.setAgvFactory(1);                     JSONObject sendAgvTask = submitTask(transTask);                     if (!"1".equals(sendAgvTask.getString("Success"))) {                         log.error("入库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));                         throw new CoolException("入库下发agv运输任务失败");                     }                 } else {                     throw new CoolException("MES入库下发agv运输任务失败");                 }         }         return 1;     }     /**      * 出库完成      * 出库后,按托推送,非整个订单      *      * @param orderNo      * @return      */     public int outFeedbackByTuo(String orderNo, Task agvTask) {         int success = 0;         OrderPakout order = orderPakoutService.selectByNo(orderNo);         if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {             JSONObject dbMemo = JSONObject.parseObject(order.getMemo());             // TODO:出库完成后,若未解绑托盘和物料,则执行托盘解绑             // TODO:出库完成后,若未清除零件二维码,则执行清除,也可以在AGV送货完成后清除 //            EntityWrapper<OrderDetlPakout> wrapper = new EntityWrapper<>(); //            wrapper.eq("order_no", orderNo); //            List<OrderDetlPakout> orderDetlPakouts = orderDetlPakoutService.selectList(wrapper); //            if (orderDetlPakouts != null && !orderDetlPakouts.isEmpty()) { //                for (OrderDetlPakout orderDetl : orderDetlPakouts) { //                    StringBuilder palletId = new StringBuilder(); //                    EntityWrapper<WaitPakin> wrapper2 = new EntityWrapper<>(); //                    wrapper2.eq("order_no", orderDetl.getOrderNo()); //                    List<WaitPakin> waitPakins = waitPakinService.selectList(wrapper2); //                    if (waitPakins != null && waitPakins.size() > 0) { //                        for (WaitPakin waitPakin : waitPakins) { //                            palletId.append(waitPakin.getZpallet()).append(","); //                        } //                    } // //                    MesOutFeedback mesOutFeedback = new MesOutFeedback(); //                    mesOutFeedback.setTaskno(dbMemo.getString("taskno")); //                    mesOutFeedback.setTaskname(dbMemo.getString("taskname")); //                    mesOutFeedback.setProductLineId(dbMemo.getString("ProductLineId")); //                    mesOutFeedback.setStationId(dbMemo.getString("StationID")); //                    mesOutFeedback.setItemno(orderDetl.getMatnr()); //                    mesOutFeedback.setTuoPanId(zpalletId); //                    mesOutFeedback.setQty(orderDetl.getQty().intValue()); //                    if (!StringUtils.isEmpty(dbMemo.getString("ItemBarcode"))) { //                        mesOutFeedback.setItemBarcode(barCodeStrToList(dbMemo.getString("ItemBarcode"))); //                    } //                    mesOutFeedback.setOrderNo(orderNo); //                } //            }             EntityWrapper<TaskDetl> entityWrapper = new EntityWrapper<>();             entityWrapper.eq("wrk_no", agvTask.getWrkNo());             TaskDetl taskDetl = taskDetlService.selectOne(entityWrapper);             String zpalletId = taskDetl.getZpallet();             List<String> itemBarCode = new ArrayList<>();             JSONArray array = JSONArray.parseArray(taskDetl.getMemo());             for (Object one : array) {                 itemBarCode.add(one.toString());                 // TODO:入库时存储零件码(ItemBarCode),并绑定托盘,出库后这里考虑解绑             }             MesOutFeedback mesOutFeedback = new MesOutFeedback();             mesOutFeedback.setTaskno(agvTask.getTaskNo());             mesOutFeedback.setTaskname(dbMemo.getString("taskname"));             mesOutFeedback.setProductLineId(dbMemo.getString("ProductLineId"));             mesOutFeedback.setStationId(dbMemo.getString("StationId"));             mesOutFeedback.setItemno(dbMemo.getString("Itemno"));             mesOutFeedback.setTuoPanId(zpalletId);             if (itemBarCode.size() > 0) {                 mesOutFeedback.setQty(itemBarCode.size());                 mesOutFeedback.setItemBarcode(itemBarCode);             }             mesOutFeedback.setOrderNo(orderNo);             String url = MES_URL + "issueComplete";             String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(mesOutFeedback));             if (!StringUtils.isEmpty(response) && response.contains("Success")){                 MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);                 if("1".equals(mesReturn.getSuccess())) {                     success = 1;                 }             }         }         return success;     }     /**      * 入库完成      * 入库后,按托推送,非整个订单      *      * @param orderNo      * @param zapplet      * @return      */     public int inFeedbackByTuo(String orderNo, String zapplet) {         int success = 0;         OrderPakin order = orderPakinService.selectByNo(orderNo);         if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {             List<MesInApply.ProductInfo> list = new ArrayList<>();             // 从托盘绑定的零件二维码中查询信息             EntityWrapper<MatItemBarcode> matItemBarcodeEntityWrapper = new EntityWrapper<>();             matItemBarcodeEntityWrapper.eq("zapplet", zapplet).eq("status", 1);             List<MatItemBarcode> barcodes = matItemBarcodeMapper.selectList(matItemBarcodeEntityWrapper);             for (MatItemBarcode barcode : barcodes) {                 MesInApply.ProductInfo productInfo = new MesInApply.ProductInfo();                 productInfo.setItemBarcode(barcode.getItemBarcode());                 productInfo.setQualityStatus(barcode.getQualityStatus());                 list.add(productInfo);             }             MesInApply result = JSONObject.parseObject(order.getMemo(), MesInApply.class);             result.setProductInfo(list);             result.setQty(list.size());             String url = MES_URL + "loadComplete";             String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(result));             if (!StringUtils.isEmpty(response) && response.contains("Success")){                 MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);                 if("1".equals(mesReturn.getSuccess())) {                     success = 1;                 }             }         }         return success;     }     /**      * 零件二维码,数组转string      *      * @param list      * @return      */     public static String barCodeListToStr(List<String> list) {         if(list.isEmpty()) {             return "";         }         StringBuilder stringBuilder = new StringBuilder();         for (String str : list) {             stringBuilder.append(str).append(",");         }         String result = stringBuilder.toString();         return result.endsWith(",") ? result.substring(0, result.length() - 1) : result;     }     /**      * 零件二维码,string转数组      *      * @param str      * @return      */     public static List<String> barCodeStrToList(String str) {         String[] array = str.split(",");         return Arrays.asList(array);     }     /**      * 入库完成      * 入库单完成后,整单推送      *      * @param orderNo      * @return      */     public int inFeedback(String orderNo) {         int success = 0;         OrderPakin order = orderPakinService.selectByNo(orderNo);         if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {             EntityWrapper<OrderDetlPakin> wrapper = new EntityWrapper<>();             wrapper.eq("order_no", orderNo);             List<OrderDetlPakin> orderDetlPakins = orderDetlPakinService.selectList(wrapper);             if (orderDetlPakins != null && !orderDetlPakins.isEmpty()) {                 for (OrderDetlPakin orderDetl : orderDetlPakins) {                     MesInApply result = JSONObject.parseObject(order.getMemo(), MesInApply.class);                     result.setQty(orderDetl.getQty().intValue());                     String url = MES_URL + "loadComplete";                     String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(result));                     if (!StringUtils.isEmpty(response) && response.contains("Success")){                         MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);                         if("1".equals(mesReturn.getSuccess())) {                             success++;                         }                     }                 }                 if (success == orderDetlPakins.size()) {                     success = 1;                 } else {                     success = 0;                 }             }         }         return success;     }     /**      * (备份)出库订单完成      *      * @param orderNo      * @return      */     public int outFeedback(String orderNo) {         int success = 0;         OrderPakout order = orderPakoutService.selectByNo(orderNo);         if (order != null && order.getSettle() == 4) {   // 校验是否完成             JSONObject dbMemo = JSONObject.parseObject(order.getMemo());             EntityWrapper<OrderDetlPakout> wrapper = new EntityWrapper<>();             wrapper.eq("order_no", orderNo);             List<OrderDetlPakout> orderDetlPakouts = orderDetlPakoutService.selectList(wrapper);             if (orderDetlPakouts != null && !orderDetlPakouts.isEmpty()) {                 for (OrderDetlPakout orderDetl : orderDetlPakouts) {                     StringBuilder palletId = new StringBuilder();                     EntityWrapper<WaitPakin> wrapper2 = new EntityWrapper<>();                     wrapper2.eq("order_no", orderDetl.getOrderNo());                     List<WaitPakin> waitPakins = waitPakinService.selectList(wrapper2);                     if (waitPakins != null && waitPakins.size() > 0) {                         for (WaitPakin waitPakin : waitPakins) {                             palletId.append(waitPakin.getZpallet()).append(",");                         }                     }                     MesOutFeedback mesOutFeedback = new MesOutFeedback();                     mesOutFeedback.setTaskno(dbMemo.getString("taskno"));                     mesOutFeedback.setTaskname(dbMemo.getString("taskname"));                     mesOutFeedback.setProductLineId(dbMemo.getString("ProductLineId"));                     mesOutFeedback.setStationId(dbMemo.getString("StationID"));                     mesOutFeedback.setItemno(orderDetl.getMatnr());                     if (!StringUtils.isEmpty(palletId.toString())) {                         mesOutFeedback.setTuoPanId(palletId.substring(0, palletId.length() - 1));                     }                     mesOutFeedback.setQty(orderDetl.getQty().intValue());                     if (!StringUtils.isEmpty(dbMemo.getString("ItemBarcode"))) {                         mesOutFeedback.setItemBarcode(barCodeStrToList(dbMemo.getString("ItemBarcode")));                     }                     mesOutFeedback.setOrderNo(orderNo);                     // TODO:备注:出库完成后解绑托盘和物料,若前面未解绑,此处需要解绑                     String url = MES_URL + "issueComplete";                     String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(mesOutFeedback));                     if (!StringUtils.isEmpty(response) && response.contains("Success")){                         MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);                         if("1".equals(mesReturn.getSuccess())) {                             success++;                         }                     }                 }                 if (success == orderDetlPakouts.size()) {                     success = 1;                     // TODO:立库出库后自动调度AGV运送到站点                     String taskNo = dbMemo.getString("taskno");                     if (!StringUtils.isEmpty(taskNo)) {                         TransTask transTask = new TransTask();                         transTask.setTaskno(dbMemo.getString("taskno"));                         transTask.setTaskname(dbMemo.getString("taskname"));                         transTask.setOrderNo(dbMemo.getString("OrderNo"));                         transTask.setTransType(dbMemo.getString("TransType")); //                    transTask.setCurProcess();                         transTask.setCurStationId(WMS_TRANS_START_STATION_3);                         transTask.setNextProcess(dbMemo.getString("ProductLineId"));                         transTask.setNextStationId(dbMemo.getString("StationId"));                         transTask.setItemno(dbMemo.getString("Itemno"));                         transTask.setQty(dbMemo.getInteger("Qty"));                         transTask.setProductLineId(dbMemo.getString("ProductLineId"));                         transTask.setItemBarcode(barCodeStrToList(dbMemo.getString("ItemBarcode")));                         transTask.setOperateType(1);                         transTask.setAgvFactory(1);                         JSONObject sendAgvTask = submitTask(transTask);                         if (!"1".equals(sendAgvTask.getString("Success"))) {                             log.error("出库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));                         }                     }                 } else {                     success = 0;                 }             }         }         return success;     }     /**      * 出库申请(叫料),装配库、滑块库      *      * @param mesCallOutApply      * @return      */     public int callOutBoundOrder(MesCallOutApply mesCallOutApply){         // docType根据库类型确定         long docType = 7;         long settle = 1;         // 校验订单是否重复         OrderPakout order = orderPakoutService.selectByNo(mesCallOutApply.getOrderNo());         if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {             return -1;         }         // 生成订单         Date now = new Date();         OrderPakout orderPakout = new OrderPakout();         orderPakout.setUuid(String.valueOf(snowflakeIdWorker.nextId()));         orderPakout.setOrderNo(mesCallOutApply.getOrderNo());         orderPakout.setOrderTime(com.core.common.DateUtils.convert(now));         orderPakout.setDocType(docType);         orderPakout.setSettle(settle);         orderPakout.setStatus(1);         orderPakout.setCreateBy(defaultUserId);         orderPakout.setCreateTime(now);         orderPakout.setUpdateBy(defaultUserId);         orderPakout.setUpdateTime(now);         orderPakout.setMemo(JSONObject.toJSONString(mesCallOutApply));         orderPakout.setPakinPakoutStatus(2);         if (!orderPakoutService.insert(orderPakout)) {             log.error("MES保存出库订单(叫料)主档失败");             throw new CoolException("保存出库订单(叫料)主档失败");         }         // 生成明细         if (mesCallOutApply.getItemdata() != null && !mesCallOutApply.getItemdata().isEmpty()) {             for (MesCallOutApply.MesOutApplyItem mesOutApplyItem : mesCallOutApply.getItemdata()) {                 Mat mat = matService.selectByMatnr(mesOutApplyItem.getItemno());                 OrderDetlPakout orderDetlPakout = new OrderDetlPakout();                 orderDetlPakout.setOrderId(orderPakout.getId());                 orderDetlPakout.setOrderNo(orderPakout.getOrderNo());                 orderDetlPakout.setAnfme(Double.valueOf(mesOutApplyItem.getQty()));                 orderDetlPakout.setQty(0.0);                 orderDetlPakout.setMatnr(mat.getMatnr());                 orderDetlPakout.setMaktx(mat.getMaktx());                 orderDetlPakout.setSpecs(mat.getSpecs());                 orderDetlPakout.setModel(mat.getModel());                 orderDetlPakout.setThreeCode(mesOutApplyItem.getItemBarcode());                 orderDetlPakout.setStandby1(mesOutApplyItem.getTrayid());   //保存配盘号,非托盘号                 orderDetlPakout.setCreateBy(defaultUserId);                 orderDetlPakout.setCreateTime(now);                 orderDetlPakout.setUpdateBy(defaultUserId);                 orderDetlPakout.setUpdateTime(now);                 orderDetlPakout.setStatus(1);                 orderDetlPakout.setPakinPakoutStatus(2);                 if (!orderDetlPakoutService.insert(orderDetlPakout)) {                     log.error("MES保存出库订单(叫料)明细档失败");                     throw new CoolException("保存出库订单(叫料)明细档失败");                 }             }         }         return 1;     }     // endregion     // region 搬运任务调度     // route转发3个WCS任务     @Resource     private BasDevpMapper basDevpMapper;     /**      * 9.1下发运输任务      *      * @param transTask      * @return      */     @Transactional     public JSONObject submitTask(TransTask transTask) {         JSONObject result = new JSONObject();         result.put("taskno", transTask.getTaskno());         // 重复性校验         EntityWrapper<Task> wrapper = new EntityWrapper<>();         wrapper.eq("task_no", transTask.getTaskno());         List<Task> tasks = taskService.selectList(wrapper);         if (tasks != null && !tasks.isEmpty()) {             log.error("agv任务号重复:{}", transTask.getTaskno());             result.put("Success", "2");             result.put("Message", "agv任务号重复:" + transTask.getTaskno());             return result;         }         // 下发给RCS         RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();         // 模板名         if(transTask.getCurStationId().startsWith("LL") || transTask.getCurStationId().startsWith("LJ")                 || transTask.getCurStationId().startsWith("LG") || transTask.getCurStationId().startsWith("LT")) { // 起点产线             rcsTaskSubmit.setTaskType("JJIN");         } else if(transTask.getNextStationId().startsWith("LL") || transTask.getNextStationId().startsWith("LJ")                 || transTask.getNextStationId().startsWith("LG") || transTask.getNextStationId().startsWith("LT")) { // 终点产线             rcsTaskSubmit.setTaskType("JJOUT");         } else if(transTask.getCurStationId().startsWith("B")) { // 不涉及产线,起点接驳位,入库             rcsTaskSubmit.setTaskType("CS4");         } else if(transTask.getNextStationId().startsWith("B")){  // 不涉及产线,终点接驳位,出库             rcsTaskSubmit.setTaskType("CS3");         } else {             log.error("根据起点:{},终点:{},无法匹配模板", transTask.getCurStationId(),transTask.getNextStationId());             result.put("Success", "2");             result.put("Message", "根据起点:"+transTask.getCurStationId()+",终点:"+transTask.getNextStationId()+",无法匹配模板");             return result;         }         rcsTaskSubmit.setRobotTaskCode(transTask.getTaskno());         rcsTaskSubmit.setInitPriority(10);  //默认10         List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();         RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute();         RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute();         startRoute.setSeq(0);         startRoute.setOperation("COLLECT");         endRoute.setSeq(1);         endRoute.setOperation("DELIVERY");         String curStationId = transTask.getCurStationId(); // 起点         String nextStationId = transTask.getNextStationId(); // 终点         // 起点和终点是输送线时 根据托盘码给AGV不同的站点         startRoute.setCode(transTask.getCurStationId());         if (curStationId.equals("202") || curStationId.equals("204") || curStationId.equals("205")) {             if(curStationId.equals("202") || curStationId.equals("204")) {                 startRoute.setCode(transTask.getCurStationId() + (transTask.getTuoPanId().startsWith("11") ? "-2" : "-1"));             }             // 出库先绑定载具             SiteBind siteBind = new SiteBind("SITE", startRoute.getCode(), "POD", transTask.getTuoPanId(), "BIND");             RcsReturn carrierBindReturn = rcsService.siteBind(siteBind);             if (!carrierBindReturn.getCode().equals("SUCCESS")) {                 log.error("出库绑定载具失败:{}", JSONObject.toJSONString(carrierBindReturn));                 result.put("Success", "2");                 result.put("Message", "出库绑定载具失败:" + JSONObject.toJSONString(carrierBindReturn));                 return result;             }         }         endRoute.setCode(transTask.getNextStationId());         if(nextStationId.equals("202") || nextStationId.equals("204")) {             endRoute.setCode(transTask.getNextStationId() + (transTask.getTuoPanId().startsWith("11") ? "-2" : "-1"));         }         targetRouteList.add(startRoute);         targetRouteList.add(endRoute);         rcsTaskSubmit.setTargetRoute(targetRouteList);         // 转发给海康或华晓RCS         RcsReturn rcsReturn = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());         if (rcsReturn.getCode().equals("SUCCESS")) {             int workNo = commonService.getWorkNo(WorkNoType.OTHER.type);             Date now = new Date();             Task task = new Task();             task.setWrkNo(workNo);             task.setTaskType("AGV");             task.setWrkSts(301L);             task.setIoType(3);             task.setIoPri(10.00);             task.setWrkDate(now);             task.setSourceStaNo(transTask.getCurStationId());             task.setStaNo(transTask.getNextStationId());             task.setBarcode(transTask.getTuoPanId());             task.setModiUser(defaultUserId);             task.setModiTime(now);             task.setAppeUser(defaultUserId);             task.setAppeTime(now);             task.setTaskNo(transTask.getTaskno());             task.setMemo(JSONObject.toJSONString(transTask));             taskService.insert(task);             Mat mat = matService.selectByMatnr(transTask.getItemno());             TaskDetl taskDetl = new TaskDetl();             taskDetl.setWrkNo(task.getWrkNo());             taskDetl.setIoTime(task.getIoTime());             taskDetl.setMatnr(transTask.getItemno());             taskDetl.setAnfme(0.0); //            taskDetl.setStandby1(String.valueOf(transTask.getQty()));             taskDetl.setMaktx(mat.getMaktx());             taskDetl.setSpecs(mat.getSpecs());             taskDetl.setOrderNo(transTask.getOrderNo());             taskDetl.setZpallet(transTask.getTuoPanId());             taskDetl.setMemo(Cools.isEmpty(transTask.getItemBarcode()) ? "":barCodeListToStr(transTask.getItemBarcode()));             taskDetl.setModiUser(defaultUserId);             taskDetl.setModiTime(now);             taskDetl.setAppeUser(defaultUserId);             taskDetl.setAppeTime(now);             taskDetlService.insert(taskDetl);             result.put("Success", "1");             result.put("Message", "任务接收成功");             // 出入库任务控制 入库暂存+1             if(task.getStaNo().equals("205")) {                 basDevpMapper.updateInQty(Integer.parseInt(task.getStaNo()),1);             }         } else {             result.put("Success", "2");             result.put("Message", "任务下发给RCS失败");         }         return result;     }     /**      * 9.2返回任务执行结果      *      * @param rcsReporterTask      * @return      */     public int reporterTask(RcsReporterTask rcsReporterTask) {         // 结果汇总         boolean completed = true;         EntityWrapper<Task> wrapper = new EntityWrapper<>();         wrapper.eq("task_no", rcsReporterTask.getRobotTaskCode());         List<Task> tasks = taskService.selectList(wrapper);         if (tasks != null && !tasks.isEmpty()) {             for (Task task : tasks) {                 if (task.getWrkSts() != 304) {   // TODO:确认完成,可能存在多盘任务                     completed = false;                 }             }         }         if (completed) {             TransTaskFeedback transTaskFeedback = new TransTaskFeedback();             transTaskFeedback.setTaskno(rcsReporterTask.getRobotTaskCode()); //            transTaskFeedback.setTaskname();             transTaskFeedback.setResult(1);             String url = MES_URL + "api/task/reporter";             String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(transTaskFeedback));             if (!StringUtils.isEmpty(response) && response.contains("Success")){                 MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);                 if("1".equals(mesReturn.getSuccess())) {                     return 1;                 }             }         }         return 0;     }     /**      * 9.8申请华晓AGV进入生产线      *      * @param apply      * @return      */     public String applyInLine(TransParent apply) {         String url = MES_URL + "api/apply/inLine";         String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));         if (!StringUtils.isEmpty(response) && response.contains("Success")){             JSONObject jsonObject = JSONObject.parseObject(response);             if("1".equals(jsonObject.getString("Success"))) {                 return jsonObject.getJSONObject("Data").getString("status");             }         }         return "N";     }     /**      * 入站请求:转发AGV->入站请求->给MES      *      * @param apply      * @return      */     public int applyInStation(TransParent apply) {         String path = ("LL").equals(apply.getProductLineId()) || ("LJ").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")){             MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);             if("1".equals(mesReturn.getSuccess())) {                 return 1;             }         }         return 0;     }     /**      * 入站允许:转发MES->允许入站->给AGV      *      * @param allow      * @return      */     public MesReturn allowInStation(TransInOutStationAllow allow) {         MesReturn mesReturn = new MesReturn();         mesReturn.setSuccess("1");         if ("Y".equals(allow.getStatus())) {             RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();             rcsTaskContinue.setRobotTaskCode(allow.getTaskno());             rcsTaskContinue.setTriggerType("TASK");             rcsTaskContinue.setTriggerCode(allow.getTaskno()); //            rcsTaskContinue.setTriggerType("ROBOT"); //            rcsTaskContinue.setTriggerCode(allow.getAgvCode());             int success = rcsService.continueTask(rcsTaskContinue, 1);             mesReturn.setSuccess(success == 1 ? "1" : "2");             mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");         }         return mesReturn;     }     /**      * 到站完成:转发AGV->到站完成->给MES      *      * @param arrivalStation      * @return      */     public int arriveOnStation(TransArrivalStation arrivalStation) {         if ("01".equals(arrivalStation.getDaotype())) {             arrivalStation.setItemno(null);             arrivalStation.setItemBarcode(new ArrayList<>());             arrivalStation.setOrderNo(null);         }         String path = ("LL").equals(arrivalStation.getProductLineId()) || ("LJ").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);             if("1".equals(mesReturn.getSuccess())) {                 return 1;             }         }         return 0;     }     /**      * 离站请求:转发AGV->离站请求->给MES      *      * @param apply      * @return      */     public int applyOutStation(TransParent apply) {         String url = MES_URL + "api/apply/outStation";         String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));         if (!StringUtils.isEmpty(response) && response.contains("Success")){             MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);             if("1".equals(mesReturn.getSuccess())) {                 return 1;             }         }         return 0;     }     /**      * 离站允许:转发MES->允许离站->给AGV      *      * @param allow      * @return      */     public MesReturn allowOutStation(TransInOutStationAllow allow) {         MesReturn mesReturn = new MesReturn();         mesReturn.setSuccess("1");         if ("Y".equals(allow.getStatus())) {             RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();             rcsTaskContinue.setRobotTaskCode(allow.getTaskno());             rcsTaskContinue.setTriggerType("TASK");             rcsTaskContinue.setTriggerCode(allow.getTaskno());             int success = rcsService.continueTask(rcsTaskContinue, checkRcsFactory(allow.getAgvCode()));             mesReturn.setSuccess(success == 1 ? "1" : "2");             mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");         }         return mesReturn;     }     /**      * 离站完成:转发AGV->离站完成->给MES      *      * @param apply      * @return      */     public int outStation(TransParent apply) {         String path = ("LL").equals(apply.getProductLineId()) || ("LJ").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);             if("1".equals(mesReturn.getSuccess())) {                 return 1;             }         }         return 0;     }     @Override     public MesReturn queryInventory(String itemno,String orderNo) {         MesReturn mesReturn = new MesReturn();         mesReturn.setSuccess("1");         List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("matnr", itemno).eq("order_no",orderNo));         int count = 0;         for(LocDetl locDetl:locDetls) {             count += locDetl.getAnfme();         }         mesReturn.setMessage(String.valueOf(count));         return mesReturn;     }     // endregion     /**      * 查询Rcs地址      *      * @param agvNo      * @return 1 海康;2 华晓      */     private int checkRcsFactory(String agvNo) {         AgvInfo agvInfo = agvInfoMapper.selectById(agvNo);         return agvInfo.getAgvFactory();     } }