自动化立体仓库 - WMS系统
zyh
昨天 701542ac0a90cf0e3a0a81ec2bb8066b5de68e75
src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
@@ -2,6 +2,7 @@
import com.alibaba.excel.util.DateUtils;
import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
@@ -14,6 +15,7 @@
import com.zy.asrs.entity.param.EmptyPlateOutParam;
import com.zy.asrs.entity.rcs.*;
import com.zy.asrs.mapper.AgvInfoMapper;
import com.zy.asrs.mapper.CanFinMapper;
import com.zy.asrs.mapper.MatItemBarcodeMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.OrderInAndOutUtil;
@@ -26,8 +28,11 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import javax.annotation.Resource;
import java.io.IOException;
import java.text.ParseException;
import java.util.*;
import java.util.concurrent.ExecutionException;
@@ -52,6 +57,14 @@
    public long defaultUserId;
    @Value("${wms.zpalletId}")
    public String WMS_ZPALLET_ID;
    // 海康RCS地址
    @Value("${hik.url}")
    private String HIK_URL;
    // 华晓RCS地址
    @Value("${hx.url}")
    private String HX_URL;
    @Resource
    private RcsService rcsService;
@@ -95,6 +108,8 @@
    private DocTypeService docTypeService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private CanFinMapper canFinMapper;
    // region MES接口
@@ -239,7 +254,6 @@
            newMemo.put("itemdata", list);
            // 生成订单
            OrderPakin orderPakin = new OrderPakin();
            orderPakin.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
