自动化立体仓库 - WMS系统
pang.jiabao
7 天以前 cfb1943832cc253f43cddd164f468dfe6a32cb35
src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java
@@ -1,11 +1,12 @@
package com.zy.asrs.service.impl;
import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.mes.TransArrivalStation;
import com.zy.asrs.entity.mes.TransParent;
import com.zy.asrs.entity.mes.*;
import com.zy.asrs.entity.rcs.*;
import com.zy.asrs.enums.RcsRetMethodEnum;
import com.zy.asrs.mapper.BlockStationMapper;
@@ -22,6 +23,8 @@
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@@ -39,6 +42,11 @@
    @Value("${mes.defaultUserId}")
    public long defaultUserId;
    @Value("${dj.url}")
    public String DJ_URL;
    @Resource
    private BasStationService basStationService;
    @Resource
    private MesService mesService;
@@ -52,6 +60,12 @@
    private TaskDetlServiceImpl taskDetlService;
    @Resource
    private WrkMastService wrkMastService;
    @Resource
    private WrkDetlService wrkDetlService;
    @Resource
    private OrderPakoutService orderPakoutService;
    // region 封锁区逻辑,目前只有一个大封锁区,任务全部转到滑块库处理,或直接写到滑块库
@@ -155,6 +169,9 @@
    // region 海康RCS,AGV
    @Resource
    private ApiLogService apiLogService;
    /**
     * 2.1.2任务下发接口
     * 厂家:海量、华晓
@@ -163,23 +180,49 @@
     * @param rcsFactory 1 海康;2 华晓;
     * @return
     */
    public int submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory){
        return 1;
    public RcsReturn submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory){
        RcsReturn rcsReturn = new RcsReturn();
        boolean success = false;
        String url = rcsFactory == 2 ? HX_URL : HIK_URL + "api/robot/controller/task/submit";
        String response = "";
        try {
            // 模拟返回
//            rcsReturn.setCode("SUCCESS");
//            success = true;
//        String url = rcsFactory == 2 ? HX_URL :HIK_URL + "api/robot/controller/task/submit";
//        String response = sendPost(url, rcsTaskSubmit.toString());
//        if (!StringUtils.isEmpty(response) && response.contains("code")){
//            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
//            if("SUCCESS".equals(rcsReturn.getCode())) {
//                JSONObject data = rcsReturn.getData();
//                String robotTaskCode = data.getString("robotTaskCode");
//                if (robotTaskCode.equals(rcsTaskSubmit.getRobotTaskCode())){
//                    return 1;
//                }
//            }
//        }
//
//        return 0;
            response = sendPost(url, JSONObject.toJSONString(rcsTaskSubmit));
            if (!StringUtils.isEmpty(response) && response.contains("code")) {
                rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
                if ("SUCCESS".equals(rcsReturn.getCode())) {
                    success = true;
                    log.info("呼叫agv搬运成功!url:{};request:{};response:{}", url, JSON.toJSONString(rcsTaskSubmit), response);
                } else {
                    log.error("呼叫agv搬运失败!url:{};request:{};response:{}", url, JSON.toJSONString(rcsTaskSubmit), response);
                }
            } else {
                log.error("呼叫agv搬运失败,response:{}",response);
                rcsReturn.setCode("ERROR");
            }
        } catch (Exception e) {
            log.error("呼叫agv搬运异常", e);
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "呼叫agv搬运",
                        url,
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(rcsTaskSubmit),
                        response,
                        success
                );
            } catch (Exception e) {
                log.error("呼叫agv搬运保存接口日志异常", e);
            }
        }
        return rcsReturn;
    }
    /**
@@ -192,7 +235,7 @@
    public int continueTask(RcsTaskContinue rcsTaskContinue, int rcsFactory){
        String url = rcsFactory == 2 ? HX_URL :HIK_URL + "api/robot/controller/task/extend/continue";
        String response = sendPost(url, rcsTaskContinue.toString());
        String response = sendPost(url, JSONObject.toJSONString(rcsTaskContinue));
        if (!StringUtils.isEmpty(response) && response.contains("code")){
            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
            if("SUCCESS".equals(rcsReturn.getCode())) {
@@ -217,7 +260,7 @@
    public int cancelTask(RcsTaskCancel rcsTaskCancel, int rcsFactory){
        String url = rcsFactory == 2 ? HX_URL :HIK_URL  + "api/robot/controller/task/cancel";
        String response = sendPost(url, rcsTaskCancel.toString());
        String response = sendPost(url, JSONObject.toJSONString(rcsTaskCancel));
        if (!StringUtils.isEmpty(response) && response.contains("code")){
            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
            if("SUCCESS".equals(rcsReturn.getCode())) {
@@ -242,7 +285,7 @@
    private int notifyEqpt(RcsEqptNotify rcsEqptNotify, int rcsFactory){
        String url = rcsFactory == 2 ? HX_URL :HIK_URL + "api/wcs/robot/eqpt/notify";
        String response = sendPost(url, rcsEqptNotify.toString());
        String response = sendPost(url, JSONObject.toJSONString(rcsEqptNotify));
        if (!StringUtils.isEmpty(response) && response.contains("code")){
            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
            if("SUCCESS".equals(rcsReturn.getCode())) {
@@ -274,9 +317,81 @@
        // start : 任务开始;outbin : 走出储位;end : 任务完成
        String method = values.getString("method");
        String carrierType = values.getString("carrierType");
        Date now = new Date();
        try {
            if ("Q3".equals(carrierType) || "Q8".equals(carrierType)) {    //AGV
            if (singleRobotCode.equals("14") || singleRobotCode.equals("15")) { // 两台CTU库机器人编号
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("task_no", robotTaskCode));
                if(wrkMast != null) {
                    Integer ioType = wrkMast.getIoType();
                    switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
                        case TASK_START: {
                            if (ioType == 1 || ioType == 10 || ioType == 53) {
                                wrkMast.setModiTime(now);
                                wrkMastService.updateById(wrkMast);
                            } else if (ioType == 101 || ioType == 110 || ioType == 103) {
                                wrkMast.setModiTime(now);
                                wrkMastService.updateById(wrkMast);
                            } else {
                                log.error("{}ioType{}不在end反馈处理中", wrkMast.getWrkNo(), ioType);
                            }
                        }
                        break;
                        case TASK_END: {
                            if (ioType == 1 || ioType == 10 || ioType == 53) {
                                wrkMast.setWrkSts(4L);
                                wrkMast.setCrnEndTime(now);
                                wrkMast.setModiTime(now);
                                wrkMastService.updateById(wrkMast);
                            } else if (ioType == 101 || ioType == 110 || ioType == 103) {
                                wrkMast.setWrkSts(14L);
                                wrkMast.setCrnEndTime(now);
                                wrkMast.setModiTime(now);
                                wrkMastService.updateById(wrkMast);
                                // 给TMS反馈出库货物信息
                                List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
                                if(!wrkDetls.isEmpty()) {
                                    WrkDetl wrkDetl = wrkDetls.get(0);
                                    String orderNo = wrkDetl.getOrderNo();
                                    if(!Cools.isEmpty(orderNo)) {
                                        OrderPakout orderPakout = orderPakoutService.selectByNo(orderNo);
                                        if (orderPakout != null) {
                                            MesInApply mesOutFeedback = new MesInApply();
                                            mesOutFeedback.setBillType(String.valueOf(orderPakout.getDocType()));
                                            mesOutFeedback.setOrderNo(orderNo);
                                            mesOutFeedback.setCreateTime( new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(now));
                                            List<MesItemDetails> details = new ArrayList<>();
                                            for(WrkDetl detl:wrkDetls) {
                                                MesItemDetails detail = new MesItemDetails();
                                                detail.setItemNo(detl.getMatnr());
                                                detail.setAnfme(detl.getAnfme());
                                                details.add(detail);
                                            }
                                            mesOutFeedback.setDetails(details);
                                            String url = DJ_URL + "api/OutboundOrder/WmsOutFinish";
                                            String request = JSONObject.toJSONString(mesOutFeedback);
                                            String response = RcsServiceImpl.sendPost(url, request);
                                            if (!StringUtils.isEmpty(response) && response.contains("Success")){
                                                MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
                                                if("1".equals(mesReturn.getSuccess())) {
                                                    log.info("CTU出库反馈end,上报TMS成功,工作号:{},明细:{}",wrkMast.getWrkNo(),request);
                                                } else {
                                                    log.error("CTU出库反馈end,上报TMS失败!,工作号:{},明细:{}",wrkMast.getWrkNo(),request);
                                                }
                                            }
                                        }
                                    }
                                }
                            } else {
                                log.error("{}ioType{}不在end反馈处理中", wrkMast.getWrkNo(), ioType);
                            }
                        }
                        break;
                        default:
                    }
                }
            } else { //AGV
                EntityWrapper<Task> wrapper = new EntityWrapper<>();
                wrapper.eq("task_no", robotTaskCode);
                Task task = taskService.selectOne(wrapper);
@@ -292,6 +407,17 @@
                switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
                    case TASK_START: {
                        if(memo.getString("TransType").equals("05") || memo.getString("TransType").equals("01")) {
                            BasStation station = basStationService.selectOne(new EntityWrapper<BasStation>().eq("dev_no", task.getSourceStaNo()));
                            if(station.getLocSts().equals("R")) {
                                station.setLocSts("O");
                                station.setBarcode("");
                                station.setModiTime(new Date());
                                basStationService.updateById(station);
                            } else {
                                log.error("agv回调start,接驳点状态不为R,agv任务号:{},状态:{}",task.getTaskNo(),task.getWrkSts());
                            }
                        }
                        task.setWrkSts(302L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                        task.setModiTime(new Date());
                        task.setModiUser(defaultUserId);
@@ -300,12 +426,28 @@
//                    case TASK_OUT_BIN: {} break;
                    case TASK_END: {
                        // 更新任务状态等内部逻辑
                        task.setWrkSts(304L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                        if(memo.getString("TransType").equals("06") || memo.getString("TransType").equals("02")) {
                            // 06下刀来的空刀架需要回去,02来的要上刀05的空刀架上满后需要回去,pda上做任务转换
                            task.setWrkSts(305L); // 305.任务转换
                            BasStation station = basStationService.selectOne(new EntityWrapper<BasStation>().eq("dev_no", task.getStaNo()));
                            if(station.getLocSts().equals("S")) {
                                station.setLocSts("F");
                                station.setModiTime(new Date());
                                basStationService.updateById(station);
                            } else {
                                log.error("agv回调end,接驳点状态不为S,agv任务号:{},状态:{}",task.getTaskNo(),task.getWrkSts());
                            }
                        } else {
                            task.setWrkSts(304L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                        }
                        task.setModiTime(new Date());
                        task.setModiUser(defaultUserId);
                        taskService.updateById(task);
                        // 任务完成
                        mesService.reporterTask(rcsReporterTask);
//                        mesService.reporterTask(rcsReporterTask);
                        // 更新接驳位置状态
//                    EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>();
//                    wapper2.eq("wrk_no", task.getWrkNo())
@@ -342,6 +484,15 @@
                            mesService.applyOutStation(apply);
                        } else if (RcsRetMethodEnum.ARRIVE_OFF_STATION.getCode().equals(method)) {
                            mesService.outStation(apply);
                            // agv继续执行
                            // 源站点是产线,离站完成后给rcs反馈继续执行
                            if(task.getSourceStaNo().contains("TOOL")) {
                                TransInOutStationAllow inOutStationAllow = new TransInOutStationAllow();
                                inOutStationAllow.setTaskno(robotTaskCode);
                                inOutStationAllow.setStatus("Y");
                                inOutStationAllow.setAgvCode(singleRobotCode);
                                mesService.allowOutStation(inOutStationAllow);
                            }
                        }
                    } break;
                    case ARRIVE_ON_STATION: {
@@ -353,7 +504,7 @@
                        TransArrivalStation arrivalStation = new TransArrivalStation();
                        arrivalStation.setTaskno(robotTaskCode);
                        arrivalStation.setTaskname(memo.getString("taskName"));
                        arrivalStation.setTuoPanId(taskDetl == null || taskDetl.getZpallet() == null ? "" : taskDetl.getZpallet());
//                        arrivalStation.setTuoPanId(taskDetl == null || taskDetl.getZpallet() == null ? "" : taskDetl.getZpallet());
                        arrivalStation.setDaotype(memo.getString("TransType"));
                        arrivalStation.setProductLineId(memo.getString("ProductLineId"));
//                        arrivalStation.setStationId(task.getStaNo());
@@ -379,53 +530,54 @@
                    } break;
                    default: {} break;
                }
            } else if ("CTU".equals(carrierType)) { //CTU
                EntityWrapper<WrkMast> wrapper = new EntityWrapper<>();
                wrapper.eq("task_no", robotTaskCode);
                WrkMast task = wrkMastService.selectOne(wrapper);
                if (task == null || !task.getTaskNo().equals(robotTaskCode)) {
                    rcsReturn.setCode("Err_RobotCodeNotMatch");
                    rcsReturn.setMessage("");
                    JSONObject data = new JSONObject();
                    data.put("robotTaskCode", robotTaskCode);
                    rcsReturn.setData(data);
                    return rcsReturn;
                }
//                JSONObject memo = JSONObject.parseObject(task.getMemo());
                switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
                    case TASK_START: {
//                        task.setWrkSts(302L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
            }
//            else if ("CTU".equals(carrierType)) { //CTU
//                EntityWrapper<WrkMast> wrapper = new EntityWrapper<>();
//                wrapper.eq("task_no", robotTaskCode);
//                WrkMast task = wrkMastService.selectOne(wrapper);
//                if (task == null || !task.getTaskNo().equals(robotTaskCode)) {
//                    rcsReturn.setCode("Err_RobotCodeNotMatch");
//                    rcsReturn.setMessage("");
//                    JSONObject data = new JSONObject();
//                    data.put("robotTaskCode", robotTaskCode);
//                    rcsReturn.setData(data);
//                    return rcsReturn;
//                }
////                JSONObject memo = JSONObject.parseObject(task.getMemo());
//
//                switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
//                    case TASK_START: {
////                        task.setWrkSts(302L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
////                        task.setModiTime(new Date());
////                        task.setModiUser(defaultUserId);
////                        taskService.updateById(task);
//                    } break;
////                    case TASK_OUT_BIN: {} break;
//                    case TASK_END: {
//                        // 更新任务状态等内部逻辑
//                        long wrkSts = task.getWrkSts(); // 1.入库;101.出库;
//                        if (task.getIoType() == 1) {
//                            wrkSts = 4L;
//                        } else if (task.getIoType() == 101) {
//                            wrkSts = 14L;
//                        }
//
//                        task.setWrkSts(wrkSts); // 4.入库完成;14.已出库未确认;
//                        task.setModiTime(new Date());
//                        task.setModiUser(defaultUserId);
//                        taskService.updateById(task);
                    } break;
//                    case TASK_OUT_BIN: {} break;
                    case TASK_END: {
                        // 更新任务状态等内部逻辑
                        long wrkSts = task.getWrkSts(); // 1.入库;101.出库;
                        if (task.getIoType() == 1) {
                            wrkSts = 4L;
                        } else if (task.getIoType() == 101) {
                            wrkSts = 14L;
                        }
                        task.setWrkSts(wrkSts); // 4.入库完成;14.已出库未确认;
                        task.setModiTime(new Date());
                        task.setModiUser(defaultUserId);
                        wrkMastService.updateById(task);
                        // TODO:任务完成触发出入库变更操作
//                        // 入库完成
//                        mesService.inFeedback(memo.getString("OrderNo"));
//                        // 出库完成
//                        mesService.outFeedback(memo.getString("OrderNo"));
                    } break;
                    default: {} break;
                }
            }
//                        wrkMastService.updateById(task);
//
//                        // TODO:任务完成触发出入库变更操作
//
//
////                        // 入库完成
////                        mesService.inFeedback(memo.getString("OrderNo"));
////                        // 出库完成
////                        mesService.outFeedback(memo.getString("OrderNo"));
//                    } break;
//                    default: {} break;
//                }
//            }
            // 返回RCS
            rcsReturn.setCode("SUCCESS");
@@ -553,11 +705,15 @@
            log.info("sendPost - {} - {}", url, param);
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection();
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            conn.setRequestProperty("Accept-Charset", "utf-8");
            conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Content-Length", "<calculated when request is sent>");
            conn.setRequestProperty("Host", "<calculated when request is sent>");
            conn.setRequestProperty("Accept", "*/*");
            conn.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
            conn.setRequestProperty("Connection", "keep-alive");
            conn.setRequestProperty("X-lr-request-id", String.valueOf(new Date().getTime()));
            conn.setRequestProperty("X-lr-version", "4.3");
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            conn.setDoOutput(true);