自动化立体仓库 - WMS系统
zyx
2023-10-18 080fdceed464c56f43633e85daeaf929d40496af
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java
@@ -1,21 +1,193 @@
package com.zy.asrs.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.exception.CoolException;
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.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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;
@Service
@Slf4j
public class AgvWrkMastServiceImp extends ServiceImpl<AgvWrkMastMapper, AgvWrkMast> implements AgvWrkMastService {
    @Value("${agv.url}")
    private String url;
    @Value("${agv.taskCreatePath}")
    private String taskCreatePath;
    @Value("${agv.containerMoveInPath}")
    private String containerMoveInPath;
    @Value("${agv.containerMoveOutPath}")
    private String containerMoveOutPath;
    @Autowired
    AgvWrkMastMapper agvWrkMastMapper;
    @Autowired
    AgvWrkDetlService agvWrkDetlService;
    @Autowired
    AgvLocMastService agvLocMastService;
    @Autowired
    ApiLogService apiLogService;
    public void updateWrkStsByWrkNo(int wrkNo, long wrkSts) {
        AgvWrkMast agvWrkMast = this.selectById(wrkNo);
        //判断要修改的工作档状态是否合理,如果不合理则抛出异常
        checkWrkSts(agvWrkMast,wrkSts);
        agvWrkMast.setWrkSts(wrkSts);
        this.updateById(agvWrkMast);
    }
    // TODO 判断规则
    private boolean checkWrkSts(AgvWrkMast agvWrkMast,long wrkSts){
        return true;
    }
    public int startWrk(List<AgvWrkMast> agvWrkMastList, String taskType) throws IOException {
        AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam();
        agvTaskCreateParam.setTaskType(taskType);
//        //调用容器入场时所需要参数
//        Map<String,List<Map<String,String>>> containerMoveParam = new HashMap<>();
//        List<Map<String,String>> positionCodeMapList = new ArrayList<>();
//        containerMoveParam.put("containerMoveIns",positionCodeMapList);
        getRequestParam(agvTaskCreateParam,agvWrkMastList);
        return doHttpRequest(agvTaskCreateParam,"搬运任务下发",url, taskCreatePath,null,"127.0.0.1");
        //return containerMoveParam;
    }
    //容器入场
    public int containerMove(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);
        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");
    }
    public boolean insertByIncrease(AgvWrkMast agvWrkMast) {
        int index = this.baseMapper.insertByIncrease(agvWrkMast);
        return index > 0;
    }
    @Override
    public boolean deleteByWrkNo(int wrkNo) {
        return this.delete(new EntityWrapper<AgvWrkMast>().eq("wrk_no", wrkNo));
    }
    private void getContainerMoveParam(List<AgvWrkMast> agvWrkMastList,List<Map<String,String>> positionCodeMapList){
        //往容器入场参数中放入源站点位置
        for(AgvWrkMast agvWrkMast : agvWrkMastList){
            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() + "");
            }
            agvTaskParam.setTaskPriority(agvWrkMast.getIoPri().intValue());
            //AgvTaskkDescribeParam
            agvTaskkDescribeParam.setFromLocationCode(agvWrkMast.getSourceLocNo());
            agvTaskkDescribeParam.setToLocationCode(agvWrkMast.getLocNo());
            agvTaskkDescribeParam.setContainerCode(agvWrkMast.getBarcode());
            return agvTaskParam;
        }).collect(Collectors.toList());
        agvTaskCreateParam.setTasks(agvTaskParamList);
    }
    private int doHttpRequest(Object requestParam, String namespace, String url, String path, String appkey, String ip){
        String response = "";
        boolean success = false;
        try {
            response = new HttpHandler.Builder()
                    .setUri(url)
                    .setPath(path)
                    .setJson(JSONObject.toJSONString(requestParam))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            int code = (int) jsonObject.get("code");
            if(code != 0){
                throw new CoolException("调用AGV响应错误");
            }
            success = true;
            return code;
        }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
            );
        }
    }
}