自动化立体仓库 - WMS系统
zhangc
2024-12-12 5dc8a9f9aba3310fd21cad9509635bb7ec2f007f
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java
@@ -3,18 +3,18 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.AgvBasDevp;
import com.zy.asrs.entity.AgvLocMast;
import com.zy.asrs.entity.AgvWrkMast;
import com.zy.asrs.entity.param.AgvTaskCreateParam;
import com.zy.asrs.entity.param.AgvTaskParam;
import com.zy.asrs.entity.param.AgvTaskkDescribeParam;
import com.zy.asrs.mapper.AgvWrkMastMapper;
import com.zy.asrs.service.AgvLocMastService;
import com.zy.asrs.service.AgvWrkDetlService;
import com.zy.asrs.service.AgvWrkMastService;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.*;
import com.zy.common.service.AgvCommonService;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -22,21 +22,24 @@
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.*;
import java.util.concurrent.TimeUnit;
@Service
@Slf4j
public class AgvWrkMastServiceImp extends ServiceImpl<AgvWrkMastMapper, AgvWrkMast> implements AgvWrkMastService {
    @Value("${agv.flag}")
    private boolean flag;
    @Value("${agv.url}")
    private String url;
    @Value("${agv.taskCreatePath}")
    private String taskCreatePath;
    @Value("${agv.taskCancelPath}")
    private String taskCancelPath;
    @Value("${agv.containerMoveInPath}")
    private String containerMoveInPath;
@@ -55,62 +58,97 @@
    AgvLocMastService agvLocMastService;
    @Autowired
    ApiLogService apiLogService;
    @Autowired
    AgvBasDevpService agvBasDevpService;
    @Autowired
    private AgvCommonService agvCommonService;
    @Autowired
    private AgvWrkMastService agvWrkMastService;
    public void updateWrkStsByWrkNo(int wrkNo, long wrkSts) {
    public Boolean updateWrkStsByWrkNo(int wrkNo, long wrkSts) {
        AgvWrkMast agvWrkMast = this.selectById(wrkNo);
        //判断要修改的工作档状态是否合理,如果不合理则抛出异常
        checkWrkSts(agvWrkMast,wrkSts);
        checkWrkSts(agvWrkMast, wrkSts);
        agvWrkMast.setWrkSts(wrkSts);
        agvWrkMast.setModiTime(new Date());
        return this.updateById(agvWrkMast);
    }
    public void updateWrkStsByWrkNo(int wrkNo, long wrkSts, String manuType, long userId) {
        Date now = new Date();
        AgvWrkMast agvWrkMast = this.selectById(wrkNo);
        //判断要修改的工作档状态是否合理,如果不合理则抛出异常
        checkWrkSts(agvWrkMast, wrkSts);
        agvWrkMast.setWrkSts(wrkSts);
        agvWrkMast.setManuType(manuType);
        agvWrkMast.setModiTime(now);
        agvWrkMast.setModiUser(userId);
        this.updateById(agvWrkMast);
    }
    // TODO 判断规则
    private boolean checkWrkSts(AgvWrkMast agvWrkMast,long wrkSts){
    private boolean checkWrkSts(AgvWrkMast agvWrkMast, long wrkSts) {
        return true;
    }
    public int startWrk(List<AgvWrkMast> agvWrkMastList, String taskType) throws IOException {
    public int startWrk(AgvWrkMast agvWrkMast) throws IOException {
        AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam();
        agvTaskCreateParam.setTaskType(taskType);
        //agvTaskCreateParam.setTaskType(taskType);
        getRequestParam(agvTaskCreateParam,agvWrkMastList);
        getRequestParam(agvTaskCreateParam, agvWrkMast);
        return doHttpRequest(agvTaskCreateParam,"搬运任务下发",url, taskCreatePath,null,"127.0.0.1");
        return doHttpRequest(agvTaskCreateParam, "搬运任务下发", url, taskCreatePath, null, "127.0.0.1");
        //return containerMoveParam;
    }
    //容器入场
    public int containerMoveIn(List<AgvWrkMast> agvWrkMastList) throws IOException {
        //调用容器入场时所需要参数
        Map<String,List<Map<String,String>>> containerMoveParam = new HashMap<>();
        List<Map<String,String>> positionCodeMapList = new ArrayList<>();
        containerMoveParam.put("containerMoveIns",positionCodeMapList);
        getContainerMoveParam(agvWrkMastList,positionCodeMapList);
        if(Cools.isEmpty(positionCodeMapList)){
            return 0;
        }
        return doHttpRequest(containerMoveParam,"容器入场任务下发",url, containerMoveInPath,null,"127.0.0.1");
    public int startAllcationIn(AgvWrkMast agvWrkMast) throws IOException {
        AgvBasDevp basDevp = agvBasDevpService.selectByDevNo(agvWrkMast.getSourceLocNo());
        //检索库位,选择合适的库位
        AgvLocMast locMast = agvCommonService.getLocNo(basDevp.getLocType1(), basDevp.getFloor(), false, true);
        agvWrkMast.setLocNo(locMast.getLocNo());
        agvWrkMast.setWrkSts(201L);
        agvWrkMast.setLogErrMemo("startAllcationIn");
        agvWrkMast.setModiTime(new Date());
        agvWrkMastService.updateById(agvWrkMast);
        // 更目标库位
        locMast.setLocSts("S");
        agvLocMastService.updateById(locMast);
        return 0;
    }
    //容器离场
    public int containerMoveOut(List<AgvWrkMast> agvWrkMastList){
        Map<String,List<Map<String,String>>> containerMoveParam = new HashMap<>();
        List<Map<String,String>> positionCodeMapList = new ArrayList<>();
        containerMoveParam.put("containerMoveOuts",positionCodeMapList);
        for(AgvWrkMast agvWrkMast : agvWrkMastList){
            Map<String,String> positionCodeMap = new HashMap<>();
            positionCodeMap.put("positionCode",agvWrkMast.getLocNo());
    //货架入场
    public int containerMoveIn(List<AgvWrkMast> agvWrkMastList) throws IOException {
        //调用货架入场时所需要参数
        Map<String, List<Map<String, String>>> containerMoveParam = new HashMap<>();
        List<Map<String, String>> positionCodeMapList = new ArrayList<>();
        containerMoveParam.put("containerMoveIns", positionCodeMapList);
        getContainerMoveParam(agvWrkMastList, positionCodeMapList);
        if (Cools.isEmpty(positionCodeMapList)) {
            return 0;
        }
        return doHttpRequest(containerMoveParam, "货架入场任务下发", url, containerMoveInPath, null, "127.0.0.1");
    }
    //货架离场
    public int containerMoveOut(List<AgvWrkMast> agvWrkMastList) {
        Map<String, List<Map<String, String>>> containerMoveParam = new HashMap<>();
        List<Map<String, String>> positionCodeMapList = new ArrayList<>();
        containerMoveParam.put("containerMoveOuts", positionCodeMapList);
        for (AgvWrkMast agvWrkMast : agvWrkMastList) {
            Map<String, String> positionCodeMap = new HashMap<>();
            positionCodeMap.put("positionCode", agvWrkMast.getLocNo());
            positionCodeMapList.add(positionCodeMap);
        }
        return doHttpRequest(containerMoveParam,"容器离场任务下发",url, containerMoveOutPath,null,"127.0.0.1");
        return doHttpRequest(containerMoveParam, "货架离场任务下发", url, containerMoveOutPath, null, "127.0.0.1");
    }
    public boolean insertByIncrease(AgvWrkMast agvWrkMast) {
@@ -124,86 +162,165 @@
        return this.delete(new EntityWrapper<AgvWrkMast>().eq("wrk_no", wrkNo));
    }
    //容器到达通知
    //货架到达通知
    public int containerArrived(AgvWrkMast agvWrkMast) {
        Map<String,String> containerArrivedParam = new HashMap<>();
        String slotCode = agvWrkMast.getSourceLocNo().substring(3, 6) + "-1";
        containerArrivedParam.put("slotCode",slotCode);
        containerArrivedParam.put("containerCode",agvWrkMast.getBarcode());
        Map<String, String> containerArrivedParam = new HashMap<>();
        containerArrivedParam.put("slotCode", agvWrkMast.getSourceLocNo());
        containerArrivedParam.put("containerCode", agvWrkMast.getBarcode());
        return doHttpRequest(containerArrivedParam,"容器达到通知",url, containerArrivedPath,null,"127.0.0.1");
        return doHttpRequest(containerArrivedParam, "货架达到通知", url, containerArrivedPath, null, "127.0.0.1");
    }
    private void getContainerMoveParam(List<AgvWrkMast> agvWrkMastList,List<Map<String,String>> positionCodeMapList){
        //往容器入场参数中放入源站点位置
        for(AgvWrkMast agvWrkMast : agvWrkMastList){
            //判断是否为输送线入库,是则不需要容器进场请求
            if("Y".equals(agvWrkMast.getMk())){
    @Override
    public List<AgvWrkMast> selectReadyAgvWrkMast() {
        List<String> stationCodes = agvBasDevpService.selectAllStationCode();
        Wrapper<AgvWrkMast> wrapper = new EntityWrapper<AgvWrkMast>().eq("wrk_sts", 21L).like(false, "loc_no", "@");
        wrapper.in("loc_no", stationCodes);
        return this.selectList(wrapper);
        //return this.baseMapper.selectReadyAgvWrkMast();
    }
    @Override
    public AgvWrkMast selectByContainerCode(String containerCode) {
        return this.selectOne(new EntityWrapper<AgvWrkMast>().eq("barcode", containerCode));
    }
    @Override
    public int callCancelTask(int wrkNo) {
        AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam();
        agvTaskCreateParam.setTaskCode(wrkNo + "");
        return doHttpRequest(agvTaskCreateParam, "取消任务下发", url, taskCancelPath, null, "127.0.0.1");
    }
    private void getContainerMoveParam(List<AgvWrkMast> agvWrkMastList, List<Map<String, String>> positionCodeMapList) {
        //往货架入场参数中放入源站点位置
        for (AgvWrkMast agvWrkMast : agvWrkMastList) {
            //判断是否为输送线入库,是则不需要货架进场请求
            if ("Y".equals(agvWrkMast.getMk())) {
                continue;
            }
            Map<String,String> positionCodeMap = new HashMap<>();
            positionCodeMap.put("positionCode",agvWrkMast.getSourceLocNo());
            Map<String, String> positionCodeMap = new HashMap<>();
            positionCodeMap.put("positionCode", agvWrkMast.getSourceLocNo());
            positionCodeMapList.add(positionCodeMap);
        }
    }
    private void getRequestParam(AgvTaskCreateParam agvTaskCreateParam,List<AgvWrkMast> agvWrkMastList){
        List<AgvTaskParam> agvTaskParamList = agvWrkMastList.stream().map(agvWrkMast -> {
            AgvTaskParam agvTaskParam = new AgvTaskParam();
            AgvTaskkDescribeParam agvTaskkDescribeParam = new AgvTaskkDescribeParam();
            agvTaskParam.setTaskDescribe(agvTaskkDescribeParam);
            //AgvTaskParam
            if(agvWrkMast.getIoType() == 53 || agvWrkMast.getIoType() == 57){
                agvTaskParam.setTaskCode(-agvWrkMast.getWrkNo() + "");
            }else{
                agvTaskParam.setTaskCode(agvWrkMast.getWrkNo() + "");
            }
    private void getRequestParam(AgvTaskCreateParam agvTaskCreateParam, AgvWrkMast agvWrkMast) {
            agvTaskParam.setTaskPriority(agvWrkMast.getIoPri().intValue());
        List<AgvTaskParam> agvTaskParamList = Arrays.asList(
                //起始位
                new AgvTaskParam(agvWrkMast.getSourceLocNo()),
                //目标位
                new AgvTaskParam(agvWrkMast.getLocNo()));
            //AgvTaskkDescribeParam
            agvTaskkDescribeParam.setFromLocationCode(agvWrkMast.getSourceLocNo());
            agvTaskkDescribeParam.setToLocationCode(agvWrkMast.getLocNo());
            agvTaskkDescribeParam.setContainerCode(agvWrkMast.getBarcode());
            return agvTaskParam;
        }).collect(Collectors.toList());
//        //起始位
//        agvTaskParamList.add(new AgvTaskParam(agvWrkMast.getSourceLocNo()));
//        //目标位
//        agvTaskParamList.add(new AgvTaskParam(agvWrkMast.getLocNo()));
        agvTaskCreateParam.setTasks(agvTaskParamList);
        if (agvWrkMast.getIoType() == 53 || agvWrkMast.getIoType() == 57) {
            agvWrkMast.setWrkNo(-agvWrkMast.getWrkNo());
        }
        agvTaskCreateParam.setTaskCode(agvWrkMast.getWrkNo().toString());
        switch (agvWrkMast.getIoType()) {
            case 114:
            case 108:
            case 12:
                agvTaskCreateParam.setTaskTyp("F06");
                break;
            case 109:
                if (agvWrkMast.getWrkSts() == 201) {
                    agvTaskCreateParam.setTaskTyp("F06");
                } else {
                    agvTaskCreateParam.setTaskTyp("F01");
                }
                break;
            case 1:
            case 57:
                // 入库任务是只有 接驳位 -- > 库位
                AgvLocMast loc = agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>().eq("loc_no", agvWrkMast.getLocNo()));
                String locSub = loc.getLocNo().substring(loc.getLocNo().length() - 4).substring(0, 2).substring(0, 2);
                AgvBasDevp agvBasDevp = agvBasDevpService.selectByDevNo(agvWrkMast.getSourceLocNo());
                if ("02".equals(locSub)) {
                    if (agvBasDevp.getFloor() == 4) {
                        agvTaskCreateParam.setTaskTyp("F01");
                    } else {
                        agvTaskCreateParam.setTaskTyp("F06");
                    }
                } else {
                    // 目标楼层位1楼 但源库位(接驳位)在吸塑二楼
                    if (agvBasDevp.getFloor() == 4) {
                        agvTaskCreateParam.setTaskTyp("F06");
                    } else {
                        agvTaskCreateParam.setTaskTyp("F01");
                    }
                }
                break;
            default:
                agvTaskCreateParam.setTaskTyp("F01");
                break;
        }
        agvTaskCreateParam.setPositionCodePath(agvTaskParamList);
    }
    private int doHttpRequest(Object requestParam, String namespace, String url, String path, String appkey, String ip){
    private int doHttpRequest(Object requestParam, String namespace, String url, String path, String appkey, String ip) {
        if (!flag) {
            return 1;
        }
        String response = "";
        boolean success = false;
        int code = 0;
        try {
            response = new HttpHandler.Builder()
                    .setUri(url)
                    .setPath(path)
                    .setTimeout(30, TimeUnit.SECONDS)
                    .setJson(JSONObject.toJSONString(requestParam))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            int code = (int) jsonObject.get("code");
            if(code != 0){
            code = Integer.parseInt(jsonObject.get("code").toString());
            if (code != 0) {
                if (code == 6) {
                    log.info("AGV任务单号已上报:{}", response);
                    String message = jsonObject.getString("message");
                    if (!Cools.isEmpty(message) && message.contains("已存在任务单头为")) {
                        success = true;
                        return 0;
                    }
                }
                throw new CoolException("调用AGV响应错误");
                //return code;
            }
            success = true;
            return code;
        }catch (Exception e){
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new CoolException("调用AGV响应错误");
        }finally {
            apiLogService.save(
                    namespace,
                    url + path,
                    appkey,
                    ip,
                    JSON.toJSONString(JSONObject.toJSONString(requestParam)),
                    response,
                    success
            );
            //return 1;
        } finally {
            if (code != 6) {
                apiLogService.save(
                        namespace,
                        url + path,
                        appkey,
                        ip,
                        JSON.toJSONString(JSONObject.toJSONString(requestParam)),
                        response,
                        success
                );
            }
        }
    }