AcsServiceImpl.java 10.5 KB
package com.huaheng.api.acs.service;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huaheng.api.acs.domain.AgvTask;
import com.huaheng.api.acs.domain.StateInfoUploadModel;

import com.huaheng.api.acs.mapper.AcsMapper;
import com.huaheng.common.constant.HttpConstant;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.http.HttpUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.service.ConfigService;
import com.huaheng.pc.config.address.service.AddressService;
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.config.pointPosition.domain.PointPosition;
import com.huaheng.pc.config.pointPosition.service.PointPositionService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;

/**
 * @ClassName AcsServiceImpl
 * @Description TODO
 * @Author Administrator
 * @Date 2019/12/2615:38
 */
@Service
public class AcsServiceImpl extends ServiceImpl<AcsMapper,AgvTask> implements AcsService {


//    public static final  int STATUS_TASK_CARRY=100; 搬运任务
//    public static final  int STATUS_TASK_WALK=200;  行走任务
//    public static final  int STATUS_TASK_PICKUP=300;取货任务
//    public static final  int STATUS_TASK_Release=400;放货任务
//    public static final  String STATUS_POSITION_EMPTY="empty";
//    public static final  String STATUS_POSITION_SOME="some";
//    public static final  String STATUS_POSITION_FULL="full";
//    public static final  String STATUS_POSITION_LOCK="lock";
    @Resource
    private ConfigService configService;
    @Resource
    private AddressService addressService;

    @Resource
    private PointPositionService pointPositionService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private ContainerService containerService;

    //AGV信息上传
    @Override
    public AjaxResult StateInfoUpload(StateInfoUploadModel model) {
        return null;
    }

