From 0cf1c13ac668cdb689b073c3961592d8ab41316c Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期三, 21 五月 2025 19:35:17 +0800 Subject: [PATCH] 拣料出库任务优化 --- rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java | 166 +++++++++++++++++++++++++++++++----------------------- 1 files changed, 95 insertions(+), 71 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 295ccdf..325480d 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 @@ -7,18 +7,13 @@ 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.system.utils.SerialRuleUtils; @@ -28,7 +23,6 @@ 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; @@ -55,10 +49,41 @@ private TaskItemService taskItemService; @Autowired private WaitPakinItemService waitPakinItemService; + @Autowired + private BasStationService basStationService; + @Override @Transactional(rollbackFor = Exception.class) - public InTaskMsgDto createInTask(TaskInParam param, Long loginUserId) { + 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(StaUseStatusType.TYPE_O.type); + basStation.setBarcode(null); + basStationService.updateById(basStation); + + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public InTaskMsgDto createInTask(TaskInParam param) { // 鑾峰彇搴撲綅鍙� InTaskMsgDto locNo = getLocNo(param); @@ -73,7 +98,7 @@ // 鍒涘缓骞朵繚瀛樹换鍔� 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()); @@ -82,15 +107,16 @@ 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; } + /** * 楠岃瘉璁惧绔欑偣 @@ -140,6 +166,7 @@ task.setTaskCode(ruleCode) .setTaskStatus(TaskStsType.GENERATE_IN.id.shortValue()) .setTaskType(TaskType.TASK_TYPE_IN.type.shortValue()) + .setWarehType(WarehType.WAREHOUSE_TYPE_CRN.id) .setTargLoc(targetLoc) .setBarcode(barcode) .setTargSite(targetSite) @@ -189,7 +216,7 @@ 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) @@ -270,10 +297,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()) @@ -299,24 +327,28 @@ // locNo.setWorkNo(ruleCode); // return locNo; // } - public InTaskMsgDto getLocNo(TaskInParam param) { - String matnr = null; String batch = null; + 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("鏈壘鍒扮珯鐐硅矾寰勪俊鎭�"); } - WarehouseAreas warehouseArea = warehouseAreasService.getById(param.getArea()); + DeviceBind deviceBind = deviceBindService.getById(LocUtils.getAreaType(param.getSourceStaNo())); + if (Cools.isEmpty(deviceBind)) { + throw new CoolException("鏁版嵁寮傚父锛岃鑱旂郴绠$悊鍛�===>搴撲綅瑙勫垯鏈煡"); + } + WarehouseAreas warehouseArea = warehouseAreasService.getById(deviceBind.getTypeId()); if (Cools.isEmpty(warehouseArea)) { throw new CoolException("鏈壘鍒版墍灞炲簱鍖轰俊鎭�"); } @@ -324,18 +356,18 @@ InTaskMsgDto dto = null; switch (warehouseArea.getType()) { case "CRN": //鍫嗗灈鏈� - dto = getLocNoCrn(param.getArea(), param.getSourceStaNo(), matnr,batch, locTypeDto, 0, param.getIoType()); + dto = getLocNoCrn(deviceBind, warehouseArea.getId(), param.getSourceStaNo(), matnr, batch, locTypeDto, 0, param.getIoType()); break; case "SXC": //鍥涘悜搴� break; case "CTU": //ctu - dto = getLocNoCtu(param.getArea(), param.getSourceStaNo(), matnr,batch, locTypeDto, 0, param.getIoType()); + dto = getLocNoCtu(deviceBind, warehouseArea.getId(), param.getSourceStaNo(), matnr, batch, locTypeDto, 0, param.getIoType()); break; } return dto; } - private InTaskMsgDto getLocNoCrn(Integer area,Integer sourceStaNo, String matnr, String batch,LocTypeDto locTypeDto, int times,Integer ioType){ + private InTaskMsgDto getLocNoCrn(DeviceBind deviceBind, Long area, Integer sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) { if (Cools.isEmpty(matnr)) { //鐗╂枡鍙� matnr = ""; } @@ -350,10 +382,7 @@ Loc loc = null; // 鐩爣搴撲綅 InTaskMsgDto inTaskMsgDto = new InTaskMsgDto(); - DeviceBind deviceBind = deviceBindService.getById(LocUtils.getAreaType(sourceStaNo)); - if (Cools.isEmpty(deviceBind)) { - throw new CoolException("鏁版嵁寮傚父锛岃鑱旂郴绠$悊鍛�===>搴撲綅瑙勫垯鏈煡"); - } + int sRow = deviceBind.getStartRow(); int eRow = deviceBind.getEndRow(); int deviceQty = deviceBind.getDeviceQty(); @@ -375,7 +404,7 @@ throw new CoolException("鏃犲彲鐢ㄥ爢鍨涙満"); } //鍏ュ簱闈犺繎鎽嗘斁 - if (ioType== 1 && deviceBind.getBeSimilar().equals("1") && !Cools.isEmpty(matnr)) { + if (ioType == 1 && deviceBind.getBeSimilar().equals("1") && !Cools.isEmpty(matnr)) { if (nearRow != curRow) { List<LocItem> locItems = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getMatnrCode, matnr)); for (LocItem locItem : locItems) { @@ -385,12 +414,12 @@ } String shallowLocNo = LocUtils.getShallowLoc(slaveProperties, 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; + deviceNo = shallowLoc.getDeviceNo(); + break; } } @@ -428,9 +457,9 @@ .eq(DeviceSite::getSite, sourceStaNo) .eq(DeviceSite::getDeviceCode, deviceNo) ); - if (Cools.isEmpty(deviceSite)){ + if (Cools.isEmpty(deviceSite)) { deviceNo = 0; - }else { + } else { inTaskMsgDto.setStaNo(Integer.parseInt(deviceSite.getDeviceSite())); } @@ -445,9 +474,9 @@ 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) ); @@ -456,12 +485,12 @@ continue; } String shallowLoc = LocUtils.getDeepLoc(slaveProperties, locMast1.getCode()); - if ((ioType== 1 && deviceBind.getBeSimilar().equals("1"))) { + 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::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) + .eq(Loc::getAreaId, area) ); if (!Cools.isEmpty(locMast2)) { loc = locMast2; @@ -471,17 +500,17 @@ //鐩镐技鐗╂枡鍏抽棴锛屽垽鏂繁搴撲綅鏈夋病鏈夎揣锛屾湁璐у氨鏀炬祬搴撲綅锛屾棤璐у氨涓嶆搷浣� 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)) { 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)) { loc = locMast2; @@ -499,8 +528,8 @@ String shallowLoc = LocUtils.getDeepLoc(slaveProperties, 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)) { loc = locMast2; @@ -508,8 +537,8 @@ } 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)) { loc = locMast1; @@ -527,27 +556,27 @@ } //鏌ヨ褰撳墠搴撲綅绫诲瀷绌哄簱浣� 灏忎簬5涓垯locmast = null List<Loc> locTypeLocMasts = locService.list(new LambdaQueryWrapper<Loc>() - .eq(Loc::getUseStatus, LocUseStatusType.Empty_Slot.type) + .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) .eq(Loc::getDeviceNo, deviceNo) .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(area,sourceStaNo,matnr,batch,locTypeDto,times, ioType); + return getLocNoCrn(deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, times, ioType); } // 2.搴撲綅褰撳墠鎵�灞炲昂瀵告棤绌哄簱浣嶆椂锛岃皟鏁村昂瀵稿弬鏁帮紝鍚戜笂鍏煎妫�绱㈠簱浣� if (locTypeDto.getLocType1() < 3) { int i = locTypeDto.getLocType1() + 1; locTypeDto.setLocType1(i); - return getLocNoCrn(area,sourceStaNo,matnr,batch,locTypeDto,0, ioType); + return getLocNoCrn(deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, 0, ioType); } throw new CoolException("娌℃湁绌哄簱浣�"); } @@ -561,7 +590,7 @@ return inTaskMsgDto; } - private InTaskMsgDto getLocNoCtu(Integer 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 = ""; } @@ -571,20 +600,15 @@ int deviceNo = 0; Loc loc = new Loc(); InTaskMsgDto inTaskMsgDto = new InTaskMsgDto(); - DeviceBind deviceBind = deviceBindService.getById(LocUtils.getAreaType(sourceStaNo)); - if (Cools.isEmpty(deviceBind)) { - throw new CoolException("鏁版嵁寮傚父锛岃鑱旂郴绠$悊鍛�===>搴撲綅瑙勫垯鏈煡"); - } - 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; } @@ -597,25 +621,25 @@ .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 getLocNoCrn(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 getLocNoCrn(area,sourceStaNo,matnr,batch,locTypeDto,0, ioType); + return getLocNoCtu(deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, 0, ioType); } throw new CoolException("娌℃湁绌哄簱浣�"); } -- Gitblit v1.9.1