From ae2b0889d677be95535349c389bfb041b18a27ef Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期二, 22 七月 2025 20:09:53 +0800 Subject: [PATCH] 盘点功能优化 --- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java | 181 ++++++++++++++++++++++++++++++++++----------- 1 files changed, 136 insertions(+), 45 deletions(-) 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 a7c8e9a..71a4afc 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 @@ -33,6 +33,7 @@ import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; @Service("taskService") public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService { @@ -83,6 +84,14 @@ private OutStockService outStockService; @Autowired private OutStockItemService outStockItemService; + @Autowired + private CheckOrderItemService checkOrderItemService; + @Autowired + private CheckOrderService checkOrderService; + @Autowired + private CheckDiffService checkDiffService; + @Autowired + private CheckDiffItemService checkDiffItemService; @Override @Transactional(rollbackFor = Exception.class) @@ -675,13 +684,13 @@ if (taskItems.isEmpty()) { throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦紒锛�"); } + List<LocItem> items = new ArrayList<>(); for (TaskItem taskItem : taskItems) { LocItem locItem = new LocItem(); LocItemWorking locWorking = locItemWorkingService.getOne(new LambdaQueryWrapper<LocItemWorking>() .eq(LocItemWorking::getTaskId, taskItem.getTaskId()) .eq(StringUtils.isNotBlank(taskItem.getBatch()), LocItemWorking::getBatch, taskItem.getBatch()) - .eq(StringUtils.isNotBlank(taskItem.getFieldsIndex()), LocItemWorking::getFieldsIndex, taskItem.getFieldsIndex()) .eq(LocItemWorking::getMatnrId, taskItem.getMatnrId())); if (Objects.isNull(locWorking)) { throw new CoolException("鏁版嵁閿欒锛屼綔涓氫腑搴撳瓨鏁版嵁涓㈠け锛侊紒"); @@ -742,7 +751,9 @@ .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type))) { throw new CoolException("婧愬簱浣嶇姸鎬佷慨鏀瑰け璐ワ紒锛�"); } - if (!locService.update(new LambdaUpdateWrapper<Loc>().eq(Loc::getCode, task.getTargLoc()).set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type))) { + if (!locService.update(new LambdaUpdateWrapper<Loc>() + .eq(Loc::getCode, task.getTargLoc()) + .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type))) { throw new CoolException("绉诲簱鐩爣搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�"); } @@ -761,7 +772,21 @@ throw new CoolException("浠诲姟淇℃伅淇敼澶辫触锛侊紒"); } } + } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)) { + List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().in(TaskItem::getTaskId, Arrays.asList(ids))); + if (!taskItems.isEmpty()) { + taskItems.forEach(taskItem -> { + checkDiffItemService.remove(new LambdaQueryWrapper<CheckDiffItem>().eq(CheckDiffItem::getTaskItemId, taskItem.getId())); + checkDiffService.removeById(taskItem.getSourceId()); + }); + } + + if (!locService.update(new LambdaUpdateWrapper<Loc>() + .eq(Loc::getCode, task.getOrgLoc()) + .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type))) { + throw new CoolException("婧愬簱浣嶇姸鎬佷慨鏀瑰け璐ワ紒锛�"); + } } if (!Objects.isNull(task.getWarehType()) && task.getWarehType().equals(WarehType.WAREHOUSE_TYPE_AGV.val)) { @@ -796,7 +821,10 @@ if (Objects.isNull(loc)) { throw new CoolException("鏁版嵁閿欒锛氬簱浣嶄俊鎭笉瀛樺湪锛侊紒"); } - loc.setUseStatus(LocStsType.LOC_STS_TYPE_F.type).setBarcode(task.getBarcode()).setUpdateBy(loginUserId).setUpdateTime(new Date()); + loc.setUseStatus(LocStsType.LOC_STS_TYPE_F.type) + .setBarcode(task.getBarcode()) + .setUpdateBy(loginUserId) + .setUpdateTime(new Date()); if (!locService.updateById(loc)) { throw new CoolException("搴撲綅淇℃伅淇敼澶辫触锛侊紒"); } @@ -842,7 +870,7 @@ throw new CoolException("鍘熷崟鎹姸鎬佷慨鏀瑰け璐ワ紒锛�"); } - AsnOrderItem orderItem = outStockItemService.getById(item.getSource()); + WkOrderItem orderItem = outStockItemService.getById(item.getSource()); if (Objects.isNull(orderItem)) { throw new CoolException("鏁版嵁閿欒锛氬崟鎹槑缁嗗凡涓嶅瓨鍦紒锛�"); } @@ -867,7 +895,8 @@ } Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTaskType() < TaskStsType.UPDATED_IN.id ? task.getTargLoc() : task.getOrgLoc())); - if (null != loc && (loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type) || loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_R.type))) { + if (null != loc && (loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type) + || loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_R.type))) { loc.setUseStatus(LocStsType.LOC_STS_TYPE_O.type); if (!locService.updateById(loc)) { throw new CoolException("鏇存柊搴撲綅鐘舵�佸け璐ワ紒锛�"); @@ -943,46 +972,84 @@ if (!this.updateById(task)) { throw new CoolException("浠诲姟鐘舵�佹洿鏂板け璐ワ紒锛�"); } - + //鑾峰彇鍥犲綋鍓嶄换鍔″嚭搴撶殑鎵�鏈夌墿鏂欎俊鎭� + List<LocItemWorking> tempLocs = locItemWorkingService.list(new LambdaQueryWrapper<LocItemWorking>().eq(LocItemWorking::getTaskId, task.getId())); + if (tempLocs.isEmpty()) { + throw new CoolException("鏁版嵁閿欒锛屼綔涓氫腑搴撳瓨鏁版嵁涓㈠け锛侊紒"); + } List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); - for (int i = 0; i < taskItems.size(); i++) { - TaskItem taskItem = taskItems.get(i); - LocItemWorking locWorking = locItemWorkingService.getOne(new LambdaQueryWrapper<LocItemWorking>() - .eq(LocItemWorking::getTaskId, taskItem.getTaskId()) - .eq(StringUtils.isNotBlank(taskItem.getBatch()), LocItemWorking::getBatch, taskItem.getBatch()) - .eq(StringUtils.isNotBlank(taskItem.getFieldsIndex()), LocItemWorking::getFieldsIndex, taskItem.getFieldsIndex()) - .eq(LocItemWorking::getMatnrId, taskItem.getMatnrId())); - if (Objects.isNull(locWorking)) { - throw new CoolException("鏁版嵁閿欒锛屼綔涓氫腑搴撳瓨鏁版嵁涓㈠け锛侊紒"); - } - if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)) { - locWorking.setWorkQty(0.0); - locWorking.setAnfme(taskItem.getAnfme()); - } else { - if (locWorking.getAnfme().compareTo(taskItem.getAnfme()) >= 0) { - locWorking.setWorkQty(0.0); - locWorking.setAnfme(Math.round((locWorking.getAnfme() - taskItem.getAnfme()) * 10000) / 10000.0); - } else { - continue; + if (taskItems.isEmpty()) { + throw new CoolException("鏁版嵁閿欒锛氫换鍔℃槑缁嗕负绌猴紒锛�"); + } + + tempLocs.forEach(working -> { + taskItems.forEach(taskItem -> { + if (taskItem.getMatnrId().equals(working.getMatnrId())) { + Double minQty = taskItem.getAnfme(); + if (!task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)) { + minQty = Math.round((working.getAnfme() - taskItem.getAnfme()) * 10000) / 10000.0; + } + if (minQty.compareTo(0.0) > 0) { + taskItem.setAnfme(minQty); + if (!taskItemService.updateById(taskItem)) { + throw new CoolException("浠诲姟鏄庣粏淇敼澶辫触锛侊紒"); + } + } else { + if (!taskItemService.removeById(taskItem)) { + throw new CoolException("浠诲姟鏄庣粏淇敼澶辫触锛侊紒"); + } + } } - } - if (!locItemWorkingService.updateById(locWorking)) { - throw new CoolException("涓存椂搴撳瓨鏇存柊澶辫触锛侊紒"); - } - taskItems.get(i).setAnfme(locWorking.getAnfme()); - } - if (!taskItemService.updateBatchById(taskItems)) { - throw new CoolException("浠诲姟鏄庣粏鏇存柊澶辫触锛侊紒"); - } - Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc())); - if (Objects.isNull(one)) { + }); + }); + List<Long> matnrIds = taskItems.stream().map(TaskItem::getMatnrId).collect(Collectors.toList()); + //鍒犻櫎涓庝换鍔℃槑缁嗛噸澶嶇殑搴撳瓨淇℃伅锛屼互浠诲姟鏄庣粏涓哄噯 + List<LocItemWorking> itemWorkings = tempLocs.stream() + .filter(working -> !matnrIds.contains(working.getMatnrId())) + .collect(Collectors.toList()); + itemWorkings.forEach(working -> { + TaskItem taskItem = taskItems.stream().findFirst().get(); + taskItem.setMatnrId(working.getMatnrId()) + .setMaktx(working.getMaktx()) + .setMatnrId(working.getMatnrId()) + .setMatnrCode(working.getMatnrCode()) + .setSpec(working.getSpec()) + .setAnfme(working.getAnfme()) + .setBatch(working.getBatch()) + .setFieldsIndex(working.getFieldsIndex()) + .setUnit(working.getUnit()) + .setId(null) + .setModel(working.getModel()); + + if (!taskItemService.saveOrUpdate(taskItem)) { + throw new CoolException("涓存椂搴撳瓨杞换鍔℃槑缁嗗け璐ワ紒锛�"); + } + }); + + locItemWorkingService.remove(new LambdaQueryWrapper<LocItemWorking>().eq(LocItemWorking::getTaskId, task.getId())); + Loc loc1 = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc())); + if (Objects.isNull(loc1)) { throw new CoolException("鐩爣搴撲綅涓嶅瓨鍦紒锛�"); } - one.setUseStatus(LocStsType.LOC_STS_TYPE_S.type); - if (!locService.updateById(one)) { + List<LocItemWorking> workings = new ArrayList<>(); + List<TaskItem> items = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); + items.forEach(taskItem -> { + LocItemWorking itemWorking = new LocItemWorking(); + BeanUtils.copyProperties(taskItem, itemWorking); + itemWorking.setTaskId(task.getId()).setLocId(loc1.getId()).setLocCode(loc1.getCode()); + workings.add(itemWorking); + }); + + if (!locItemWorkingService.saveBatch(workings)) { + throw new CoolException("涓存椂搴撳瓨鏇存柊澶辫触锛侊紒"); + } + + loc1.setUseStatus(LocStsType.LOC_STS_TYPE_S.type); + + if (!locService.updateById(loc1)) { throw new CoolException("搴撲綅棰勭害鍏ュ簱澶辫触锛侊紒"); } return task; @@ -1058,17 +1125,23 @@ throw new CoolException("娉㈡鏄庣粏涓嶅瓨鍦紒锛�"); } try { - saveOutStockItem(maps.get(key), null, waveItem, loginUserId); + saveOutStockItem(maps.get(key), null, waveItem, null, loginUserId); } catch (Exception e) { throw new CoolException(e.getMessage()); } - } else if (task.getResource().equals(TaskResouceType.TASK_RESOUCE_ORDER_TYPE.val)) { - AsnOrderItem orderItem = asnOrderItemService.getById(key); + } else if (task.getResource().equals(TaskResouceType.TASK_RESOUCE_ORDER_TYPE.val) || task.getResource().equals(TaskResouceType.TASK_RESOUCE_CHECK_TYPE.val)) { + WkOrderItem orderItem = new WkOrderItem(); + if (task.getResource().equals(TaskResouceType.TASK_RESOUCE_CHECK_TYPE.val)) { + CheckDiffItem diffItem = checkDiffItemService.getById(key); + } else { + orderItem = asnOrderItemService.getById(key); + + } if (Objects.isNull(orderItem)) { throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�"); } try { - saveOutStockItem(maps.get(key), orderItem, null, loginUserId); + saveOutStockItem(maps.get(key), orderItem, null, null, loginUserId); } catch (Exception e) { throw new CoolException(e.getMessage()); } @@ -1078,7 +1151,7 @@ }); } else { try { - saveOutStockItem(taskItems, null, null, loginUserId); + saveOutStockItem(taskItems, null, null, null, loginUserId); } catch (Exception e) { throw new CoolException(e.getMessage()); } @@ -1125,7 +1198,22 @@ * @version 1.0 */ @Transactional(rollbackFor = Exception.class) - public void saveOutStockItem(List<TaskItem> taskItems, AsnOrderItem orderItem, WaveItem waveItem, Long loginUserId) throws Exception { + public void saveOutStockItem(List<TaskItem> taskItems, CheckDiffItem diffItem, Long loginUserId) { + try { + saveOutStockItem(taskItems, null, null, diffItem, loginUserId); + } catch (Exception e) { + throw new CoolException(e); + } + } + + /** + * @author Ryan + * @date 2025/5/20 + * @description: 鍑哄簱淇℃伅淇濆瓨鑷冲簱瀛樻槑缁嗚〃 + * @version 1.0 + */ + @Transactional(rollbackFor = Exception.class) + public void saveOutStockItem(List<TaskItem> taskItems, WkOrderItem orderItem, WaveItem waveItem, CheckDiffItem diffItem, Long loginUserId) throws Exception { Stock stock = new Stock(); String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null); if (StringUtils.isBlank(ruleCode)) { @@ -1141,9 +1229,12 @@ .setMemo("搴撳瓨鍑哄簱锛屾棤鍗曟嵁淇℃伅锛侊紒") .setType(OrderType.ORDER_OUT.type); } else if (!Objects.isNull(orderItem) && StringUtils.isNotBlank(orderItem.getId() + "")) { - WkOrder wkOrder = asnOrderService.getById(orderItem.getAsnId()); + WkOrder wkOrder = asnOrderService.getById(orderItem.getOrderId()); stock.setWkType(Short.parseShort(wkOrder.getWkType())) .setType(OrderType.ORDER_OUT.type); + } else if (!Objects.isNull(diffItem)) { + stock.setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type)) + .setType(OrderType.ORDER_CHECK.type); } else { //TODO 鐢熸垚娉㈡鏃堕渶瑕佸皢娉㈡鍙峰啓鍏ュ崟鎹紝閫氳繃鐗╂枡锛屾壒娆★紝鍔ㄦ�佸瓧娈电瓑鍞竴鍊煎弽鏌ュ崟鎹俊鎭� stock.setSourceId(waveItem.getId()).setType(OrderType.ORDER_OUT.type); -- Gitblit v1.9.1