    //AGV信息回传
    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult TaskConfirm(AgvTask agvTask) { return null;}

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult createAGVTask(AgvTask agvTask) {

        //校验请求参数
        checkAgvTaskPosition(agvTask);
        //校验托盘是否存在任务及是否锁定
        checkContainerAndPositionStatus(agvTask);
        agvTask.setStatus(QuantityConstant.TASK_STATUS_BUILD);
        agvTask.setCreatedBy(ShiroUtils.getLoginName());
        agvTask.setCreatedTime(new Date());
        agvTask.setUpdated(new Date());
        agvTask.setUpdatedBy(ShiroUtils.getLoginName());
        if (save(agvTask)) {
            pointPositionService.updateStatus(agvTask.getFromPort(), QuantityConstant.STATUS_POSITION_LOCK, agvTask.getWarehouseCode());
            pointPositionService.updateStatus(agvTask.getToPort(), QuantityConstant.STATUS_POSITION_LOCK, agvTask.getWarehouseCode());
        } else {
            throw new ServiceException("AGV创建任务失败");
        }
        return AjaxResult.success("执行生成任务成功", agvTask);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult sendTaskToAGV(Integer[] AgvTaskIds) {
        AgvTask task = null;
        for (Integer taskId : AgvTaskIds) {
            task = getById(taskId);

            if (task.getStatus() >= QuantityConstant.TASK_STATUS_RELEASE) {
                return AjaxResult.error("任务" + taskId + "已经下发,请不要重复下发,操作中止");
            }
            // 给AGV传递任务
            AjaxResult ajaxResult = agvTaskAssign(task);
            if (ajaxResult != null && ajaxResult.hasErr()) {
                return AjaxResult.error(ajaxResult.getMsg());
            }

            //修改任务头表
            task.setId(taskId);
            task.setStatus(QuantityConstant.TASK_STATUS_RELEASE);
            task.setUpdated(new Date());
            task.setUpdatedBy(ShiroUtils.getLoginName());
            saveOrUpdate(task);
        }
        return AjaxResult.success("执行下发任务成功", task);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult agvTaskAssign(AgvTask agvTask) {
        //1、判断agvHeader是否为空
        if (agvTask == null) {
            return AjaxResult.error("Agv任务为空");
        }
        //2、判断必填字段是否满足
        if (agvTask.getId() == null) {
            return AjaxResult.error("Agv任务号Id为空");
        }
        if (agvTask.getTaskType() == null) {
            return AjaxResult.error("Agv任务类型为空");
        }
        String containerCode = agvTask.getContainerCode();
        if (StringUtils.isEmpty(containerCode)) {
            return AjaxResult.error("Agv任务中容器为空");
        }
        String warehouseCode = agvTask.getWarehouseCode();
        //3、转换实体,初始化Agv任务实体
        agvTask.setTaskNo(String.valueOf(agvTask.getId()));
        //4、发送数据
        String value = configService.getKey(QuantityConstant.RULE_CONNECT_AGV);
        int connectAGV = Integer.parseInt(value);
        AjaxResult ajaxResult =new AjaxResult();
        if (connectAGV == QuantityConstant.RULE_AGV_CONNECT) {
            String url = addressService.selectAddress(QuantityConstant.ADDRESS_AGV_TASK_ASSIGN, warehouseCode, "1");
            String JsonParam = JSON.toJSONString(agvTask);
            System.out.println(JsonParam);
            String result = HttpUtils.bodypost(url, JsonParam, warehouseCode);
            if (StringUtils.isEmpty(result)) {
                throw new ServiceException("接口地址错误或返回为空");
            }
            ajaxResult = JSON.parseObject(result, AjaxResult.class);
            if (ajaxResult.getCode() != HttpConstant.OK) {
                return AjaxResult.error(ajaxResult.getMsg());
            }
        }
        return AjaxResult.success(agvTask);
    }


    //检查托盘和点位是否存在未完成的任务
    private void checkContainerAndPositionStatus(AgvTask agvTask){

        TaskHeader containerLKTaskStatus = taskHeaderService.getOne(new LambdaQueryWrapper<TaskHeader>()
                .eq(TaskHeader::getContainerCode, agvTask.getContainerCode())
                .lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED));
        AgvTask containerAgvTaskStatus = getOne(new LambdaQueryWrapper<AgvTask>()
                .eq(AgvTask::getContainerCode, agvTask.getContainerCode())
                .eq(AgvTask::getStatus, QuantityConstant.TASK_STATUS_COMPLETED));
        if (StringUtils.isNotNull(containerLKTaskStatus)&&StringUtils.isNotNull(containerAgvTaskStatus)) {
            throw  new ServiceException("托盘"+agvTask.getContainerCode()+"存在未完成的任务");
        }

        Container containerStatus = containerService.getContainerByCode(agvTask.getContainerCode());
        if(StringUtils.isNull(containerStatus)){
            throw  new ServiceException("托盘"+agvTask.getContainerCode()+"不存在");
        }
        if(QuantityConstant.STATUS_CONTAINER_LOCK.equals(containerStatus.getStatus())){
            throw  new ServiceException("托盘"+agvTask.getContainerCode()+"已锁定");
        }

        PointPosition pointPosition = pointPositionService.getOne(new LambdaQueryWrapper<PointPosition>()
                .eq(PointPosition::getContainCode, agvTask.getContainerCode())
                .eq(PointPosition::getStatus, QuantityConstant.STATUS_CONTAINER_LOCK));
        if (pointPosition != null) {
            throw  new ServiceException("点位"+pointPosition.getPositionName()+"已锁定,托盘在此位置不能生成任务");
        }
    }
    //根据任务类型检验参数
    private void checkAgvTaskPosition(AgvTask agvTask){
        if (StringUtils.isNull(agvTask)) {
            throw new ServiceException("任务数据为空,请重新下发");
        }
        if (StringUtils.isEmpty(agvTask.getContainerCode())) {
            throw new ServiceException("托盘为空");
        }
        if (StringUtils.isNull(agvTask.getTaskType())) {
            throw new ServiceException("任务类型无");
        }
        int taskType = agvTask.getTaskType().intValue();
        PointPosition sourcePosition = pointPositionService.getPositionByCode(agvTask.getFromPort(), agvTask.getWarehouseCode());
        PointPosition desPosition = pointPositionService.getPositionByCode(agvTask.getToPort(), agvTask.getWarehouseCode());
        if (taskType == QuantityConstant.STATUS_TASK_CARRY || taskType == QuantityConstant.STATUS_TASK_WALK
                || taskType == QuantityConstant.STATUS_TASK_PICKUP) {
            if (StringUtils.isEmpty(agvTask.getFromPort())) {
                throw  new ServiceException("源点位为空");
            }
            if (StringUtils.isNull(sourcePosition)) {
                throw new ServiceException("源点位:" + sourcePosition + "未找到");
            }
            if(sourcePosition.getStatus().equals(QuantityConstant.STATUS_POSITION_LOCK)){
                throw new ServiceException("源点位:" + sourcePosition + "禁用");
            }
        }
        if (taskType == QuantityConstant.STATUS_TASK_CARRY || taskType == QuantityConstant.STATUS_TASK_WALK
                || taskType == QuantityConstant.STATUS_TASK_RELEASE) {
            if (StringUtils.isEmpty(agvTask.getToPort())) {
                throw  new ServiceException("目标点位为空");
            }
            if (StringUtils.isNull(desPosition)) {
                throw new ServiceException("目标点位:" + desPosition + "未找到");
            }
            if(desPosition.getStatus().equals(QuantityConstant.STATUS_POSITION_LOCK)){
                throw new ServiceException("目标点位:" + sourcePosition + "禁用");
            }
            if (QuantityConstant.STATUS_CONTAINER_FULL.equals(desPosition.getStatus())) {
                throw new ServiceException("目标点位:" + desPosition + "已满");

            }
        }
    }
}