|  |  | 
 |  |  | package com.vincent.rsf.server.api.service.impl; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSONArray; | 
 |  |  | import com.alibaba.fastjson.JSONObject; | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | 
 |  |  | import com.fasterxml.jackson.core.JsonProcessingException; | 
 |  |  | import com.fasterxml.jackson.databind.ObjectMapper; | 
 |  |  | import com.fasterxml.jackson.databind.cfg.CoercionAction; | 
 |  |  | import com.fasterxml.jackson.databind.cfg.CoercionInputShape; | 
 |  |  | import com.vincent.rsf.framework.common.Cools; | 
 |  |  | import com.vincent.rsf.framework.common.R; | 
 |  |  | import com.vincent.rsf.framework.exception.CoolException; | 
 |  |  | import com.vincent.rsf.server.api.config.RemotesInfoProperties; | 
 |  |  | import com.vincent.rsf.server.api.entity.CommonResponse; | 
 |  |  | import com.vincent.rsf.server.api.entity.constant.RcsConstant; | 
 |  |  | import com.vincent.rsf.server.api.entity.dto.InTaskMsgDto; | 
 |  |  | import com.vincent.rsf.server.api.entity.dto.LocTypeDto; | 
 |  |  | import com.vincent.rsf.server.api.controller.erp.params.TaskInParam; | 
 |  |  | import com.vincent.rsf.server.api.entity.dto.SyncLocsDto; | 
 |  |  | import com.vincent.rsf.server.api.entity.enums.CallBackEvent; | 
 |  |  | import com.vincent.rsf.server.api.entity.params.CommonRequest; | 
 |  |  | import com.vincent.rsf.server.api.entity.params.ExMsgParams; | 
 |  |  | import com.vincent.rsf.server.api.entity.params.WcsTaskParams; | 
 |  |  | import com.vincent.rsf.server.manager.enums.*; | 
 |  |  | import com.vincent.rsf.server.api.service.WcsService; | 
 |  |  | import com.vincent.rsf.server.api.utils.LocUtils; | 
 |  |  | 
 |  |  | import com.vincent.rsf.server.system.constant.SerialRuleCode; | 
 |  |  | import com.vincent.rsf.server.manager.enums.LocStsType; | 
 |  |  | import com.vincent.rsf.server.system.utils.SerialRuleUtils; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.apache.commons.lang3.StringUtils; | 
 |  |  | import org.springframework.beans.BeanUtils; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.http.HttpEntity; | 
 |  |  | import org.springframework.http.HttpHeaders; | 
 |  |  | import org.springframework.http.HttpMethod; | 
 |  |  | import org.springframework.http.ResponseEntity; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.web.client.RestTemplate; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Objects; | 
 |  |  | import java.util.Random; | 
 |  |  | import java.util.concurrent.Executors; | 
 |  |  | import java.util.concurrent.ScheduledExecutorService; | 
 |  |  | import java.util.concurrent.TimeUnit; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | @Slf4j | 
 |  |  | @Service | 
 |  |  | public class WcsServiceImpl implements WcsService { | 
 |  |  |     @Autowired | 
 |  |  | 
 |  |  |     private WaitPakinItemService waitPakinItemService; | 
 |  |  |     @Autowired | 
 |  |  |     private BasStationService basStationService; | 
 |  |  |     @Autowired | 
 |  |  |     private RestTemplate restTemplate; | 
 |  |  |     @Autowired | 
 |  |  |     private RemotesInfoProperties.RcsApi rcsApi; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  | 
 |  |  |         //根据立库类型获取获取库位 | 
 |  |  |         if (warehouseArea.getType().equals(WarehType.WAREHOUSE_TYPE_CRN.val)) { | 
 |  |  |             //堆垛机 | 
 |  |  |             dto = getLocNoCrn(param.getOrgLoc(),deviceBind, warehouseArea.getId(), param.getSourceStaNo(), matnr, batch, locTypeDto, 0, param.getIoType()); | 
 |  |  |             dto = getLocNoCrn(param.getOrgLoc(), deviceBind, warehouseArea.getId(), param.getSourceStaNo(), matnr, batch, locTypeDto, 0, param.getIoType()); | 
 |  |  |  | 
 |  |  |         } else if (warehouseArea.getType().equals(WarehType.WAREHOUSE_TYPE_FOUR_DIRECTIONS.val)) { | 
 |  |  |             //四向库 | 
 |  |  |         }  else { | 
 |  |  |         } else { | 
 |  |  |             //CTU 库以及其它 | 
 |  |  |             dto = getLocNoCtu(deviceBind, warehouseArea.getId(), param.getSourceStaNo(), matnr, batch, locTypeDto, 0, param.getIoType()); | 
 |  |  |         } | 
 |  |  |         return dto; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private InTaskMsgDto getLocNoCrn(String orgLoc,DeviceBind deviceBind, Long area, Integer sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) { | 
 |  |  |     /** | 
 |  |  |      * @author Ryan | 
 |  |  |      * @date 2025/8/28 | 
 |  |  |      * @description: Wcs库位同步 | 
 |  |  |      * @version 1.0 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public void syncLocsToWms() { | 
 |  |  |         /**RCS基础配置链接*/ | 
 |  |  |         CommonRequest params = new CommonRequest(); | 
 |  |  |         params.setPageSize(100); | 
 |  |  |         ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1); | 
 |  |  |         scheduled.scheduleWithFixedDelay(new Runnable() { | 
 |  |  |             int current = 1; | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void run() { | 
 |  |  |                 params.setCurrent(current); | 
 |  |  |                 List<SyncLocsDto> dtos = syncLocs(params); | 
 |  |  |                 if (dtos.isEmpty()) { | 
 |  |  |                     scheduled.shutdown(); | 
 |  |  |                 } | 
 |  |  |                 for (SyncLocsDto dto : dtos) { | 
 |  |  |                     Loc loc = new Loc(); | 
 |  |  |                     String string = new Random().nextInt(10000000) + ""; | 
 |  |  |                     Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, dto.getLocNo())); | 
 |  |  |                     if (!Objects.isNull(one)) { | 
 |  |  |                         string = new Random().nextInt(10000000) + ""; | 
 |  |  |                     } | 
 |  |  |                     loc.setCode(dto.getLocNo()) | 
 |  |  |                             .setBarcode(dto.getBarcode()) | 
 |  |  |                             .setRow(dto.getRow()) | 
 |  |  |                             .setLev(dto.getLev()) | 
 |  |  |                             .setId(null) | 
 |  |  |                             .setAreaId(42L) | 
 |  |  |                             .setWarehouseId(29L) | 
 |  |  |                             .setBarcode(string) | 
 |  |  |                             .setCol(dto.getBay()) | 
 |  |  |                             .setType(dto.getLocType().equals("16") ? "17" : "15") | 
 |  |  |                             .setStatus(dto.getStatusBool()) | 
 |  |  |                             .setUseStatus(LocStsType.getLocSts(dto.getLocSts())); | 
 |  |  |                     if (!locService.save(loc)) { | 
 |  |  |                         scheduled.shutdown(); | 
 |  |  |                         throw new CoolException("WCS库位同步失败!!"); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 current++; | 
 |  |  |             } | 
 |  |  |         }, 1, 1, TimeUnit.SECONDS); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 异常信息上报 | 
 |  |  |      * | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public R receiveExMsg(ExMsgParams params) { | 
 |  |  |         if (Objects.isNull(params)) { | 
 |  |  |             return R.error("参数不能为空!!"); | 
 |  |  |         } | 
 |  |  |         Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskCode, params.getSeqNum())); | 
 |  |  |         if (Objects.isNull(task)) { | 
 |  |  |             throw new CoolException("任务不存在可已结束!!"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /**料箱搬运中, 修改站点状态*/ | 
 |  |  | //        if (params.getEventType().equals(CallBackEvent.CALL_BACK_EVENT_OBIT.event)) { | 
 |  |  | //            if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) | 
 |  |  | //                    || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type) | 
 |  |  | //                    || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type) | 
 |  |  | //                    || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type) | 
 |  |  | //                    || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type) | 
 |  |  | //                    || task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { | 
 |  |  | // | 
 |  |  | //            } | 
 |  |  | //            /**取箱完成, 修改任务状态*/ | 
 |  |  | //        } else | 
 |  |  |         if (params.getEventType().equals(CallBackEvent.CALL_BACK_EVENT_END.event)) { | 
 |  |  |             if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) | 
 |  |  |                     || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type) | 
 |  |  |                     || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type) | 
 |  |  |                     || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type) | 
 |  |  |                     || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type) | 
 |  |  |                     || task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { | 
 |  |  |  | 
 |  |  |                 if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { | 
 |  |  |                     BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getOrgSite())); | 
 |  |  |                     if (Objects.isNull(station)) { | 
 |  |  |                         throw new CoolException("数据错误,站点不存在!!"); | 
 |  |  |                     } | 
 |  |  |                     if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { | 
 |  |  |                         station.setUseStatus(LocStsType.LOC_STS_TYPE_O.type); | 
 |  |  |                         if (!basStationService.updateById(station)) { | 
 |  |  |                             throw new CoolException("站点状态修改失败!!"); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if (!taskService.update(new LambdaUpdateWrapper<Task>() | 
 |  |  |                         .lt(Task::getTaskStatus, TaskStsType.COMPLETE_IN.id) | 
 |  |  |                         .eq(Task::getTaskCode, task.getTaskCode()) | 
 |  |  |                         .set(Task::getTaskStatus, TaskStsType.COMPLETE_IN.id))) { | 
 |  |  |                     throw new CoolException("任务状态修改失败!!"); | 
 |  |  |                 } | 
 |  |  |             } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type) | 
 |  |  |                     || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type) | 
 |  |  |                     || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type) | 
 |  |  |                     || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type) | 
 |  |  |                     || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type)) { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                 /**修改出库站点状态*/ | 
 |  |  |                 BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>() | 
 |  |  |                         .eq(BasStation::getStationName, task.getTargSite())); | 
 |  |  |                 if (Objects.isNull(station)) { | 
 |  |  |                     throw new CoolException("数据错误,站点不存在!!"); | 
 |  |  |                 } | 
 |  |  |                 if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { | 
 |  |  |                     station.setUseStatus(LocStsType.LOC_STS_TYPE_F.type); | 
 |  |  |                     if (!basStationService.updateById(station)) { | 
 |  |  |                         throw new CoolException("站点状态修改失败!!"); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()) | 
 |  |  |                         .lt(Task::getTaskStatus, TaskStsType.COMPLETE_OUT.id) | 
 |  |  |                         .set(Task::getTaskStatus, TaskStsType.AWAIT.id))) { | 
 |  |  |                     throw new CoolException("任务状态修改失败!!"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         log.info(JSONObject.toJSONString(params)); | 
 |  |  |         return R.ok(JSONObject.toJSONString(params)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 下发任务至中转API | 
 |  |  |      * | 
 |  |  |      * @param params | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public R pubWcsTask(WcsTaskParams params) { | 
 |  |  |         String rcsUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.pubTask; | 
 |  |  |         log.info("任务下发,请求地址: {}, 请求参数: {}", rcsUrl, JSONObject.toJSONString(params)); | 
 |  |  |         HttpHeaders headers = new HttpHeaders(); | 
 |  |  |         headers.add("Content-Type", "application/json"); | 
 |  |  |         headers.add("api-version", "v2.0"); | 
 |  |  |         HttpEntity httpEntity = new HttpEntity(params, headers); | 
 |  |  |         ResponseEntity<String> exchange = restTemplate.exchange(rcsUrl, HttpMethod.POST, httpEntity, String.class); | 
 |  |  |         log.info("任务下发后,响应结果: {}", exchange); | 
 |  |  |         if (Objects.isNull(exchange.getBody())) { | 
 |  |  |             throw new CoolException("任务下发失败!!"); | 
 |  |  |         } else { | 
 |  |  |             ObjectMapper objectMapper = new ObjectMapper(); | 
 |  |  |             objectMapper.coercionConfigDefaults() | 
 |  |  |                     .setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); | 
 |  |  |             try { | 
 |  |  |                 CommonResponse result = objectMapper.readValue(exchange.getBody(), CommonResponse.class); | 
 |  |  |                 if (result.getCode() == 200) { | 
 |  |  |                     return R.ok(); | 
 |  |  |                 } else { | 
 |  |  |                     throw new CoolException("任务下发失败!!"); | 
 |  |  |                 } | 
 |  |  |             } catch (JsonProcessingException e) { | 
 |  |  |                 throw new CoolException(e.getMessage()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     private List<SyncLocsDto> syncLocs(CommonRequest params) { | 
 |  |  |         String rcsUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.syncLocs; | 
 |  |  |         log.info("库位同步,请求地址: {}, 请求参数: {}", rcsUrl, JSONObject.toJSONString(params)); | 
 |  |  |         HttpHeaders headers = new HttpHeaders(); | 
 |  |  |         headers.add("Content-Type", "application/json"); | 
 |  |  |         headers.add("api-version", "v2.0"); | 
 |  |  |         HttpEntity httpEntity = new HttpEntity(params, headers); | 
 |  |  |         ResponseEntity<String> exchange = restTemplate.exchange(rcsUrl, HttpMethod.POST, httpEntity, String.class); | 
 |  |  |         log.info("库位同步,响应结果: {}", exchange); | 
 |  |  |         if (Objects.isNull(exchange.getBody())) { | 
 |  |  |             throw new CoolException("库位同步下发失败!!"); | 
 |  |  |         } else { | 
 |  |  |             ObjectMapper objectMapper = new ObjectMapper(); | 
 |  |  |             objectMapper.coercionConfigDefaults() | 
 |  |  |                     .setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); | 
 |  |  |             try { | 
 |  |  |                 CommonResponse result = objectMapper.readValue(exchange.getBody(), CommonResponse.class); | 
 |  |  |                 if (result.getCode() == 200) { | 
 |  |  |                     JSONObject jsonObject = JSONObject.parseObject(exchange.getBody()); | 
 |  |  |                     return JSONArray.parseArray(jsonObject.getJSONArray("data").toJSONString(), SyncLocsDto.class); | 
 |  |  |                 } else { | 
 |  |  |                     throw new CoolException("库位同步失败!!"); | 
 |  |  |                 } | 
 |  |  |             } catch (JsonProcessingException e) { | 
 |  |  |                 throw new CoolException(e.getMessage()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private InTaskMsgDto getLocNoCrn(String orgLoc, DeviceBind deviceBind, Long area, String sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) { | 
 |  |  |         if (Cools.isEmpty(matnr)) {  //物料号 | 
 |  |  |             matnr = ""; | 
 |  |  |         } | 
 |  |  | 
 |  |  |         if (Cools.isEmpty(deviceSite)) { | 
 |  |  |             channel = 0; | 
 |  |  |         } else { | 
 |  |  |             inTaskMsgDto.setStaNo(Integer.parseInt(deviceSite.getDeviceSite())); | 
 |  |  |             inTaskMsgDto.setStaNo(deviceSite.getDeviceSite()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //更新当前排 | 
 |  |  | 
 |  |  |                     ); | 
 |  |  |  | 
 |  |  |                     if (!Cools.isEmpty(locMast2)) { | 
 |  |  |                         if (null != orgMoveLoc){ | 
 |  |  |                         if (null != orgMoveLoc) { | 
 |  |  |                             if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { | 
 |  |  |                                 break; | 
 |  |  |                             } | 
 |  |  | 
 |  |  |                     ); | 
 |  |  |  | 
 |  |  |                     if (!Cools.isEmpty(locMast2)) { | 
 |  |  |                         if (null != orgMoveLoc){ | 
 |  |  |                         if (null != orgMoveLoc) { | 
 |  |  |                             if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { | 
 |  |  |                                 break; | 
 |  |  |                             } | 
 |  |  | 
 |  |  |                         ); | 
 |  |  |  | 
 |  |  |                         if (!Cools.isEmpty(locMast2)) { | 
 |  |  |                             if (null != orgMoveLoc){ | 
 |  |  |                             if (null != orgMoveLoc) { | 
 |  |  |                                 if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { | 
 |  |  |                                     break; | 
 |  |  |                                 } | 
 |  |  | 
 |  |  |                         ); | 
 |  |  |  | 
 |  |  |                         if (!Cools.isEmpty(locMast2)) { | 
 |  |  |                             if (null != orgMoveLoc){ | 
 |  |  |                             if (null != orgMoveLoc) { | 
 |  |  |                                 if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { | 
 |  |  |                                     break; | 
 |  |  |                                 } | 
 |  |  | 
 |  |  |                             ); | 
 |  |  |  | 
 |  |  |                             if (!Cools.isEmpty(locMast2)) { | 
 |  |  |                                 if (null != orgMoveLoc){ | 
 |  |  |                                 if (null != orgMoveLoc) { | 
 |  |  |                                     if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { | 
 |  |  |                                         break; | 
 |  |  |                                     } | 
 |  |  | 
 |  |  |             // 当前巷道无空库位时,递归调整至下一巷道,检索全部巷道无果后,跳出递归 | 
 |  |  |             if (times < rowCount * 2) { | 
 |  |  |                 times = times + 1; | 
 |  |  |                 return getLocNoCrn(orgLoc,deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, times, ioType); | 
 |  |  |                 return getLocNoCrn(orgLoc, deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, times, ioType); | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |             // 2.库位当前所属尺寸无空库位时,调整尺寸参数,向上兼容检索库位 | 
 |  |  |             if (locTypeDto.getLocType1() < 3) { | 
 |  |  |                 int i = locTypeDto.getLocType1() + 1; | 
 |  |  |                 locTypeDto.setLocType1(i); | 
 |  |  |                 return getLocNoCrn(orgLoc,deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, 0, ioType); | 
 |  |  |                 return getLocNoCrn(orgLoc, deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, 0, ioType); | 
 |  |  |             } | 
 |  |  |             throw new CoolException("没有空库位"); | 
 |  |  |         } | 
 |  |  | 
 |  |  |         return inTaskMsgDto; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private InTaskMsgDto getLocNoCtu(DeviceBind deviceBind, Long area, Integer sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) { | 
 |  |  |     private InTaskMsgDto getLocNoCtu(DeviceBind deviceBind, Long area, String sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) { | 
 |  |  |         if (Cools.isEmpty(matnr)) {  //物料号 | 
 |  |  |             matnr = ""; | 
 |  |  |         } | 
 |  |  | 
 |  |  |                 .eq(Loc::getAreaId, area) | 
 |  |  |                 .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) | 
 |  |  |                 .eq(Loc::getType, locTypeDto.getLocType1()) | 
 |  |  |                 .ge(Loc::getRow, deviceBind.getStartRow()) | 
 |  |  |                 .le(Loc::getRow, deviceBind.getEndRow()) | 
 |  |  |                 .orderByAsc(Loc::getLev) | 
 |  |  |                 .orderByAsc(Loc::getCol) | 
 |  |  |                 .orderByAsc(Loc::getRow) | 
 |  |  | 
 |  |  |         DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>() | 
 |  |  |                 .eq(DeviceSite::getType, ioType) | 
 |  |  |                 .eq(DeviceSite::getSite, sourceStaNo) | 
 |  |  |                 .eq(DeviceSite::getDeviceCode, loc.getDeviceNo()) | 
 |  |  |                 .eq(!Objects.isNull(loc.getDeviceNo()), DeviceSite::getDeviceCode, loc.getDeviceNo()) | 
 |  |  |         ); | 
 |  |  |         if (Cools.isEmpty(deviceSite)) { | 
 |  |  |             deviceNo = 0; | 
 |  |  |             loc = null; | 
 |  |  |         } else { | 
 |  |  |             inTaskMsgDto.setStaNo(Integer.parseInt(deviceSite.getDeviceSite())); | 
 |  |  |             inTaskMsgDto.setStaNo(deviceSite.getDeviceSite()); | 
 |  |  |         } | 
 |  |  |         // 递归查询 | 
 |  |  |         if (Cools.isEmpty(loc) || !loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { |