From 734f0c5fa7c83c73e388e25c9863663b3559fe23 Mon Sep 17 00:00:00 2001 From: zjj <3272660260@qq.com> Date: 星期五, 30 五月 2025 15:26:44 +0800 Subject: [PATCH] #移库找库位优化 --- rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java | 183 +++++++++++++++++++++++++++------------------ 1 files changed, 111 insertions(+), 72 deletions(-) diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java index 84f477e..971f036 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java @@ -15,7 +15,7 @@ import com.vincent.rsf.server.manager.service.*; import com.vincent.rsf.server.manager.service.impl.LocServiceImpl; 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; @@ -74,7 +74,7 @@ task.setTaskStatus(TaskStsType.WCS_EXECUTE_OUT_TOTE_LOAD.id); taskService.updateById(task); - basStation.setUseStatus(StaUseStatusType.TYPE_O.type); + basStation.setUseStatus(LocStsType.LOC_STS_TYPE_O.type); basStation.setBarcode(null); basStationService.updateById(basStation); @@ -84,8 +84,6 @@ @Override @Transactional(rollbackFor = Exception.class) public InTaskMsgDto createInTask(TaskInParam param) { - // 鑾峰彇搴撲綅鍙� - InTaskMsgDto locNo = getLocNo(param); // 楠岃瘉璁惧绔欑偣 DeviceSite deviceSite = validateDeviceSite(param); @@ -95,6 +93,14 @@ // 鐢熸垚浠诲姟缂栫爜 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(), @@ -118,7 +124,6 @@ } - /** * 楠岃瘉璁惧绔欑偣 */ @@ -139,7 +144,7 @@ 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("璇锋鏌ョ粍鎷栫姸鎬佹槸鍚﹀畬鎴愶紒锛�"); @@ -165,8 +170,9 @@ 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) @@ -188,7 +194,6 @@ .eq(Loc::getCode, locCode) .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type) .set(Loc::getBarcode, barcode)); - if (!updated) { throw new CoolException("搴撲綅棰勭害澶辫触锛侊紒"); } @@ -198,9 +203,7 @@ * 鑾峰彇骞堕獙璇佺粍鎷栨槑缁� */ 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("鏁版嵁閿欒锛氱粍鎷栨槑缁嗕笉瀛樺湪"); } @@ -297,10 +300,11 @@ // 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()) @@ -326,19 +330,20 @@ // 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("鏈壘鍒扮珯鐐硅矾寰勪俊鎭�"); @@ -353,20 +358,21 @@ } 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 = ""; } @@ -374,7 +380,7 @@ batch = ""; } // 鍒濆鍖栧弬鏁� - int deviceNo = 0; //鍫嗗灈鏈哄彿 + int channel = 0; //鍫嗗灈鏈哄彿 int nearRow = 0; //鏈�娴呭簱浣嶆帓 int curRow = 0; //鏈�娣卞簱浣嶆帓 int rowCount = 0; //杞杞 @@ -394,7 +400,7 @@ 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; @@ -403,23 +409,22 @@ 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)); + 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; } } } @@ -454,11 +459,11 @@ 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())); } @@ -469,29 +474,39 @@ // 寮�濮嬫煡鎵惧簱浣� ==============================>> // 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, 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::getCode, shallowLoc) .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) - .eq(Loc::getAreaId,area) + .eq(Loc::getAreaId, area) ); + if (!Cools.isEmpty(locMast2)) { + if (null != orgMoveLoc){ + if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { + break; + } + } loc = locMast2; break; } @@ -499,19 +514,31 @@ //鐩镐技鐗╂枡鍏抽棴锛屽垽鏂繁搴撲綅鏈夋病鏈夎揣锛屾湁璐у氨鏀炬祬搴撲綅锛屾棤璐у氨涓嶆搷浣� Loc locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>() .eq(Loc::getCode, shallowLoc) - .in(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_D.type,LocStsType.LOC_STS_TYPE_F.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, LocStsType.LOC_STS_TYPE_O.type) - .eq(Loc::getAreaId,area) + .eq(Loc::getAreaId, area) ); + if (!Cools.isEmpty(locMast2)) { + if (null != orgMoveLoc){ + if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { + break; + } + } loc = locMast2; break; } @@ -524,22 +551,34 @@ 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, LocStsType.LOC_STS_TYPE_O.type) - .eq(Loc::getAreaId,area) + .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, LocStsType.LOC_STS_TYPE_D.type,LocStsType.LOC_STS_TYPE_D.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; } @@ -555,12 +594,12 @@ } //鏌ヨ褰撳墠搴撲綅绫诲瀷绌哄簱浣� 灏忎簬5涓垯locmast = null List<Loc> locTypeLocMasts = locService.list(new LambdaQueryWrapper<Loc>() - .eq(Loc::getUseStatus,LocStsType.LOC_STS_TYPE_O.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; } // 閫掑綊鏌ヨ @@ -568,28 +607,28 @@ // 褰撳墠宸烽亾鏃犵┖搴撲綅鏃讹紝閫掑綊璋冩暣鑷充笅涓�宸烽亾锛屾绱㈠叏閮ㄥ贩閬撴棤鏋滃悗锛岃烦鍑洪�掑綊 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 = ""; } @@ -607,7 +646,7 @@ .orderByAsc(Loc::getCol) .orderByAsc(Loc::getRow) ); - for (Loc loc2 :loc1){ + for (Loc loc2 : loc1) { if (!LocUtils.locMoveCheckLocTypeComplete(loc2, locTypeDto)) { continue; } @@ -620,10 +659,10 @@ .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())); } // 閫掑綊鏌ヨ @@ -631,14 +670,14 @@ // 褰撳墠宸烽亾鏃犵┖搴撲綅鏃讹紝閫掑綊璋冩暣鑷充笅涓�宸烽亾锛屾绱㈠叏閮ㄥ贩閬撴棤鏋滃悗锛岃烦鍑洪�掑綊 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("娌℃湁绌哄簱浣�"); } -- Gitblit v1.9.1