package com.zy.asrs.service.impl; import com.alibaba.excel.util.DateUtils; import com.alibaba.excel.util.StringUtils; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.R; 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.rcs.*; import com.zy.asrs.mapper.AgvInfoMapper; import com.zy.asrs.service.*; import com.zy.common.model.enums.WorkNoType; import com.zy.common.service.CommonService; import lombok.extern.slf4j.Slf4j; 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.time.OffsetDateTime; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service public class MesServiceImpl implements MesService { @Value("${mes.url}") public String MES_URL; @Value("${dj.url}") public String DJ_URL; @Value("${wms.currentName}") public String WMS_CURRENT_NAME; @Value("${mes.defaultUserId}") public long defaultUserId; @Value("${wms.wmsTransStartStation1}") public String WMS_TRANS_START_STATION_1; @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 MobileService mobileService; @Resource private WaitPakinService waitPakinService; @Resource private TaskService taskService; @Resource private TaskDetlService taskDetlService; @Resource private SnowflakeIdWorker snowflakeIdWorker; @Resource private CommonService commonService; @Resource private AgvInfoMapper agvInfoMapper; // region MES接口 // /** // * 物料信息同步,MES->WMS // * 同步物料信息->入库单 // * // * @param matRecvForm // * @return // */ // @Transactional(rollbackFor = Exception.class) // public MesReturn matInfoAndInBound(MesMatRecvForm matRecvForm) { // // MesReturn mesReturn = new MesReturn(); // // // 1、物料信息同步 // try { // if (synMatInfo(matRecvForm.getItemdata()) == 1) { // // 2、生成入库单 // try { // MesInApply mesInApply = new MesInApply(); // mesInApply.setItemno(matRecvForm.getItemdata().getItem_no()); // mesInApply.setQty(matRecvForm.getItemdata().getQty()); // mesInApply.setOrderNo(matRecvForm.getItemdata().getOrderNo()); // if (inBoundOrder(mesInApply, 1) == 1) { // mesReturn.setSuccess("1"); // } else { // mesReturn.setSuccess("2"); // mesReturn.setMessage("生成入库订单失败"); // } // } catch (Exception e) { // mesReturn.setSuccess("2"); // mesReturn.setMessage("生成入库订单失败"); // log.error("MES物料信息同步接口,生成入库订单错误", e); // } // } else { // mesReturn.setSuccess("2"); // mesReturn.setMessage("同步物料信息失败"); // } // } catch (Exception e) { // mesReturn.setSuccess("2"); // mesReturn.setMessage("同步物料信息失败"); // log.error("MES物料信息同步接口,同步物料错误", e); // } // // return mesReturn; // } /** * 新增、修改物料信息 * * @param mesMatInfo * @return 1 成功;-1 保存物料类型失败;-2 保存物料失败; * @throws ParseException */ public int synMatInfo(MesMatInfo mesMatInfo) { try { // 规则定义:默认第3层为同步的物料类型 long secondPath = 2; String secondParentName = WMS_CURRENT_NAME; // long locType = 1; long userId = defaultUserId; // if (mesMatInfo.getModified_operator1() != null && !mesMatInfo.getModified_operator1().isEmpty()) { // userId = Long.parseLong(mesMatInfo.getModified_operator1()); // } Date now = new Date(); if (mesMatInfo.getModified_date1() != null && !mesMatInfo.getModified_date1().isEmpty()) { now = Date.from(OffsetDateTime.parse(mesMatInfo.getModified_date1()).toInstant()); } // 物料类型更新 EntityWrapper wrapper = new EntityWrapper<>(); wrapper.eq("name", mesMatInfo.getItem_type()); Tag tag = tagService.selectByName(mesMatInfo.getItem_type(), 3); if (tag == null || StringUtils.isEmpty(tag.getName())) { Tag newTag = new Tag(); newTag.setName(mesMatInfo.getItem_type()); newTag.setParentId(secondPath); newTag.setParentName(secondParentName); newTag.setPath("2"); newTag.setPathName(secondParentName); newTag.setLevel(3); newTag.setStatus(1); newTag.setCreateBy(userId); newTag.setCreateTime(now); newTag.setUpdateBy(userId); newTag.setUpdateTime(now); if (!tagService.insert(newTag)) return -1; } // 物料更新 long tagId = tagService.selectByName(mesMatInfo.getItem_type(), 3).getId(); Mat mat = matService.selectByMatnr(mesMatInfo.getItem_no()); Mat newMat = new Mat(); newMat.setMatnr(mesMatInfo.getItem_no()); newMat.setMaktx(mesMatInfo.getDescription()); newMat.setTagId(tagId); newMat.setLocType(tagId); //locType newMat.setSpecs(mesMatInfo.getSpecification()); newMat.setUnit("件"); //统一为件,mesMatInfo.getUnit_of_measure() newMat.setModel(mesMatInfo.getClassification_code()); newMat.setMemo(JSONObject.toJSONString(mesMatInfo)); newMat.setCreateBy(userId); newMat.setCreateTime(now); newMat.setUpdateBy(userId); 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"); JSONObject newMemo = JSONObject.parseObject(newMat.getMemo()); // newMemo.remove("OrderNo"); // newMemo.remove("qty"); if (!dbMemo.equals(newMemo)) { newMat.setId(mat.getId()); if (!matService.updateById(newMat)) return -2; } } return 1; } catch (Exception e) { log.error("同步物料失败", e); return -1; } } /** * 实际入库反馈 * 触发条件:针对原料出库检查再入库的情况 * 推送时机:当订单完成时推送 * * @param orderNo * @return */ public int recvFeedback(String orderNo) { // 按单号查询 OrderPakin order = orderPakinService.selectByNo(orderNo); if (order != null && order.getSettle() == 4) { // 校验是否完成 // List list = new ArrayList<>(); JSONObject dbMemo = JSONObject.parseObject(order.getMemo()); List details = new ArrayList<>(); EntityWrapper wrapper = new EntityWrapper<>(); wrapper.eq("order_no", orderNo); List orderDetlPakins = orderDetlPakinService.selectList(wrapper); if (orderDetlPakins != null && !orderDetlPakins.isEmpty()) { for (OrderDetlPakin orderDetl : orderDetlPakins) { int qty = Integer.parseInt(dbMemo.getString("qty")); double real_qty = Double.parseDouble(orderDetl.getQty().toString()); MesItemDetails detail = new MesItemDetails(); detail.setItemNo(orderDetl.getMatnr()); detail.setAnfme(real_qty); details.add(detail); // MesRecvFeedback.MesRecvFeedbackItem item = new MesRecvFeedback.MesRecvFeedbackItem(); // item.setItem_no(orderDetl.getMatnr()); // item.setOrderNo(orderNo); // item.setQty(qty); // item.setReal_qty(real_qty); // list.add(item); } } // MesRecvFeedback mesRecvFeedback = new MesRecvFeedback(); // mesRecvFeedback.setSource_no(dbMemo.getString("source_no")); // mesRecvFeedback.setOperuser(dbMemo.getString("operuser")); // mesRecvFeedback.setItemdata(list); MesInApply mesRecvFeedback = new MesInApply(); mesRecvFeedback.setBillType(dbMemo.getString("billType")); mesRecvFeedback.setOrderNo(dbMemo.getString("orderNo")); mesRecvFeedback.setCreateTime(dbMemo.getString("createTime")); mesRecvFeedback.setDetails(details); String url = DJ_URL + "api/InboundOrder/WmsInFinish"; String response = RcsServiceImpl.sendPost(url, mesRecvFeedback.toString()); if (!StringUtils.isEmpty(response) && response.contains("Success")){ MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class); if("1".equals(mesReturn.getSuccess())) { return 1; } } } return 0; } /** * 出库申请 * 加工库、刀具库 * * @param mesOutApply * @return 1 成功;-1 订单重复; */ public int outBoundOrder(MesInApply mesOutApply){ // docType根据库类型确定 long docType = 7; long settle = 1; // 校验订单是否重复 OrderPakout order = orderPakoutService.selectByNo(mesOutApply.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(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("保存出库订单主档失败"); } // 生成明细 for (MesItemDetails item : mesOutApply.getDetails()) { Mat mat = matService.selectByMatnr(item.getItemNo()); OrderDetlPakout orderDetlPakout = new OrderDetlPakout(); orderDetlPakout.setOrderId(orderPakout.getId()); orderDetlPakout.setOrderNo(orderPakout.getOrderNo()); orderDetlPakout.setAnfme(Double.valueOf(item.getAnfme())); orderDetlPakout.setQty(0.0); orderDetlPakout.setMatnr(mat.getMatnr()); orderDetlPakout.setMaktx(mat.getMaktx()); orderDetlPakout.setSpecs(mat.getSpecs()); orderDetlPakout.setModel(mat.getModel()); 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:CTU出库动作 // todo 呼叫agv产线取空料架 // TODO:若AGV和输送线没有安全交互,则要保证立库出货完成后再呼叫AGV。 // 立库生成订单后,自动调度AGV从产线运输空刀架至立库缓存区。 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("02"); //运回刀架时默认02(下空托) mesOutApply.getTransType() transTask.setCurProcess(mesOutApply.getProductLineId()); transTask.setCurStationId(mesOutApply.getStationId()); // transTask.setNextProcess(); transTask.setNextStationId(WMS_TRANS_START_STATION_1); // transTask.setItemno(mesOutApply.getItemNo()); transTask.setQty(0); 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)); } // // 按零件二维码查询有几个托,多托生成多个任务,每托对应零件二维码 //// 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()); // } // // // } // } } } catch (Exception e) { log.error("下发AGV运输任务失败", e); } return 1; } public int transDj(String taskNo,String djNo) { try { EntityWrapper wapper = new EntityWrapper<>(); wapper.eq("task_no", taskNo).orderBy("wrk_date"); Task task = taskService.selectOne(wapper); if (task != null) { JSONObject memo = JSONObject.parseObject(task.getMemo()); TransTask transTask = new TransTask(); transTask.setTaskno(taskNo + "_1"); // transTask.setTaskname(mesOutApply.getTaskname()); transTask.setOrderNo(memo.getString("OrderNo")); transTask.setTransType("05"); //送刀时默认05(上刀) transTask.setCurStationId(WMS_TRANS_START_STATION_1); transTask.setNextProcess(memo.getString("ProductLineId")); transTask.setNextStationId(memo.getString("CurStationId")); // transTask.setItemno(mesOutApply.getItemNo()); // transTask.setQty(0); transTask.setProductLineId(memo.getString("ProductLineId")); // transTask.setItemBarcode(codes); // transTask.setTuoPanId(entry.getKey()); transTask.setOperateType(1); transTask.setAgvFactory(1); transTask.setDjNo(djNo); 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 mesInApply * @return 1 成功;-1 入库订单重复;0 部分失败; */ public int inBoundOrder(MesInApply mesInApply, int check){ // docType根据库类型确定 long docType = 4; long settle = 1; // 校验订单是否重复 OrderPakin order = orderPakinService.selectByNo(mesInApply.getOrderNo()); if (order != null && !StringUtils.isEmpty(order.getOrderNo())) { return -1; } // 生成订单 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); if (!orderPakinService.insert(orderPakin)) { log.error("MES保存入库订单主档失败"); throw new CoolException("保存入库订单主档失败"); } // 生成明细 for (MesItemDetails item : mesInApply.getDetails()) { Mat mat = matService.selectByMatnr(item.getItemNo()); OrderDetlPakin orderDetlPakin = new OrderDetlPakin(); orderDetlPakin.setOrderId(orderPakin.getId()); orderDetlPakin.setOrderNo(orderPakin.getOrderNo()); orderDetlPakin.setAnfme(Double.valueOf(item.getAnfme())); orderDetlPakin.setQty(0.0); orderDetlPakin.setMatnr(mat.getMatnr()); orderDetlPakin.setMaktx(mat.getMaktx()); orderDetlPakin.setSpecs(mat.getSpecs()); orderDetlPakin.setModel(mat.getModel()); // if (mesInApply.getDetails() != null) { // orderDetlPakin.setStandby1(JSONObject.toJSONString(mesInApply.getProductInfo())); //零件详情存在备选1 // } orderDetlPakin.setStandby2(String.valueOf(check)); //保存齐套性检查标识,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"); } } // // TODO:是否绑定货物和托盘? // if (!StringUtils.isEmpty(mesInApply.getTuoPanId())) { // CombParam combParam = new CombParam(); // combParam.setOrderNo(mesInApply.getOrderNo()); // combParam.setBarcode(mesInApply.getTuoPanId()); // List combMats = new ArrayList<>(); // CombParam.CombMat combMat = new CombParam.CombMat(); // combMat.setOrderNo(mesInApply.getOrderNo()); // combMat.setMatnr(mat.getMatnr()); // combMat.setMaktx(mat.getMaktx()); // combMat.setSpecs(mat.getSpecs()); // combMat.setAnfme(Double.valueOf(mesInApply.getQty())); //// combMat.setBatch("1"); // combMats.add(combMat); // combParam.setCombMats(combMats); // // 组托 // mobileService.comb(combParam, defaultUserId); // } return 1; } /** * 出库申请(叫料) * 装配库、滑块库 * * @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; } /** * 出库完成 * * @param orderNo * @return */ public int outFeedback(String orderNo) { int success = 0; OrderPakout order = orderPakoutService.selectByNo(orderNo); if (order != null && order.getSettle() == 4) { // 校验是否完成 List details = new ArrayList<>(); 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) { double real_qty = Double.parseDouble(orderDetl.getQty().toString()); MesItemDetails detail = new MesItemDetails(); detail.setItemNo(orderDetl.getMatnr()); detail.setAnfme(real_qty); details.add(detail); // StringBuilder palletId = new StringBuilder(); // EntityWrapper wrapper2 = new EntityWrapper<>(); // wrapper2.eq("order_no", orderDetl.getOrderNo()); // List waitPakins = waitPakinService.selectList(wrapper2); // 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(Integer.parseInt(orderDetl.getQty().toString())); // mesOutFeedback.setItemBarcode(dbMemo.getString("ItemBarcode")); // mesOutFeedback.setOrderNo(orderNo); } MesInApply mesOutFeedback = new MesInApply(); mesOutFeedback.setBillType(dbMemo.getString("billType")); mesOutFeedback.setOrderNo(dbMemo.getString("orderNo")); mesOutFeedback.setCreateTime(dbMemo.getString("createTime")); mesOutFeedback.setDetails(details); String url = DJ_URL + "api/OutboundOrder/WmsOutFinish"; String response = RcsServiceImpl.sendPost(url, mesOutFeedback.toString()); 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; } else { success = 0; } } } return success; } /** * 入库完成 * * @param orderNo * @return */ public int inFeedback(String orderNo) { int success = 0; int recvFeedback = 0; OrderPakin order = orderPakinService.selectByNo(orderNo); if (order != null && order.getSettle() == 4) { // 校验是否完成 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.setAnfme(Float.parseFloat(orderDetl.getAnfme().toString())); String url = MES_URL + "api/order/inComplete"; String response = RcsServiceImpl.sendPost(url, result.toString()); if (!StringUtils.isEmpty(response) && response.contains("Success")){ MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class); if("1".equals(mesReturn.getSuccess())) { success++; } } if ("1".equals(orderDetl.getStandby2())) { recvFeedback++; } } // 入库回馈 if (recvFeedback > 0) { recvFeedback(orderNo); } if (success == orderDetlPakins.size()) { success = 1; } else { success = 0; } } } return success; } // 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()) { result.put("Success", "2"); result.put("Message", "任务重复发送"); return result; } try { 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.setStaNo(transTask.getNextStationId()); task.setSourceStaNo(transTask.getCurStationId()); task.setModiUser(defaultUserId); task.setModiTime(now); task.setAppeUser(defaultUserId); task.setAppeTime(now); task.setTaskNo(transTask.getTaskno()); task.setMemo(JSONObject.toJSONString(transTask)); if (taskService.insert(task)) { Mat mat = matService.selectByMatnr("emptyDj"); TaskDetl taskDetl = new TaskDetl(); taskDetl.setWrkNo(task.getWrkNo()); taskDetl.setIoTime(task.getIoTime()); taskDetl.setMatnr(mat.getMatnr()); taskDetl.setAnfme(0.0); taskDetl.setStandby1(String.valueOf(transTask.getQty())); taskDetl.setMaktx(mat.getMaktx()); taskDetl.setSpecs(mat.getSpecs()); taskDetl.setOrderNo(transTask.getOrderNo()); taskDetl.setModiUser(defaultUserId); taskDetl.setModiTime(now); taskDetl.setAppeUser(defaultUserId); taskDetl.setAppeTime(now); taskDetlService.insert(taskDetl); // EntityWrapper wrapper1 = new EntityWrapper<>(); // wrapper1.eq("order_no", transTask.getTaskno()) // .eq("matnr", mat.getMatnr()) // .eq("anfme", transTask.getQty()); // WaitPakin waitPakin = waitPakinService.selectOne(wrapper1); // if (waitPakin != null) // { // TaskDetl taskDetl = new TaskDetl(); // taskDetl.setWrkNo(task.getWrkNo()); // taskDetl.setIoTime(task.getIoTime()); // taskDetl.setMatnr(transTask.getItemno()); // taskDetl.setAnfme(Double.valueOf(transTask.getQty())); // taskDetl.setAnfme(0.0); // taskDetl.setStandby1(String.valueOf(transTask.getQty())); // taskDetl.setZpallet(waitPakin.getZpallet()); // taskDetl.setMaktx(mat.getMaktx()); // taskDetl.setSpecs(mat.getSpecs()); // taskDetl.setOrderNo(transTask.getOrderNo()); // taskDetl.setModiUser(defaultUserId); // taskDetl.setModiTime(now); // taskDetl.setAppeUser(defaultUserId); // taskDetl.setAppeTime(now); // taskDetlService.insert(taskDetl); // } // else { // result.put("Success", "2"); // result.put("Message", "接收任务失败"); // // Throw // } // 下发给RCS RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit(); rcsTaskSubmit.setRobotTaskCode(transTask.getTaskno()); rcsTaskSubmit.setInitPriority(10); //默认10 List targetRouteList = new ArrayList<>(); RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute(); startRoute.setSeq(0); startRoute.setCode(transTask.getCurStationId()); startRoute.setOperation("COLLECT"); targetRouteList.add(startRoute); RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute(); endRoute.setSeq(1); endRoute.setCode(transTask.getNextStationId()); endRoute.setOperation("DELIVERY"); targetRouteList.add(endRoute); rcsTaskSubmit.setTargetRoute(targetRouteList); // 转发给海康或华晓RCS int success = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory()); if (success == 1) { result.put("Success", "1"); result.put("Message", "任务接收成功"); } else { result.put("Success", "2"); result.put("Message", "任务下发给RCS失败"); } } else { result.put("Success", "2"); result.put("Message", "接收任务失败"); } } catch (Exception e) { log.error("下发运输任务错位 - {}", transTask, e); } 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, transTaskFeedback.toString()); 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, apply.toString()); 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 url = MES_URL + (apply.getProductLineId().equals("LL") ? "AGVTransportPalletNotice" : "Aprs/AGVTransportPalletNotice"); 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, checkRcsFactory(allow.getAgvCode())); mesReturn.setSuccess(success == 1 ? "1" : "2"); mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败"); } return mesReturn; } /** * 到站完成:转发AGV->到站完成->给MES * * @param arrivalStation * @return */ public int arriveOnStation(TransArrivalStation arrivalStation,String path) { 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 url = MES_URL + (apply.getProductLineId().equals("LL") ? "AGVDepartureCompleted" : "Aprs/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 R tkt(String taskNo) { boolean flag = false; try { EntityWrapper wapper = new EntityWrapper<>(); wapper.eq("task_no", taskNo).orderBy("wrk_date",false); Task task = taskService.selectOne(wapper); // 下发给RCS RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit(); rcsTaskSubmit.setRobotTaskCode(taskNo + "-1"); rcsTaskSubmit.setInitPriority(10); //默认10 List targetRouteList = new ArrayList<>(); RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute(); startRoute.setSeq(0); startRoute.setCode(task.getStaNo()); startRoute.setOperation("COLLECT"); targetRouteList.add(startRoute); RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute(); endRoute.setSeq(1); endRoute.setCode(task.getSourceStaNo()); endRoute.setOperation("DELIVERY"); targetRouteList.add(endRoute); rcsTaskSubmit.setTargetRoute(targetRouteList); // 更新起点和终点 String memo = task.getMemo(); TransTask transTask = JSONObject.parseObject(memo, TransTask.class); transTask.setCurStationId(task.getSourceStaNo()); transTask.setNextStationId(task.getStaNo()); transTask.setTransType("01"); // 下空托 // 更新agv任务起点和终点 task.setTaskNo(taskNo + "-1"); task.setSourceStaNo(transTask.getCurStationId()); task.setStaNo(transTask.getNextStationId()); task.setMemo(JSONObject.toJSONString(transTask)); taskService.updateById(task); // 转发给海康或华晓RCS int success = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory()); if (success == 1) { flag = true; } } catch (Exception e) { log.error("空托回产线发AGV运输任务失败", e); } return flag ?R.ok() : R.parse("空托回产线呼叫agv失败"); } // endregion /** * 查询Rcs地址 * * @param agvNo * @return 1 海康;2 华晓 */ private int checkRcsFactory(String agvNo) { AgvInfo agvInfo = agvInfoMapper.selectById(agvNo); return agvInfo.getAgvFactory(); } }