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/manager/service/impl/TaskServiceImpl.java | 26 +++++--- rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/LocType.java | 6 +- rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/TaskInParam.java | 19 ++++++ rsf-server/src/main/java/com/vincent/rsf/server/api/utils/LocUtils.java | 1 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java | 16 +++++ rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java | 80 +++++++++++++------------- 6 files changed, 95 insertions(+), 53 deletions(-) diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java index f41c681..703afe3 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java @@ -65,6 +65,22 @@ } + /** + * 鎺ユ敹WCS璋冨害锛屽洖浼犳墽琛岀姸鎬� + * //TODO 1. 鎷f枡鍑哄簱锛屽啀鍏ュ簱鎵ц锛屼慨鏀圭姸鎬佷负199.浠诲姟瀹屾垚 骞惰褰曞叆搴撶珯鐐癸紙婧愮珯鐐癸級锛屾坊鍔犱换鍔″彿鍙傛暟 + * + * @param param + * @return + */ + @ApiOperation("鎺ユ敹WCS璋冨害锛屽洖浼犳墽琛岀姸鎬�") + @PostMapping("/exce/status") + public R receiveTask(@RequestBody TaskInParam param) { + if (Cools.isEmpty(param)) { + return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒"); + } + + return R.ok(); + } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/TaskInParam.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/TaskInParam.java index 155829f..784df15 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/TaskInParam.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/TaskInParam.java @@ -1,14 +1,33 @@ package com.vincent.rsf.server.api.controller.params; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.experimental.Accessors; @Data +@Accessors(chain = true) +@ApiModel(value = "TaskInParam", description = "WCS璋冨害鍙傛暟") public class TaskInParam { + @ApiModelProperty("浣滀笟绫诲瀷") private Integer ioType; //浣滀笟绫诲瀷 + + @ApiModelProperty("浣滀笟绔欑偣 or 鏉ユ簮绔欑偣") private Integer sourceStaNo; //浣滀笟绔欑偣 or 鏉ユ簮绔欑偣 + + @ApiModelProperty("瀹瑰櫒鏉$爜") private String barcode; //瀹瑰櫒鏉$爜 + + @ApiModelProperty("搴撲綅绫诲瀷") private Integer locType1; //搴撲綅绫诲瀷 + + @ApiModelProperty("浠诲姟缂栫爜") + private String taskCode; + +// @ApiModelProperty("搴撲綅绫诲瀷") +// private String locType; + private Long user; // private Integer locType2; //搴撲綅绫诲瀷 // private Integer locType3; //搴撲綅绫诲瀷 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 21e35c2..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 @@ -118,7 +118,6 @@ } - /** * 楠岃瘉璁惧绔欑偣 */ @@ -298,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()) @@ -327,19 +327,19 @@ // 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("鏈壘鍒扮珯鐐硅矾寰勪俊鎭�"); @@ -356,18 +356,18 @@ InTaskMsgDto dto = null; switch (warehouseArea.getType()) { case "CRN": //鍫嗗灈鏈� - dto = getLocNoCrn(deviceBind,warehouseArea.getId(), 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(deviceBind,warehouseArea.getId(), 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(DeviceBind deviceBind,Long 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 = ""; } @@ -404,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) { @@ -414,12 +414,12 @@ } String shallowLocNo = LocUtils.getShallowLoc(slaveProperties, 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; + deviceNo = shallowLoc.getDeviceNo(); + break; } } @@ -457,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())); } @@ -476,7 +476,7 @@ .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) ); @@ -485,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, LocStsType.LOC_STS_TYPE_O.type) - .eq(Loc::getAreaId,area) + .eq(Loc::getAreaId, area) ); if (!Cools.isEmpty(locMast2)) { loc = locMast2; @@ -500,17 +500,17 @@ //鐩镐技鐗╂枡鍏抽棴锛屽垽鏂繁搴撲綅鏈夋病鏈夎揣锛屾湁璐у氨鏀炬祬搴撲綅锛屾棤璐у氨涓嶆搷浣� 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)) { 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)) { loc = locMast2; @@ -529,7 +529,7 @@ 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)) { loc = locMast2; @@ -537,8 +537,8 @@ } 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)) { loc = locMast1; @@ -556,12 +556,12 @@ } //鏌ヨ褰撳墠搴撲綅绫诲瀷绌哄簱浣� 灏忎簬5涓垯locmast = null List<Loc> locTypeLocMasts = locService.list(new LambdaQueryWrapper<Loc>() - .eq(Loc::getUseStatus,LocStsType.LOC_STS_TYPE_O.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; } // 閫掑綊鏌ヨ @@ -569,14 +569,14 @@ // 褰撳墠宸烽亾鏃犵┖搴撲綅鏃讹紝閫掑綊璋冩暣鑷充笅涓�宸烽亾锛屾绱㈠叏閮ㄥ贩閬撴棤鏋滃悗锛岃烦鍑洪�掑綊 if (times < rowCount * 2) { times = times + 1; - return getLocNoCrn(deviceBind,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(deviceBind,area,sourceStaNo,matnr,batch,locTypeDto,0, ioType); + return getLocNoCrn(deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, 0, ioType); } throw new CoolException("娌℃湁绌哄簱浣�"); } @@ -590,7 +590,7 @@ 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 = ""; } @@ -608,7 +608,7 @@ .orderByAsc(Loc::getCol) .orderByAsc(Loc::getRow) ); - for (Loc loc2 :loc1){ + for (Loc loc2 : loc1) { if (!LocUtils.locMoveCheckLocTypeComplete(loc2, locTypeDto)) { continue; } @@ -621,10 +621,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())); } // 閫掑綊鏌ヨ @@ -632,14 +632,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("娌℃湁绌哄簱浣�"); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/utils/LocUtils.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/utils/LocUtils.java index dc5064e..0c66250 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/utils/LocUtils.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/utils/LocUtils.java @@ -150,6 +150,7 @@ // 濡傛灉婧愬簱浣嶆槸楂樺簱浣嶏紝鐩爣搴撲綅鏄綆搴撲綅 return dto.getLocType1().equals(Integer.parseInt(loc.getType())); } + public static String zerofill(String msg, Integer count) { if (msg.length() == count) { return msg; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/enums/LocType.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/LocType.java similarity index 79% rename from rsf-server/src/main/java/com/vincent/rsf/server/system/enums/LocType.java rename to rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/LocType.java index d3c44b8..c5ed998 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/system/enums/LocType.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/LocType.java @@ -1,4 +1,4 @@ -package com.vincent.rsf.server.system.enums; +package com.vincent.rsf.server.manager.enums; /** * @author Ryan @@ -19,7 +19,7 @@ this.desc = desc; } - private String type; + public String type; - private String desc; + public String desc; } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java index 7f4972a..10de96f 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java @@ -3,19 +3,20 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.server.api.controller.params.TaskInParam; import com.vincent.rsf.server.manager.enums.*; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.utils.LocUtils; import com.vincent.rsf.server.manager.controller.params.GenerateTaskParams; import com.vincent.rsf.server.manager.entity.*; -import com.vincent.rsf.server.manager.mapper.TaskItemMapper; import com.vincent.rsf.server.manager.mapper.TaskMapper; import com.vincent.rsf.server.manager.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.LocType; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import lombok.Synchronized; import org.apache.commons.lang3.StringUtils; @@ -398,7 +399,6 @@ complateOutStock(task); } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_IN.type)) { //鎷f枡鍑哄簱 - // pickTask(task.getId()); //绉婚櫎鍘熷搴撳瓨 complateOutStock(task); @@ -448,7 +448,7 @@ throw new CoolException("鏁版嵁閿欒锛屼綔涓氫腑搴撳瓨鏁版嵁涓㈠け锛侊紒"); } if (locWorking.getAnfme().compareTo(taskItem.getAnfme()) >= 0) { - locWorking.setAnfme(Math.round((locWorking.getAnfme() - taskItem.getAnfme()) * 10000) / 10000.0); + locWorking.setAnfme(Math.round((locWorking.getAnfme() - taskItem.getAnfme()) * 10000) / 10000.0); } else { continue; } @@ -458,13 +458,13 @@ items.add(locItem); } - if (!locItemService.saveBatch(items)) { - throw new CoolException("浣滀笟搴撳瓨鍥炲啓澶辫触锛侊紒"); - } + if (!locItemService.saveBatch(items)) { + throw new CoolException("浣滀笟搴撳瓨鍥炲啓澶辫触锛侊紒"); + } - if (!locItemWorkingService.remove(new LambdaQueryWrapper<LocItemWorking>().eq(LocItemWorking::getTaskId, task.getId()))) { - throw new CoolException("浣滀笟涓簱瀛樺垹闄ゅけ璐ワ紒锛�"); - } + if (!locItemWorkingService.remove(new LambdaQueryWrapper<LocItemWorking>().eq(LocItemWorking::getTaskId, task.getId()))) { + throw new CoolException("浣滀笟涓簱瀛樺垹闄ゅけ璐ワ紒锛�"); + } } @@ -570,11 +570,17 @@ .setTaskType(TaskType.TASK_TYPE_PICK_IN.type) .setBarcode(task.getBarcode()) .setTaskStatus(TaskStsType.GENERATE_IN.id); + //TODO 鍚庣画闇�鏍规嵁浠撳簱绫诲瀷鏌ユ壘鏂板簱浣嶏紝鍘熷搴撲綅缃┖闂茬姸鎬� { + // TaskInParam param = new TaskInParam(); + // param.setSourceStaNo(Integer.parseInt(task.getOrgSite())) + // .setIoType(Integer.parseInt(TaskType.TASK_TYPE_IN.type + "")); + //// .setLocType1(LocType.LOC_TYPE_LOW.type);} + if (!this.updateById(task)) { throw new CoolException("浠诲姟鐘舵�佹洿鏂板け璐ワ紒锛�"); } - //TODO 鍚庣画闇�鏍规嵁浠撳簱绫诲瀷鏌ユ壘鏂板簱浣嶏紝鍘熷搴撲綅缃┖闂茬姸鎬� + List<LocItemWorking> workings = new ArrayList<>(); for (LocItem item : locItems) { LocItemWorking working = new LocItemWorking(); -- Gitblit v1.9.1