AgvMoveService.java 6.89 KB
package com.huaheng.api.pda.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.pda.domain.AgvMoveDetailDomain;
import com.huaheng.api.pda.domain.AgvMoveDomain;
import com.huaheng.api.pda.domain.AgvMoveHeaderDomain;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.BusinessException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
import com.huaheng.pc.task.agvTask.domain.AgvTask;
import com.huaheng.pc.task.agvTask.service.AgvTaskService;
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

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

@Component
@Transactional
public class AgvMoveService {

    @Resource
    private LocationService locationService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private TaskDetailService taskDetailService;
    @Resource
    private AgvTaskService agvTaskService;


    /**
     * 商片仓,从起点 工作台到终点 自动区或手动去
     * 原料仓  从起点 工作台到终点 缓存区,从起点 缓存区到终点 工作台
     *
     * agv搬运任务
     * @param agvMoveDomain
     */
    @Transactional
    public AjaxResult agvMove(AgvMoveDomain agvMoveDomain){
        //创建主任务
        if(agvMoveDomain==null){
            return AjaxResult.error("接收数据为空");
        }
        AgvMoveHeaderDomain headerDomain=agvMoveDomain.getHeaderDomain();
        List<AgvMoveDetailDomain> detailDomains=agvMoveDomain.getMoveDetailDomains();

        if(StringUtils.isEmpty(headerDomain.getWorkCode())){
            return AjaxResult.error("请填写工作台");
        }
        //保存taskheader和taskdetail
        TaskHeader task=createTaskHeaderForMove(headerDomain,detailDomains);
        //agv搬运任务,生成agv任务
//        AgvTask agvTask=agvTaskService.createAgvTaskByTaskHeader(task);
//        task.setAgvNo(agvTask.getTaskNo());
//        taskHeaderService.updateById(task);
        return AjaxResult.success();
    }

    public TaskHeader createTaskHeaderForMove(AgvMoveHeaderDomain headerDomain,List<AgvMoveDetailDomain> detailDomains){

        TaskHeader taskHeader=new TaskHeader();
        taskHeader.setWarehouseCode(QuantityConstant.WAREHOUSECODE);
        taskHeader.setCompanyCode(QuantityConstant.COMPANYCODE);
        taskHeader.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT);
        taskHeader.setZoneCode(headerDomain.getZoneCode());
        Location location=null;
        location= locationService.getLocationCodeByWorkCodeEmpty(headerDomain.getZoneCode(),headerDomain.getWorkCode(),taskHeader.getIsEmpty());
        if(location==null){
            throw new BusinessException("找不到该设备对应空闲库位");
        }
        if(StringUtils.isNotEmpty(headerDomain.getContainerCode())){
            //B库区,有托盘,pda选择区域,
            if(StringUtils.isNotEmpty(headerDomain.getTaskType())&&headerDomain.getTaskType().equals("1")){
                taskHeader.setPort(headerDomain.getWorkCode());
                taskHeader.setTaskType(QuantityConstant.TASK_TYPE_WHOLERECEIPT);
                taskHeader.setToPort(location.getCode());
            }else{
                taskHeader.setPort(headerDomain.getWorkCode());
                taskHeader.setTaskType(QuantityConstant.TASK_TYPE_WHOLESHIPMENT);
                taskHeader.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_SHIPMENT);
                taskHeader.setToPort(location.getCode());
            }
        }else{
            //A库区,无托盘
            if(StringUtils.isNotEmpty(headerDomain.getTaskType())&&headerDomain.getTaskType().equals("1")){
                taskHeader.setPort(headerDomain.getWorkCode());
                taskHeader.setToPort(headerDomain.getWorkCode());
                taskHeader.setTaskType(QuantityConstant.TASK_TYPE_AGV_MOVE_RECEIPT);
                taskHeader.setToPort(location.getCode());
            }else{
                taskHeader.setPort(headerDomain.getWorkCode());
                taskHeader.setTaskType(QuantityConstant.TASK_TYPE_AGV_MOVE_SHIPMENT);
                taskHeader.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_SHIPMENT);
                taskHeader.setToPort(location.getCode());

            }
        }
        taskHeader.setFromLocation(location.getCode());
        taskHeader.setToLocation(location.getCode());
        taskHeader.setContainerCode(headerDomain.getContainerCode());
        taskHeader.setSendTo(QuantityConstant.TASK_SEND_TO_AGV);


        //查找该入库口出库口是否有相同的还未完成的任务
        LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getPort,taskHeader.getPort());
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getToPort,taskHeader.getToPort());
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getTaskType,taskHeader.getTaskType());
        taskHeaderLambdaQueryWrapper.lt(TaskHeader::getStatus,QuantityConstant.TASK_STATUS_COMPLETED);
        taskHeaderLambdaQueryWrapper.last("limit 1");
        TaskHeader preTaskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
        if(preTaskHeader!=null){
            throw new BusinessException("该工作台还有未完成的任务,请稍等");
        }

        if(!taskHeaderService.save(taskHeader)){
            throw new BusinessException("创建主任务失败");
        }
        //保存TaskDetail任务明细
        createTaskDetailForMove(detailDomains,taskHeader);
        return taskHeader;
    }

    public void createTaskDetailForMove(List<AgvMoveDetailDomain> detailDomains,TaskHeader task){
        for (AgvMoveDetailDomain detailDomain:detailDomains){
            TaskDetail taskDetail=new TaskDetail();
            taskDetail.setTaskId(task.getId());
            taskDetail.setTaskType(task.getTaskType());
            taskDetail.setWarehouseCode(task.getWarehouseCode());
            taskDetail.setCompanyCode(task.getCompanyCode());
            taskDetail.setMaterialCode(detailDomain.getMaterialCode());
            taskDetail.setQty(detailDomain.getQyt());
            taskDetail.setContainerCode(task.getContainerCode());
            taskDetail.setRollNumber(detailDomain.getRollNumber());
            if(!taskDetailService.save(taskDetail)){
                throw new BusinessException("创建任务明细失败");
            }
        }
    }

}