自动化立体仓库 - WMS系统
pang.jiabao
4 天以前 10e6a9a8adad2226f13a4e4704ca5b2ad5b9ef9a
src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
@@ -9,6 +9,7 @@
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.digitaltwin.DtLocDetailVo;
import com.zy.asrs.entity.mes.*;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.entity.rcs.*;
@@ -133,11 +134,7 @@
            // 规则定义:默认第3层为同步的物料类型
            long secondPath = 2;
            String secondParentName = WMS_CURRENT_NAME;
//        long locType = 1;
            long userId = defaultUserId;
//            if (mesMatInfo.getModified_operator1() != null && !mesMatInfo.getModified_operator1().isEmpty()) {
//                userId = Long.parseLong(mesMatInfo.getModified_operator1());
//            }
            Date now = new Date();
            if (mesMatInfo.getModified_date1() != null && !mesMatInfo.getModified_date1().isEmpty()) {
                now = Date.from(OffsetDateTime.parse(mesMatInfo.getModified_date1()).toInstant());
@@ -168,35 +165,29 @@
            // 物料更新
            long tagId = tagService.selectByName(mesMatInfo.getItem_type(), 3).getId();
            Mat mat = matService.selectByMatnr(mesMatInfo.getItem_no());
            Mat newMat = new Mat();
            newMat.setMatnr(mesMatInfo.getItem_no());
            newMat.setMaktx(mesMatInfo.getDescription());
            newMat.setTagId(tagId);
            newMat.setLocType(tagId);   //locType
            newMat.setSpecs(mesMatInfo.getSpecification());
            newMat.setUnit("件");   //统一为件,mesMatInfo.getUnit_of_measure()
            newMat.setModel(mesMatInfo.getClassification_code());
            newMat.setMemo(JSONObject.toJSONString(mesMatInfo));
            newMat.setCreateBy(userId);
            newMat.setCreateTime(now);
            newMat.setUpdateBy(userId);
            newMat.setUpdateTime(now);
            newMat.setStatus(1);
            if (mat == null) {
                if (!matService.insert(newMat))
                    return -2;
                Mat newMat = new Mat();
                newMat.setMatnr(mesMatInfo.getItem_no());
                newMat.setMaktx(mesMatInfo.getDescription());
                newMat.setTagId(tagId);
                newMat.setLocType(tagId);   //locType
                newMat.setSpecs(mesMatInfo.getSpecification());
                newMat.setUnit(mesMatInfo.getUnit_of_measure());
                newMat.setModel(mesMatInfo.getClassification_code());
//            newMat.setMemo(JSONObject.toJSONString(mesMatInfo));
                newMat.setCreateBy(userId);
                newMat.setCreateTime(now);
                newMat.setUpdateBy(userId);
                newMat.setUpdateTime(now);
                newMat.setStatus(1);
                matService.insert(newMat);
            } else {
                JSONObject dbMemo = JSONObject.parseObject(mat.getMemo());
//            dbMemo.remove("OrderNo");
//            dbMemo.remove("qty");
            JSONObject newMemo = JSONObject.parseObject(newMat.getMemo());
//            newMemo.remove("OrderNo");
//            newMemo.remove("qty");
                if (!dbMemo.equals(newMemo)) {
                    newMat.setId(mat.getId());
                    if (!matService.updateById(newMat))
                        return -2;
                }
                mat.setMaktx(mesMatInfo.getDescription());
                mat.setSpecs(mesMatInfo.getSpecification());
                mat.setUnit(mesMatInfo.getUnit_of_measure());
                mat.setModel(mesMatInfo.getClassification_code());
                mat.setUpdateTime(now);
                matService.updateById(mat);
            }
            return 1;
@@ -266,6 +257,9 @@
        return 0;
    }
    @Resource
    private BasStationService basStationService;
    /**
     * 出库申请
     * 加工库、刀具库
@@ -274,22 +268,38 @@
     * @return 1 成功;-1 订单重复;
     */
    @Transactional
    public int outBoundOrder(MesInApply mesOutApply){
    public MesReturn outBoundOrder(MesInApply mesOutApply) {
        MesReturn mesReturn = new MesReturn();
        // 终点为空,计算接驳位
        BasStation basStation = null;
        if (Cools.isEmpty(mesOutApply.getNextStationId())) {
            List<BasStation> basStations = basStationService.selectList(new EntityWrapper<BasStation>().eq("loc_sts", "O"));
            if (basStations.isEmpty()) {
                mesReturn.setSuccess("2");
                mesReturn.setMessage("无空接驳位,请稍后再试!");
                return mesReturn;
            }
            // 接驳点
            basStation = basStations.get(0);
            mesOutApply.setNextStationId(basStation.getDevNo());
        }
        // docType根据库类型确定
        long docType = 7;
        long docType = Long.parseLong(mesOutApply.getBillType());
        long settle = 1;
        // 校验订单是否重复
        OrderPakout order = orderPakoutService.selectByNo(mesOutApply.getOrderNo());
        if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
            return -1;
            mesReturn.setSuccess("2");
            mesReturn.setMessage("orderNo重复:" + mesOutApply.getOrderNo());
            return mesReturn;
        }
        // 生成订单
        Date now = new Date();
        OrderPakout orderPakout = new OrderPakout();
        orderPakout.setUuid( String.valueOf(snowflakeIdWorker.nextId()));
        orderPakout.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
        orderPakout.setOrderNo(mesOutApply.getOrderNo());
        orderPakout.setOrderTime(com.core.common.DateUtils.convert(now));
        orderPakout.setDocType(docType);
@@ -302,7 +312,7 @@
        orderPakout.setMemo(JSONObject.toJSONString(mesOutApply));
        orderPakout.setPakinPakoutStatus(2);
        if (!orderPakoutService.insert(orderPakout)) {
            log.error("MES保存出库订单主档失败:{}",orderPakout);
            log.error("MES保存出库订单主档失败:{}", orderPakout);
            throw new CoolException("保存出库订单主档失败");
        }
@@ -325,74 +335,43 @@
            orderDetlPakout.setStatus(1);
            orderDetlPakout.setPakinPakoutStatus(2);
            if (!orderDetlPakoutService.insert(orderDetlPakout)) {
                log.error("MES保存出库订单明细档失败:{}",orderDetlPakout);
                log.error("MES保存出库订单明细档失败:{}", orderDetlPakout);
                throw new CoolException("保存出库订单明细档失败");
            }
        }
        // TODO:CTU出库动作
        // 立库生成订单后,自动调度AGV从产线运输空刀架至立库缓存区。
            if (!StringUtils.isEmpty(mesOutApply.getTaskNo()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
                TransTask transTask = new TransTask();
                transTask.setTaskno(mesOutApply.getTaskNo());
                transTask.setTaskname(mesOutApply.getTaskname());
                transTask.setOrderNo(mesOutApply.getOrderNo());
                transTask.setTransType("02");    //运回刀架时默认02(下空托) mesOutApply.getTransType()
                transTask.setCurProcess(mesOutApply.getProductLineId());
                transTask.setCurStationId(mesOutApply.getStationId());
                transTask.setNextProcess(mesOutApply.getProductLineId());
                transTask.setNextStationId(mesOutApply.getNextStationId());
//                transTask.setItemno(mesOutApply.getItemNo());
                transTask.setQty(1);
                transTask.setProductLineId(mesOutApply.getProductLineId());
//                        transTask.setItemBarcode(codes);
//                        transTask.setTuoPanId(entry.getKey());
                transTask.setDjNo(mesOutApply.getDjNo());
                transTask.setOperateType(1);
                transTask.setAgvFactory(1);
                JSONObject sendAgvTask = submitTask(transTask);
                if (!"1".equals(sendAgvTask.getString("Success"))) {
                    log.error("出库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));
                }
        TransTask transTask = new TransTask();
        transTask.setTaskno(mesOutApply.getTaskNo());
        transTask.setTaskname(mesOutApply.getTaskname());
        transTask.setOrderNo(mesOutApply.getOrderNo());
        transTask.setTransType("02");    //运回刀架时默认02(下空托) mesOutApply.getTransType()
        transTask.setCurProcess(mesOutApply.getProductLineId());
        transTask.setCurStationId(mesOutApply.getStationId());
        transTask.setNextProcess(mesOutApply.getProductLineId());
        transTask.setNextStationId(mesOutApply.getNextStationId());
        transTask.setQty(1);
        transTask.setProductLineId(mesOutApply.getProductLineId());
        transTask.setDjNo(mesOutApply.getDjNo());
        transTask.setOperateType(1);
        transTask.setAgvFactory(1);
        JSONObject sendAgvTask = submitTask(transTask);
        if ("1".equals(sendAgvTask.getString("Success"))) {
            // 新接驳点状态
            if (basStation != null) {
                basStation.setModiTime(new Date());
                basStation.setLocSts("S");
                basStation.setBarcode(mesOutApply.getDjNo());
                basStationService.updateById(basStation);
            }
        return 1;
    }
    public int transDj(String taskNo,String djNo) {
        try {
            EntityWrapper<Task> wapper = new EntityWrapper<>();
            wapper.eq("task_no", taskNo).orderBy("wrk_date");
            Task task = taskService.selectOne(wapper);
            if (task != null) {
                JSONObject memo = JSONObject.parseObject(task.getMemo());
                TransTask transTask = new TransTask();
                transTask.setTaskno(taskNo + "_1");
//                        transTask.setTaskname(mesOutApply.getTaskname());
                transTask.setOrderNo(memo.getString("OrderNo"));
                transTask.setTransType("05");    //送刀时默认05(上刀)
                transTask.setCurStationId(WMS_TRANS_START_STATION_1);
                transTask.setNextProcess(memo.getString("ProductLineId"));
                transTask.setNextStationId(memo.getString("CurStationId"));
//                transTask.setItemno(mesOutApply.getItemNo());
//                transTask.setQty(0);
                transTask.setProductLineId(memo.getString("ProductLineId"));
//                        transTask.setItemBarcode(codes);
//                        transTask.setTuoPanId(entry.getKey());
                transTask.setOperateType(1);
                transTask.setAgvFactory(1);
                transTask.setDjNo(djNo);
                JSONObject sendAgvTask = submitTask(transTask);
                if (!"1".equals(sendAgvTask.getString("Success"))) {
                    log.error("上刀下发agv运输任务失败", JSONObject.toJSONString(transTask));
                }
            }
        } catch (Exception e) {
            log.error("上刀下发AGV运输任务失败", e);
            mesReturn.setSuccess("1");
            mesReturn.setMessage("订单下发成功,agv开始运输:" + transTask.getTaskno());
            return mesReturn;
        } else {
            log.error("出库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));
            throw new CoolException("出库下发agv运输任务失败");
        }
        return 1;
    }
    /**
@@ -710,7 +689,6 @@
    /**
     * 9.1下发运输任务
     * TODO:其他库的任务全部转到滑块库统一调度
     *
     * @param transTask
     * @return
@@ -734,7 +712,11 @@
        // 下发给RCS
        RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
        // 模板名
        rcsTaskSubmit.setTaskType("CS");
        if(transTask.getCurStationId().startsWith("LL") || transTask.getCurStationId().startsWith("LG")) { // 起点产线
            rcsTaskSubmit.setTaskType("DJ1");
        } else if(transTask.getNextStationId().startsWith("LL") || transTask.getNextStationId().startsWith("LG")) { // 终点产线
            rcsTaskSubmit.setTaskType("DJ2");
        }
        rcsTaskSubmit.setRobotTaskCode(transTask.getTaskno());
        rcsTaskSubmit.setInitPriority(10);  //默认10
        List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
@@ -990,51 +972,47 @@
        return 0;
    }
    @Resource
    private LocDetlService locDetlService;
    @Resource
    private LocMastService locMastService;
    @Override
    public R tkt(String taskNo) {
        boolean flag = false;
        try {
            EntityWrapper<Task> wapper = new EntityWrapper<>();
            wapper.eq("task_no", taskNo).orderBy("wrk_date",false);
            Task task = taskService.selectOne(wapper);
            // 下发给RCS
            RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
            rcsTaskSubmit.setRobotTaskCode(taskNo + "-1");
            rcsTaskSubmit.setInitPriority(10);  //默认10
            List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
            RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute();
            startRoute.setSeq(0);
            startRoute.setCode(task.getStaNo());
            startRoute.setOperation("COLLECT");
            targetRouteList.add(startRoute);
            RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute();
            endRoute.setSeq(1);
            endRoute.setCode(task.getSourceStaNo());
            endRoute.setOperation("DELIVERY");
            targetRouteList.add(endRoute);
            rcsTaskSubmit.setTargetRoute(targetRouteList);
            // 更新起点和终点
            String memo = task.getMemo();
            TransTask transTask = JSONObject.parseObject(memo, TransTask.class);
            transTask.setCurStationId(task.getSourceStaNo());
            transTask.setNextStationId(task.getStaNo());
            transTask.setTransType("01"); // 下空托
            // 更新agv任务起点和终点
            task.setTaskNo(taskNo + "-1");
            task.setSourceStaNo(transTask.getCurStationId());
            task.setStaNo(transTask.getNextStationId());
            task.setMemo(JSONObject.toJSONString(transTask));
            taskService.updateById(task);
            // 转发给海康或华晓RCS
            RcsReturn rcsReturn = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
            if (rcsReturn.getCode().equals("SUCCESS")) {
                flag = true;
            }
        } catch (Exception e) {
            log.error("空托回产线发AGV运输任务失败", e);
    public R queryStock(String matnr) {
        List<LocDetl> locDetls;
        if (Cools.isEmpty(matnr)) {
            locDetls = locDetlService.selectList(new EntityWrapper<>());
        } else {
            locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("matnr",matnr));
        }
        return flag ?R.ok() : R.parse("空托回产线呼叫agv失败");
        List<String> locNoList = locDetls.stream().map(LocDetl::getLocNo).distinct().collect(Collectors.toList());
        List<DtLocDetailVo> dtLocDetailVoList = new ArrayList<>();
        for (String locNo: locNoList) {
            LocMast locMast = locMastService.selectById(locNo);
            DtLocDetailVo dtLocDetailVo = new DtLocDetailVo();
            dtLocDetailVo.setLocNo(locNo);
            dtLocDetailVo.setLocSts(locMast.getLocSts());
            dtLocDetailVo.setRow1(locMast.getRow1());
            dtLocDetailVo.setBay1(locMast.getBay1());
            dtLocDetailVo.setLev1(locMast.getLev1());
            List<LocDetl> locDetlList2 = locDetls.parallelStream().filter(o-> o.getLocNo().equals(locNo)).collect(Collectors.toList());
            List<StockDetl> stockDetls = new ArrayList<>();
            for(LocDetl locDetl:locDetlList2) {
                StockDetl stockDetl = new StockDetl();
                stockDetl.setMatnr(locDetl.getMatnr());
                stockDetl.setMaktx(locDetl.getMaktx());
                stockDetl.setAnfme(locDetl.getAnfme());
                stockDetls.add(stockDetl);
            }
            dtLocDetailVo.setLocDetl(stockDetls);
            dtLocDetailVoList.add(dtLocDetailVo);
        }
        return R.ok(dtLocDetailVoList);
    }
    // endregion
@@ -1047,8 +1025,9 @@
     */
    private int checkRcsFactory(String agvNo) {
        AgvInfo agvInfo = agvInfoMapper.selectById(agvNo);
        return agvInfo.getAgvFactory();
//        AgvInfo agvInfo = agvInfoMapper.selectById(agvNo);
//        return agvInfo.getAgvFactory();
        return 1;
    }
}