@@ -260,14 +274,14 @@
                    // 生成明细
                    Mat mat = matService.selectByMatnr(mesMatInfo.getItemNo());
                    if(Cools.isEmpty(mat)){
                        log.error("该物料编号立库没有="+mesMatInfo.getItemNo());
                    if (Cools.isEmpty(mat)) {
                        log.error("该物料编号立库没有=" + mesMatInfo.getItemNo());
                        continue;
                    }
                    OrderDetlPakin orderDetlPakin = new OrderDetlPakin();
                    orderDetlPakin.setOrderId(orderPakin.getId());
                    orderDetlPakin.setOrderNo(orderPakin.getOrderNo());
                    orderDetlPakin.setAnfme(Double.valueOf(mesMatInfo.getQty()));
                    orderDetlPakin.setAnfme(mesMatInfo.getQty());
                    orderDetlPakin.setQty(0.0);
                    orderDetlPakin.setMatnr(mat.getMatnr());
                    orderDetlPakin.setMaktx(mat.getMaktx());
@@ -938,6 +952,27 @@
        if (docType == null) {
            return 0;
        }
/*
        // 查询can_fin表中apply_time最新的记录
        List<CanFin> canFinList = canFinMapper.selectList(new EntityWrapper<CanFin>()
                .orderBy("apply_time", false)
        );
        if (!canFinList.isEmpty()) {
            CanFin firstCanFin = canFinList.get(0);
            if (firstCanFin.getAgvType().equals("agv-in-out")) {
                // 只修改需要更新的字段
                firstCanFin.setOutType("waiting");
                firstCanFin.setOutNo(mesCallOutApply.getOrderNo());
                // 确保其他字段保持不变
                canFinMapper.updateById(firstCanFin);
                log.info("已更新can_fin表最早记录的out_no,ID:{},出库单号:{}",
                        firstCanFin.getId(), mesCallOutApply.getOrderNo());
            }
        }
*/
        //生成出库单
        if (docType.getPakout() == 1) {
            long settle = 1;
@@ -967,10 +1002,27 @@
            orderPakout.setUpdateTime(now);
            orderPakout.setMemo(JSONObject.toJSONString(mesCallOutApply));
            orderPakout.setPakinPakoutStatus(2);
            orderPakout.setCstmrName(mesCallOutApply.getStationId());//agv目标站点
            if (!orderPakoutService.insert(orderPakout)) {
                log.error("MES保存出库订单(叫料)主档失败");
                throw new CoolException("保存出库订单(叫料)主档失败");
            }
            if (mesCallOutApply.getTransType().equals("装配出库单")){
                CanFin canFin = new CanFin();
                Date time = now;
                canFin.setAgvType("agv-out");
                canFin.setOutNo(mesCallOutApply.getOrderNo());
                List<CanFin> canFinList = canFinMapper.selectList(new EntityWrapper<>());
                if (canFinList.isEmpty()){
                    canFin.setTaskStatus("canout");
                }else {
                    canFin.setTaskStatus("waiting");
                }
                canFin.setApplyTime(time);
                canFinMapper.insert(canFin);
            }
            Set<String> set = new HashSet<>();
            // 生成明细
            if (mesCallOutApply.getItemdata() != null && !mesCallOutApply.getItemdata().isEmpty()) {
@@ -978,6 +1030,10 @@
                    set.add(mesOutApplyItem.getTrayid());
                    Mat mat = matService.selectByMatnr(mesOutApplyItem.getItemno());
                    if (Cools.isEmpty(mat)) {
                        log.error("物料编号不存在: {}", mesOutApplyItem.getItemno());
                        throw new CoolException("物料编号不存在: " + mesOutApplyItem.getItemno());
                    }
                    OrderDetlPakout orderDetlPakout = new OrderDetlPakout();
                    orderDetlPakout.setOrderId(orderPakout.getId());
                    orderDetlPakout.setOrderNo(orderPakout.getOrderNo());
@@ -1003,9 +1059,9 @@
            }
            //有多少种不同的配盘号   只有配盘出库单需要知道
            if (mesCallOutApply.getTransType().equals("配盘出库单")){
            if (mesCallOutApply.getTransType().equals("配盘出库单")) {
                orderPakout.setPayType(set.size());
                String shipCode =mesCallOutApply.getItemdata().get(0).getTrayid().split("-")[2];
                String shipCode = mesCallOutApply.getItemdata().get(0).getTrayid().split("-")[2];
                orderPakout.setShipCode(shipCode);//区域  是否是特殊托盘
                orderPakoutService.updateById(orderPakout);
            }
@@ -1039,11 +1095,11 @@
            orderPakin.setPakinPakoutStatus(1);
            orderPakinService.insert(orderPakin);
            if (mesCallOutApply.getItemdata() != null && !mesCallOutApply.getItemdata().isEmpty()) {
                for (MesCallOutApply.MesOutApplyItem mesOutApplyItem : mesCallOutApply.getItemdata()){
                for (MesCallOutApply.MesOutApplyItem mesOutApplyItem : mesCallOutApply.getItemdata()) {
                    // 生成明细
                    Mat mat = matService.selectByMatnr(mesOutApplyItem.getItemno());
                    if(Cools.isEmpty(mat)){
                        log.error("该物料编号立库没有="+mesOutApplyItem.getItemno());
                    if (Cools.isEmpty(mat)) {
                        log.error("该物料编号立库没有=" + mesOutApplyItem.getItemno());
                        continue;
                    }
                    OrderDetlPakin orderDetlPakin = new OrderDetlPakin();
@@ -1104,73 +1160,57 @@
            return result;
        }
        // 下发给RCS
        RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
        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);
        int workNo = commonService.getWorkNo(WorkNoType.OTHER.type);
        Date now = new Date();
        Task task = new Task();
        task.setWrkNo(workNo);
        task.setTaskType("ZX-AGV");
        if (transTask.getTransType()!= null){
            if (transTask.getTransType().equals("08-1")){
                task.setTaskType("ZX-AGV-08-1");
            }else if (transTask.getTransType().equals("08-2")){
                task.setTaskType("ZX-AGV-08-2");
            }else if (transTask.getTransType().equals("11")){
                task.setTaskType("ZP-AGV");
            }
        }
        task.setWrkSts(301L);//301.AGV任务创建
        task.setIoType(3);//3.站到站
        task.setIoPri(10.00);
        task.setWrkDate(now);
        task.setBarcode(transTask.getBarcode());
        task.setSourceStaNo(transTask.getCurStationId());
        task.setStaNo(transTask.getNextStationId());
        task.setBarcode(transTask.getTuoPanId());
        task.setModiUser(defaultUserId);
        task.setModiTime(now);
        task.setAppeUser(defaultUserId);
        task.setAppeTime(now);
        task.setTaskNo(transTask.getTaskno());
        task.setMemo(JSONObject.toJSONString(transTask));
        task.setPltType(transTask.getAgvFactory());//华晓AGV
        task.setPacked(transTask.getRackNumber());//料架号
        task.setCtnType(1);
        task.setIsPda(transTask.getIsPDA());
        // 转发给海康或华晓RCS
        int success = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
        if (success == 1) {
            int workNo = commonService.getWorkNo(WorkNoType.OTHER.type);
            Date now = new Date();
            Task task = new Task();
            task.setWrkNo(workNo);
            task.setTaskType("ZX-AGV");
            task.setWrkSts(302L);//302.AGV任务执行中
            task.setIoType(3);//3.站到站
            task.setIoPri(10.00);
            task.setWrkDate(now);
            task.setBarcode(transTask.getBarcode());
            task.setSourceStaNo(transTask.getCurStationId());
            task.setStaNo(transTask.getNextStationId());
            task.setBarcode(transTask.getTuoPanId());
            task.setModiUser(defaultUserId);
            task.setModiTime(now);
            task.setAppeUser(defaultUserId);
            task.setAppeTime(now);
            task.setTaskNo(transTask.getTaskno());
            task.setMemo(JSONObject.toJSONString(transTask));
            task.setPltType(transTask.getAgvFactory());//华晓AGV
            task.setPacked(transTask.getRackNumber());//料架号
            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(JSONObject.toJSONString(transTask.getItemBarcode()));
//            taskDetl.setModiUser(defaultUserId);
//            taskDetl.setModiTime(now);
//            taskDetl.setAppeUser(defaultUserId);
//            taskDetl.setAppeTime(now);
//            taskDetlService.insert(taskDetl);
        if (taskService.insert(task)) {
            if (transTask.getNextStationId().equals("402") || transTask.getNextStationId().equals("401")){
                CanFin canFin = new CanFin();
//            canFin.setAgvType("agv-in-out");
                canFin.setAgvType("agv-in");
                canFin.setTaskStatus("waiting");
                canFin.setInNo(transTask.getTaskno());
                canFin.setApplyTime(now);
                canFinMapper.insert(canFin);
                result.put("Success", "1");
                result.put("Message", "任务下发给RCS成功");
            }
            result.put("Success", "1");
            result.put("Message", "任务接收成功");
        } else {
            result.put("Message", "任务下发给RCS成功");
        }else {
            result.put("Success", "2");
            result.put("Message", "任务下发给RCS失败");
        }
        return result;
    }
@@ -1266,9 +1306,14 @@
        mesReturn.setSuccess("2");
        if ("Y".equals(allow.getStatus())) {
            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", allow.getTaskno()));
            String taskNo = allow.getTaskno();
            if (taskNo.contains("-")) {
                taskNo = allow.getTaskno().substring(0, taskNo.lastIndexOf("-"));
            }
            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", taskNo));
            if (Cools.isEmpty(task)) {
                mesReturn.setMessage("没有找个该任务编号=" + allow.getTaskno() + "的AGV移动任务");
                mesReturn.setMessage("没有找到该任务编号=" + allow.getTaskno() + "的AGV移动任务");
            } else {
                //查看申请站点的是海康还是华晓
                //海康
@@ -1284,13 +1329,23 @@
                    mesReturn.setSuccess(success == 1 ? "1" : "2");
                    mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");
                } else {
                    JSONObject params = new JSONObject();
                    params.put("EqptCode", allow.getStationId());
                    params.put("TaskCode", allow.getTaskno());
                    params.put("ActionStatus", "1");
                    allow.setMethod("APPLY_IN_STATION");
                    int success = rcsService.continueTask(allow, 2);
                    mesReturn.setSuccess(success == 1 ? "1" : "2");
                    mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");
                    int success1 = rcsService.applyIn(params, 2);
                    if (success1 == 1 || success == 1){
                        mesReturn.setSuccess("1");
                        mesReturn.setMessage("");
                    }else {
                        mesReturn.setSuccess(success1 == 1 ? "1" : "2");
                        mesReturn.setMessage(success1 == 1 ? "" : "转发给RCS失败");
                    }
                }
            }
        }
        return mesReturn;
@@ -1354,23 +1409,27 @@
        mesReturn.setSuccess("2");
        if ("Y".equals(allow.getStatus())) {
            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", allow.getTaskno()));
            String taskNo = allow.getTaskno();
            if (taskNo.contains("-")) {
                taskNo = allow.getTaskno().substring(0, taskNo.lastIndexOf("-"));
            }
            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", taskNo));
            if (Cools.isEmpty(task)) {
                mesReturn.setMessage("没有找个该任务编号=" + allow.getTaskno() + "的AGV移动任务");
            } else {
                //查看申请站点的是海康还是华晓
                //海康
                if (Cools.isEmpty(task.getPltType()) || task.getPltType() == 1) {
                if (Cools.isEmpty(task.getPltType()) || task.getPltType() == 1 || task.getPltType() == 0) {
                    RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
                    rcsTaskContinue.setRobotTaskCode(allow.getTaskno());
                    rcsTaskContinue.setTriggerType("TASK");
                    rcsTaskContinue.setTriggerCode(allow.getTaskno());
//            rcsTaskContinue.setTriggerType("ROBOT");
//            rcsTaskContinue.setTriggerCode(allow.getAgvCode());
                    int success = rcsService.continueTask(rcsTaskContinue, 1);
                    mesReturn.setSuccess(success == 1 ? "1" : "2");
                    mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");
                } else {
                    allow.setMethod("APPLY_OFF_STATION");
                    int success = rcsService.continueTask(allow, 2);
@@ -1418,6 +1477,7 @@
        return mesReturn;
    }
    // endregion
    /**
@@ -1431,5 +1491,39 @@
        AgvInfo agvInfo = agvInfoMapper.selectById(agvNo);
        return agvInfo.getAgvFactory();
    }
    @Override
    public int AGVPause(JSONObject params, int AGVType){
        MesReturn mesReturn = new MesReturn();
        String hik_blockUrl = "api/robot/controller/zone/blockade";
        String hik_pauseUrl = "api/robot/controller/zone/pause";
        String hx_url = "robot/controller/notify/isstop";
        if (AGVType == 1){
            String BLOCK_URL = HIK_URL + hik_blockUrl;
            String PAUSE_URL = HIK_URL + hik_pauseUrl;
            String blockResponse = RcsServiceImpl.sendPost(BLOCK_URL, JSONObject.toJSONString(params));
            JSONObject jsonObject = JSON.parseObject(blockResponse);
            if (!StringUtils.isEmpty(blockResponse) && (jsonObject.getString("code").equals("SUCCESS") || jsonObject.getInteger("code") == 200)) {
                String PauseResponse = RcsServiceImpl.sendPost(PAUSE_URL, JSONObject.toJSONString(params));
                JSONObject pauseJsonObject = JSON.parseObject(PauseResponse);
                if (!StringUtils.isEmpty(PauseResponse) && (jsonObject.getString("code").equals("SUCCESS") || jsonObject.getInteger("code") == 200)) {
                    return 1;
                }else
                    return 2;
            }else
                return 2;
        }else {
            String URL = "";
            URL = HX_URL + hx_url;
            String PauseResponse = RcsServiceImpl.sendPost(URL, JSONObject.toJSONString(params));
            JSONObject jsonObject = JSON.parseObject(PauseResponse);
            if (!StringUtils.isEmpty(PauseResponse) && (jsonObject.getString("code").equals("SUCCESS") || jsonObject.getInteger("code") == 200)) {
                return 1;
            }else
                return 2;
        }
    }
}