From 6cfcb307f01b9550b6cd67321f2c1db345b4da19 Mon Sep 17 00:00:00 2001 From: zhangc <zc@123> Date: 星期一, 13 一月 2025 16:07:21 +0800 Subject: [PATCH] 优化自动移库逻辑及调拨信息上报 --- src/main/java/com/zy/asrs/task/handler/AutoReplenishmentHandler.java | 312 ++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 265 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/zy/asrs/task/handler/AutoReplenishmentHandler.java b/src/main/java/com/zy/asrs/task/handler/AutoReplenishmentHandler.java index 2a9cb89..451c395 100644 --- a/src/main/java/com/zy/asrs/task/handler/AutoReplenishmentHandler.java +++ b/src/main/java/com/zy/asrs/task/handler/AutoReplenishmentHandler.java @@ -1,24 +1,24 @@ package com.zy.asrs.task.handler; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.core.common.Cools; +import com.core.common.DateUtils; +import com.core.common.SnowflakeIdWorker; import com.core.exception.CoolException; -import com.zy.asrs.entity.LocDetl; -import com.zy.asrs.entity.LocMast; -import com.zy.asrs.entity.Order; -import com.zy.asrs.entity.OrderDetl; -import com.zy.asrs.service.LocDetlService; -import com.zy.asrs.service.LocMastService; -import com.zy.asrs.service.OrderDetlService; -import com.zy.asrs.service.WorkService; +import com.zy.asrs.entity.*; +import com.zy.asrs.service.*; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; +import com.zy.asrs.utils.Utils; +import com.zy.common.model.enums.WorkNoType; +import com.zy.common.service.CommonService; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; @Service public class AutoReplenishmentHandler extends AbstractHandler<String> { @@ -29,71 +29,289 @@ private LocDetlService locDetlService; @Autowired private LocMastService locMastService; + @Autowired - private WorkService workService; + private AgvLocMastService agvLocMastService; + @Autowired + private CommonService commonService; + @Autowired + private WrkMastService wrkMastService; + @Autowired + private WrkDetlService wrkDetlService; + @Autowired + private OrderService orderService; + @Autowired + private SnowflakeIdWorker snowflakeIdWorker; + @Transactional - public ReturnT<String> start(Order order) { + public ReturnT<String> create(Mat mat, double anfme) { + //鍒涘缓涓�涓柊鐨勮嚜鍔ㄨˉ璐у崟鎹� + Order order = createOrder(); + orderService.insert(order); + OrderDetl orderDetl = createOrderDetl(order); + orderDetl.setMatnr(mat.getMatnr()); + orderDetl.setMaktx(mat.getMaktx()); + orderDetl.setSpecs(mat.getSpecs()); + orderDetl.setAnfme(anfme); + orderDetl.setQty(0.0); - Set<String> locNos = pakoutLoc(order); - for (String locNo : locNos){ - LocMast locMast = locMastService.selectByLoc(locNo); - if(!"F".equals(locMast.getLocSts())){ - throw new CoolException("搴撲綅鐘舵�佸凡鍙樻洿"); - } - //鐢熸垚宸ヤ綔妗� - //鐢熸垚宸ヤ綔妗f槑缁� - //淇敼搴撲綅鐘舵�� - } - + orderDetlService.insert(orderDetl); return SUCCESS; } - private Set<String> pakoutLoc(Order order){ + @Transactional + public ReturnT<String> start(Order order) { + Date now = new Date(); + + Set<String> locNos = pakoutLoc(order); + for (String locNo : locNos) { + LocMast locMast = locMastService.selectByLoc(locNo); + if (!"F".equals(locMast.getLocSts())) { + throw new CoolException("搴撲綅鐘舵�佸凡鍙樻洿"); + } + //鐢熸垚宸ヤ綔妗� + WrkMast wrkMast = createWrkMast(locNo, locMast.getBarcode(), now); + //鐢熸垚宸ヤ綔妗f槑缁� + List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo); + createWrkDetl(locDetls, wrkMast, order.getOrderNo(), now); + //淇敼搴撲綅鐘舵�� + locMast.setLocSts("R"); + locMastService.updateByLocNo(locMast); + } + order.setSettle(2L); + orderService.updateById(order); + + return SUCCESS; + } + + private Order createOrder() { + Date now = new Date(); + return new Order( + String.valueOf(snowflakeIdWorker.nextId()), // 缂栧彿[闈炵┖] + "AUTO" + snowflakeIdWorker.nextId(), // 璁㈠崟缂栧彿 + DateUtils.convert(now), // 鍗曟嵁鏃ユ湡 + 21L, // 鍗曟嵁绫诲瀷 21.鑷姩琛ヨ揣鍗� + null, // 椤圭洰缂栧彿 + null, // + null, // 璋冩嫧椤圭洰缂栧彿 + null, // 鍒濆绁ㄦ嵁鍙� + null, // 绁ㄦ嵁鍙� + null, // 瀹㈡埛缂栧彿 + null, // 瀹㈡埛 + null, // 鑱旂郴鏂瑰紡 + null, // 鎿嶄綔浜哄憳 + null, // 鍚堣閲戦 + null, // 浼樻儬鐜� + null, // 浼樻儬閲戦 + null, // 閿�鍞垨閲囪喘璐圭敤鍚堣 + null, // 瀹炰粯閲戦 + null, // 浠樻绫诲瀷 + null, // 涓氬姟鍛� + null, // 缁撶畻澶╂暟 + null, // 閭垂鏀粯绫诲瀷 + null, // 閭垂 + null, // 浠樻鏃堕棿 + null, // 鍙戣揣鏃堕棿 + null, // 鐗╂祦鍚嶇О + null, // 鐗╂祦鍗曞彿 + 1L, // 璁㈠崟鐘舵�� + 1, // 鐘舵�� + 9999L, // 娣诲姞浜哄憳 + now, // 娣诲姞鏃堕棿 + 9999L, // 淇敼浜哄憳 + now, // 淇敼鏃堕棿 + null // 澶囨敞 + ); + + } + + private OrderDetl createOrderDetl(Order order) { + Date now = new Date(); + OrderDetl orderDetl = new OrderDetl(); + + orderDetl.setOrderId(order.getId()); + orderDetl.setOrderNo(order.getOrderNo()); + orderDetl.setCreateBy(order.getCreateBy()); + orderDetl.setCreateTime(now); + orderDetl.setUpdateBy(order.getCreateBy()); + orderDetl.setUpdateTime(now); + orderDetl.setStatus(1); + orderDetl.setQty(0.0D); + + return orderDetl; + } + + private Set<String> pakoutLoc(Order order) { //闇�瑕佸嚭搴撶殑搴撲綅 Set<String> locNos = new HashSet<>(); //鏍规嵁璁㈠崟鐢熸垚鍥涢」搴撳嚭搴撳伐浣滄。 List<OrderDetl> orderDetlList = orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_no", order.getOrderNo())); - orderDetlList.forEach(orderDetl -> { + + for (OrderDetl orderDetl : orderDetlList) { + if (orderDetl.getAnfme() - orderDetl.getQty() <= 0) { + continue; + } + String matnr = orderDetl.getMatnr(); - Double orderAnfme = orderDetl.getAnfme(); - List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>() - .eq("matnr", matnr) - .eq("loc_sts","F") - .groupBy("loc_no")); - for (LocDetl locDetl : locDetls){ - String locNo = locDetl.getLocNo(); - //璁㈠崟寰呭嚭鏁伴噺鍑忓幓搴撳瓨鏁伴噺 - orderAnfme -= locDetl.getAnfme(); - //娣诲姞寰呭嚭搴撳簱浣� + double orderAnfme = orderDetl.getAnfme(); + + //List<String> locNosSearch = locDetlService.selectLocNo(matnr); + Set<String> locNosSearch = locDetlService.selectLocNos(matnr); + + //杩囨护搴撲綅璐х墿涓洪珮璐х墿 + locNosSearch = locNosSearch.stream().filter(locNo -> { + LocMast locMast = locMastService.selectByLoc(locNo); + if (locMast.getLocType1() == 3) { + return false; + } else { + //涓旀娴嬭搴撲綅鏄惁鍚病鏈夎揣鏋剁爜鐨勭墿鏂欙紝濡傛湁鏈夊垯涓嶅厑璁稿嚭搴� +// LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locNo) +// .andNew().eq("supp_code", "").or().isNull("supp_code")); + + if (Cools.isEmpty(locDetlService.selectByLocWithoutContainer(locNo))) { + return true; + } else { + return false; + } + } + }).collect(Collectors.toSet()); + + //閲嶆柊鎺掑簭 + Set<String> resort = resort(locNosSearch); + + for (String locNo : resort) { + List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo); locNos.add(locNo); - - if(orderAnfme <= 0){ + for (LocDetl locDetl : locDetls) { + if (matnr.equals(locDetl.getMatnr())) { + orderAnfme -= locDetl.getAnfme(); + } else { + OrderDetl odNew = createOrderDetl(order); + odNew.setMatnr(locDetl.getMatnr()); + odNew.setMaktx(locDetl.getMaktx()); + odNew.setBatch(locDetl.getBatch()); + odNew.setThreeCode(locDetl.getThreeCode()); + odNew.setDeadTime(locDetl.getDeadTime()); + odNew.setSpecs(locDetl.getSpecs()); + odNew.setAnfme(0.0); + odNew.setQty(locDetl.getAnfme()); + orderDetlService.insert(odNew); + } + } + if (orderAnfme <= 0) { orderDetl.setQty(orderDetl.getAnfme() - orderAnfme); orderDetlService.updateById(orderDetl); break; } } - - }); + if (orderAnfme > 0) { + orderDetl.setAnfme(orderDetl.getAnfme() - orderAnfme); + orderDetl.setQty(orderDetl.getAnfme()); + orderDetlService.updateById(orderDetl); + } + } return locNos; } - public static void main(String[] args) { - for (int i=0; i<10; i++){ - for (int y=0; y<10; y++){ - System.out.println(i); - System.out.println(y); - if(y == 5){ - break; + //鏍规嵁娣辨祬搴撲綅杩涜閲嶆柊鎺掑簭 + private Set<String> resort(Set<String> locNos) { + Set<String> locNosResort = new LinkedHashSet<>(); + + for (String locNoSearch : locNos) { + LocMast locMast = locMastService.selectById(locNoSearch); + if (!"F".equals(locMast.getLocSts())) { + continue; + } + + List<String> groupOuterLoc = Utils.getGroupOuterLoc(locNoSearch); + + if (Cools.isEmpty(groupOuterLoc)) { + locNosResort.add(locNoSearch); + } else { + groupOuterLoc.add(locNoSearch); + //濡傛灉鏄繁搴撲綅锛屽垯鍏堟壘澶栦晶鐨勫簱浣� + for (String locNoOut : groupOuterLoc) { + LocMast locMastOuter = locMastService.selectById(locNoOut); + //澶栦晶濡傛灉鏄嫞鏂欙紝鍒欏唴娴嬩笉鍏佽鍑� + if ("P".equals(locMastOuter.getLocSts()) || "Q".equals(locMastOuter.getLocSts()) || "S".equals(locMastOuter.getLocSts())) { + break; + } + + if (!"F".equals(locMastOuter.getLocSts())) { + continue; + } + locNosResort.add(locNoOut); + } } } + return locNosResort; } + private WrkMast createWrkMast(String locNo, String barCode, Date now) { + int ioType = 101; + int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); + WrkMast wrkMast = new WrkMast(); + wrkMast.setWrkNo(workNo); + wrkMast.setIoTime(now); + wrkMast.setWrkSts(21L); // 宸ヤ綔鐘舵�侊細21.鐢熸垚鍑哄簱浠诲姟 + wrkMast.setIoType(ioType); // 鍏ュ嚭搴撶姸鎬� + wrkMast.setIoPri(300D); // 浼樺厛绾э細13 + //wrkMast.setOutMost(outMost?1:0);; + //wrkMast.setCrnNo(outMost?outCrnNo:locMast.getCrnNo()); + //wrkMast.setSourceStaNo(loc); // 婧愮珯 + wrkMast.setStaNo(300); // 鐩爣绔� + wrkMast.setSourceLocNo(locNo); // 婧愬簱浣� + wrkMast.setFullPlt("Y"); // 婊℃澘锛歒 + wrkMast.setPicking("N"); // 鎷f枡 + wrkMast.setExitMk("N"); // 閫�鍑� + wrkMast.setEmptyMk("N"); // 绌烘澘 + wrkMast.setLinkMis("N"); + wrkMast.setBarcode(barCode); + //wrkMast.setAppeUser(userId); // 鎿嶄綔浜哄憳鏁版嵁 + wrkMast.setAppeTime(now); + //wrkMast.setModiUser(userId); + wrkMast.setModiTime(now); + Integer pltType = null; + if (!Cools.isEmpty(locNo) && Cools.isEmpty(pltType)) { + AgvLocMast agvLocMast = agvLocMastService.selectById(locNo); + if (agvLocMast != null) { + pltType = agvLocMast.getPltType(); + } + } + wrkMast.setPltType(pltType); + //琛ヨ揣鏍囪瘑 + wrkMast.setMk("Y"); + if (!wrkMastService.insert(wrkMast)) { + throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐ワ紝鍑哄簱搴撲綅鍙凤細" + locNo); + } + return wrkMast; + } + + private void createWrkDetl(List<LocDetl> locDetls, WrkMast wrkMast, String orderNo, Date now) { + locDetls.forEach(locDetl -> { + WrkDetl wrkDetl = new WrkDetl(); + BeanUtils.copyProperties(locDetl, wrkDetl); + wrkDetl.setZpallet(wrkMast.getBarcode()); + wrkDetl.setIoTime(now); + wrkDetl.setWrkNo(wrkMast.getWrkNo()); + //wrkDetl.setBatch(locDetl.getBatch()); + wrkDetl.setOrderNo(orderNo); + //wrkDetl.setAnfme(locDetl.getAnfme()); // 鏁伴噺 + wrkDetl.setAppeTime(now); + //wrkDetl.setAppeUser(userId); + wrkDetl.setModiTime(now); + //wrkDetl.setSuppCode(locDetl.getSuppCode()); + //wrkDetl.setModiUser(userId); + if (!wrkDetlService.insert(wrkDetl)) { + throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�"); + } + }); + } } -- Gitblit v1.9.1