|  |  |  | 
|---|
|  |  |  | 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.params.TaskInParam; | 
|---|
|  |  |  | import com.vincent.rsf.server.api.entity.enums.LocUseStatusType; | 
|---|
|  |  |  | import com.vincent.rsf.server.api.entity.enums.OrderType; | 
|---|
|  |  |  | import com.vincent.rsf.server.api.entity.enums.TaskStsType; | 
|---|
|  |  |  | import com.vincent.rsf.server.api.entity.enums.TaskType; | 
|---|
|  |  |  | 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.api.utils.SlaveProperties; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.entity.*; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.enums.PakinIOStatus; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.service.*; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.service.impl.LocServiceImpl; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.utils.LocManageUtil; | 
|---|
|  |  |  | import com.vincent.rsf.server.system.constant.SerialRuleCode; | 
|---|
|  |  |  | import com.vincent.rsf.server.system.enums.LocStsType; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.enums.LocStsType; | 
|---|
|  |  |  | import com.vincent.rsf.server.system.utils.SerialRuleUtils; | 
|---|
|  |  |  | import org.apache.commons.lang3.StringUtils; | 
|---|
|  |  |  | import org.springframework.beans.BeanUtils; | 
|---|
|  |  |  | 
|---|
|  |  |  | import org.springframework.stereotype.Service; | 
|---|
|  |  |  | import org.springframework.transaction.annotation.Transactional; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  | import java.util.List; | 
|---|
|  |  |  | import java.util.Objects; | 
|---|
|  |  |  | import java.util.stream.Collectors; | 
|---|
|  |  |  | 
|---|
|  |  |  | private TaskItemService taskItemService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private WaitPakinItemService waitPakinItemService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private BasStationService basStationService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public InTaskMsgDto createInTask(TaskInParam param, Long loginUserId) { | 
|---|
|  |  |  | // 获取库位号 | 
|---|
|  |  |  | InTaskMsgDto locNo = getLocNo(param); | 
|---|
|  |  |  | public void agvTaskPickUpComplete(TaskInParam param) { | 
|---|
|  |  |  | Task task = taskService.getOne(new LambdaQueryWrapper<Task>() | 
|---|
|  |  |  | .eq(Task::getBarcode, param.getBarcode()) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | if (null == task) { | 
|---|
|  |  |  | throw new CoolException("未找到任务信息"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //        if (!task.getTaskStatus().equals(TaskStsType.WCS_CONVEYOR_START.id)){ | 
|---|
|  |  |  | //            throw new CoolException("任务状态有误"); | 
|---|
|  |  |  | //        } | 
|---|
|  |  |  | BasStation basStation = basStationService.getOne(new LambdaQueryWrapper<BasStation>() | 
|---|
|  |  |  | .eq(BasStation::getStationName, param.getSourceStaNo()) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | if (null == basStation) { | 
|---|
|  |  |  | throw new CoolException("未找到站点信息"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | task.setTaskStatus(TaskStsType.WCS_EXECUTE_OUT_TOTE_LOAD.id); | 
|---|
|  |  |  | taskService.updateById(task); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | basStation.setUseStatus(LocStsType.LOC_STS_TYPE_O.type); | 
|---|
|  |  |  | basStation.setBarcode(null); | 
|---|
|  |  |  | basStationService.updateById(basStation); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public InTaskMsgDto createInTask(TaskInParam param) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 验证设备站点 | 
|---|
|  |  |  | DeviceSite deviceSite = validateDeviceSite(param); | 
|---|
|  |  |  | 
|---|
|  |  |  | // 生成任务编码 | 
|---|
|  |  |  | String ruleCode = generateTaskCode(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取库位号 | 
|---|
|  |  |  | InTaskMsgDto locNo = null; | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | locNo = getLocNo(param); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | throw new RuntimeException(e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 创建并保存任务 | 
|---|
|  |  |  | Task task = createTask(ruleCode, locNo.getLocNo(), waitPakin.getBarcode(), | 
|---|
|  |  |  | deviceSite.getDeviceSite(), param.getSourceStaNo().toString(), loginUserId); | 
|---|
|  |  |  | deviceSite.getDeviceSite(), param.getSourceStaNo().toString(), param.getUser()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 更新库位状态 | 
|---|
|  |  |  | updateLocStatus(task.getTargLoc(), waitPakin.getBarcode()); | 
|---|
|  |  |  | 
|---|
|  |  |  | List<WaitPakinItem> waitPakinItems = getWaitPakinItems(waitPakin.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 创建并保存任务明细 | 
|---|
|  |  |  | saveTaskItems(task.getId(), waitPakinItems, loginUserId); | 
|---|
|  |  |  | saveTaskItems(task.getId(), waitPakinItems, param.getUser()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 更新组托状态 | 
|---|
|  |  |  | updateWaitPakinStatus(param.getBarcode(), loginUserId); | 
|---|
|  |  |  | updateWaitPakinStatus(param.getBarcode(), param.getUser()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 设置工作单号并返回 | 
|---|
|  |  |  | locNo.setWorkNo(ruleCode); | 
|---|
|  |  |  | return locNo; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 验证设备站点 | 
|---|
|  |  |  | 
|---|
|  |  |  | private WaitPakin validateWaitPakin(String barcode) { | 
|---|
|  |  |  | WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>() | 
|---|
|  |  |  | .eq(WaitPakin::getBarcode, barcode) | 
|---|
|  |  |  | .eq(WaitPakin::getIoStatus, Short.parseShort(PakinIOStatus.PAKIN_IO_STATUS_DONE.val))); | 
|---|
|  |  |  | .eq(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (Cools.isEmpty(waitPakin)) { | 
|---|
|  |  |  | throw new CoolException("请检查组拖状态是否完成!!"); | 
|---|
|  |  |  | 
|---|
|  |  |  | String targetSite, String sourceSiteNo, Long loginUserId) { | 
|---|
|  |  |  | Task task = new Task(); | 
|---|
|  |  |  | task.setTaskCode(ruleCode) | 
|---|
|  |  |  | .setTaskStatus(TaskStsType.GENERATE_IN.id.shortValue()) | 
|---|
|  |  |  | .setTaskType(TaskType.TASK_TYPE_IN.type.shortValue()) | 
|---|
|  |  |  | .setTaskStatus(TaskStsType.GENERATE_IN.id) | 
|---|
|  |  |  | .setTaskType(TaskType.TASK_TYPE_IN.type) | 
|---|
|  |  |  | .setWarehType(WarehType.WAREHOUSE_TYPE_CRN.val) | 
|---|
|  |  |  | .setTargLoc(targetLoc) | 
|---|
|  |  |  | .setBarcode(barcode) | 
|---|
|  |  |  | .setTargSite(targetSite) | 
|---|
|  |  |  | 
|---|
|  |  |  | .eq(Loc::getCode, locCode) | 
|---|
|  |  |  | .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type) | 
|---|
|  |  |  | .set(Loc::getBarcode, barcode)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!updated) { | 
|---|
|  |  |  | throw new CoolException("库位预约失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | * 获取并验证组拖明细 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private List<WaitPakinItem> getWaitPakinItems(Long pakinId) { | 
|---|
|  |  |  | List<WaitPakinItem> waitPakinItems = waitPakinItemService.list( | 
|---|
|  |  |  | new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, pakinId)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, pakinId)); | 
|---|
|  |  |  | if (waitPakinItems.isEmpty()) { | 
|---|
|  |  |  | throw new CoolException("数据错误:组拖明细不存在"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | BeanUtils.copyProperties(item, taskItem); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return taskItem.setTaskId(taskId) | 
|---|
|  |  |  | .setOrderType(OrderType.ORDER_RECEIPT.type) | 
|---|
|  |  |  | .setOrderType(OrderType.ORDER_IN.type) | 
|---|
|  |  |  | .setSource(item.getId()) | 
|---|
|  |  |  | .setTrackCode(item.getTrackCode()) | 
|---|
|  |  |  | .setCreateBy(loginUserId) | 
|---|
|  |  |  | 
|---|
|  |  |  | //            waitPakinItems.forEach(item -> { | 
|---|
|  |  |  | //                TaskItem taskItem = new TaskItem(); | 
|---|
|  |  |  | //                BeanUtils.copyProperties(item, taskItem); | 
|---|
|  |  |  | ////                AsnOrder order = asnOrderService.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getId, item.getAsnId())); | 
|---|
|  |  |  | ////                if (Objects.isNull(order)) { | 
|---|
|  |  |  | ////                    throw new CoolException("数据错误: 单据不存在!!"); | 
|---|
|  |  |  | ////                } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /// /                AsnOrder order = asnOrderService.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getId, item.getAsnId())); | 
|---|
|  |  |  | /// /                if (Objects.isNull(order)) { | 
|---|
|  |  |  | /// /                    throw new CoolException("数据错误: 单据不存在!!"); | 
|---|
|  |  |  | /// /                } | 
|---|
|  |  |  | //                taskItem.setTaskId(task.getId()) | 
|---|
|  |  |  | //                        .setOrderType(OrderType.ORDER_RECEIPT.type) | 
|---|
|  |  |  | //                        .setSource(item.getId()) | 
|---|
|  |  |  | 
|---|
|  |  |  | //        locNo.setWorkNo(ruleCode); | 
|---|
|  |  |  | //        return locNo; | 
|---|
|  |  |  | //    } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public InTaskMsgDto getLocNo(TaskInParam param) { | 
|---|
|  |  |  | String matnr = null; String batch = null; | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public InTaskMsgDto getLocNo(TaskInParam param) throws Exception { | 
|---|
|  |  |  | String matnr = null; | 
|---|
|  |  |  | String batch = null; | 
|---|
|  |  |  | List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, param.getBarcode())); | 
|---|
|  |  |  | if (Cools.isEmpty(waitPakins) && param.getIoType().equals(TaskType.TASK_TYPE_IN.type)) { | 
|---|
|  |  |  | throw new CoolException("未找到组托信息,请组托"); | 
|---|
|  |  |  | }else if (!Cools.isEmpty(waitPakins)) { | 
|---|
|  |  |  | } else if (!Cools.isEmpty(waitPakins)) { | 
|---|
|  |  |  | matnr = waitPakins.get(0).getCode(); | 
|---|
|  |  |  | batch = waitPakins.get(0).getCode(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<DeviceSite> deviceSites = deviceSiteService.list(new LambdaQueryWrapper<DeviceSite>() | 
|---|
|  |  |  | .eq(DeviceSite::getSite, param.getSourceStaNo()) | 
|---|
|  |  |  | .eq(DeviceSite::getType,param.getIoType()) | 
|---|
|  |  |  | .eq(DeviceSite::getType, param.getIoType()) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | if (Cools.isEmpty(deviceSites)) { | 
|---|
|  |  |  | throw new CoolException("未找到站点路径信息"); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | LocTypeDto locTypeDto = new LocTypeDto(param); | 
|---|
|  |  |  | InTaskMsgDto dto = null; | 
|---|
|  |  |  | switch (warehouseArea.getType()) { | 
|---|
|  |  |  | case "CRN": //堆垛机 | 
|---|
|  |  |  | dto = getLocNoCrn(deviceBind,warehouseArea.getId(), param.getSourceStaNo(), matnr,batch, locTypeDto, 0, param.getIoType()); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case "SXC": //四向库 | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case "CTU": //ctu | 
|---|
|  |  |  | dto = getLocNoCtu(deviceBind,warehouseArea.getId(), param.getSourceStaNo(), matnr,batch, locTypeDto, 0, param.getIoType()); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | //根据立库类型获取获取库位 | 
|---|
|  |  |  | if (warehouseArea.getType().equals(WarehType.WAREHOUSE_TYPE_CRN.val)) { | 
|---|
|  |  |  | //堆垛机 | 
|---|
|  |  |  | 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 { | 
|---|
|  |  |  | //CTU 库以及其它 | 
|---|
|  |  |  | dto = getLocNoCtu(deviceBind, warehouseArea.getId(), param.getSourceStaNo(), matnr, batch, locTypeDto, 0, param.getIoType()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return dto; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private InTaskMsgDto getLocNoCrn(DeviceBind deviceBind,Long area,Integer sourceStaNo, String matnr, String batch,LocTypeDto locTypeDto, int times,Integer ioType){ | 
|---|
|  |  |  | private InTaskMsgDto getLocNoCrn(String orgLoc,DeviceBind deviceBind, Long area, Integer sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) { | 
|---|
|  |  |  | if (Cools.isEmpty(matnr)) {  //物料号 | 
|---|
|  |  |  | matnr = ""; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | batch = ""; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 初始化参数 | 
|---|
|  |  |  | int deviceNo = 0;      //堆垛机号 | 
|---|
|  |  |  | int channel = 0;      //堆垛机号 | 
|---|
|  |  |  | int nearRow = 0;    //最浅库位排 | 
|---|
|  |  |  | int curRow = 0;     //最深库位排 | 
|---|
|  |  |  | int rowCount = 0;   //轮询轮次 | 
|---|
|  |  |  | 
|---|
|  |  |  | for (int i = times; i <= deviceQty * 2; i++) { | 
|---|
|  |  |  | int[] locNecessaryParameters = LocUtils.LocNecessaryParameters(deviceBind, curRow, deviceQty); | 
|---|
|  |  |  | curRow = locNecessaryParameters[1]; | 
|---|
|  |  |  | deviceNo = locNecessaryParameters[2]; | 
|---|
|  |  |  | channel = locNecessaryParameters[2]; | 
|---|
|  |  |  | rowCount = locNecessaryParameters[0]; | 
|---|
|  |  |  | nearRow = locNecessaryParameters[3]; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | 
|---|
|  |  |  | throw new CoolException("无可用堆垛机"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //入库靠近摆放 | 
|---|
|  |  |  | if (ioType== 1 && deviceBind.getBeSimilar().equals("1") && !Cools.isEmpty(matnr)) { | 
|---|
|  |  |  | if (ioType == 1 && deviceBind.getBeSimilar().equals("1") && !Cools.isEmpty(matnr) && Cools.isEmpty(orgLoc)) { | 
|---|
|  |  |  | if (nearRow != curRow) { | 
|---|
|  |  |  | List<LocItem> locItems = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getMatnrCode, matnr)); | 
|---|
|  |  |  | for (LocItem locItem : locItems) { | 
|---|
|  |  |  | Loc loc1 = locService.getById(locItem.getLocId()); | 
|---|
|  |  |  | if (LocUtils.isShallowLoc(slaveProperties, loc1.getCode())) { | 
|---|
|  |  |  | if (LocUtils.isShallowLoc(loc1.getCode())) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String shallowLocNo = LocUtils.getShallowLoc(slaveProperties, loc1.getCode()); | 
|---|
|  |  |  | String shallowLocNo = LocUtils.getShallowLoc(loc1.getCode()); | 
|---|
|  |  |  | // 检测目标库位是否为空库位 | 
|---|
|  |  |  | Loc shallowLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode,shallowLocNo)); | 
|---|
|  |  |  | if (shallowLoc != null && shallowLoc.getUseStatus().equals(LocUseStatusType.Empty_Slot.type)) { | 
|---|
|  |  |  | Loc shallowLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, shallowLocNo)); | 
|---|
|  |  |  | if (shallowLoc != null && shallowLoc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { | 
|---|
|  |  |  | if (LocUtils.locMoveCheckLocTypeComplete(shallowLoc, locTypeDto)) { | 
|---|
|  |  |  | loc = shallowLoc; | 
|---|
|  |  |  | deviceNo = shallowLoc.getDeviceNo(); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | loc = shallowLoc; | 
|---|
|  |  |  | channel = shallowLoc.getChannel(); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>() | 
|---|
|  |  |  | .eq(DeviceSite::getType, ioType) | 
|---|
|  |  |  | .eq(DeviceSite::getSite, sourceStaNo) | 
|---|
|  |  |  | .eq(DeviceSite::getDeviceCode, deviceNo) | 
|---|
|  |  |  | .eq(DeviceSite::getChannel, channel) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | if (Cools.isEmpty(deviceSite)){ | 
|---|
|  |  |  | deviceNo = 0; | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | if (Cools.isEmpty(deviceSite)) { | 
|---|
|  |  |  | channel = 0; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | inTaskMsgDto.setStaNo(Integer.parseInt(deviceSite.getDeviceSite())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | // 开始查找库位 ==============================>> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 1.按规则查找库位 | 
|---|
|  |  |  | if (Cools.isEmpty(loc) && deviceNo != 0) { | 
|---|
|  |  |  | if (Cools.isEmpty(loc) && channel != 0) { | 
|---|
|  |  |  | List<Loc> locMasts = null; | 
|---|
|  |  |  | locMasts = locService.list(new LambdaQueryWrapper<Loc>() | 
|---|
|  |  |  | .eq(Loc::getRow, nearRow) | 
|---|
|  |  |  | .eq(Loc::getUseStatus, LocUseStatusType.Empty_Slot.type) | 
|---|
|  |  |  | .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) | 
|---|
|  |  |  | .eq(Loc::getType, locTypeDto.getLocType1()) | 
|---|
|  |  |  | .eq(Loc::getAreaId,area) | 
|---|
|  |  |  | .eq(Loc::getAreaId, area) | 
|---|
|  |  |  | .orderByAsc(Loc::getLev) | 
|---|
|  |  |  | .orderByAsc(Loc::getCol) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | Loc orgMoveLoc = null; | 
|---|
|  |  |  | if (!Cools.isEmpty(orgLoc)) { | 
|---|
|  |  |  | orgMoveLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, orgLoc)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (Loc locMast1 : locMasts) { | 
|---|
|  |  |  | if (!LocUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String shallowLoc = LocUtils.getDeepLoc(slaveProperties, locMast1.getCode()); | 
|---|
|  |  |  | if ((ioType== 1 && deviceBind.getBeSimilar().equals("1"))) { | 
|---|
|  |  |  | String shallowLoc = LocUtils.getDeepLoc(locMast1.getCode()); | 
|---|
|  |  |  | if ((ioType == 1 && deviceBind.getBeSimilar().equals("1"))) { | 
|---|
|  |  |  | //相似物料打开,判断深库位有没有货,没货就放深库位,有货就不操作 | 
|---|
|  |  |  | Loc locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>() | 
|---|
|  |  |  | .eq(Loc::getRow, shallowLoc) | 
|---|
|  |  |  | .eq(Loc::getUseStatus, LocUseStatusType.Empty_Slot.type) | 
|---|
|  |  |  | .eq(Loc::getAreaId,area) | 
|---|
|  |  |  | .eq(Loc::getCode, shallowLoc) | 
|---|
|  |  |  | .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) | 
|---|
|  |  |  | .eq(Loc::getAreaId, area) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!Cools.isEmpty(locMast2)) { | 
|---|
|  |  |  | if (null != orgMoveLoc){ | 
|---|
|  |  |  | if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | loc = locMast2; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | //相似物料关闭,判断深库位有没有货,有货就放浅库位,无货就不操作 | 
|---|
|  |  |  | Loc locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>() | 
|---|
|  |  |  | .eq(Loc::getCode, shallowLoc) | 
|---|
|  |  |  | .in(Loc::getUseStatus, LocUseStatusType.Empty_Pallet.type,LocUseStatusType.In_Stock.type) | 
|---|
|  |  |  | .eq(Loc::getAreaId,area) | 
|---|
|  |  |  | .in(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_D.type, LocStsType.LOC_STS_TYPE_F.type) | 
|---|
|  |  |  | .eq(Loc::getAreaId, area) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!Cools.isEmpty(locMast2)) { | 
|---|
|  |  |  | if (null != orgMoveLoc){ | 
|---|
|  |  |  | if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | loc = locMast1; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>() | 
|---|
|  |  |  | .eq(Loc::getCode, shallowLoc) | 
|---|
|  |  |  | .eq(Loc::getUseStatus, LocUseStatusType.Empty_Slot.type) | 
|---|
|  |  |  | .eq(Loc::getAreaId,area) | 
|---|
|  |  |  | .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) | 
|---|
|  |  |  | .eq(Loc::getAreaId, area) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!Cools.isEmpty(locMast2)) { | 
|---|
|  |  |  | if (null != orgMoveLoc){ | 
|---|
|  |  |  | if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | loc = locMast2; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (deviceBind.getBeSimilar().equals("1")) { | 
|---|
|  |  |  | String shallowLoc = LocUtils.getDeepLoc(slaveProperties, locMast1.getCode()); | 
|---|
|  |  |  | String shallowLoc = LocUtils.getDeepLoc(locMast1.getCode()); | 
|---|
|  |  |  | Loc locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>() | 
|---|
|  |  |  | .eq(Loc::getCode, shallowLoc) | 
|---|
|  |  |  | .eq(Loc::getUseStatus, LocUseStatusType.Empty_Slot.type) | 
|---|
|  |  |  | .eq(Loc::getAreaId,area) | 
|---|
|  |  |  | .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) | 
|---|
|  |  |  | .eq(Loc::getAreaId, area) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!Cools.isEmpty(locMast2)) { | 
|---|
|  |  |  | if (null != orgMoveLoc){ | 
|---|
|  |  |  | if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | loc = locMast2; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>() | 
|---|
|  |  |  | .eq(Loc::getCode, shallowLoc) | 
|---|
|  |  |  | .in(Loc::getUseStatus, LocUseStatusType.Empty_Pallet.type,LocUseStatusType.In_Stock.type) | 
|---|
|  |  |  | .eq(Loc::getAreaId,area) | 
|---|
|  |  |  | .in(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_D.type, LocStsType.LOC_STS_TYPE_D.type) | 
|---|
|  |  |  | .eq(Loc::getAreaId, area) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!Cools.isEmpty(locMast2)) { | 
|---|
|  |  |  | if (null != orgMoveLoc){ | 
|---|
|  |  |  | if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | loc = locMast1; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //查询当前库位类型空库位 小于5个则locmast = null | 
|---|
|  |  |  | List<Loc> locTypeLocMasts = locService.list(new LambdaQueryWrapper<Loc>() | 
|---|
|  |  |  | .eq(Loc::getUseStatus, LocUseStatusType.Empty_Slot.type) | 
|---|
|  |  |  | .eq(Loc::getDeviceNo, deviceNo) | 
|---|
|  |  |  | .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) | 
|---|
|  |  |  | .eq(Loc::getChannel, channel) | 
|---|
|  |  |  | .eq(Loc::getType, locTypeDto.getLocType1()) | 
|---|
|  |  |  | .eq(Loc::getAreaId,area) | 
|---|
|  |  |  | .eq(Loc::getAreaId, area) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | if (null !=locTypeLocMasts && locTypeLocMasts.size()<=5){ | 
|---|
|  |  |  | if (null != locTypeLocMasts && locTypeLocMasts.size() <= 5) { | 
|---|
|  |  |  | loc = null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 递归查询 | 
|---|
|  |  |  | if (Cools.isEmpty(loc) || !loc.getUseStatus().equals(LocUseStatusType.Empty_Slot.type)) { | 
|---|
|  |  |  | if (Cools.isEmpty(loc) || !loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { | 
|---|
|  |  |  | // 当前巷道无空库位时,递归调整至下一巷道,检索全部巷道无果后,跳出递归 | 
|---|
|  |  |  | if (times < rowCount * 2) { | 
|---|
|  |  |  | times = times + 1; | 
|---|
|  |  |  | return getLocNoCrn(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(deviceBind,area,sourceStaNo,matnr,batch,locTypeDto,0, ioType); | 
|---|
|  |  |  | return getLocNoCrn(orgLoc,deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, 0, ioType); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | throw new CoolException("没有空库位"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String locNo = loc.getCode(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 返回dto | 
|---|
|  |  |  | inTaskMsgDto.setDeviceNo(deviceNo); | 
|---|
|  |  |  | inTaskMsgDto.setDeviceNo(channel); | 
|---|
|  |  |  | inTaskMsgDto.setSourceStaNo(sourceStaNo); | 
|---|
|  |  |  | //        inTaskMsgDto.setStaNo(); | 
|---|
|  |  |  | inTaskMsgDto.setLocNo(locNo); | 
|---|
|  |  |  | 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, Integer sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) { | 
|---|
|  |  |  | if (Cools.isEmpty(matnr)) {  //物料号 | 
|---|
|  |  |  | matnr = ""; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | InTaskMsgDto inTaskMsgDto = new InTaskMsgDto(); | 
|---|
|  |  |  | List<Loc> loc1 = locService.list(new LambdaQueryWrapper<Loc>() | 
|---|
|  |  |  | .eq(Loc::getAreaId, area) | 
|---|
|  |  |  | .eq(Loc::getUseStatus, LocUseStatusType.Empty_Slot.type) | 
|---|
|  |  |  | .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) | 
|---|
|  |  |  | .eq(Loc::getType, locTypeDto.getLocType1()) | 
|---|
|  |  |  | .orderByAsc(Loc::getRow) | 
|---|
|  |  |  | .orderByAsc(Loc::getCol) | 
|---|
|  |  |  | .orderByAsc(Loc::getLev) | 
|---|
|  |  |  | .orderByAsc(Loc::getCol) | 
|---|
|  |  |  | .orderByAsc(Loc::getRow) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | for (Loc loc2 :loc1){ | 
|---|
|  |  |  | for (Loc loc2 : loc1) { | 
|---|
|  |  |  | if (!LocUtils.locMoveCheckLocTypeComplete(loc2, locTypeDto)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | .eq(DeviceSite::getSite, sourceStaNo) | 
|---|
|  |  |  | .eq(DeviceSite::getDeviceCode, loc.getDeviceNo()) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | if (Cools.isEmpty(deviceSite)){ | 
|---|
|  |  |  | if (Cools.isEmpty(deviceSite)) { | 
|---|
|  |  |  | deviceNo = 0; | 
|---|
|  |  |  | loc = null; | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | inTaskMsgDto.setStaNo(Integer.parseInt(deviceSite.getDeviceSite())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 递归查询 | 
|---|
|  |  |  | if (Cools.isEmpty(loc) || !loc.getUseStatus().equals(LocUseStatusType.Empty_Slot.type)) { | 
|---|
|  |  |  | if (Cools.isEmpty(loc) || !loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { | 
|---|
|  |  |  | // 当前巷道无空库位时,递归调整至下一巷道,检索全部巷道无果后,跳出递归 | 
|---|
|  |  |  | if (times < 5) { | 
|---|
|  |  |  | times = times + 1; | 
|---|
|  |  |  | return getLocNoCtu(deviceBind,area,sourceStaNo,matnr,batch,locTypeDto,times, ioType); | 
|---|
|  |  |  | return getLocNoCtu(deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, times, ioType); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 2.库位当前所属尺寸无空库位时,调整尺寸参数,向上兼容检索库位 | 
|---|
|  |  |  | if (locTypeDto.getLocType1() < 3) { | 
|---|
|  |  |  | int i = locTypeDto.getLocType1() + 1; | 
|---|
|  |  |  | locTypeDto.setLocType1(i); | 
|---|
|  |  |  | return getLocNoCtu(deviceBind,area,sourceStaNo,matnr,batch,locTypeDto,0, ioType); | 
|---|
|  |  |  | return getLocNoCtu(deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, 0, ioType); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | throw new CoolException("没有空库位"); | 
|---|
|  |  |  | } | 
|---|