From 796103a3913320b81a5769ef3b643109be82b6aa Mon Sep 17 00:00:00 2001 From: Junjie <xjj@123> Date: 星期五, 15 八月 2025 14:49:35 +0800 Subject: [PATCH] #优先整托出库,其次拣选 --- src/main/java/com/zy/asrs/controller/OutController.java | 373 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 362 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/zy/asrs/controller/OutController.java b/src/main/java/com/zy/asrs/controller/OutController.java index f714bab..5cc59ae 100644 --- a/src/main/java/com/zy/asrs/controller/OutController.java +++ b/src/main/java/com/zy/asrs/controller/OutController.java @@ -1,20 +1,29 @@ package com.zy.asrs.controller; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.core.annotations.ManagerAuth; import com.core.common.BaseRes; import com.core.common.Cools; import com.core.common.R; -import com.zy.asrs.entity.LocDetl; -import com.zy.asrs.entity.OrderDetl; -import com.zy.asrs.service.LocDetlService; -import com.zy.asrs.service.OrderDetlService; -import com.zy.asrs.service.OrderService; +import com.zy.asrs.entity.*; +import com.zy.asrs.service.*; +import com.zy.asrs.utils.MatUtils; +import com.zy.common.model.LocDto; +import com.zy.common.model.TaskDto; import com.zy.common.web.BaseController; +import com.zy.system.entity.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.util.List; +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; /** * Created by vincent on 2022/3/26 @@ -23,25 +32,367 @@ @RestController public class OutController extends BaseController { + private static final Logger log = LoggerFactory.getLogger(OutController.class); @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired + private OrderDetlPakoutService orderDetlPakoutService; + @Autowired private LocDetlService locDetlService; + @Autowired + private LocMastService locMastService; + @Autowired + private StaDescService staDescService; + @Autowired + private WorkService workService; + @Autowired + private BasDevpService basDevpService; + + @Resource + private OrderPakoutService orderPakOutService; + + + @PostMapping("/out/pakout/orderDetlIds/auth") + @ManagerAuth + public R pakoutOrderDetlIds(@RequestParam Long orderId) throws InterruptedException { + Thread.sleep(200); + return R.ok().add(orderDetlPakoutService.selectByOrderId(orderId).stream().map(OrderDetlPakout::getId).distinct().collect(Collectors.toList())); + } @PostMapping("/out/pakout/preview/auth") - public R pakoutPreview(@RequestBody List<Long> ids) { + @ManagerAuth + public R pakoutPreview(@RequestBody HashMap<String,Object> param) { + List<Long> ids = (List<Long>) param.get("ids"); if (Cools.isEmpty(ids)) { return R.parse(BaseRes.PARAM); } - List<OrderDetl> orderDetls = orderDetlService.selectBatchIds(ids); - for (OrderDetl orderDetl : orderDetls) { - List<LocDetl> locDetls = locDetlService.queryStock(orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getOrderNo()); + String cstateid = param.getOrDefault("cstateid", "").toString(); + + List<OrderDetlPakout> orderDetlPakouts = orderDetlPakoutService.selectBatchIds(ids); + + if (orderDetlPakouts.size() == 0) { + return R.parse("璁㈠崟鏄庣粏涓虹┖"); } - return R.ok().add(orderDetls); + List<String> disableCstateidList = new ArrayList<>(); + disableCstateidList.add("1001A1100000000H0KJP");//涓嶅悎鏍� + disableCstateidList.add("1001A1100000000LFERA");//寰呭鐞� + List<LocDto> locDtos = new ArrayList<>(); + + Set<String> exist = new HashSet<>(); + + // 鑾峰彇璁㈠崟涓昏〃 + OrderPakout orderPakOut = orderPakOutService.selectByNo(orderDetlPakouts.get(0).getOrderNo()); + // 鐩樼偣鍗曞嚭搴� + if (orderPakOut.getDocType() == 8) { + for (OrderDetlPakout orderDetl : orderDetlPakouts) { + BigDecimal issuedBigDecimal = Optional.of(BigDecimal.valueOf(orderDetl.getAnfme()).subtract(BigDecimal.valueOf(orderDetl.getWorkQty()))).orElse(new BigDecimal(0)); + double issued = issuedBigDecimal.doubleValue(); + if (issued <= 0.0D) { + continue; + } + List<LocDetl> locDetls = locDetlService.queryStockAll(null, exist, orderDetl.getMatnr(), orderDetl.getBatch(), + orderDetl.getBrand(), orderDetl.getStandby1(), orderDetl.getStandby2(), orderDetl.getStandby3(), orderDetl.getBoxType1(), orderDetl.getBoxType2(), orderDetl.getBoxType3(), cstateid); + for (LocDetl locDetl : locDetls) { + if (issued > 0) { + LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(), + issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued); + LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo())); + locDto.setFrozen(locDetl.getFrozen()); + locDto.setFrozenLoc(locMast.getFrozen()); + List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), 107); + locDto.setBrand(orderDetl.getBrand()); + locDto.setStandby1(orderDetl.getStandby1()); + locDto.setStandby2(orderDetl.getStandby2()); + locDto.setStandby3(orderDetl.getStandby3()); + locDto.setBoxType1(orderDetl.getBoxType1()); + locDto.setBoxType2(orderDetl.getBoxType2()); + locDto.setBoxType3(orderDetl.getBoxType3()); + + //璁$畻杈呭崟浣� + Double weight = MatUtils.calcWeight(locDto.getMatnr(), locDto.getAnfme()); + locDto.setWeight(weight); + + locDto.setUnit(orderDetl.getUnit()); + + locDto.setStaNos(staNos); + locDtos.add(locDto); + // 鍓╀綑寰呭嚭鏁伴噺閫掑噺 + issuedBigDecimal = issuedBigDecimal.subtract(BigDecimal.valueOf(locDetl.getAnfme())); + issued = issuedBigDecimal.doubleValue(); + } else { + break; + } + } + if (issued > 0) { + LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued); + locDto.setBrand(orderDetl.getBrand()); + + locDto.setStandby1(orderDetl.getStandby1()); + locDto.setStandby2(orderDetl.getStandby2()); + locDto.setStandby3(orderDetl.getStandby3()); + locDto.setBoxType1(orderDetl.getBoxType1()); + locDto.setBoxType2(orderDetl.getBoxType2()); + locDto.setBoxType3(orderDetl.getBoxType3()); + + //璁$畻杈呭崟浣� + Double weight = MatUtils.calcWeight(locDto.getMatnr(), locDto.getAnfme()); + locDto.setWeight(weight); + + locDto.setUnit(orderDetl.getUnit()); + locDto.setLack(Boolean.TRUE); + locDtos.add(locDto); + } + } + } else { + for (OrderDetlPakout orderDetl : orderDetlPakouts) { + BigDecimal issuedBigDecimal = Optional.of(BigDecimal.valueOf(orderDetl.getAnfme()).subtract(BigDecimal.valueOf(orderDetl.getWorkQty()))).orElse(new BigDecimal(0)); + double issued = issuedBigDecimal.doubleValue(); + if (issued <= 0.0D) { + continue; + } + List<LocDetl> locDetls = locDetlService.queryStockAll(null, exist, orderDetl.getMatnr(), orderDetl.getBatch(), + orderDetl.getBrand(), orderDetl.getStandby1(), orderDetl.getStandby2(), orderDetl.getStandby3(), orderDetl.getBoxType1(), orderDetl.getBoxType2(), orderDetl.getBoxType3(), cstateid); + + HashMap<String, Double> locAnfmeMap = new HashMap<>(); + HashMap<String, List<LocDetl>> map = new HashMap<>(); + for (LocDetl locDetl : locDetls) { + if (map.containsKey(locDetl.getLocNo())) { + List<LocDetl> list = map.get(locDetl.getLocNo()); + list.add(locDetl); + map.put(locDetl.getLocNo(), list); + + Double originAnfme = locAnfmeMap.get(locDetl.getLocNo()); + originAnfme += locDetl.getAnfme(); + locAnfmeMap.put(locDetl.getLocNo(), originAnfme); + }else { + List<LocDetl> list = new ArrayList<>(); + list.add(locDetl); + map.put(locDetl.getLocNo(), list); + locAnfmeMap.put(locDetl.getLocNo(), locDetl.getAnfme()); + } + } + + // 浣跨敤Stream API杩涜鎺掑簭骞跺垱寤烘柊鐨凪ap锛屽悓鏃朵繚鎸佹彃鍏ラ『搴忋�� + Map<String, Double> sortedMap = locAnfmeMap.entrySet().stream() + .sorted(Map.Entry.<String, Double>comparingByValue(Comparator.reverseOrder())) // 鏍规嵁鍊兼帓搴忔潯鐩�� + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); + + //鏈尮閰嶄笂鏁存墭搴撳瓨 + HashMap<String, Double> lessMap = new HashMap<>(); + + List<LocDetl> allLoc = new ArrayList<>(); + List<LocDetl> lessLoc = new ArrayList<>(); + //浼樺厛鎵炬暣鎵� + for (Map.Entry<String, Double> entry : sortedMap.entrySet()) { + if (issued <= 0) { + break; + } + + String locNo = entry.getKey(); + Double anfme = entry.getValue(); + if(anfme > orderDetl.getAnfme()) { + lessMap.put(locNo, anfme); + continue; + } + List<LocDetl> list = map.get(locNo); + allLoc.addAll(list); + + // 鍓╀綑寰呭嚭鏁伴噺閫掑噺 + issuedBigDecimal = issuedBigDecimal.subtract(BigDecimal.valueOf(anfme)); + issued = issuedBigDecimal.doubleValue(); + } + + if(issued > 0) { + //闆舵暎鎼滅储 + for (Map.Entry<String, Double> entry : lessMap.entrySet()) { + if (issued <= 0) { + break; + } + + String locNo = entry.getKey(); + Double anfme = entry.getValue(); + if (anfme >= issued) { + List<LocDetl> list = map.get(locNo); + lessLoc.addAll(list); + // 鍓╀綑寰呭嚭鏁伴噺閫掑噺 + issuedBigDecimal = issuedBigDecimal.subtract(BigDecimal.valueOf(anfme)); + issued = issuedBigDecimal.doubleValue(); + } + } + } + + allLoc.addAll(lessLoc); + issuedBigDecimal = Optional.of(BigDecimal.valueOf(orderDetl.getAnfme()).subtract(BigDecimal.valueOf(orderDetl.getWorkQty()))).orElse(new BigDecimal(0)); + issued = issuedBigDecimal.doubleValue(); + for (LocDetl locDetl : allLoc) { + if (disableCstateidList.contains(locDetl.getCstateid())) { + continue; + } + + if (issued > 0) { + LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(), + issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued); + LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo())); + locDto.setFrozen(locDetl.getFrozen()); + locDto.setFrozenLoc(locMast.getFrozen()); + int ioType = (issued >= locDetl.getAnfme() && locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("loc_no", locDto.getLocNo())) == 1) ? 101 : 103; + List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), ioType); + locDto.setStaNos(staNos); + locDto.setBrand(orderDetl.getBrand()); + + locDto.setStandby1(orderDetl.getStandby1()); + locDto.setStandby2(orderDetl.getStandby2()); + locDto.setStandby3(orderDetl.getStandby3()); + locDto.setBoxType1(orderDetl.getBoxType1()); + locDto.setBoxType2(orderDetl.getBoxType2()); + locDto.setBoxType3(orderDetl.getBoxType3()); + locDto.setUnit(orderDetl.getUnit()); + locDto.setInitialAnfme(locDetl.getAnfme());//鍘熸墭鐩樻暟閲� + locDto.setInitialWeight(locDetl.getWeight());//鍘熸墭鐩樿緟鏁伴噺 + + //璁$畻杈呭崟浣� + Double weight = MatUtils.calcWeight(locDto.getMatnr(), locDto.getAnfme()); + locDto.setWeight(weight); + + locDtos.add(locDto); + exist.add(locDetl.getLocNo()); + // 鍓╀綑寰呭嚭鏁伴噺閫掑噺 + issuedBigDecimal = issuedBigDecimal.subtract(BigDecimal.valueOf(locDetl.getAnfme())); + issued = issuedBigDecimal.doubleValue(); + } else { + break; + } + } + if (issued > 0) { + LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued); + locDto.setBrand(orderDetl.getBrand()); + locDto.setStandby1(orderDetl.getStandby1()); + locDto.setStandby2(orderDetl.getStandby2()); + locDto.setStandby3(orderDetl.getStandby3()); + locDto.setBoxType1(orderDetl.getBoxType1()); + locDto.setBoxType2(orderDetl.getBoxType2()); + locDto.setBoxType3(orderDetl.getBoxType3()); + + //璁$畻杈呭崟浣� + Double weight = MatUtils.calcWeight(locDto.getMatnr(), locDto.getAnfme()); + locDto.setWeight(weight); + + locDto.setUnit(orderDetl.getUnit()); + locDto.setLack(Boolean.TRUE); + locDtos.add(locDto); + } + } + + // 閲嶆柊璁$畻鍑哄簱绔欑偣锛屽彲鑳藉瓨鍦ㄤ竴涓墭鐩樺鏉℃槑缁嗭紝澶氭潯鏄庣粏缁熻涓嬫潵鍙叏鏉垮嚭搴擄紝浣嗗疄闄呯粰鍑虹殑绔欑偣鍙兘鎷i�夊嚭搴� + HashMap<String, Double> locAnfmeMap = new HashMap<>(); + for (LocDto locDto : locDtos) { + if(locAnfmeMap.containsKey(locDto.getLocNo())) { + Double anfme = locAnfmeMap.get(locDto.getLocNo()); + BigDecimal decimal = BigDecimal.valueOf(locDto.getAnfme()).add(BigDecimal.valueOf(anfme)); + locAnfmeMap.put(locDto.getLocNo(), decimal.doubleValue()); + }else { + locAnfmeMap.put(locDto.getLocNo(), locDto.getAnfme()); + } + } + + HashMap<String, List<Integer>> locStaNosMap = new HashMap<>(); + for (Map.Entry<String, Double> entry : locAnfmeMap.entrySet()) { + String locNo = entry.getKey(); + Double realAnfme = entry.getValue(); + + double stockAnfme = 0D; + List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", locNo)); + for (LocDetl locDetl : locDetls) { + BigDecimal decimal = BigDecimal.valueOf(stockAnfme).add(BigDecimal.valueOf(locDetl.getAnfme())); + stockAnfme = decimal.doubleValue(); + } + + int ioType = 103; + if(stockAnfme == realAnfme) { + ioType = 101; + } + + List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locNo, ioType); + User user = null; + try { + user = getUser(); + } catch (Exception e) { + + } + if(user != null) { + Integer defaultOutSta = user.getDefaultOutSta(); + if(defaultOutSta != null) { + if (staNos.contains(defaultOutSta)) { + staNos.remove(defaultOutSta); + staNos.add(0, defaultOutSta); + } + } + } + + locStaNosMap.put(locNo, staNos); + } + + for (LocDto locDto : locDtos) { + List<Integer> staNos = locStaNosMap.get(locDto.getLocNo()); + locDto.setStaNos(staNos); + } + } + + return R.ok().add(locDtos); + } + + @PostMapping("/out/pakout/auth") + @ManagerAuth(memo = "璁㈠崟鍑哄簱") + public synchronized R pakout(@RequestBody List<LocDto> locDtos) throws InterruptedException { + if (Cools.isEmpty(locDtos)) { + return R.parse(BaseRes.PARAM); + } + List<LocDto> locDtoArrayList = new ArrayList<>(); + for (LocDto locDto : locDtos){ + if (locDto.getFrozen()!=1 && locDto.getFrozenLoc()!=1){ + locDtoArrayList.add(locDto); + } + } + locDtos = locDtoArrayList; + if (Cools.isEmpty(locDtos)) { + return R.parse("搴撳瓨/搴撲綅琚喕缁擄紝璇峰鐞嗗悗鍑哄簱锛侊紒锛�"); + } + boolean lack = true; + for (LocDto locDto : locDtos) { + if (!locDto.isLack()) { + lack = false; + break; + } + } + if (lack) { + return R.error("搴撳瓨涓嶈冻"); + } + + Thread.sleep(1000L); + + List<TaskDto> taskDtos = new ArrayList<>(); + // 鏍规嵁 锛堝簱浣� & 鍑哄簱绔欙級 鍒嗙粍锛� 鐞嗘兂鐘舵�侊細涓�缁勪负涓�娆″嚭搴撲换鍔� + for (LocDto locDto : locDtos) { + if (locDto.isLack()) { continue; } + TaskDto taskDto = new TaskDto(locDto.getLocNo(), locDto.getStaNo(), locDto); + if (TaskDto.has(taskDtos, taskDto)) { + TaskDto dto = TaskDto.find(taskDtos, taskDto); + assert dto != null; + dto.getLocDtos().addAll(taskDto.getLocDtos()); + } else { + taskDtos.add(taskDto); + } + } + // ----------------------------------------------------------------------------------------------- + for (TaskDto taskDto : taskDtos) { + BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo()); + workService.stockOut(staNo, taskDto, getUserId()); + } + return R.ok(); } } -- Gitblit v1.9.1