From fabc045268d2fe29ca8b0f25093b9429d5818d22 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期三, 25 六月 2025 19:23:43 +0800 Subject: [PATCH] 出库生成任务优化 --- rsf-admin/src/page/orders/outStock/OutOrderItemList.jsx | 1 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java | 4 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java | 26 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java | 163 +++++++++------------- rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WaveToLocParams.java | 47 ++++++ rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java | 6 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskStsType.java | 4 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskResouceType.java | 4 rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java | 108 ++++++++++++++- rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/OrderOutItemDto.java | 4 rsf-admin/.env | 2 11 files changed, 251 insertions(+), 118 deletions(-) diff --git a/rsf-admin/.env b/rsf-admin/.env index 8d41162..015a76d 100644 --- a/rsf-admin/.env +++ b/rsf-admin/.env @@ -1,3 +1,3 @@ -VITE_BASE_IP=192.168.4.16 +VITE_BASE_IP=192.168.4.41 # VITE_BASE_IP=47.76.147.249 VITE_BASE_PORT=8080 diff --git a/rsf-admin/src/page/orders/outStock/OutOrderItemList.jsx b/rsf-admin/src/page/orders/outStock/OutOrderItemList.jsx index 8095542..21579c4 100644 --- a/rsf-admin/src/page/orders/outStock/OutOrderItemList.jsx +++ b/rsf-admin/src/page/orders/outStock/OutOrderItemList.jsx @@ -143,6 +143,7 @@ <NumberField source="workQty" label="table.field.outStockItem.workQty" /> <NumberField source="qty" label="table.field.outStockItem.qty" /> <TextField source="stockUnit" label="table.field.outStockItem.stockUnit" /> + <TextField source="splrBatch" label="table.field.outStockItem.splrBatch" /> <TextField source="purUnit" label="table.field.outStockItem.purUnit" /> <TextField source="splrCode" label="table.field.outStockItem.splrCode" /> <TextField source="splrName" label="table.field.outStockItem.splrName" /> diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java index 406e377..8b6e00e 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java @@ -108,6 +108,12 @@ public static final String TASK_TYPE_ORDER_OUT_STOCK = "OrderOutStock"; /** + * 娉㈡鍑哄簱 + */ + public static final String TASK_TYPE_WAVE_OUT_STOCK = "WaveOutStock"; + + + /** * 鎷f枡鍑哄簱 */ public static final String TASK_TYPE_OUT_PICK = "pick"; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/OrderOutItemDto.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/OrderOutItemDto.java index 17feb1e..e826316 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/OrderOutItemDto.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/OrderOutItemDto.java @@ -21,6 +21,10 @@ private String siteNo; + private String sourceId; + + private String source; + @Data public static class staListDto{ private String staNo; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WaveToLocParams.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WaveToLocParams.java new file mode 100644 index 0000000..b7af7c0 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WaveToLocParams.java @@ -0,0 +1,47 @@ +package com.vincent.rsf.server.manager.controller.params; + + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** +* @author Ryan +* @description +* @param +* @return +* @time 2025/6/25 11:20 +*/ +@Data +@Accessors(chain = true) +public class WaveToLocParams implements Serializable { + + @ApiModelProperty("鏁伴噺") + private Double anfme; + + @ApiModelProperty("鐗╂枡缂栫爜") + private String matnrCode; + + @ApiModelProperty("鎵规") + private String batch; + + @ApiModelProperty("鍔ㄦ�佸瓧娈电储寮�") + private String fieldsIndex; + + @ApiModelProperty("鐗╂枡鍚嶇О") + private String maktx; + + @ApiModelProperty("鎵ц鏁伴噺") + private Double workQty; + + @ApiModelProperty("鍗曚綅") + private String unit; + + @ApiModelProperty("娉㈡鏄庣粏ID") + private Long itemId; + + @ApiModelProperty("娉㈡鍗旾D") + private Long waveId; +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskResouceType.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskResouceType.java index 9915624..6ca114b 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskResouceType.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskResouceType.java @@ -6,11 +6,11 @@ public enum TaskResouceType { //璁㈠崟绫诲瀷 - TASK_RESOUCE_WAVE_TYPE("1", "娉㈡浠诲姟"), + TASK_RESOUCE_WAVE_TYPE("1", "娉㈡鍑哄簱浠诲姟"), TASK_RESOUCE_STOCK_TYPE("2", "搴撳瓨鍑哄簱浠诲姟"), - TASK_RESOUCE_PAKIN_TYPE("3", "缁勬嫋浠诲姟"), + TASK_RESOUCE_PAKIN_TYPE("3", "缁勬嫋鍏ュ簱浠诲姟"), TASK_RESOUCE_ORDER_TYPE("4", "鍗曟嵁鍑哄簱浠诲姟"), diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskStsType.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskStsType.java index b0db724..c337507 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskStsType.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskStsType.java @@ -39,10 +39,10 @@ GENERATE_WAVE_SEED("197", "绛夊緟瀹瑰櫒鍒拌揪"), - WAVE_SEED("199", "鎾涓�/鐩樼偣涓�"), - COMPLETE_OUT("198", "鍑哄簱瀹屾垚"), + WAVE_SEED("199", "鎾涓�/鐩樼偣涓�/寰呯‘璁�"), + UPDATED_OUT("200", "搴撳瓨鏇存柊瀹屾垚"), ; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java index 36d255b..5ad2d1d 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java @@ -46,6 +46,8 @@ private WcsService wcsService; @Autowired private OutStockService outStockService; + @Autowired + private WaveService waveService; /** @@ -72,9 +74,17 @@ List<LocItem> items = map.getItems(); Map<Long, List<LocItem>> listMap = items.stream().collect(Collectors.groupingBy(LocItem::getLocId)); AsnOrder order; + Wave wave; if (!Objects.isNull(map.getSourceId())) { - order = outStockService.getById(map.getSourceId()); + if (map.getType().equals(Constants.TASK_TYPE_WAVE_OUT_STOCK)) { + order = new AsnOrder(); + wave = waveService.getById(map.getSourceId()); + } else { + wave = new Wave(); + order = outStockService.getById(map.getSourceId()); + } } else { + wave = new Wave(); order = new AsnOrder(); } @@ -117,9 +127,11 @@ List<LocItem> locItemList = listMap.get(key); Double outQty = locItemList.stream().mapToDouble(LocItem::getOutQty).sum(); - if (map.getType().equals(Constants.TASK_TYPE_OUT_STOCK) || map.getType().equals(Constants.TASK_TYPE_ORDER_OUT_STOCK)) { + if (map.getType().equals(Constants.TASK_TYPE_OUT_STOCK) + || map.getType().equals(Constants.TASK_TYPE_ORDER_OUT_STOCK) + || map.getType().equals(Constants.TASK_TYPE_WAVE_OUT_STOCK)) { if (orgQty.compareTo(outQty) > 0) { - //鎷f枡鍑哄簱 + //鎷f枡鍑哄簱 -- 鐩樼偣鍑哄簱 DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>() .eq(DeviceSite::getSite, siteNo) .eq(DeviceSite::getChannel, loc.getChannel()) @@ -199,14 +211,16 @@ .setCreateBy(loginUserId) .setCreateTime(new Date()) .setUpdateTime(new Date()) - .setOrderType(OrderType.ORDER_OUT.type) - .setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type)); + .setOrderType(OrderType.ORDER_OUT.type); if (map.getType().equals(Constants.TASK_TYPE_ORDER_OUT_STOCK)) { taskItem.setWkType(Short.parseShort(order.getWkType())) .setSourceCode(order.getCode()) .setSourceId(order.getId()); + } else if (map.getType().equals(Constants.TASK_TYPE_WAVE_OUT_STOCK)) { + taskItem.setSourceId(wave.getId()).setSourceCode(wave.getCode()); } else if (map.getType().equals(Constants.TASK_TYPE_OUT_CHECK) || map.getType().equals(Constants.TASK_TYPE_OUT_STOCK)) { - taskItem.setSource(item.getId()) + taskItem.setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type)) + .setSource(item.getId()) .setSourceId(item.getLocId()) .setSourceCode(item.getLocCode()); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java index 62c4b3e..4797899 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java @@ -414,7 +414,8 @@ if (Cools.isEmpty(param.getOrderId())) { throw new CoolException("鍗曟嵁ID涓虹┖"); } - WaveRule waveRule = waveRuleService.getOne(new LambdaQueryWrapper<WaveRule>().eq(WaveRule::getId, param.getWaveId())); + WaveRule waveRule = waveRuleService.getOne(new LambdaQueryWrapper<WaveRule>() + .eq(WaveRule::getId, param.getWaveId())); if (Cools.isEmpty(waveRule)) { throw new CoolException("鏈壘鍒板綋鍓嶇瓥鐣�"); } @@ -573,7 +574,6 @@ .eq(AsnOrderItem::getAsnId, orderId)); List<OrderOutItemDto> list = new ArrayList<>(); Set<ExistDto> existDtos = new HashSet<>(); - for (AsnOrderItem asnOrderItem : asnOrderItems) { BigDecimal issued = new BigDecimal(asnOrderItem.getAnfme().toString()) .subtract(new BigDecimal(asnOrderItem.getWorkQty().toString()) diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java index 0b07961..ed1130d 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java @@ -5,9 +5,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.common.constant.Constants; +import com.vincent.rsf.server.manager.controller.dto.OrderOutItemDto; +import com.vincent.rsf.server.manager.controller.params.LocToTaskParams; +import com.vincent.rsf.server.manager.controller.params.WaveToLocParams; import com.vincent.rsf.server.manager.enums.*; import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.mapper.WaveMapper; @@ -48,6 +52,10 @@ private LocService locService; @Autowired private OutStockService outStockService; + @Autowired + private WaveService waveService; + @Autowired + private WaveRuleServiceImpl waveRuleService; /** * @param @@ -77,7 +85,17 @@ } /**鐢熸垚鍑哄簱浠诲姟*/ try { - generateOutTask(waveItems, loginUserId, waves); + List<WaveToLocParams> params = new ArrayList<>(); + for (WaveItem item : waveItems) { + WaveToLocParams locParams = new WaveToLocParams(); + BeanUtils.copyProperties(item, locParams); + locParams.setBatch(item.getSplrBatch()) + .setItemId(item.getId()) + .setWaveId(item.getWaveId()); + params.add(locParams); + } + List<OrderOutItemDto> results = LocManageUtil.getOutOrderList(params, null); + generateOutTask(results, loginUserId, waves); } catch (Exception e) { log.error(e.getMessage()); throw new CoolException("鍑哄簱浠诲姟鐢熸垚澶辫触锛侊紒锛�"); @@ -119,13 +137,26 @@ throw new CoolException("娉㈡鏄庣粏涓嶅瓨鍦紒锛�"); } - for (int i = 0; i < items.size(); i++) { - List<LocItem> locItems = LocManageUtil.getEfficiencyFirstItemList(items.get(i).getMatnrCode(), items.get(i).getSplrBatch(), items.get(i).getAnfme()); - items.get(i).setStockLocs(JSONArray.toJSONString(locItems)).setStockQty(items.get(i).getAnfme()); + WaveRule waveRule = waveRuleService.getOne(new LambdaQueryWrapper<WaveRule>() + .eq(WaveRule::getType, WaveRuleType.First_In_First_Out.type)); + if (Cools.isEmpty(waveRule)) { + throw new CoolException("鏈壘鍒板綋鍓嶇瓥鐣�"); } + + List<WaveToLocParams> params = new ArrayList<>(); + for (WaveItem item : items) { + WaveToLocParams locParams = new WaveToLocParams(); + BeanUtils.copyProperties(item, locParams); + locParams.setBatch(item.getSplrBatch()) + .setItemId(item.getId()) + .setWaveId(item.getWaveId()); + params.add(locParams); + } + List<OrderOutItemDto> results = LocManageUtil.getOutOrderList(params, waveRule); + /**鐢熸垚鍑哄簱浠诲姟*/ try { - generateOutTask(items, loginUserId, waves); + generateOutTask(results, loginUserId, waves); } catch (Exception e) { log.error("UNK", e); throw new CoolException(e.getMessage()); @@ -151,102 +182,42 @@ */ @Synchronized @Transactional(rollbackFor = Exception.class) - public void generateOutTask(List<WaveItem> itemParams, Long loginUserId, Wave wave) throws Exception { - List<LocItem> locItemList = new ArrayList<>(); - for (WaveItem param : itemParams) { - String locs = param.getStockLocs(); - List<LocItem> locItems = JSONArray.parseArray(locs, LocItem.class); - /***灏嗘湁璐ф湁鐨勬槑缁嗕俊鎭瓨鏀惧埌搴撲綅淇℃伅涓�*/ - for (int i = 0; i < locItems.size(); i++) { - locItems.get(i) - .setSourceId(param.getWaveId()) - .setSourceCode(param.getWaveCode()) - .setSource(param.getId()); - } - locItemList.addAll(locItems); - } - if (locItemList.isEmpty()) { - throw new CoolException("娌℃湁鍚堥�傚簱浣嶏紒锛�"); - } + public void generateOutTask(List<OrderOutItemDto> itemParams, Long loginUserId, Wave wave) throws Exception { - /**鎷嗗垎娉㈡鏄庣粏搴撲綅闆嗭紝鍚堝苟鐩稿悓搴撲綅锛屽垎瑙d换鍔℃槑缁�*/ - Map<Long, List<LocItem>> listMap = locItemList.stream().collect(Collectors.groupingBy(LocItem::getLocId)); - /**鏍规嵁搴撲綅姹囨�讳俊鎭紝鐢熸垚浠诲姟鏄庣粏**/ - listMap.keySet().forEach(key -> { - List<LocItem> locItems = listMap.get(key); - LocItem item1 = locItems.stream().findFirst().get(); - WaveItem waveItem = waveItemService.getById(item1.getSource()); - if (Objects.isNull(waveItem)) { - throw new CoolException("鏁版嵁閿欒锛氭尝娆℃槑缁嗕笉瀛樺湪锛侊紒"); - } - //TODO 褰撳墠浠诲姟瀹屾垚鍚庯紝閫氳繃瀹氭椂浜嬩欢鍒ゆ柇鏄叏鐩樺嚭搴擄紝杩樻槸鎷f枡鍐嶅叆搴� - Loc loc = locService.getById(key); - Task task = new Task(); - String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null); - if (StringUtils.isBlank(ruleCode)) { - throw new CoolException("缂栫爜瑙勫垯閿欒锛氳妫�鏌ャ�孲YS_TASK_CODE銆嶆槸鍚﹁缃畬鎴愶紒锛�"); - } + for (OrderOutItemDto itemDto : itemParams) { + LocToTaskParams taskParams = new LocToTaskParams(); + Loc loc = locService.getById(itemDto.getLocId()); if (Objects.isNull(loc)) { - throw new CoolException("搴撲綅涓嶅瓨鍦紒锛�"); + continue; } + taskParams.setItems(Arrays.asList(itemDto.getLocItem())) + .setSiteNo(itemDto.getSiteNo()) + .setType(Constants.TASK_TYPE_WAVE_OUT_STOCK) + .setSourceId(wave.getId()) + .setTarLoc(loc.getCode()); + locItemService.generateTask(TaskResouceType.TASK_RESOUCE_WAVE_TYPE.val, taskParams, loginUserId); + } -// List<TaskItem> items = taskItemService.list(new LambdaQueryWrapper<TaskItem>().in(TaskItem::getSourceId, wave.getId())); -// if (!items.isEmpty()) { -// throw new CoolException("娉㈡浠诲姟宸茬敓鎴愶紝涓嶈兘閲嶅鐢熸垚锛侊紒"); +// /**淇敼娉㈡鎵ц鏁伴噺*/ +// taskItems.forEach(item -> { +// boolean update = waveItemService.update(new LambdaUpdateWrapper<WaveItem>() +// .eq(WaveItem::getId, item.getSource()) +// .set(WaveItem::getExceStatus, WaveItemExceStatus.WAVE_EXCE_STATUS_SEED.val) +// .set(WaveItem::getWorkQty, item.getAnfme())); +// if (!update) { +// throw new CoolException("娉㈡鎵ц鏁伴噺淇敼澶辫触锛侊紒"); +// } +// }); +// +// List<WaveItem> waveItems = waveItemService.list(new LambdaQueryWrapper<WaveItem>().eq(WaveItem::getWaveId, wave.getId())); +// double sum = waveItems.stream().mapToDouble(WaveItem::getWorkQty).sum(); +// /**娉㈡涓诲崟淇℃伅淇敼*/ +// if (!this.update(new LambdaUpdateWrapper<Wave>() +// .eq(Wave::getId, wave.getId()) +// .set(Wave::getWorkQty, sum) +// .set(Wave::getExceStatus, WaveExceStatus.WAVE_EXCE_STATUS_TASK.val))) { +// throw new CoolException("娉㈡涓诲崟淇℃伅淇敼澶辫触锛侊紒"); // } - task.setTaskCode(ruleCode) - .setTaskType(TaskType.TASK_TYPE_OUT.type) - .setTaskStatus(TaskStsType.GENERATE_OUT.id) - .setResource(TaskResouceType.TASK_RESOUCE_WAVE_TYPE.val) - .setBarcode(loc.getBarcode()) - .setOrgLoc(loc.getCode()) - .setSort(Constants.TASK_SORT_DEFAULT_VALUE) - .setCreateBy(loginUserId) - .setUpdateBy(loginUserId) - .setTargSite(wave.getTargSite()); - - if (!taskService.save(task)) { - throw new CoolException("浠诲姟鐢熸垚澶辫触锛侊紒"); - } - List<TaskItem> taskItems = new ArrayList<>(); - /**鐢熸垚浠诲姟鏄庣粏淇℃伅*/ - for (LocItem item : locItems) { - TaskItem taskItem = new TaskItem(); - BeanUtils.copyProperties(item, taskItem); - taskItem.setTaskId(task.getId()) - .setAnfme(item.getAnfme()) - .setId(null) - .setSourceCode(wave.getCode()) - .setSourceId(wave.getId()) - .setSource(item.getSource()); - taskItems.add(taskItem); - } - if (!taskItemService.saveBatch(taskItems)) { - throw new CoolException("浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒"); - } - - /**淇敼娉㈡鎵ц鏁伴噺*/ - taskItems.forEach(item -> { - boolean update = waveItemService.update(new LambdaUpdateWrapper<WaveItem>() - .eq(WaveItem::getId, item.getSource()) - .set(WaveItem::getExceStatus, WaveItemExceStatus.WAVE_EXCE_STATUS_SEED.val) - .set(WaveItem::getWorkQty, item.getAnfme())); - if (!update) { - throw new CoolException("娉㈡鎵ц鏁伴噺淇敼澶辫触锛侊紒"); - } - }); - - List<WaveItem> waveItems = waveItemService.list(new LambdaQueryWrapper<WaveItem>().eq(WaveItem::getWaveId, wave.getId())); - double sum = waveItems.stream().mapToDouble(WaveItem::getWorkQty).sum(); - /**娉㈡涓诲崟淇℃伅淇敼*/ - if (!this.update(new LambdaUpdateWrapper<Wave>() - .eq(Wave::getId, wave.getId()) - .set(Wave::getWorkQty, sum) - .set(Wave::getExceStatus, WaveExceStatus.WAVE_EXCE_STATUS_TASK.val))) { - throw new CoolException("娉㈡涓诲崟淇℃伅淇敼澶辫触锛侊紒"); - } - - }); } /** diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java index a016244..ed0b31d 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java @@ -3,17 +3,18 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.common.SpringUtils; import com.vincent.rsf.server.api.utils.LocUtils; -import com.vincent.rsf.server.manager.entity.DeviceSite; -import com.vincent.rsf.server.manager.entity.Loc; -import com.vincent.rsf.server.manager.entity.LocItem; -import com.vincent.rsf.server.manager.service.DeviceSiteService; -import com.vincent.rsf.server.manager.service.LocItemService; -import com.vincent.rsf.server.manager.service.LocService; +import com.vincent.rsf.server.manager.controller.dto.ExistDto; +import com.vincent.rsf.server.manager.controller.dto.OrderOutItemDto; +import com.vincent.rsf.server.manager.controller.params.WaveToLocParams; +import com.vincent.rsf.server.manager.entity.*; +import com.vincent.rsf.server.manager.enums.TaskType; +import com.vincent.rsf.server.manager.enums.WaveRuleType; +import com.vincent.rsf.server.manager.service.*; import com.vincent.rsf.server.manager.enums.LocStsType; -import java.util.Comparator; -import java.util.List; -import java.util.Objects; +import javax.swing.*; +import java.math.BigDecimal; +import java.util.*; import java.util.stream.Collectors; public class LocManageUtil { @@ -110,6 +111,95 @@ return locItems; } + /** + * 鑾峰彇鍑哄簱搴撲綅淇℃伅 + * @param params + * @param waveRule + * @return + */ + public static List<OrderOutItemDto> getOutOrderList(List<WaveToLocParams> params, WaveRule waveRule) { + LocService locService = SpringUtils.getBean(LocService.class); + LocItemService locItemService = SpringUtils.getBean(LocItemService.class); + DeviceSiteService deviceSiteService = SpringUtils.getBean(DeviceSiteService.class); + List<OrderOutItemDto> list = new ArrayList<>(); + Set<ExistDto> existDtos = new HashSet<>(); + for (WaveToLocParams item : params) { + BigDecimal issued = new BigDecimal(item.getAnfme().toString()) + .subtract(new BigDecimal(item.getWorkQty().toString())); + if (issued.doubleValue() <= 0) { + continue; + } + List<LocItem> locItems; + if (Objects.isNull(waveRule)) { + locItems = LocManageUtil.getFirstInFirstOutItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme()); + } else { + if (WaveRuleType.Efficiency_First.type.equals(waveRule.getType())) { + locItems = LocManageUtil.getEfficiencyFirstItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme()); + } else if (WaveRuleType.First_In_First_Out.type.equals(waveRule.getType())) { + locItems = LocManageUtil.getFirstInFirstOutItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme()); + } else { + locItems = LocManageUtil.getFirstInFirstOutItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme()); + } + } + + for (LocItem locItem : locItems) { + Loc loc = locService.getById(locItem.getLocId()); + List<LocItem> itemList = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocCode, locItem.getLocCode())); + if (issued.doubleValue() > 0) { + ExistDto existDto = new ExistDto().setBatch(locItem.getBatch()).setMatnr(locItem.getMatnrCode()).setLocNo(locItem.getLocCode()); + if (existDtos.add(existDto)) { + locItem.setOutQty(issued.doubleValue() >= locItem.getAnfme() ? locItem.getAnfme() : issued.doubleValue()); + locItem.setBarcode(loc.getBarcode()) + .setSourceId(item.getWaveId()) + .setSource(item.getItemId()); + OrderOutItemDto orderOutItemDto = new OrderOutItemDto(); + orderOutItemDto.setLocItem(locItem); + + List<DeviceSite> deviceSites = deviceSiteService.list(new LambdaQueryWrapper<DeviceSite>() + .eq(DeviceSite::getChannel, loc.getChannel()) + .eq(DeviceSite::getType, issued.doubleValue() >= locItem.getAnfme() && itemList.size() == 1 ? TaskType.TASK_TYPE_OUT.type : TaskType.TASK_TYPE_PICK_AGAIN_OUT.type) + ); + + if (!deviceSites.isEmpty()) { + List<OrderOutItemDto.staListDto> maps = new ArrayList<>(); + for (DeviceSite sta : deviceSites) { + OrderOutItemDto.staListDto staListDto = new OrderOutItemDto.staListDto(); + staListDto.setStaNo(sta.getSite()); + staListDto.setStaName(sta.getSite()); + maps.add(staListDto); + } + orderOutItemDto.setStaNos(maps); + //榛樿鑾峰彇绗竴绔欑偣 + DeviceSite deviceSite = deviceSites.stream().findFirst().get(); + orderOutItemDto.setSiteNo(deviceSite.getSite()); + } + + orderOutItemDto.setSource(item.getItemId()).setSource(item.getWaveId()); + + list.add(orderOutItemDto); + + issued = issued.subtract(new BigDecimal(locItem.getAnfme().toString())); + } + } + } +// if (issued.doubleValue() > 0) { +// LocItem locItem = new LocItem() +// .setId(new Random().nextLong()) +// .setMatnrCode(item.getMatnrCode()) +// .setMaktx(item.getMaktx()) +// .setAnfme(0.00) +// .setWorkQty(issued.doubleValue()) +// .setOutQty(issued.doubleValue()) +// .setUnit(item.getUnit()) +// .setBatch(item.getBatch()); +// OrderOutItemDto orderOutItemDto = new OrderOutItemDto(); +// orderOutItemDto.setLocItem(locItem); +// list.add(orderOutItemDto); +// } + } + + return list; + } } -- Gitblit v1.9.1