From cbdf37567d53de40dfd51eba57aad3cf7095f4fe Mon Sep 17 00:00:00 2001 From: zjj <3272660260@qq.com> Date: 星期二, 29 四月 2025 10:49:59 +0800 Subject: [PATCH] # --- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java | 177 +++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 147 insertions(+), 30 deletions(-) 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 96355b3..f070e5f 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 @@ -6,16 +6,17 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; -import com.vincent.rsf.server.manager.entity.AsnOrder; -import com.vincent.rsf.server.manager.entity.LocItem; -import com.vincent.rsf.server.manager.entity.WaveItem; +import com.vincent.rsf.server.api.entity.enums.TaskStsType; +import com.vincent.rsf.server.api.entity.enums.TaskType; +import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.enums.AsnExceStatus; import com.vincent.rsf.server.manager.enums.WaveExceStatus; import com.vincent.rsf.server.manager.mapper.WaveMapper; -import com.vincent.rsf.server.manager.entity.Wave; import com.vincent.rsf.server.manager.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.server.manager.utils.OptimalAlgorithmUtil; +import com.vincent.rsf.server.system.constant.SerialRuleCode; +import com.vincent.rsf.server.system.utils.SerialRuleUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -24,7 +25,6 @@ import java.util.*; import java.util.stream.Collectors; -import java.util.stream.IntStream; @Service("waveService") public class WaveServiceImpl extends ServiceImpl<WaveMapper, Wave> implements WaveService { @@ -41,9 +41,12 @@ private TaskItemService taskItemService; @Autowired private LocItemService locItemService; + @Autowired + private LocService locService; /** * @param + * @param loginUserId * @return * @author Ryan * @description 娉㈡浠诲姟涓嬪彂 @@ -51,25 +54,24 @@ */ @Override @Transactional(rollbackFor = Exception.class) - public R publicTask(Map<String, Object> map) { - List<WaveItem> itemParams = (List<WaveItem>) map.get("wave"); + public R publicTask(Map<String, Object> map, Long loginUserId) { + List<WaveItem> itemParams = (List<WaveItem>) map.get("waveItem"); if (Objects.isNull(itemParams) || itemParams.isEmpty()) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒"); } - List<Long> ids = itemParams.stream().map(WaveItem::getWaveId).collect(Collectors.toList()); - List<Wave> waves = this.list(new LambdaQueryWrapper<Wave>().in(Wave::getId, ids)); - if (Objects.isNull(waves) || waves.isEmpty()) { + Wave wave = (Wave) map.get("wave"); + Wave waves = this.getById(new LambdaQueryWrapper<Wave>().in(Wave::getId, wave.getId())); + if (Objects.isNull(waves)) { throw new CoolException("娉㈡鏁版嵁涓嶅瓨鍦紒锛�"); } - List<Long> list = waves.stream().map(Wave::getId).collect(Collectors.toList()); + List<Long> list = itemParams.stream().map(WaveItem::getWaveId).collect(Collectors.toList()); List<WaveItem> waveItems = waveItemService.list(new LambdaQueryWrapper<WaveItem>().in(WaveItem::getWaveId, list)); if (waveItems.isEmpty()) { throw new CoolException("娉㈡鏄庣粏涓嶅瓨鍦紒锛�"); } - List<Long> orderIds = waveItems.stream().map(WaveItem::getOrderId).collect(Collectors.toList()); - /**鏌ヨ姣忔潯鏄庣粏鍖归厤鐨勫簱浣�*/ + /**鐢熸垚鍑哄簱浠诲姟*/ try { -// List<WaveItem> items = getLocs(waveItems); + generateOutTask(itemParams, loginUserId, wave); } catch (Exception e) { throw new CoolException("搴撲綅鑾峰彇澶辫触锛侊紒锛�"); } @@ -77,17 +79,130 @@ // 2. 鏍规嵁鐗╂枡SKU瀵绘壘绗﹀悎鐗╂枡搴撲綅 {1. 鏍规嵁鐗╂枡缂栫爜锛屾壒娆★紝鍔ㄦ�佸瓧娈� 鏌ヨ绗﹀悎鐨勫簱浣嶏紝鍐嶆牴鎹簱浣嶄腑鐗╂枡鐨勬暟閲忛�夋嫨鏈�閫傚悎鐨勫簱浣� 2. 鍒ゆ柇褰撳墠璁㈠崟鏄叏鎷栧嚭搴撹繕鏄嫞鏂欏叆搴搣 // 3. 淇敼涓诲崟銆佹尝娆℃墽琛屾暟閲� // 4. 鍒ゆ柇鍏ㄤ粨鍑哄簱鎴栨嫞鏂欏嚭搴� -// List<AsnOrder> orders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, orderIds)); -// /**淇敼鍘熷嚭搴撳崟鐘舵��*/ -// if (!asnOrderService.update(new LambdaQueryWrapper<AsnOrder>() -// .eq(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_WORKING.val) -// .in(AsnOrder::getId, orders))) { -// throw new CoolException("鍑哄簱鍗曟嵁鐘舵�佷慨鏀瑰け璐ワ紒锛�"); -// } -// if (!this.update(new LambdaUpdateWrapper<Wave>().set(Wave::getExceStatus, WaveExceStatus.WAVE_EXCE_STATUS_TASK).in(Wave::getId, ids))) { -// throw new CoolException("娉㈡鐘舵�佷慨鏀瑰け璐ワ紒锛�"); -// } + List<Long> orderIds = waveItems.stream().map(WaveItem::getOrderId).collect(Collectors.toList()); + + List<AsnOrder> orders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, orderIds)); + /**淇敼鍑哄簱鍗曠姸鎬�*/ + if (!asnOrderService.update(new LambdaQueryWrapper<AsnOrder>() + .eq(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_WORKING.val) + .in(AsnOrder::getId, orders))) { + throw new CoolException("鍑哄簱鍗曟嵁鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + /**淇敼娉㈡鍗曟嵁鎵ц鐘舵��*/ + if (!this.update(new LambdaUpdateWrapper<Wave>().set(Wave::getExceStatus, WaveExceStatus.WAVE_EXCE_STATUS_TASK).eq(Wave::getId, wave.getId()))) { + throw new CoolException("娉㈡鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } return R.ok(); + } + + /** + * @param + * @param loginUserId + * @param wave + * @return + * @author Ryan + * @description 鐢熸垚鍑哄簱浠诲姟 + * @time 2025/4/28 14:01 + */ + @Transactional(rollbackFor = Exception.class) + private synchronized 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); + if (locItems.isEmpty()) { + continue; + } + List<Long> list = locItems.stream().map(LocItem::getId).collect(Collectors.toList()); + /**鏍规嵁渚涘簲鍟嗘壒娆★紝鐗╂枡鐮侊紝 鍔ㄦ�佸瓧娈垫煡璇㈡寚瀹氱殑鐗╂枡搴撳瓨淇℃伅*/ + List<LocItem> items = locItemService.list(new LambdaQueryWrapper<LocItem>() + .eq(LocItem::getSplrBatch, param.getSplrBatch()) + .in(LocItem::getLocId, list) + .eq(StringUtils.isNotBlank(param.getFieldsIndex()), LocItem::getFieldsIndex, param.getFieldsIndex()) + .eq(LocItem::getMatnrCode, param.getMatnrCode())); + if (items.isEmpty()) { + throw new CoolException("搴撳瓨淇℃伅鏈夊彉锛岃鍙栨秷褰撳墠娉㈡锛岀敓鏂扮敓鎴愭柊鐨勬尝娆★紒锛�"); + } + /***灏嗘湁璐ф湁鐨勬槑缁嗕俊鎭瓨鏀惧埌搴撲綅淇℃伅涓�*/ + for (int i = 0; i < items.size(); i++) { + items.get(i) + .setWaveId(param.getWaveId()) + .setWaveCode(param.getWaveCode()) + .setWaveItemId(param.getId()); + } + locItemList.addAll(items); + } + if (locItemList.isEmpty()) { + throw new CoolException("娌℃湁鍚堥�傚簱浣嶏紒锛�"); + } + + /**鎷嗗垎娉㈡鏄庣粏搴撲綅闆嗭紝鍚堝苟鐩稿悓搴撲綅锛屽垎瑙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.getWaveItemId()); + if (null == waveItem || 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銆嶆槸鍚﹁缃畬鎴愶紒锛�"); + } + if (Objects.isNull(loc)) { + throw new CoolException("搴撲綅涓嶅瓨鍦紒锛�"); + } + task.setTaskCode(ruleCode) + .setTaskType(TaskType.TASK_TYPE_OUT.type) + .setTaskStatus(TaskStsType.GENERATE_OUT.id) + .setBarcode(loc.getBarcode()) + .setOrgLoc(loc.getCode()) + .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()) + .setId(null) + .setSource(item.getWaveItemId()); + taskItems.add(taskItem); + } + if (!taskItemService.saveBatch(taskItems)) { + throw new CoolException("浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒"); + } + + /**淇敼娉㈡鎵ц鏁伴噺*/ + taskItems.forEach(item -> { + boolean update = waveItemService.update(new LambdaUpdateWrapper<WaveItem>() + .eq(WaveItem::getWaveId, item.getSource()) + .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 (!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("娉㈡涓诲崟淇℃伅淇敼澶辫触锛侊紒"); + } + + }); } /** @@ -129,7 +244,7 @@ //TODO 鏍规嵁鐗╂枡缂栫爜锛屾壒娆★紝鍔ㄦ�佸瓧娈� 鏌ヨ绗﹀悎鐨勫簱浣嶏紝鍐嶆牴鎹簱浣嶄腑鐗╂枡鐨勬暟閲忛�夋嫨鏈�閫傚悎鐨勫簱浣� waveItems.forEach(waveItem -> { List<LocItem> locItems = locItemService.list(new QueryWrapper<LocItem>() - .select("id", "loc_id", "loc_code", "order_id", "SUM(anfme) anfme", "SUM(work_qty) work_qty", "splr_batch", "fields_index", "matnr_code") + .select("id", "loc_id", "loc_code", "order_id", "SUM(anfme) anfme", "SUM(qty) qty", "SUM(work_qty) work_qty", "splr_batch", "fields_index", "matnr_code") .lambda() .eq(LocItem::getMatnrCode, waveItem.getMatnrCode()) .eq(LocItem::getSplrBatch, waveItem.getSplrBatch()) @@ -140,19 +255,21 @@ /**浣跨敤鍥炴函绠楁硶璁$畻锛岃幏鍙栫鍚堝嚭搴撻噺鐨勬渶绠�缁勫悎*/ List<Integer> result = OptimalAlgorithmUtil.findCombination(doubles, waveItem.getAnfme()); + String locs = "[]"; - if (Objects.isNull(result)) { + if (Objects.isNull(result) || result.isEmpty()) { waveItem.setStockLocs(locs).setStockQty(0.0); } else { /**杩囨护闆嗗悎涓渶绠�鐭殑缁勫悎*/ List<LocItem> locsInfo = result.stream() .filter(i -> i >= 0 && i < locItems.size()) .map(locItems::get).collect(Collectors.toList()); + locs = JSONArray.toJSONString(locsInfo); - double sumQty = locItems.stream().mapToDouble(LocItem::getAnfme).sum(); - double surQty = locItems.stream().mapToDouble(LocItem::getWorkQty).sum(); - double qty = locItems.stream().mapToDouble(LocItem::getQty).sum(); - double v = sumQty - surQty - qty; + Double sumQty = locsInfo.stream().mapToDouble(LocItem::getAnfme).sum(); + Double surQty = locsInfo.stream().mapToDouble(LocItem::getWorkQty).sum(); + Double qty = locsInfo.stream().mapToDouble(LocItem::getQty).sum(); + Double v = sumQty - surQty - qty; waveItem.setStockLocs(locs).setStockQty(v); } }); -- Gitblit v1.9.1