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; 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.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.enums.WorkNoType; import com.zy.common.service.CommonService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; 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.concurrent.ExecutionException; import java.util.stream.Collectors; import java.util.stream.Stream; @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; @Autowired private DocTypeService docTypeService; @Autowired private OrderService orderService; // region MES接口 /** * 物料信息同步,MES->WMS * 功能:同步物料信息->生成入库单 * 后续流程:入库时,需要实时调用recvFeedback返回入库数量 * * @param matRecvForm * @return */ @Transactional(rollbackFor = Exception.class) public MesReturn matInfoAndInBound(MesMatRecvForm matRecvForm) throws CoolException { MesReturn mesReturn = new MesReturn(); // 1、物料信息同步 int matSuccess = 0; for (MesMatInfo mesMatInfo : matRecvForm.getItemdata()) { if (synMatInfo(mesMatInfo) == 1) { matSuccess++; } else { throw new CoolException("同步物料信息失败"); } } // 2、生成入库单 if (inBoundOrder_List(matRecvForm) == 1) { mesReturn.setSuccess("1"); mesReturn.setMessage(""); } else { throw new CoolException("同步物料信息,生成入库单失败"); } mesReturn.setSuccess("1"); mesReturn.setMessage(""); 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 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 { return -1; } return 1; } /** * 物料同步入库单,按OrderNo生成多个订单 * * @param matRecvForm * @return */ public int inBoundOrder_List(MesMatRecvForm matRecvForm) { long docType = 1; // docType根据库类型确定 来料申请单 long settle = 1; Date now = new Date(); // 按OrderNo分组,然后再生成入库单 List mesInApply = matRecvForm.getItemdata(); Map> map = mesInApply.stream().collect(Collectors.groupingBy(MesMatInfo::getOrderNo)); for (Map.Entry> entry : map.entrySet()) { List list = entry.getValue(); // 校验订单是否重复 OrderPakin order = orderPakinService.selectByNo(entry.getKey()); // 如果单据不存在则添加;如果单据存在,作业中无法修改,反之则修改单据 if (!Cools.isEmpty(order)) { if (order.getSettle() > 1L) { throw new CoolException(entry.getKey() + "正在出库,无法修改单据"); } orderPakinService.remove(order.getId()); } // 生成订单 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(1L); orderPakin.setStatus(1); orderPakin.setCreateBy(defaultUserId); orderPakin.setCreateTime(now); orderPakin.setUpdateBy(defaultUserId); orderPakin.setUpdateTime(now); orderPakin.setMemo(JSONObject.toJSONString(newMemo)); //为出库完成反馈保存 orderPakin.setPakinPakoutStatus(1); orderPakinService.insert(orderPakin); if (list != null && !list.isEmpty()) { for (MesMatInfo mesMatInfo : list) { // 生成明细 Mat mat = matService.selectByMatnr(mesMatInfo.getItemNo()); if (Cools.isEmpty(mat)) { log.error("该物料编号立库没有=" + mesMatInfo.getItemNo()); continue; } OrderDetlPakin orderDetlPakin = new OrderDetlPakin(); orderDetlPakin.setOrderId(orderPakin.getId()); orderDetlPakin.setOrderNo(orderPakin.getOrderNo()); orderDetlPakin.setAnfme(Double.valueOf(mesMatInfo.getQty())); orderDetlPakin.setQty(0.0); orderDetlPakin.setMatnr(mat.getMatnr()); orderDetlPakin.setMaktx(mat.getMaktx()); orderDetlPakin.setSpecs(mat.getSpecs()); orderDetlPakin.setModel(mat.getModel()); // orderDetlPakin.setThreeCode(mesOutApplyItem.getItemBarcode()); // orderDetlPakin.setStandby1(mesOutApplyItem.getTrayid()); //保存配盘号,非托盘号 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); } } } 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 list = new ArrayList<>(); JSONObject dbMemo = JSONObject.parseObject(order.getMemo()); // 从组托信息中查询入库的信息 EntityWrapper waitPakinEntityWrapper = new EntityWrapper<>(); waitPakinEntityWrapper.eq("zpallet", zapplet); List zpalletMat = waitPakinService.selectList(waitPakinEntityWrapper); EntityWrapper wrapper = new EntityWrapper<>(); wrapper.eq("order_no", orderNo); List 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 matItemBarcodeEntityWrapper = new EntityWrapper<>(); matItemBarcodeEntityWrapper.eq("zapplet", zapplet).eq("status", 1); List barcodes = matItemBarcodeMapper.selectList(matItemBarcodeEntityWrapper); if (barcodes != null) { List 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 订单重复; */ public int outBoundOrder(MesOutApply mesOutApply) { // // 空托出库 // if (StringUtils.isEmpty(mesOutApply.getOrderNo()) && "01".equals(mesOutApply.getTransType())) { // // 生成空托出库任务 // mobileService.callEmptyBinOutBound(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); // } // // return 1; // } else { // 毛坯(物料)出库 // // docType根据库类型确定 // long docType = 7; // long settle = 1; // // // 校验订单是否重复 // OrderPakout order = orderPakoutService.selectByNo(mesOutApply.getOrderNo()); // if (order != null && !StringUtils.isEmpty(order.getOrderNo())) { // log.error("出库订单号重复:{}", mesOutApply.getOrderNo()); // return -1; // } // // // 生成订单 // 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); // 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.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.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("保存出库订单明细档失败"); // } // // // TODO:若AGV和输送线没有安全交互,则要保证立库出货完成后再呼叫AGV。 // // 立库生成订单后,自动调度AGV运送到站点,目前多托生成多个。 // try { // if (!StringUtils.isEmpty(mesOutApply.getTaskno()) && !StringUtils.isEmpty(mesOutApply.getStationId())) { // // 按零件二维码查询有几个托,多托生成多个任务,每托对应零件二维码 // String barCode = barCodeListToStr(mesOutApply.getItemBarcode()); // EntityWrapper matItemBarcodeEntityWrapper = new EntityWrapper<>(); // matItemBarcodeEntityWrapper.in("item_barcode", barCode); // List barcodes = matItemBarcodeMapper.selectList(matItemBarcodeEntityWrapper); // if (barcodes != null) { // Map> map = barcodes.stream().collect(Collectors.groupingBy(MatItemBarcode::getZapplet)); // for (Map.Entry> entry : map.entrySet()) { // List list = entry.getValue(); // List 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(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); // } // } return 1; } /** * 入库申请 * 收到入库申请后自动呼叫AGV取货 * * @param mesInApply */ @Transactional public int inBoundOrder(MesInApply mesInApply) { // 空托回库 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(WMS_TRANS_START_STATION_2); transTask.setItemno(WMS_ZPALLET_ID); // 固定为空托的编码 transTask.setQty(1); // 空托只回1个 transTask.setProductLineId(mesInApply.getProductLineId()); transTask.setOperateType(1); transTask.setAgvFactory(1); 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()); if (mesInApply.getProductInfo() != null) { orderDetlPakin.setStandby1(JSONObject.toJSONString(mesInApply.getProductInfo())); //零件详情存在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); List 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(), 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从产线运回立库 try { 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(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)); } } } catch (Exception e) { log.error("下发AGV运输任务失败", e); } } 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 wrapper = new EntityWrapper<>(); // wrapper.eq("order_no", orderNo); // List orderDetlPakouts = orderDetlPakoutService.selectList(wrapper); // if (orderDetlPakouts != null && !orderDetlPakouts.isEmpty()) { // for (OrderDetlPakout orderDetl : orderDetlPakouts) { // StringBuilder palletId = new StringBuilder(); // EntityWrapper wrapper2 = new EntityWrapper<>(); // wrapper2.eq("order_no", orderDetl.getOrderNo()); // List 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 entityWrapper = new EntityWrapper<>(); entityWrapper.eq("wrk_no", agvTask.getWrkNo()); TaskDetl taskDetl = taskDetlService.selectOne(entityWrapper); String zpalletId = taskDetl.getZpallet(); List 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 != null && 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 list = new ArrayList<>(); // 从托盘绑定的零件二维码中查询信息 EntityWrapper matItemBarcodeEntityWrapper = new EntityWrapper<>(); matItemBarcodeEntityWrapper.eq("zapplet", zapplet).eq("status", 1); List 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 list) { 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 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 wrapper = new EntityWrapper<>(); wrapper.eq("order_no", orderNo); List 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 wrapper = new EntityWrapper<>(); wrapper.eq("order_no", orderNo); List orderDetlPakouts = orderDetlPakoutService.selectList(wrapper); if (orderDetlPakouts != null && !orderDetlPakouts.isEmpty()) { for (OrderDetlPakout orderDetl : orderDetlPakouts) { StringBuilder palletId = new StringBuilder(); EntityWrapper wrapper2 = new EntityWrapper<>(); wrapper2.eq("order_no", orderDetl.getOrderNo()); List 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_1); 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 docType = docTypeService.selectOne(new EntityWrapper().eq("doc_name", mesCallOutApply.getTransType())); if (docType == null) { return 0; } //生成出库单 if (docType.getPakout() == 1) { long settle = 1; // 校验订单是否重复 OrderPakout order = orderPakoutService.selectByNo(mesCallOutApply.getOrderNo()); // 如果单据不存在则添加;如果单据存在,作业中无法修改,反之则修改单据 if (!Cools.isEmpty(order)) { if (order.getSettle() > 1L) { throw new CoolException(mesCallOutApply.getOrderNo() + "正在出库,无法修改单据"); } orderPakoutService.remove(order.getId()); } // 生成订单 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.getDocId()); 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); orderPakout.setCstmrName(mesCallOutApply.getStationId());//agv目标站点 if (!orderPakoutService.insert(orderPakout)) { log.error("MES保存出库订单(叫料)主档失败"); throw new CoolException("保存出库订单(叫料)主档失败"); } Set set = new HashSet<>(); // 生成明细 if (mesCallOutApply.getItemdata() != null && !mesCallOutApply.getItemdata().isEmpty()) { for (MesCallOutApply.MesOutApplyItem mesOutApplyItem : mesCallOutApply.getItemdata()) { set.add(mesOutApplyItem.getTrayid()); 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("保存出库订单(叫料)明细档失败"); } } } //有多少种不同的配盘号 只有配盘出库单需要知道 if (mesCallOutApply.getTransType().equals("配盘出库单")) { orderPakout.setPayType(set.size()); String shipCode = mesCallOutApply.getItemdata().get(0).getTrayid().split("-")[2]; orderPakout.setShipCode(shipCode);//区域 是否是特殊托盘 orderPakoutService.updateById(orderPakout); } return 1; } else { // 校验订单是否重复 OrderPakin order = orderPakinService.selectByNo(mesCallOutApply.getOrderNo()); // 如果单据不存在则添加;如果单据存在,作业中无法修改,反之则修改单据 if (!Cools.isEmpty(order)) { if (order.getSettle() > 1L) { throw new CoolException(mesCallOutApply.getOrderNo() + "正在出库,无法修改单据"); } orderPakinService.remove(order.getId()); } // 生成订单 Date now = new Date(); OrderPakin orderPakin = new OrderPakin(); orderPakin.setUuid(String.valueOf(snowflakeIdWorker.nextId())); orderPakin.setOrderNo(mesCallOutApply.getOrderNo()); orderPakin.setOrderTime(com.core.common.DateUtils.convert(now)); orderPakin.setDocType(docType.getDocId()); orderPakin.setSettle(1L); orderPakin.setStatus(1); orderPakin.setCreateBy(defaultUserId); orderPakin.setCreateTime(now); orderPakin.setUpdateBy(defaultUserId); orderPakin.setUpdateTime(now); orderPakin.setMemo(JSONObject.toJSONString(mesCallOutApply)); //为出库完成反馈保存 orderPakin.setPakinPakoutStatus(1); orderPakinService.insert(orderPakin); if (mesCallOutApply.getItemdata() != null && !mesCallOutApply.getItemdata().isEmpty()) { for (MesCallOutApply.MesOutApplyItem mesOutApplyItem : mesCallOutApply.getItemdata()) { // 生成明细 Mat mat = matService.selectByMatnr(mesOutApplyItem.getItemno()); if (Cools.isEmpty(mat)) { log.error("该物料编号立库没有=" + mesOutApplyItem.getItemno()); continue; } OrderDetlPakin orderDetlPakin = new OrderDetlPakin(); orderDetlPakin.setOrderId(orderPakin.getId()); orderDetlPakin.setOrderNo(orderPakin.getOrderNo()); orderDetlPakin.setAnfme(Double.valueOf(mesOutApplyItem.getQty())); orderDetlPakin.setQty(0.0); orderDetlPakin.setMatnr(mat.getMatnr()); orderDetlPakin.setMaktx(mat.getMaktx()); orderDetlPakin.setSpecs(mat.getSpecs()); orderDetlPakin.setModel(mat.getModel()); orderDetlPakin.setThreeCode(mesOutApplyItem.getItemBarcode()); orderDetlPakin.setStandby1(mesOutApplyItem.getTrayid()); //保存配盘号,非托盘号 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); } } return 1; } } // endregion // region 搬运任务调度 // route转发3个WCS任务 /** * 9.1下发运输任务 * TODO:其他库的任务全部转到滑块库统一调度 * * @param transTask * @return */ @Transactional public JSONObject submitTask(TransTask transTask) { JSONObject result = new JSONObject(); result.put("taskno", transTask.getTaskno()); // 重复性校验 EntityWrapper wrapper = new EntityWrapper<>(); wrapper.eq("task_no", transTask.getTaskno()); List 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; } int workNo = commonService.getWorkNo(WorkNoType.OTHER.type); Date now = new Date(); Task task = new Task(); task.setWrkNo(workNo); task.setTaskType("ZX-AGV"); task.setWrkSts(301L);//301.AGV任务创建 task.setIoType(3);//3.站到站 task.setIoPri(10.00); task.setWrkDate(now); task.setBarcode(transTask.getBarcode()); 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)); task.setPltType(transTask.getAgvFactory());//华晓AGV task.setPacked(transTask.getRackNumber());//料架号 task.setCtnType(1); if (taskService.insert(task)) { result.put("Success", "1"); result.put("Message", "任务接收成功"); }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 wrapper = new EntityWrapper<>(); wrapper.eq("task_no", rcsReporterTask.getRobotTaskCode()); List 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 = "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("2"); if ("Y".equals(allow.getStatus())) { Task task = taskService.selectOne(new EntityWrapper().eq("task_no", allow.getTaskno())); if (Cools.isEmpty(task)) { mesReturn.setMessage("没有找个该任务编号=" + allow.getTaskno() + "的AGV移动任务"); } else { //查看申请站点的是海康还是华晓 //海康 if (Cools.isEmpty(task.getPltType()) || task.getPltType() == 1) { 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失败"); } else { allow.setMethod("APPLY_IN_STATION"); int success = rcsService.continueTask(allow, 2); 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 url = MES_URL + "AGVArrivalCompleted"; 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 + "AGVDepartureRequest"; 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("2"); if ("Y".equals(allow.getStatus())) { Task task = taskService.selectOne(new EntityWrapper().eq("task_no", allow.getTaskno())); if (Cools.isEmpty(task)) { mesReturn.setMessage("没有找个该任务编号=" + allow.getTaskno() + "的AGV移动任务"); } else { //查看申请站点的是海康还是华晓 //海康 if (Cools.isEmpty(task.getPltType()) || task.getPltType() == 1) { 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失败"); } else { allow.setMethod("APPLY_OFF_STATION"); int success = rcsService.continueTask(allow, 2); mesReturn.setSuccess(success == 1 ? "1" : "2"); mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败"); } } } return mesReturn; } /** * 离站完成:转发AGV->离站完成->给MES * * @param apply * @return */ public int outStation(TransParent apply) { String url = MES_URL + "AGVDepartureCompleted"; 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 locDetls = locDetlService.selectList(new EntityWrapper().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(); } }