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(""); } }