| | |
| | | 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.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,WMS_TRANS_START_STATION_1,"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 = 2; |
| | | |
| | | // 校验订单是否重复 |
| | | OrderPakout order = orderPakoutService.selectByNo(mesOutApply.getOrderNo()); |
| | | if (order != null && !StringUtils.isEmpty(order.getOrderNo())) { |
| | | log.error("出库订单号重复:{}",mesOutApply.getOrderNo()); |
| | | return -1; |
| | | } |
| | | String itemBarcode = barCodeListToStr(mesOutApply.getItemBarcode()); |
| | | // 自动出库 |
| | | LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("standby1", itemBarcode)); |
| | | if (locDetl == null) { |
| | | throw new CoolException("零件二维码没有匹配到库存:" +itemBarcode ); |
| | | } |
| | | LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo())); |
| | | if (!locMast.getLocSts().equals("F")) { |
| | | throw new CoolException("库位状态不为F:" +locMast.getLocNo() ); |
| | | } |
| | | |
| | | // 生成订单 |
| | | 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); |
| | | 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 (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()); |
| | | 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(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_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根据库类型确定 |
| | | 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任务 |
| | | |
| | | /** |
| | | * 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("LG")) { // 起点产线 |
| | | rcsTaskSubmit.setTaskType("CS2"); |
| | | } else if(transTask.getNextStationId().startsWith("LL") || transTask.getNextStationId().startsWith("LG")) { // 终点产线 |
| | | rcsTaskSubmit.setTaskType("CS"); |
| | | } else { // 不涉及产线 |
| | | rcsTaskSubmit.setTaskType("CS3"); |
| | | } |
| | | rcsTaskSubmit.setRobotTaskCode(transTask.getTaskno()); |
| | | rcsTaskSubmit.setInitPriority(10); //默认10 |
| | | List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>(); |
| | | 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 |
| | | 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", "任务接收成功"); |
| | | } 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()) ? "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()) ? "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()) ? "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(); |
| | | } |
| | | |
| | | } |
| | | 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();
}
}
|