package com.huaheng.api.acs.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
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.domain.ToAgvTask;
import com.huaheng.api.acs.mapper.AcsMapper;
import com.huaheng.api.mes.domain.AgvPortMES;
import com.huaheng.api.mes.service.MESHelper;
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.restful.RestUtil;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.domain.RetCode;
import com.huaheng.framework.web.service.ConfigService;
import com.huaheng.pc.agv.domain.AgvInventory;
import com.huaheng.pc.agv.domain.AgvPort;
import com.huaheng.pc.agv.domain.WorkStation;
import com.huaheng.pc.agv.domain.WorkStationFlow;
import com.huaheng.pc.agv.service.IAgvInventoryService;
import com.huaheng.pc.agv.service.IAgvPortService;
import com.huaheng.pc.agv.service.IWorkStationFlowService;
import com.huaheng.pc.agv.service.IWorkStationService;
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.inventory.inventoryHeader.domain.InventoryHeader;
import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
import com.huaheng.pc.receipt.receiptContainerHeader.service.ReceiptContainerHeaderService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
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.ReceiptTaskService;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @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
    public AcsService acsService;
    @Resource
    private ConfigService configService;
    @Resource
    private AddressService addressService;
    @Resource
    private IAgvPortService agvPortService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private ContainerService containerService;
    @Resource
    private InventoryHeaderService inventoryHeaderService;
    @Resource
    private IAgvInventoryService iAgvInventoryService;
    @Resource
    private IWorkStationService iWorkStationService;
    @Resource
    private IWorkStationFlowService iiWorkStationFlowService;
    @Resource
    private IAgvInventoryService agvInventoryService;
    @Resource
    private TaskDetailService taskDetailService;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private ReceiptContainerHeaderService receiptContainerHeaderService;
    @Resource
    private ReceiptTaskService receiptTaskService;
    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private MESHelper mesHelper;

    /**
     * agv 信息上传
     * @param model
     * @return
     */
    @Override
    public AjaxResult stateInfoUpload(StateInfoUploadModel model) {
        return null;
    }

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

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult createAGVTask(AgvTask agvTask) {
        if(StringUtils.isEmpty(agvTask.getPreTaskNo())){
            //校验请求参数
            checkAgvTaskPosition(agvTask);
            //校验托盘是否存在任务及是否锁定
            checkContainerAndPositionStatus(agvTask);
            //校验自己生成的任务中源点位的托盘和实际托盘一不一致
            checkContainerAndPositionLove(agvTask);
        }
        if(agvTask.getToPort().replace(" ","").toLowerCase().equals("work680")){
            AjaxResult ajaxResult = checkP6001Status();
            if(ajaxResult.hasErr()){
                return ajaxResult;
            }
        }
        agvTask.setStatus(QuantityConstant.TASK_STATUS_BUILD);
        if(StringUtils.isNotEmpty(ShiroUtils.getLoginName())){
            agvTask.setCreatedBy(ShiroUtils.getLoginName());
        }else {
            agvTask.setCreatedBy(agvTask.getCreatedBy());
        }
        agvTask.setTaskType(QuantityConstant.STATUS_TASK_CARRY);
        agvTask.setCreatedTime(new Date());
        agvTask.setUpdated(new Date());
        if(StringUtils.isNotEmpty(ShiroUtils.getLoginName())){
            agvTask.setUpdatedBy(ShiroUtils.getLoginName());
        }else {
            agvTask.setUpdatedBy(agvTask.getCreatedBy());
        }
        agvTask.setWarehouseCode("CS0001");
        if (acsService.save(agvTask)) {
            if(StringUtils.isEmpty(agvTask.getPreTaskNo())){
                agvPortService.updateStatus(agvTask.getFromPort(), QuantityConstant.STATUS_POSITION_LOCK);
                AgvPort desPosition = agvPortService.getAgvportByCode(agvTask.getToPort());
                if(desPosition.getUserDef1()){
                    agvPortService.updateStatus(agvTask.getToPort(), QuantityConstant.STATUS_POSITION_LOCK);
                }
                containerService.updateStatus(agvTask.getContainerCode(),QuantityConstant.STATUS_CONTAINER_LOCK,agvTask.getWarehouseCode());

            }
        } else {
            throw new ServiceException("AGV创建任务失败");
        }
        return AjaxResult.success("执行生成任务成功");
    }

    private AjaxResult checkP6001Status() {
        HashMap map = new HashMap();
        String url="http://192.168.74.200:8026/api/agv_plc/rollersignalread";
        map.put("stationName","P6001");
        map.put("signalNo",4);
        String param = JSON.toJSONString(map);
        String result =HttpUtils.bodypost(url,param,"AGV");
        if(StringUtils.isNull(result) || StringUtils.isEmpty(result)) {
            throw new ServiceException("WCS:接口地址错误或返回为空");
        }
        JSONObject jsonObject = JSONObject.parseObject(result);
        String code = jsonObject.getString("code");
        if(code.equals("200")){
            JSONObject data = jsonObject.getJSONObject("data");
            String flag = data.getBoolean("flag").toString();
            if(flag.equals("true")){
               return AjaxResult.error("P6001有货,不允许放货");
            }else {
                return AjaxResult.success();
            }
        }else {
            return AjaxResult.error("P6001读取wcs异常");
        }
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult createAGVTask2(TaskHeader taskHeader) {
        try {
            if(taskHeader.getTaskType().equals(QuantityConstant.TASK_TYPE_WHOLESHIPMENT)){
                AgvTask agvTask=new AgvTask();
                agvTask.setTaskType(QuantityConstant.STATUS_TASK_CARRY);
                agvTask.setContainerCode(taskHeader.getContainerCode());
                agvTask.setFromPort(taskHeader.getPort());
                agvTask.setToPort("");
                agvTask.setWarehouseCode(taskHeader.getWarehouseCode());
                agvTask.setStatus(QuantityConstant.TASK_STATUS_BUILD);
                agvTask.setCreatedBy(taskHeader.getCreatedBy());
                agvTask.setCreatedTime(new Date());
                if (save(agvTask)) {
                    agvPortService.updateStatus(agvTask.getFromPort(), QuantityConstant.STATUS_POSITION_LOCK);
                    containerService.updateStatus(agvTask.getContainerCode(),QuantityConstant.STATUS_CONTAINER_LOCK,agvTask.getWarehouseCode());
                }
            }
        }catch (Exception e) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            taskHeader.setUserDef3("新增AGV任务失败了");
            taskHeaderService.updateById(taskHeader);
        }
        return null;
    }


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

            if (task.getStatus() >= QuantityConstant.TASK_STATUS_RELEASE) {
                result = AjaxResult.error("任务" + taskId + "已经下发,请不要重复下发,操作中止");
                finished = true;
                break;
            }
            if (StringUtils.isEmpty(task.getToPort())) {
                result = AjaxResult.error("任务没有目标点位,不允许下发");
                finished = true;
                break;
            }
            LambdaQueryWrapper<AgvTask> agvTaskLambdaQueryWrapper = Wrappers.lambdaQuery();
            AgvPort desPosition = agvPortService.getAgvportByCode(task.getToPort());
            if(desPosition.getUserDef1()&&StringUtils.isEmpty(task.getPreTaskNo())){
                agvTaskLambdaQueryWrapper.eq(AgvTask::getToPort, task.getToPort())
                        .eq(AgvTask::getWarehouseCode, task.getWarehouseCode())
                        .ge(AgvTask::getStatus, QuantityConstant.TASK_STATUS_RELEASE)
                        .lt(AgvTask::getStatus, QuantityConstant.TASK_STATUS_COMPLETED);
                List<AgvTask> list = list(agvTaskLambdaQueryWrapper);
                if (list != null && list.size() > 0) {
                    result = AjaxResult.error("目标点位存在任务,请更换目标点位");
                    finished = true;
                    break;
                }
            }
            //此处判断是否需要 有尘车间和无尘车间之间进行任务中转
            AgvPort sourcePosition = agvPortService.getAgvportByCode(task.getFromPort());
            WorkStation sourceWorkStation = iWorkStationService.getById(sourcePosition.getWorkStationId());
            WorkStation desWorkStation = iWorkStationService.getById(desPosition.getWorkStationId());
            if(sourceWorkStation.getUserDef1()!=null&&desWorkStation.getUserDef1()!=null){
                if(!sourceWorkStation.getUserDef1().trim().equals(desWorkStation.getUserDef1().trim())){
                    AjaxResult ajax=new AjaxResult();
                    if(sourceWorkStation.getUserDef1().trim().equals("有尘车间左")&&desWorkStation.getUserDef1().trim().equals("无尘车间")){
                        ajax= createAfterTask(sourcePosition,task,1);
                    }
                    if(sourceWorkStation.getUserDef1().trim().equals("有尘车间右")&&desWorkStation.getUserDef1().trim().equals("无尘车间")){
                        ajax= createAfterTask(sourcePosition,task,2);
                    }
                    if(sourceWorkStation.getUserDef1().trim().equals("无尘车间")&&desWorkStation.getUserDef1().trim().equals("有尘车间左")){
                        ajax= createAfterTask(sourcePosition,task,3);
                    }
                    if(sourceWorkStation.getUserDef1().trim().equals("无尘车间")&&desWorkStation.getUserDef1().trim().equals("有尘车间右")){
                        ajax= createAfterTask(sourcePosition,task,4);
                    }
                    if(ajax.hasErr()){
                        return ajax;
                    }
                    task.setId(taskId);
                    task.setStatus(QuantityConstant.TASK_STATUS_RELEASE);
                    task.setUpdated(new Date());
                    task.setUpdatedBy(ShiroUtils.getLoginName());
                    task.setFromUserDef1(sourceWorkStation.getUserDef1());
                    task.setToUserDef1(desWorkStation.getUserDef1());
                    saveOrUpdate(task);
                    return ajax;
                }
            }
            // 给AGV传递任务
            AjaxResult ajaxResult = agvTaskAssign(task);
            if (ajaxResult != null && ajaxResult.hasErr()) {
                result = AjaxResult.error(ajaxResult.getMsg());
                finished = true;
                break;
            }
            //修改任务头表
            task.setId(taskId);
            task.setStatus(QuantityConstant.TASK_STATUS_RELEASE);
            task.setUpdated(new Date());
            task.setUpdatedBy(ShiroUtils.getLoginName());
            saveOrUpdate(task);
        }
        if (!finished) {
            result = AjaxResult.success("执行下发任务成功", task);
        }
        return result;
    }

    private AjaxResult createAfterTask(AgvPort sourcePosition,AgvTask task,int i) {
        AjaxResult ajaxResult=new AjaxResult();
        String url=null;
        String param=null;
        if(i==1){
            HashMap map = new HashMap();
            url="http://192.168.74.200:8026/api/agv_plc/carputsignalread";
            map.put("stationName","P4001");
            map.put("signalNo",4);
            param=JSON.toJSONString(map);
        }
        if(i==2){
            HashMap map = new HashMap();
            url="http://192.168.74.200:8026/api/agv_plc/carputsignalread";
            map.put("stationName","P4004");
            map.put("signalNo",4);
            param=JSON.toJSONString(map);
        }
        if(i==3){
            HashMap map = new HashMap();
            url="http://192.168.74.200:8026/api/agv_plc/carputsignalread";
            map.put("stationName","P4002");
            map.put("signalNo",4);
            param=JSON.toJSONString(map);
        }
        if(i==4){
            HashMap map = new HashMap();
            url="http://192.168.74.200:8026/api/agv_plc/carputsignalread";
            map.put("stationName","P4003");
            map.put("signalNo",4);
            param=JSON.toJSONString(map);
        }
        String result =HttpUtils.bodypost(url,param,"AGV");
//        HashMap map = new HashMap();
//        HashMap map1 = new HashMap();
//        map.put("code","200");
//        map1.put("flag","true");
//        map.put("data",map1);
//        String result = JSON.toJSONString(map);
        if(StringUtils.isNull(result) || StringUtils.isEmpty(result)) {
            throw new ServiceException("WCS:接口地址错误或返回为空");
        }
        JSONObject jsonObject = JSONObject.parseObject(result);
        String code = jsonObject.getString("code");
        if(code.equals("200")){
            JSONObject data = jsonObject.getJSONObject("data");
            String flag = data.getBoolean("flag").toString();
            if(flag.equals("true")){
                AgvTask agvTask=new AgvTask();
                agvTask.setFromPort(sourcePosition.getCode());
                if(i==1){
                    agvTask.setToPort("Work 776");
//                    List<AgvTask> agvTasks=list(new LambdaQueryWrapper<AgvTask>().eq(AgvTask::getToPort,"Work 776").lt(AgvTask::getStatus,100));
//                    if(CollectionUtils.isNotEmpty(agvTasks)){
//                        return AjaxResult.error("接驳位P4001有任务去");
//                    }
                }
                if(i==2){
                    agvTask.setToPort("Work 775");
                }
                if(i==3){
                    agvTask.setToPort("Work 633");
//                    List<AgvTask> agvTasks=list(new LambdaQueryWrapper<AgvTask>().eq(AgvTask::getToPort,"Work 633").lt(AgvTask::getStatus,100));
//                    if(CollectionUtils.isNotEmpty(agvTasks)){
//                        return AjaxResult.error("接驳位P4002有任务去");
//                    }
                }
                if(i==4){
                    agvTask.setToPort("Work 630");
                }
                agvTask.setContainerCode(task.getContainerCode());
                agvTask.setWarehouseCode("CS0001");
                agvTask.setPreTaskNo(task.getId().toString());
                ajaxResult= createAGVTask(agvTask);
                if(!ajaxResult.hasErr()){
                    return AjaxResult.success("生成任务成功");
                }
            }else {
                if(i==1){
                    return AjaxResult.error("接驳位P4001不允许放货");
                }
                if(i==2){
                    return AjaxResult.error("接驳位P4004不允许放货");
                }
                if(i==3){
                    return AjaxResult.error("接驳位P4002不允许放货");
                }
                if(i==4){
                    return AjaxResult.error("接驳位P4003不允许放货");
                }
            }
        }else {
            return AjaxResult.error("读取wcs异常");
        }
        return AjaxResult.error("程序未执行");
    }

    @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()));
        ToAgvTask toAgvTask=new ToAgvTask();
        ArrayList<String> containers=new ArrayList<>();
        ArrayList<String> fromports=new ArrayList<>();
        ArrayList<String> toports=new ArrayList<>();
        containers.add(agvTask.getContainerCode());
        toAgvTask.setContainerCode(containers);
        fromports.add(agvTask.getFromPort());
        toAgvTask.setFromPort(fromports);
        toports.add(agvTask.getToPort());
        toAgvTask.setToPort(toports);
        AgvPort desPosition =agvPortService.getAgvportByCode(agvTask.getToPort());
        WorkStation workStation= iWorkStationService.getById(desPosition.getWorkStationId());
        toAgvTask.setTaskType(workStation.getTaskType());
        toAgvTask.setTaskNo(agvTask.getId().toString());
        //4、发送数据
        return  sendDataToAgv(1,warehouseCode,"1",toAgvTask);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult cancelAGVTask(Integer[] agvTaskIds) {
        for (int taskId : agvTaskIds) {
            AgvTask agvTask = getById(taskId);
            if (agvTask == null) {
                return AjaxResult.error("任务" + taskId + "未找到,操作中止");
            }
            if (agvTask.getStatus() > QuantityConstant.TASK_STATUS_RELEASE) {
                return AjaxResult.error("存在任务" + agvTask.getId() + "已下发或执行,操作中止");
            }
            int preTaskNo = taskId;
            LambdaQueryWrapper<AgvTask> agvLambdaQueryWrapper = Wrappers.lambdaQuery();
            agvLambdaQueryWrapper.eq(AgvTask::getPreTaskNo, preTaskNo);
            AgvTask agvTaskHeader = getOne(agvLambdaQueryWrapper);
            if (agvTaskHeader != null) {
                return AjaxResult.error("取消任务失败, 有前置任务" + agvTask.getId());
            }
            //查出任务明细
            //删除子任务
            //删除主任务
            removeById(taskId);
            //盘点取消任务,恢复明细状态为1
            int taskType = agvTask.getTaskType().intValue();
            switch (taskType) {
                case QuantityConstant.STATUS_TASK_CARRY:
                case QuantityConstant.STATUS_TASK_WALK:
                    break;
                case QuantityConstant.STATUS_TASK_PICKUP:
                case QuantityConstant.STATUS_TASK_RELEASE:
                    break;
                default:
                    break;
            }
            cancelPositionStatus(agvTask);
            cancelContainerStatus(agvTask);
        }
        return AjaxResult.success("取消任务成功!");
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult cancelTask(Integer id, String warehouseCode, String area) {
        //1、判断参数是否为空
        if(id == null) {
            throw new ServiceException("任务号为空");
        }
        HashMap<String,Object> map=new HashMap();
        List<Integer> list=new ArrayList<>();
        list.add(id);
        map.put("taskNo",list);
        //2、发送数据
        return sendDataToAgv(2,warehouseCode,area,map);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult updateAGVTask(String agvTaskId, Integer priority) {
        if(StringUtils.isEmpty(agvTaskId)) {
            throw new ServiceException("任务号为空");
        }
        AgvTask agvTask = getById(Integer.parseInt(agvTaskId));
        agvTask.setPriority(priority);
        agvTask.setUpdated(new Date());
        agvTask.setUpdatedBy(ShiroUtils.getLoginName());
        if(!updateById(agvTask)) {
            throw new ServiceException("更新优先级失败");
        }
        return AjaxResult.success();
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult updateTask(Integer id, String warehouseCode, Integer priority) {
        if(id == null) {
            throw new ServiceException("任务号为空");
        }

        AgvTask agvTask=new AgvTask();
        agvTask.setTaskNo(String.valueOf(id));
        agvTask.setPriority(priority);
        return sendDataToAgv(3,warehouseCode,"1",agvTask);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult notifyAGVPort(Map map) {
        AgvTask agvTask=new AgvTask();
        if(map.isEmpty()) {
            return AjaxResult.error("请求数据为空");
        }
        Object o1=map.get("taskNo");
        Object o2=map.get("carNo");
        Object o3=map.get("oldPort");
        Object o4=map.get("newPort");
        if(StringUtils.isNull(o1)) {
            return AjaxResult.error("任务号为空");
        }
        if(StringUtils.isNull(o2)) {
            return AjaxResult.error("小车编号为空");
        }
        if(StringUtils.isNull(o3)) {
            return AjaxResult.error("起点为空");
        }
        if(StringUtils.isNull(o4)) {
            return AjaxResult.error("终点为空");
        }
        Integer taskNo=Integer.valueOf(o1.toString());
        String carNo=o2.toString();
        String fromPort=o3.toString();
        String toPort=o4.toString();
        agvTask.setId(taskNo);
        agvTask.setCarNo(carNo);
        agvTask.setFromPort(fromPort);
        agvTask.setToPort(toPort);
        AjaxResult ajaxResult = checkPointPositionExist(agvTask);
        if(ajaxResult.hasErr()) {
            return ajaxResult;
        }
        if(!updateById(agvTask)){ throw new ServiceException("更新失败"); };
        return ajaxResult;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult notifyAGVTask(Map map) {
        AgvTask agvTask=new AgvTask();
        if(map.isEmpty()) {
            return AjaxResult.error("请求数据为空");
        }
        Object o1=map.get("taskNo");
        Object o2=map.get("carNo");
        Object o3=map.get("status");
        if(StringUtils.isNull(o1)) {
            return AjaxResult.error("任务号为空");
        }
        Integer taskNo=Integer.valueOf(o1.toString());
        List<AgvTask> list = list(new LambdaQueryWrapper<AgvTask>().eq(AgvTask::getId, taskNo));
        if(CollectionUtils.isNotEmpty(list)){
            AgvTask agvTask1 = list.get(0);
            if(agvTask1.getStatus().equals(100)){
                  return AjaxResult.success("任务已经是完成了的");
            }
        }else {
            return AjaxResult.success("任务不存在");
        }
        if(StringUtils.isNotNull(o2)) {
            String carNo=o2.toString();
            agvTask.setCarNo(carNo);
        }
        if(StringUtils.isNull(o3)) {
            return AjaxResult.error("任务状态为空");
        }
        String status=o3.toString();
        agvTask.setId(taskNo);
        agvTaskStatusNowStart(status,agvTask);
        return AjaxResult.success();
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult completeTaskByWMS(String taskId) {
        if(StringUtils.isEmpty(taskId)){
            return AjaxResult.error("任务id为空");
        }
        AgvTask agvTask = getById(taskId);
        if(StringUtils.isNotEmpty(agvTask.getPreTaskNo())){
            agvTask.setStatus(100);
            agvTask.setCarNo(agvTask.getCarNo());
            String toPort=agvTask.getToPort();
            updateById(agvTask);
            agvTask = getById(agvTask.getPreTaskNo());
            if(!toPort.equals(agvTask.getToPort())){
                return AjaxResult.success();
            }
        }
        if (agvTask.getStatus() == QuantityConstant.TASK_STATUS_BUILD) {
            return AjaxResult.error("任务" + taskId + "未下发,请不要直接完成");
        }
        //更新点位和托盘信息
        if(StringUtils.isNotEmpty(agvTask.getFromPort())){
            AgvPort sourcePosition = agvPortService.getAgvportByCode(agvTask.getFromPort());
            if(StringUtils.isNull(sourcePosition)){
                return AjaxResult.error("源点位未找到");
            }
            agvPortService.updateStatus(agvTask.getFromPort(), QuantityConstant.STATUS_POSITION_EMPTY);
            agvPortService.setContainerCode(agvTask.getFromPort(),null);
        }
        if(StringUtils.isNotEmpty(agvTask.getToPort())){
            AgvPort agvPort = agvPortService.getAgvportByCode(agvTask.getToPort());
            agvPortService.updateStatus(agvTask.getToPort(),QuantityConstant.STATUS_POSITION_EMPTY);
            if(agvPort.getUserDef1()){
                containerService.updateLocationCodeAndStatus(agvTask.getContainerCode(),agvTask.getToPort(),QuantityConstant.STATUS_CONTAINER_EMPTY,agvTask.getWarehouseCode());
                agvPortService.setContainerCode(agvTask.getToPort(),agvTask.getContainerCode());
                WorkStation workStation = iWorkStationService.getOne(new LambdaQueryWrapper<WorkStation>().eq(WorkStation::getId, agvPort.getWorkStationId()));
                List<AgvInventory> agvInventories = iAgvInventoryService.getListByContainerCode(agvTask.getContainerCode());
                agvInventories.forEach((agvInventory)->{
                    agvInventory.setWorkStationId(workStation.getId());
                    agvInventory.setWorkStationCode(workStation.getCode());
                    agvInventory.setAgvPortId(agvPort.getId());
                    agvInventory.setAgvPortCode(agvPort.getCode());
                    agvInventory.setStatus("empty");
                    iAgvInventoryService.updateById(agvInventory);
                });
            }else {
                Container container= containerService.getContainerByCode(agvTask.getContainerCode(),"CS0001");
                container.setStatus("empty");
                container.setLocationCode(null);
                containerService.updateById(container);
                agvPortService.setContainerCode(agvTask.getToPort(),null);
                iAgvInventoryService.removeByPortCode(agvTask.getFromPort());
            }
        }
        //更新agv任务状态
        agvTask.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
        agvTask.setUpdated(new Date());
        agvTask.setUpdatedBy(ShiroUtils.getLoginName());
        if(!updateById(agvTask)) {
            throw new ServiceException("完成任务失败");
        }
        return AjaxResult.success();
    }

    /**
     * 将参数传输给AGV
     * @param
     * @param warehouseCode
     * @param area
     * @param object
     * @return
     */
    private AjaxResult sendDataToAgv(int i,String warehouseCode,String area,Object object){
        String value = configService.getKey(QuantityConstant.RULE_CONNECT_AGV);
        int connectAGV = Integer.parseInt(value);
        String url=null;
        if (connectAGV == QuantityConstant.RULE_AGV_CONNECT) {
            if(i==1) {
                url = addressService.selectAddress(QuantityConstant.ADDRESS_AGV_TASK_ASSIGN, warehouseCode, area);
            }else if(i==2){
                url = addressService.selectAddress(QuantityConstant.ADDRESS_AGV_TASK_CANCEL, warehouseCode, area);
            }else {

            }
            String JsonParam = JSON.toJSONString(object);
            System.out.println(JsonParam);
         //   ResponseEntity<JSONObject> result = RestUtil.request_post(url, warehouseCode, JsonParam);
            String result = HttpUtils.bodypost(url, JsonParam, "CS0001");
//            if (result != null && result.getBody() != null) {
//                String code = result.getBody().getString("code");
//                String msg = result.getBody().getString("msg");
//                if (Integer.parseInt(code) != HttpConstant.OK) {
//                    return AjaxResult.error(msg);
//                }
//            } else {
//                throw new ServiceException("接口地址错误或返回为空");
//            }
//            String data = result.getBody().getString("data");
//            AjaxResult ajaxResult = JSON.parseObject(data, AjaxResult.class);
//            if(ajaxResult.getCode() != HttpConstant.OK) {
//                return AjaxResult.error(ajaxResult.getMsg());
//            }
            if(result==null){
                throw new ServiceException("调用失败");
            }else {
                return AjaxResult.success(result);
            }
        }
        return AjaxResult.success("下发成功");
    }

    /**
     * 检查托盘和点位是否存在未完成的任务
     * @param 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())
                .lt(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()+"已锁定");
        }

        AgvPort pointPosition = agvPortService.getOne(new LambdaQueryWrapper<AgvPort>()
                .eq(AgvPort::getContainerCode, agvTask.getContainerCode())
                .eq(AgvPort::getStatus, QuantityConstant.STATUS_CONTAINER_LOCK)
                .orderByAsc(AgvPort::getType).last("limit 1"));
        if (pointPosition != null) {
            throw  new ServiceException("点位"+pointPosition.getCode()+"已锁定,托盘在此位置不能生成任务");
        }
    }

    //根据任务类型检验参数
    @SuppressWarnings({"AlibabaRemoveCommentedCode", "AlibabaCommentsMustBeJavadocFormat"})
    private void checkAgvTaskPosition(AgvTask agvTask){
        if (StringUtils.isNull(agvTask)) {
            throw new ServiceException("任务数据为空,请重新下发");
        }
        if (StringUtils.isEmpty(agvTask.getContainerCode())) {
            throw new ServiceException("托盘为空");
        }

        AgvPort sourcePosition = agvPortService.getAgvportByCode(agvTask.getFromPort());
        AgvPort desPosition = agvPortService.getAgvportByCode(agvTask.getToPort());

        if (StringUtils.isEmpty(agvTask.getFromPort())) {
            throw  new ServiceException("源点位为空");
        }
        if (StringUtils.isNull(sourcePosition)) {
            throw new ServiceException("源点位:" + sourcePosition.getName() + "未找到");
        }
//        if(sourcePosition.getStatus().equals(QuantityConstant.STATUS_POSITION_LOCK)){
//            throw new ServiceException("源点位:" + sourcePosition.getName() + "禁用");
//        }

        if (StringUtils.isEmpty(agvTask.getToPort())) {
            throw  new ServiceException("目标点位为空");
        }
        if (StringUtils.isNull(desPosition)) {
            throw new ServiceException("目标点位:" + desPosition.getName() + "未找到");
        }
        if(!desPosition.getUserDef1()){
            return;
        }
        if(desPosition.getStatus().equals(QuantityConstant.STATUS_POSITION_LOCK)){
            throw new ServiceException("目标点位:" + desPosition.getName() + "禁用");
        }
        if(StringUtils.isNotEmpty(desPosition.getContainerCode())){
            throw new ServiceException("目标点位:" + desPosition.getName() + "存在托盘:"+desPosition.getContainerCode());
        }
        if (QuantityConstant.STATUS_CONTAINER_FULL.equals(desPosition.getStatus())) {
            throw new ServiceException("目标点位:" + desPosition.getName() + "已满");
        }

    }

    //更新点位状态
    @SuppressWarnings("AlibabaCommentsMustBeJavadocFormat")
    private void cancelPositionStatus(AgvTask agvTask) {
        if (agvTask.getFromPort() != null) {
            //更新点位状态
            AgvPort agvPort = agvPortService.getAgvportByCode(agvTask.getFromPort());
            if(agvPort!=null&&StringUtils.isNotEmpty(agvPort.getContainerCode())){
                agvPortService.updateStatus(agvTask.getFromPort(), QuantityConstant.STATUS_POSITION_EMPTY);
            } else {
                agvPortService.updateStatus(agvTask.getFromPort(), QuantityConstant.STATUS_POSITION_EMPTY);
            }
        }
        if (agvTask.getToPort() != null) {
            //更新点位状态
            AgvPort agvPort = agvPortService.getAgvportByCode(agvTask.getToPort());
            if(agvPort!=null&&StringUtils.isNotEmpty(agvPort.getContainerCode())){
                agvPortService.updateStatus(agvTask.getToPort(), QuantityConstant.STATUS_POSITION_EMPTY);
            } else {
                agvPortService.updateStatus(agvTask.getToPort(), QuantityConstant.STATUS_POSITION_EMPTY);

            }
        }

    }
    //更新容器状态
    @SuppressWarnings("AlibabaCommentsMustBeJavadocFormat")
    private void cancelContainerStatus(AgvTask agvTask){
        LambdaQueryWrapper<InventoryHeader> inventoryHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        inventoryHeaderLambdaQueryWrapper.eq(InventoryHeader::getContainerCode, agvTask.getContainerCode());
        InventoryHeader inventoryHeader = inventoryHeaderService.getOne(inventoryHeaderLambdaQueryWrapper);
        Container container = new Container();
        container.setStatus(QuantityConstant.STATUS_CONTAINER_EMPTY);
        if (inventoryHeader != null) {
            if (QuantityConstant.STATUS_CONTAINER_SOME.equals(inventoryHeader.getContainerStatus())) {
                container.setStatus(QuantityConstant.STATUS_CONTAINER_SOME);
            }
        }
        LambdaUpdateWrapper<Container> containerUpdateWrapper = Wrappers.lambdaUpdate();
        containerUpdateWrapper.eq(Container::getCode, agvTask.getContainerCode());
        containerService.update(container, containerUpdateWrapper);
    }


    //检查点位是否存在
    @SuppressWarnings("AlibabaCommentsMustBeJavadocFormat")
    private AjaxResult checkPointPositionExist(AgvTask agvTask){
        AgvPort sourcePosition = agvPortService.getAgvportByCode(agvTask.getFromPort());
        AgvPort desPosition = agvPortService.getAgvportByCode(agvTask.getToPort());
        if (StringUtils.isNull(sourcePosition)) {
            return AjaxResult.error("源点位:" + sourcePosition + "未找到");
        }
        if (StringUtils.isNull(desPosition)) {
            return AjaxResult.error("目标点位:" + desPosition + "未找到");
        }
        return AjaxResult.success();
    }
    //校验自己生成的任务中源点位的托盘和实际托盘一不一致
    @SuppressWarnings("AlibabaCommentsMustBeJavadocFormat")
    private void  checkContainerAndPositionLove(AgvTask agvTask){
        AgvPort agvPort = agvPortService.getAgvportByCode(agvTask.getFromPort());
        if(agvPort!=null&&StringUtils.isNotEmpty(agvPort.getContainerCode())){
            if(!agvTask.getContainerCode().equals(agvPort.getContainerCode())){
                throw  new ServiceException("源点位上托盘数据和分配的托盘不一致,请核对");
            }
        }

    }
    //根据agv的任务状态来判断
    private AjaxResult agvTaskStatusNowStart(String o3,AgvTask agvTask){
        AgvTask task = getById(agvTask.getId());
        if(task==null) {
            return   AjaxResult.error("任务号"+agvTask.getId()+"不存在");
        }
        if(task.getStatus().equals(QuantityConstant.TASK_STATUS_COMPLETED)) {
            return AjaxResult.error("任务"+agvTask.getId()+"已经完成");
        }
       /* if(!updateById(agvTask)){ throw new ServiceException("更新失败"); };*/
//        if(o3.equals(QuantityConstant.STATUS_TASK_WAITING)){
//             agvTask.setStatus(10);
//             updateById(agvTask);
//        }
        if(o3.equals(QuantityConstant.STATUS_TASK_AGV_START)){
             agvTask.setStatus(15);
             updateById(agvTask);
        }
//        if(o3.equals(QuantityConstant.STATUS_TASK_DISPATCHED)){
//             agvTask.setStatus(18);
//             updateById(agvTask);
//        }
        if(o3.equals(QuantityConstant.STATUS_TASK_AGV_TASKOVER)){
            agvTask.setStatus(20);
            agvPortService.updateStatus(task.getFromPort(),QuantityConstant.STATUS_POSITION_EMPTY);
            agvPortService.setContainerCode(task.getFromPort(),null);
            updateById(agvTask);
            AgvInventory agvInventory=new AgvInventory();
            agvInventory.setStatus("lock");
            LambdaQueryWrapper<AgvInventory> lambdaQueryWrapper=Wrappers.lambdaQuery();
            lambdaQueryWrapper.eq(AgvInventory::getContainerCode,task.getContainerCode());
            iAgvInventoryService.update(agvInventory,lambdaQueryWrapper);
        }
        if(o3.equals(QuantityConstant.STATUS_TASK_FINISH)){
            if(StringUtils.isNotEmpty(task.getPreTaskNo())){
                task.setStatus(100);
                if(StringUtils.isNotEmpty(agvTask.getCarNo())){
                    task.setCarNo(agvTask.getCarNo());
                }
                String toport=task.getToPort();
                updateById(task);
                task = getById(task.getPreTaskNo());
                if(!toport.equals(task.getToPort())){
                    return AjaxResult.success();
                }
            }
            task.setStatus(100);
            if(StringUtils.isNotEmpty(agvTask.getCarNo())){
                task.setCarNo(agvTask.getCarNo());
            }
            AgvPort fromPort= agvPortService.getAgvportByCode(task.getFromPort());
            WorkStation fromWorkStation = iWorkStationService.getOne(new LambdaQueryWrapper<WorkStation>().eq(WorkStation::getId, fromPort.getWorkStationId()));
            if(fromWorkStation!=null&&fromWorkStation.getTaskType().equals("1")){
                agvPortService.updateStatus(task.getFromPort(),QuantityConstant.STATUS_POSITION_EMPTY);
                agvPortService.setContainerCode(task.getFromPort(),null);
            }
            updateById(task);
            //处理一下agv_inventory
            AgvPort toPort = agvPortService.getAgvportByCode(task.getToPort());
            agvPortService.updateStatus(task.getToPort(),QuantityConstant.STATUS_POSITION_EMPTY);
            if(toPort.getUserDef1()){
                containerService.updateLocationCodeAndStatus(task.getContainerCode(),task.getToPort(),QuantityConstant.STATUS_CONTAINER_EMPTY,task.getWarehouseCode());
                agvPortService.setContainerCode(task.getToPort(),task.getContainerCode());
                WorkStation workStation = iWorkStationService.getOne(new LambdaQueryWrapper<WorkStation>().eq(WorkStation::getId, toPort.getWorkStationId()));
                List<AgvInventory> agvInventories = iAgvInventoryService.getListByContainerCode(task.getContainerCode());
                agvInventories.forEach((agvInventory)->{
                    agvInventory.setWorkStationId(workStation.getId());
                    agvInventory.setWorkStationCode(workStation.getCode());
                    agvInventory.setAgvPortId(toPort.getId());
                    agvInventory.setAgvPortCode(toPort.getCode());
                    agvInventory.setStatus("empty");
                    iAgvInventoryService.updateById(agvInventory);
                });
            }else {
                Container container = containerService.getContainerByCode(task.getContainerCode());
                containerService.updateSetLocationNullByCode(container.getCode(),QuantityConstant.STATUS_POSITION_EMPTY);
                String containerCode= task.getContainerCode();
                if(task.getToPort().equals("Work 830")){
                    List<AgvInventory> agvInventories = iAgvInventoryService.getListByContainerCode(containerCode);
                    if(CollectionUtils.isNotEmpty(agvInventories)){
                        ReceiptHeader receiptHeader=new ReceiptHeader();
                        receiptHeader.setReceiptType("PPI");
                        receiptHeader.setCompanyCode("WB");
                        receiptHeaderService.saveReceiptHeader(receiptHeader);
                        List<ReceiptDetail> receiptDetailList = new ArrayList<>();
                        agvInventories.forEach((agvInventory)->{
                            ReceiptDetail receiptDetail=new ReceiptDetail();
                            receiptDetail.setCompanyCode("WB");
                            receiptDetail.setInventorySts("good");
                            receiptDetail.setQcCheck("0");
                            receiptDetail.setReceiptCode(receiptHeader.getCode());
                            receiptDetail.setReceiptId(receiptHeader.getId());
                            receiptDetail.setMaterialCode(agvInventory.getMaterialCode());
                            receiptDetail.setTotalQty(BigDecimal.valueOf(agvInventory.getQty()));
                            receiptDetailList.add(receiptDetail);
                            receiptDetailService.saveReceiptDetaial(receiptDetail);
                        });
                        if(CollectionUtils.isNotEmpty(receiptDetailList)){
                            List<ReceiptContainerHeader> receiptContainerHeaders = new ArrayList<>();
                            receiptDetailList.forEach(receiptDetail -> {
                                ReceiptContainerHeader receiptContainerHeader=new ReceiptContainerHeader();
                                AjaxResult ajaxResult = receiptContainerHeaderService.saveContainer(receiptDetail.getReceiptCode(), containerCode, receiptDetail.getId(),
                                        "", receiptDetail.getTotalQty(), "");
                                receiptContainerHeaders.add((ReceiptContainerHeader)ajaxResult.getData());
                            });
                            if(CollectionUtils.isNotEmpty(receiptContainerHeaders)){
                                List<Integer> list=new ArrayList<>();
                                for (ReceiptContainerHeader receiptContainerHeader : receiptContainerHeaders) {
                                    list.add(receiptContainerHeader.getId());
                                }
                                list = list.stream().distinct().collect(Collectors.toList());
                                receiptTaskService.createReceiptTask(list);
                            }
                        }
                    }else {
                        inventoryHeaderService.createEmptyIn(task.getContainerCode(), null);
                    }
                }
                agvPortService.setContainerCode(task.getToPort(),null);
                iAgvInventoryService.removeByPortCode(task.getFromPort());
            }
            cancelContainerStatus(task);
        }
        if(o3.equals(QuantityConstant.STATUS_TASK_ERROR)){
             agvTask.setStatus(110);
             updateById(agvTask);
        }
        if(o3.equals(QuantityConstant.STATUS_TASK_WAITING_CANCEL)){
             agvTask.setStatus(120);
             updateById(agvTask);
        }
//        if(o3.equals(QuantityConstant.STATUS_TASK_CANCEL_FINISH)){
//             agvTask.setStatus(130);
//             updateById(agvTask);
//        }
//        if(o3.equals(QuantityConstant.STATUS_TASK_WAITING_MANUALLY_FINISH)){
//             agvTask.setStatus(140);
//             updateById(agvTask);
//        }
//        if(o3.equals(QuantityConstant.STATUS_TASK_MANUALLY_FINISH)){
//            agvTask.setStatus(150);
//            agvPortService.updateStatus(task.getFromPort(),QuantityConstant.STATUS_POSITION_EMPTY);
//            agvPortService.updateStatus(task.getToPort(),QuantityConstant.STATUS_POSITION_EMPTY);
//            agvPortService.setContainerCode(task.getFromPort(),null);
//            agvPortService.setContainerCode(task.getToPort(),task.getContainerCode());
//            containerService.updateLocationCodeAndStatus(task.getContainerCode(),task.getToPort(),QuantityConstant.STATUS_CONTAINER_EMPTY,task.getWarehouseCode());
//            updateById(agvTask);
//            cancelContainerStatus(task);
//        }
        return AjaxResult.success();
    }

    @Override
    public AjaxResult getEmptyContainer(String destinationLocation,String type) {
        if(type.trim().equals("1")){
            AgvPort agvPort = agvPortService.getAgvportByCode(destinationLocation);
            List<WorkStationFlow> workStationFlows = iiWorkStationFlowService.list(new LambdaQueryWrapper<WorkStationFlow>().eq(WorkStationFlow::getWorkStationId, agvPort.getWorkStationId()));
            workStationFlows = workStationFlows.stream().filter(workStationFlow -> workStationFlow.getFlowType().trim().equals("next")).collect(Collectors.toList());
            List<Long> workStationIdRelateds = workStationFlows.stream().map(workStationFlow -> workStationFlow.getWorkStationIdRelated()).collect(Collectors.toList());
            for (Long workStationIdRelated : workStationIdRelateds) {
                List<AgvPort> list = agvPortService.list(new LambdaQueryWrapper<AgvPort>().eq(AgvPort::getWorkStationId, workStationIdRelated));
                list = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getName()))), ArrayList::new));
                list = list.stream().filter(agvPort1 -> StringUtils.isNotEmpty(agvPort1.getContainerCode())).collect(Collectors.toList());
                if(CollectionUtils.isNotEmpty(list)){
                    for (AgvPort port : list) {
                        AgvTask agvTask=new AgvTask();
                        agvTask.setFromPort(port.getCode());
                        agvTask.setToPort(destinationLocation);
                        agvTask.setContainerCode(port.getContainerCode());
                        List<AgvInventory> list1 = iAgvInventoryService.list(new LambdaQueryWrapper<AgvInventory>().eq(AgvInventory::getContainerCode, port.getContainerCode()));
                        if(CollectionUtils.isNotEmpty(list1)){
                            continue;
                        }
                        try{
                            AjaxResult ajax = createAGVTask(agvTask);
                            if(ajax.getCode()==RetCode.FAIL.getValue()){
                                continue;
                            }
                        }catch (Exception e){
                            continue;
                        }
                        return AjaxResult.success("创建成功");
                    }
                }else {
                    return AjaxResult.error("没有空托盘可以叫");
                }
            }
        }else if(type.trim().equals("2")){
//            AgvPort agvPort = agvPortService.getAgvportByCode(destinationLocation);
//            List<WorkStationFlow> workStationFlows = iiWorkStationFlowService.list(new LambdaQueryWrapper<WorkStationFlow>().eq(WorkStationFlow::getWorkStationId, agvPort.getWorkStationId()));
//            workStationFlows = workStationFlows.stream().filter(workStationFlow -> workStationFlow.getFlowType().trim().equals("prev")).collect(Collectors.toList());
//            List<Long> workStationIdRelateds = workStationFlows.stream().map(workStationFlow -> workStationFlow.getWorkStationIdRelated()).collect(Collectors.toList());
//            for (Long workStationIdRelated : workStationIdRelateds) {
//                List<AgvPort> list = agvPortService.list(new LambdaQueryWrapper<AgvPort>().eq(AgvPort::getWorkStationId, workStationIdRelated));
//                list = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getName()))), ArrayList::new));
//                list = list.stream().filter(agvPort1 -> StringUtils.isEmpty(agvPort1.getContainerCode())).collect(Collectors.toList());
//                if(CollectionUtils.isNotEmpty(list)){
//                    AgvTask agvTask=new AgvTask();
//                    agvTask.setFromPort(destinationLocation);
//                    agvTask.setToPort(list.get(0).getCode());
//                    agvTask.setContainerCode(agvPort.getContainerCode());
//                    createAGVTask(agvTask);
//                    return AjaxResult.success("创建成功");
//                }else {
//                    return AjaxResult.error("没有空托盘可以送");
//                }
//            }
        }
        return null;
    }
    @Override
    public void shipmentAgvPortContext(TaskHeader task){
        List<Container> containers = containerService.list(new LambdaQueryWrapper<Container>().eq(Container::getLocationCode,"Work 831"));
        containers.forEach(container -> {
            if(container!=null&&container.getLocationCode()!=null&&container.getLocationCode().startsWith("Work")){
                container.setLocationCode("");
                containerService.updateById(container);
            }
        });
        agvPortService.clearContainerCodeByCode("Work 831");
        agvInventoryService.removeByPortCode("Work 831");
        //绑定托盘数据
        agvPortService.setContainerCode("Work 831", task.getContainerCode());
        //获取任务明细
        List<TaskDetail> taskDetails = taskDetailService.findByTaskId(task.getId());
        List<AgvInventory> agvInventories=new ArrayList<>();
        taskDetails.forEach(taskDetail -> {
            AgvInventory a=new AgvInventory();
            a.setAgvPortCode("Work 831");
            a.setAgvPortId(Long.valueOf("910"));
            a.setContainerCode(task.getContainerCode());
            a.setMaterialCode(taskDetail.getMaterialCode());
            a.setMaterialName(taskDetail.getMaterialName());
            a.setWorkStationCode("LK");
            a.setWorkStationId(Long.valueOf("58"));
            a.setQty(Long.valueOf(taskDetail.getQty().toString()));
            agvInventories.add(a);
        });
        agvInventoryService.addInventory(agvInventories);
    }

    @Override
    public AjaxResult emptyContainer(AgvTask agvTask) {
        agvTask.setToPort("Work 830");
        agvTask.setWarehouseCode("CS0001");
        return createAGVTask(agvTask);
    }

    @Override
    public AjaxResult<AgvTask> huichuanMesError(Integer[] toIntArray) throws Exception {
        for (Integer integer : toIntArray) {
            AgvTask agvTask = acsService.getById(integer);
            AgvPortMES agvPortMES=new AgvPortMES();
            agvPortMES.setCode(agvTask.getCode());
            agvPortMES.setStatus("error");
            String s = JSONObject.toJSONString(agvPortMES);
            mesHelper.returnMESEmptyFinsh(s);
            agvTask.setSendToMes(1);
            agvTask.setStatus(110);
            acsService.updateById(agvTask);
        }
        return AjaxResult.success("");
    }
}