package com.ruoyi.wms.controller; import com.alibaba.fastjson.JSONObject; import com.cmeim.common.core.utils.BeanUtil; import com.cmeim.common.core.utils.DateUtil; import com.cmeim.common.core.utils.ExcelExportUtil; import com.cmeim.common.core.web.controller.GenericController; import com.cmeim.common.core.web.domain.Respond; import com.cmeim.common.core.web.page.PageVo; import com.ruoyi.ruiYiController.exception.ServiceException; import com.ruoyi.wms.enums.AgvTaskEnum; import com.ruoyi.wms.enums.RequestEnum; import com.ruoyi.wms.po.*; import com.ruoyi.wms.repository.*; import com.ruoyi.wms.service.AGVService; import com.ruoyi.wms.service.ScheduleService; import com.ruoyi.wms.vo.*; import com.google.common.collect.Lists; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Verasion:1.0 * @Author:DZY * @Date:2023/6/26 **/ @Api(tags = "数据采集接口") @RestController @Slf4j @RequestMapping(value = "agv") public class AgvController extends GenericController { @Autowired private AgvTaskRepository agvTaskRepository; @Autowired private AGVService agvService; @Autowired private ContainerInfoRepository containerInfoRepository; @Autowired private OrderInfoRepository orderInfoRepository; @Autowired private StationInfoRepository stationInfoRepository; @Autowired private ShelfInfoRepository shelfInfoRepository; @Autowired private ScheduleService scheduleService; @ApiOperation(value = "列表") @GetMapping(value = "list") public Respond list(PageVo pv, AgvTask agvTask) { PageRequest pageRequest = PageRequest.of(pv.getPageNo() - 1, pv.getPageSize(), Sort.by(sortOrder(agvTask.getOrders()))); Page page = agvTaskRepository.findAll(buildSpecification(agvTask), pageRequest); List list = page.getContent(); pv.setRecordsTotal(page.getTotalElements()); pv.setData(list); return buildSuccess(pv); } @ApiOperation(value = "导出excel") @PostMapping("exportExcel") public void export(AgvTask agvTask, HttpServletResponse response) throws Exception { List list = agvTaskRepository.findAll(buildSpecification(agvTask)); List exportList = new ArrayList<>(); for (AgvTask task : list) { AgvTaskExportVo agvTaskExportVo = BeanUtil.copyProperties(task, AgvTaskExportVo.class); exportList.add(agvTaskExportVo); } // 创建工作簿对象 SXSSFWorkbook workbook = new SXSSFWorkbook(1000); // 创建工作表 SXSSFSheet sheet = workbook.createSheet("AGV任务列表"); String[] rowsName = new String[]{"序号", "请求单号", "类型", "json", "任务状态", "处理结果", "创建人", "创建时间"}; List dataList = new ArrayList(); Object[] objs = null; int i = 1; for (AgvTaskExportVo agvTaskExportVo : exportList) { if (agvTaskExportVo.getDictType() == 1) { agvTaskExportVo.setDictTypeShow("请求空箱"); } else if (agvTaskExportVo.getDictType() == 2) { agvTaskExportVo.setDictTypeShow("入水测"); } else if (agvTaskExportVo.getDictType() == 3) { agvTaskExportVo.setDictTypeShow("出水测"); } else if (agvTaskExportVo.getDictType() == 4) { agvTaskExportVo.setDictTypeShow("送待检"); } else if (agvTaskExportVo.getDictType() == 5) { agvTaskExportVo.setDictTypeShow("送检验"); } else if (agvTaskExportVo.getDictType() == 6) { agvTaskExportVo.setDictTypeShow("回待检"); } else if (agvTaskExportVo.getDictType() == 7) { agvTaskExportVo.setDictTypeShow("送抽检"); } else if (agvTaskExportVo.getDictType() == 8) { agvTaskExportVo.setDictTypeShow("送成品库"); } else if (agvTaskExportVo.getDictType() == 9) { agvTaskExportVo.setDictTypeShow("出成品库"); } else if (agvTaskExportVo.getDictType() == 10) { agvTaskExportVo.setDictTypeShow("空箱入库"); } else if (agvTaskExportVo.getDictType() == 11) { agvTaskExportVo.setDictTypeShow("呼叫空货架"); } if (agvTaskExportVo.getStatus() == 1) { agvTaskExportVo.setStatusShow("未发起"); } else if (agvTaskExportVo.getDictType() == 2) { agvTaskExportVo.setStatusShow("进行中"); } else if (agvTaskExportVo.getDictType() == 3) { agvTaskExportVo.setStatusShow("已完成"); } else if (agvTaskExportVo.getDictType() == 4) { agvTaskExportVo.setStatusShow("失败"); } else if (agvTaskExportVo.getDictType() == 5) { agvTaskExportVo.setStatusShow("取消"); } else if (agvTaskExportVo.getStatus() == 6) { agvTaskExportVo.setStatusShow("挂起"); } objs = new Object[rowsName.length]; objs[0] = i; objs[1] = agvTaskExportVo.getRequestCode(); objs[2] = agvTaskExportVo.getDictTypeShow(); objs[3] = agvTaskExportVo.getJson(); objs[4] = agvTaskExportVo.getStatusShow(); objs[5] = agvTaskExportVo.getMessage(); objs[6] = agvTaskExportVo.getCreatedBy(); objs[7] = agvTaskExportVo.getCreatedDt(); dataList.add(objs); i += 1; } ExcelExportUtil.getExportWorkbook(workbook, sheet, rowsName, dataList); ExcelExportUtil.sendHttpResponse(response, "Agv", workbook); } private Specification buildSpecification(AgvTask agvTask) { Specification specification = new Specification() { @Override public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder cb) { List predicates = Lists.newArrayList(); if (agvTask.getRequestCode() != null) { predicates.add(cb.like(root.get("requestCode").as(String.class), "%" + agvTask.getRequestCode() + "%")); } if (agvTask.getMessage() != null) { predicates.add(cb.like(root.get("message").as(String.class), "%" + agvTask.getMessage() + "%")); } if (agvTask.getDictType() != null) { predicates.add(cb.equal(root.get("dictType").as(Integer.class), agvTask.getDictType())); } if (agvTask.getStatus() != null) { predicates.add(cb.equal(root.get("status").as(Integer.class), agvTask.getStatus())); } if (StringUtils.isNotBlank(agvTask.getCreatedDtStart())) { predicates.add(cb.greaterThanOrEqualTo(root.get("createdDt").as(String.class), agvTask.getCreatedDtStart())); } if (StringUtils.isNotBlank(agvTask.getCreatedDtEnd())) { predicates.add(cb.lessThanOrEqualTo(root.get("createdDt").as(String.class), agvTask.getCreatedDtEnd())); } if (agvTask.getStatusArr() != null) { CriteriaBuilder.In in = cb.in(root.get("status").as(Integer.class)); for (Integer status : agvTask.getStatusArr()) { in.value(status); } predicates.add(in); } if (agvTask.getDictTypeArr() != null) { CriteriaBuilder.In in = cb.in(root.get("dictType").as(Integer.class)); for (Integer status : agvTask.getDictTypeArr()) { in.value(status); } predicates.add(in); } return cb.and(predicates.toArray(new Predicate[predicates.size()])); } }; return specification; } /** * AGV任务回调 * * @param jsonObject 回调参数 * @return 结果返回 */ @ApiOperation(value = "AGV任务回调") @PostMapping(value = "TaskStatusCallback") public JSONObject TaskStatusCallback(@RequestBody JSONObject jsonObject) { //log.info("回调任务all:" + jsonObject); String taskCode = jsonObject.getString("taskCode"); final AgvTask agvTask = agvTaskRepository.findByRequestCode(taskCode); String status = jsonObject.getString("status"); if (StringUtils.isNotBlank(status)) { if (status.equals("fail")) { agvService.updateAgvTask(taskCode, agvTask.getDictType(), agvTask.getJson(), AgvTaskEnum.FAIL.getCode(), jsonObject.getString("message")); } else if (status.equals("success")) { //获取回调类型 String eventType = jsonObject.getString("eventType"); if (eventType.equals("task")) { log.info("回调任务task:" + jsonObject); //更新任务状态 agvService.updateAgvTask(taskCode, agvTask.getDictType(), agvTask.getJson(), AgvTaskEnum.FINISH.getCode(), jsonObject.getString("message")); //成功回调 agvService.callBackSuccess(agvTask, jsonObject); } //取箱完成时,修改工位状态 else if (eventType.equals("tote_load") && agvTask.getDictType() > 3) { String locationCode = jsonObject.getString("locationCode"); agvService.updateStationStatus(locationCode); } //放箱完成回调,滚筒线请求空箱 else if (eventType.equals("tote_unload") && agvTask.getDictType() == 1) { String param = jsonObject.toJSONString(); agvService.noticeToPlc(param); } } else if (status.equals("cancel")) { agvService.updateAgvTask(taskCode, agvTask.getDictType(), agvTask.getJson(), AgvTaskEnum.CANCEL.getCode(), jsonObject.getString("message")); } else if (status.equals("suspend")) { agvService.updateAgvTask(taskCode, agvTask.getDictType(), agvTask.getJson(), AgvTaskEnum.PENDING.getCode(), jsonObject.getString("message")); } } JSONObject result = new JSONObject(); result.put("code", 0); result.put("msg", "success"); result.put("data", ""); return result; } @ApiOperation(value = "空箱入库") @PostMapping(value = "EmptyContainerInStore") @Transactional public Respond EmptyContainerInStore(@RequestBody AgvRequestVo requestVo) { //校验周转箱是否存在以及状态 ContainerInfo containerInfo = containerInfoRepository.findByContainerNumber(requestVo.getContainerCode()); if (containerInfo == null) { throw new ServiceException("周转箱号不存在:" + requestVo.getContainerCode()); } if (containerInfo.getContainerStatus() != 15 && containerInfo.getContainerStatus() != 20 && containerInfo.getContainerStatus() != 25) { throw new ServiceException("周转箱号状态不是入库中的状态:" + requestVo.getContainerCode()); } requestVo.setType(1); requestVo.setRequestType(RequestEnum.NULLBOXINSTORE.getCode()); requestVo.setFromLocationCode(requestVo.getFromLocationCode()); requestVo.setToLocationCode("LA_SHELF_STORAGE"); requestVo.setContainerCode(requestVo.getContainerCode()); String result = agvService.taskParamCreate(requestVo); if (JSONObject.parseObject(result).getInteger("code") == 0) { return buildSuccess("请求成功"); } return buildFailure(JSONObject.parseObject(result).getString("msg")); } @ApiOperation(value = "空料箱出库") @PostMapping(value = "EmptyContainerOutStore") public Respond EmptyContainerOutStore(@RequestBody AgvRequestVo agvRequestVo) { //判断空箱出库任务是否唯一 List agvTaskList = agvTaskRepository.findByDictTypeAndStatus(RequestEnum.NULLBOX.getCode(), 2); if (agvTaskList.size() > 6) { return buildFailure("还有正在执行的出库任务:" + agvTaskList); } //设置agv请求类型 agvRequestVo.setRequestType(RequestEnum.NULLBOX.getCode()); agvRequestVo.setType(0); agvService.EmptyContainerOutStore(agvRequestVo); return buildSuccess(); } @ApiOperation(value = "料箱入库") @PostMapping(value = "ContainerInStore") public Respond ContainerInStore(@RequestBody AgvRequestVo requestVo) { //校验周转箱是否存在以及状态 ContainerInfo containerInfo = containerInfoRepository.findByContainerNumber(requestVo.getContainerCode()); if (containerInfo == null) { throw new ServiceException("周转箱号不存在:" + requestVo.getContainerCode()); } if (containerInfo.getContainerStatus() != 15 && containerInfo.getContainerStatus() != 20 && containerInfo.getContainerStatus() != 25) { throw new ServiceException("该料箱在入库状态!" + requestVo.getContainerCode()); } requestVo.setType(1); requestVo.setRequestType(RequestEnum.INSTORE.getCode()); requestVo.setToStationCode("LA_SHELF_STORAGE"); String result = agvService.taskParamCreate(requestVo); if (JSONObject.parseObject(result).getInteger("code") == 0) { //final ContainerInfo containerInfo = containerInfoRepository.findByContainerNumber(requestVo.getContainerCode()); //containerInfo.setProductionTask(requestVo.productionTask); //containerInfo.setOnInstoreTime(DateUtil.getCurrentDate()); //final OrderInfo orderInfo = orderInfoRepository.findByProductionTask(requestVo.getProductionTask()); //Integer qty = orderInfo.getPlanQty() - (orderInfo.getInQty() + orderInfo.getOngoingQty() + orderInfo.getOutQty() + orderInfo.getOnoutingCheckQty()); //if (qty > 6) { // qty = 6; //} ////入库中数量 //orderInfo.setOngoingQty(orderInfo.getOngoingQty() + qty); //containerInfo.setQty(qty); //orderInfoRepository.save(orderInfo); //containerInfoRepository.save(containerInfo); return buildSuccess("请求成功"); } else { return buildSuccess(JSONObject.parseObject(result).getString("msg")); } } @ApiOperation(value = "送待检缓存区") @PostMapping(value = "sendWaitCheck") public Respond sendWaitCheck(@RequestBody AgvRequestVo agvRequestVo) { //校验 if (StringUtils.isBlank(agvRequestVo.getContainerCode())) { throw new ServiceException("无货架编码,请检查!"); } if (StringUtils.isBlank(agvRequestVo.getProductionTask())) { throw new ServiceException("无生产工单号,请检查!"); } if (StringUtils.isBlank(agvRequestVo.getFromLocationCode())) { throw new ServiceException("无起始点位置,请检查!"); } if (agvRequestVo.getBoxNumber() == null) { throw new ServiceException("无货架数量,请检查!"); } agvRequestVo.setType(0); agvRequestVo.setRequestType(RequestEnum.SENDWAITCHECK.getCode()); String toLocationCode = findToLocationCode(15); agvRequestVo.setToLocationCode(toLocationCode); final String result = agvService.taskParamCreate(agvRequestVo); if (JSONObject.parseObject(result).getInteger("code") == 0) { //修改起点位状态为空闲 StationInfo stationInfo = stationInfoRepository.findByStationCode(agvRequestVo.getFromLocationCode()); if (stationInfo != null) { stationInfo.setStationStatus(5); stationInfo.setUpdatedDt(DateUtil.getCurrentDate()); stationInfoRepository.save(stationInfo); } //修改终点点位状态为待占用 StationInfo stationInfo1 = stationInfoRepository.findByStationCode(toLocationCode); stationInfo1.setStationStatus(10); stationInfo1.setUpdatedDt(DateUtil.getCurrentDate()); stationInfoRepository.save(stationInfo1); //修改货架信息 ShelfInfo shelfInfo = shelfInfoRepository.findByShelfCode(agvRequestVo.getContainerCode()); if (shelfInfo != null) { shelfInfo.setStationCode(agvRequestVo.getFromLocationCode()); shelfInfo.setProductionTask(agvRequestVo.getProductionTask()); shelfInfo.setQty(agvRequestVo.getBoxNumber()); shelfInfo.setUpdatedDt(DateUtil.getCurrentDate()); shelfInfo.setPriority(0); shelfInfo.setStationCode(agvRequestVo.getFromLocationCode()); shelfInfoRepository.save(shelfInfo); } else { ShelfInfo shelfInfo1 = new ShelfInfo(); shelfInfo1.setShelfCode(agvRequestVo.getContainerCode()); shelfInfo1.setStationCode(agvRequestVo.getFromLocationCode()); shelfInfo1.setProductionTask(agvRequestVo.getProductionTask()); shelfInfo1.setQty(agvRequestVo.getBoxNumber()); shelfInfo1.setUpdatedDt(DateUtil.getCurrentDate()); shelfInfo1.setPriority(0); shelfInfo1.setStationCode(agvRequestVo.getFromLocationCode()); shelfInfoRepository.save(shelfInfo); } return buildSuccess("请求成功"); } return buildFailure(JSONObject.parseObject(result).getString("msg")); } @ApiOperation(value = "从缓存库位到检验库位") @PostMapping(value = "sendCheck") @Transactional public Respond sendCheck(@RequestBody AgvRequestVo agvRequestVo) { //校验 if (StringUtils.isNotBlank(agvRequestVo.getLastRequestCode())) { AgvTask agvTask = agvTaskRepository.findByRequestCode(agvRequestVo.getLastRequestCode()); if (agvTask != null) { if (agvTask.getStatus() <= 2) { throw new ServiceException("上次任务还在执行中,任务号:" + agvRequestVo.getLastRequestCode()); } } } if (StringUtils.isBlank(agvRequestVo.getProductionTask())) { throw new ServiceException("无生产工单号,请检查!"); } if (StringUtils.isBlank(agvRequestVo.getToLocationCode())) { throw new ServiceException("无终点位置,请检查!"); } List shelfInfoList = shelfInfoRepository.findByProductionTaskAndOrderStatus(agvRequestVo.getProductionTask(), 5); if (shelfInfoList.size() == 0) { throw new ServiceException("该订单没有货架在缓存库位!"); } agvRequestVo.setType(0); agvRequestVo.setContainerCode(shelfInfoList.get(0).getShelfCode()); agvRequestVo.setFromLocationCode(shelfInfoList.get(0).getStationCode()); agvRequestVo.setRequestType(RequestEnum.SENDCHECK.getCode()); String result = agvService.taskParamCreate(agvRequestVo); if (JSONObject.parseObject(result).getInteger("code") == 0) { //修改起始点位状态为空闲 StationInfo stationInfo = stationInfoRepository.findByStationCode(agvRequestVo.getFromLocationCode()); if (stationInfo != null) { stationInfo.setStationStatus(5); stationInfo.setUpdatedDt(DateUtil.getCurrentDate()); stationInfoRepository.save(stationInfo); } //修改终点工位待占用状态 StationInfo stationInfo1 = stationInfoRepository.findByStationCode(agvRequestVo.getToLocationCode()); if (stationInfo1 != null) { stationInfo1.setStationStatus(10); stationInfo1.setUpdatedDt(DateUtil.getCurrentDate()); stationInfoRepository.save(stationInfo1); } //修改货架的工单状态 ShelfInfo shelfInfo = shelfInfoList.get(0); shelfInfo.setOrderStatus(10); shelfInfo.setUpdatedDt(DateUtil.getCurrentDate()); ShelfInfo save = shelfInfoRepository.save(shelfInfo); String data = JSONObject.parseObject(result).getString("data"); SpotCheckVo spotCheckVo = BeanUtil.copyProperties(save, SpotCheckVo.class); data = data.replaceAll("\\\"",""); data = data.replace("{", "").replace("}",""); spotCheckVo.setRequestCode(data.substring(0, data.indexOf(":"))); return buildSuccess(spotCheckVo); } return buildFailure(JSONObject.parseObject(result).getString("msg")); } Lock lock = new ReentrantLock(); @ApiOperation(value = "送抽检") @PostMapping(value = "sendSpotCheck") public Respond sendSpotCheck(@RequestBody AgvRequestVo agvRequestVo) { if (StringUtils.isBlank(agvRequestVo.getFromLocationCode())) { throw new ServiceException("无起始位置,请检查!"); } agvRequestVo.setType(0); agvRequestVo.setRequestType(RequestEnum.SENDSPOTCHECK.getCode()); String result = null; lock.lock(); try { //查起始点位对应的货架编码 List shelfInfoList = shelfInfoRepository.findByStationCode(agvRequestVo.getFromLocationCode()); if (shelfInfoList.size() > 0) { agvRequestVo.setContainerCode(shelfInfoList.get(0).getShelfCode()); } else { throw new ServiceException("该位置无货架:" + agvRequestVo.getFromLocationCode()); } final List stationInfos = stationInfoRepository.findByStationTypeAndStationStatus(25, 5); if (stationInfos.size() > 0) { agvRequestVo.setToLocationCode(stationInfos.get(0).getStationCode()); } else { agvRequestVo.setRequestType(RequestEnum.BACKWAITCHECK.getCode()); } result = agvService.taskParamCreate(agvRequestVo); //查找任务单号 if (JSONObject.parseObject(result).getInteger("code") == 0) { if (stationInfos.size() > 0) { //修改起始点位状态为空闲 StationInfo stationInfo = stationInfoRepository.findByStationCode(agvRequestVo.getFromLocationCode()); stationInfo.setStationStatus(5); stationInfo.setUpdatedDt(DateUtil.getCurrentDate()); stationInfoRepository.save(stationInfo); //修改抽检工位待占用状态 stationInfos.get(0).setStationStatus(10); stationInfoRepository.save(stationInfos.get(0)); } String data = JSONObject.parseObject(result).getString("data"); SpotCheckVo spotCheckVo = BeanUtil.copyProperties(shelfInfoList.get(0), SpotCheckVo.class); data = data.replaceAll("\\\"",""); data = data.replace("{", "").replace("}",""); spotCheckVo.setRequestCode(data.substring(0, data.indexOf(":"))); return buildSuccess(spotCheckVo); } } finally { lock.unlock(); } return buildFailure(JSONObject.parseObject(result).getString("msg")); } @ApiOperation(value = "送成品库") @PostMapping(value = "sendProdStore") @Transactional public Respond sendProdStore(@RequestBody AgvRequestVo agvRequestVo) { //校验 if (StringUtils.isBlank(agvRequestVo.getContainerCode())) { throw new ServiceException("无货架编码,请检查!"); } ShelfInfo byShelfCode = shelfInfoRepository.findByShelfCode(agvRequestVo.getContainerCode()); agvRequestVo.setFromLocationCode(byShelfCode.getStationCode()); agvRequestVo.setType(0); agvRequestVo.setRequestType(RequestEnum.SENDPRODSTORE.getCode()); String toLocationCode = findToLocationCode(30); agvRequestVo.setToLocationCode(toLocationCode); final String result = agvService.taskParamCreate(agvRequestVo); if (JSONObject.parseObject(result).getInteger("code") == 0) { //修改起始点位状态为空闲 StationInfo stationInfo = stationInfoRepository.findByStationCode(agvRequestVo.getFromLocationCode()); stationInfo.setStationStatus(5); stationInfo.setUpdatedDt(DateUtil.getCurrentDate()); stationInfoRepository.save(stationInfo); //修改终点点位状态为待占用 StationInfo stationInfo1 = stationInfoRepository.findByStationCode(toLocationCode); stationInfo1.setStationStatus(10); stationInfo1.setUpdatedDt(DateUtil.getCurrentDate()); stationInfoRepository.save(stationInfo1); final ShelfInfo shelfInfo = shelfInfoRepository.findByShelfCode(agvRequestVo.getContainerCode()); final OrderInfo orderInfo = orderInfoRepository.findByProductionTask(shelfInfo.getProductionTask()); orderInfo.setProductOngoingQty(orderInfo.getProductOngoingQty() + shelfInfo.getQty()); orderInfo.setUpdatedDt(DateUtil.getCurrentDate()); orderInfoRepository.save(orderInfo); return buildSuccess("请求成功"); } return buildFailure(JSONObject.parseObject(result).getString("msg")); } @ApiOperation(value = "空货架送回(不用,用tcpUtil的空箱入库方法)") @PostMapping(value = "sendNullShelf") public Respond sendNullShelf(@RequestBody AgvRequestVo agvRequestVo) { agvRequestVo.setType(0); agvRequestVo.setRequestType(RequestEnum.SENDNULLSHELF.getCode()); final String result = agvService.taskParamCreate(agvRequestVo); if (JSONObject.parseObject(result).getInteger("code") == 0) { return buildSuccess("请求成功"); } return buildFailure(JSONObject.parseObject(result).getString("msg")); } @ApiOperation(value = "呼叫空货架") @PostMapping(value = "callNullShelf") public Respond callNullShelf(@RequestBody AgvRequestVo agvRequestVo) { //校验 if (StringUtils.isBlank(agvRequestVo.getToLocationCode())) { throw new ServiceException("无终点位置,请检查!"); } if (StringUtils.isBlank(agvRequestVo.getContainerCode())) { throw new ServiceException("无货架编码,请检查!"); } agvRequestVo.setType(0); agvRequestVo.setRequestType(RequestEnum.CALLNULLSHELF.getCode()); String result = null; lock.lock(); try { final List shelfInfos = shelfInfoRepository.findByProductionTaskIsNullAndStationCodeIsNotNull(); if (shelfInfos.size() == 0) { return buildFailure("暂无空货架"); } agvRequestVo.setContainerCode(shelfInfos.get(0).getShelfCode()); StationInfo stationInfo = stationInfoRepository.findByStationCode(shelfInfos.get(0).getStationCode()); agvRequestVo.setFromLocationCode(stationInfo.getStationCode()); result = agvService.taskParamCreate(agvRequestVo); if (JSONObject.parseObject(result).getInteger("code") == 0) { shelfInfos.get(0).setProductionTask("待绑定"); shelfInfoRepository.save(shelfInfos.get(0)); return buildSuccess("请求成功"); } } finally { lock.unlock(); } return buildFailure(JSONObject.parseObject(result).getString("msg")); } @ApiOperation(value = "取消AGV任务") @GetMapping(value = "cancelTask") public Respond cancelTask(@RequestParam("taskCode") String taskCode) { agvService.taskCancel(taskCode); return buildSuccess(); } @ApiOperation(value = "机器人是否允许取走/放置周转箱") @PostMapping(value = "allowOperation") public String allowOperation(@RequestBody String Bash) { String result = agvService.allowOperation(Bash); return result; } @ApiOperation(value = "料箱出库(定时任务测试)") @PostMapping(value = "waterTest") public void waterTest() { scheduleService.waterTest(); } @ApiOperation(value = "成品出库(测试)") @GetMapping(value = "outProdStore") public void outProdStore(String status) { agvService.outProdStore(status); } @ApiOperation(value = "空货架入库(测试)") @GetMapping(value = "sendNullShelf") public void sendNullShelf(String status) { agvService.sendNullShelf(status); } @ApiOperation(value = "空车入库(PDA)") @GetMapping(value = "nullShelfIn") public Respond nullShelfIn(@RequestParam("containerCode") String containerCode, @RequestParam("positionCode") String positionCode) { String result = agvService.moveIn(containerCode, positionCode); if (JSONObject.parseObject(result).getInteger("code") == 0) { ShelfInfo shelfInfo = shelfInfoRepository.findByShelfCode(containerCode); if (shelfInfo != null) { shelfInfo.setStationCode(positionCode); } } else { return buildFailure("海柔报错:" + JSONObject.parseObject(result).getString("msg")); } return buildSuccess(); } @ApiOperation(value = "找终点位置") @PostMapping(value = "findToLocationCode") public String findToLocationCode(Integer storeType) { String toLocationCode = null; List stationInfoList = stationInfoRepository.findByStationTypeAndStationStatus(storeType, 5); if (stationInfoList.size() > 0) { toLocationCode = stationInfoList.get(0).getStationCode(); } else { throw new ServiceException("暂无空闲的点位!"); } return toLocationCode; } }