自动化立体仓库 - WMS系统
zhangc
2024-12-17 b830ec60edf8b4a581e6ed7ca4a62e16a82d7081
优化逻辑并调整线程池配置
5个文件已修改
101 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/ReportDataScheduler.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoReplenishmentHandler.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/config/ThreadPoolConfig.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -1324,6 +1324,10 @@
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        if (!Cools.isEmpty(locNo) && Cools.isEmpty(pltType)) {
            AgvLocMast agvLocMast = agvLocMastService.selectById(locNo);
            pltType = agvLocMast.getPltType();
        }
        wrkMast.setPltType(pltType);
        wrkMast.setLogErrMemo("createWaitPainWrkMastStart");
src/main/java/com/zy/asrs/task/ReportDataScheduler.java
@@ -15,6 +15,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@@ -58,6 +59,7 @@
    @Scheduled(fixedDelay = 5000)
    @Async("reportThreadPool")
    public void execute() {
        log.info("定时任务开始执行");
        if (!flag) {
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
@@ -336,15 +336,22 @@
//                }
//                agvWrkMastService.updateById(agvWrkMast);
//            }
            Integer pltType = agvWrkMast.getPltType();
            if (Cools.isEmpty(pltType) && !Cools.isEmpty(agvWrkMast.getLocNo())) {
                AgvLocMast agvLocMast = agvLocMastService.selectById(agvWrkMast.getLocNo());
                if (agvLocMast != null) {
                    pltType = agvLocMast.getPltType();
                }
            }
            if (!isJSON(orderNo)) {
                //检查订单是否已完成
                orderService.checkComplete(orderNo, agvWrkMast.getPltType());
                orderService.checkComplete(orderNo, pltType);
            } else {
                List<Map> maps = JSONArray.parseArray(orderNo, Map.class);
                Integer finalPltType = pltType;
                maps.forEach(map -> {
                    String o = map.get("orderNo").toString();
                    orderService.checkComplete(o, agvWrkMast.getPltType());
                    orderService.checkComplete(o, finalPltType);
                });
            }
src/main/java/com/zy/asrs/task/handler/AutoReplenishmentHandler.java
@@ -29,6 +29,9 @@
    private LocDetlService locDetlService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private AgvLocMastService agvLocMastService;
    @Autowired
    private CommonService commonService;
    @Autowired
@@ -64,16 +67,16 @@
        Date now = new Date();
        Set<String> locNos = pakoutLoc(order);
        for (String locNo : locNos){
        for (String locNo : locNos) {
            LocMast locMast = locMastService.selectByLoc(locNo);
            if(!"F".equals(locMast.getLocSts())){
            if (!"F".equals(locMast.getLocSts())) {
                throw new CoolException("库位状态已变更");
            }
            //生成工作档
            WrkMast wrkMast = createWrkMast(locNo,locMast.getBarcode(),now);
            WrkMast wrkMast = createWrkMast(locNo, locMast.getBarcode(), now);
            //生成工作档明细
            List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo);
            createWrkDetl(locDetls, wrkMast,order.getOrderNo(),now);
            createWrkDetl(locDetls, wrkMast, order.getOrderNo(), now);
            //修改库位状态
            locMast.setLocSts("R");
            locMastService.updateByLocNo(locMast);
@@ -84,7 +87,7 @@
        return SUCCESS;
    }
    private Order createOrder(){
    private Order createOrder() {
        Date now = new Date();
        return new Order(
                String.valueOf(snowflakeIdWorker.nextId()),    // 编号[非空]
@@ -125,7 +128,7 @@
    }
    private OrderDetl createOrderDetl(Order order){
    private OrderDetl createOrderDetl(Order order) {
        Date now = new Date();
        OrderDetl orderDetl = new OrderDetl();
@@ -141,14 +144,14 @@
        return orderDetl;
    }
    private Set<String> pakoutLoc(Order order){
    private Set<String> pakoutLoc(Order order) {
        //需要出库的库位
        Set<String> locNos = new HashSet<>();
        //根据订单生成四项库出库工作档
        List<OrderDetl> orderDetlList = orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_no", order.getOrderNo()));
        for(OrderDetl orderDetl : orderDetlList){
            if(orderDetl.getAnfme() - orderDetl.getQty() <= 0){
        for (OrderDetl orderDetl : orderDetlList) {
            if (orderDetl.getAnfme() - orderDetl.getQty() <= 0) {
                continue;
            }
@@ -162,16 +165,16 @@
            //过滤库位货物为高货物
            locNosSearch = locNosSearch.stream().filter(locNo -> {
                LocMast locMast = locMastService.selectByLoc(locNo);
                if(locMast.getLocType1() == 3){
                if (locMast.getLocType1() == 3) {
                    return false;
                }else {
                } 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))){
                    if (Cools.isEmpty(locDetlService.selectByLocWithoutContainer(locNo))) {
                        return true;
                    }else {
                    } else {
                        return false;
                    }
                }
@@ -180,13 +183,13 @@
            //重新排序
            Set<String> resort = resort(locNosSearch);
            for(String locNo : resort){
            for (String locNo : resort) {
                List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo);
                locNos.add(locNo);
                for (LocDetl locDetl :locDetls){
                    if(matnr.equals(locDetl.getMatnr())){
                for (LocDetl locDetl : locDetls) {
                    if (matnr.equals(locDetl.getMatnr())) {
                        orderAnfme -= locDetl.getAnfme();
                    }else {
                    } else {
                        OrderDetl odNew = createOrderDetl(order);
                        odNew.setMatnr(locDetl.getMatnr());
                        odNew.setMaktx(locDetl.getMaktx());
@@ -199,13 +202,13 @@
                        orderDetlService.insert(odNew);
                    }
                }
                if(orderAnfme <= 0){
                if (orderAnfme <= 0) {
                    orderDetl.setQty(orderDetl.getAnfme() - orderAnfme);
                    orderDetlService.updateById(orderDetl);
                    break;
                }
            }
            if(orderAnfme > 0){
            if (orderAnfme > 0) {
                orderDetl.setAnfme(orderDetl.getAnfme() - orderAnfme);
                orderDetl.setQty(orderDetl.getAnfme());
                orderDetlService.updateById(orderDetl);
@@ -216,30 +219,30 @@
    }
    //根据深浅库位进行重新排序
    private Set<String> resort(Set<String> locNos){
    private Set<String> resort(Set<String> locNos) {
        Set<String> locNosResort = new LinkedHashSet<>();
        for(String locNoSearch : locNos){
        for (String locNoSearch : locNos) {
            LocMast locMast = locMastService.selectById(locNoSearch);
            if(!"F".equals(locMast.getLocSts())){
            if (!"F".equals(locMast.getLocSts())) {
                continue;
            }
            List<String> groupOuterLoc = Utils.getGroupOuterLoc(locNoSearch);
            if(Cools.isEmpty(groupOuterLoc)){
            if (Cools.isEmpty(groupOuterLoc)) {
                locNosResort.add(locNoSearch);
            }else {
            } else {
                groupOuterLoc.add(locNoSearch);
                //如果是深库位,则先找外侧的库位
                for (String locNoOut : groupOuterLoc){
                for (String locNoOut : groupOuterLoc) {
                    LocMast locMastOuter = locMastService.selectById(locNoOut);
                    //外侧如果是拣料,则内测不允许出
                    if("P".equals(locMastOuter.getLocSts()) || "Q".equals(locMastOuter.getLocSts()) || "S".equals(locMastOuter.getLocSts())){
                    if ("P".equals(locMastOuter.getLocSts()) || "Q".equals(locMastOuter.getLocSts()) || "S".equals(locMastOuter.getLocSts())) {
                        break;
                    }
                    if(!"F".equals(locMastOuter.getLocSts())){
                    if (!"F".equals(locMastOuter.getLocSts())) {
                        continue;
                    }
                    locNosResort.add(locNoOut);
@@ -250,7 +253,7 @@
        return locNosResort;
    }
    private WrkMast createWrkMast(String locNo,String barCode,Date now){
    private WrkMast createWrkMast(String locNo, String barCode, Date now) {
        int ioType = 101;
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
        WrkMast wrkMast = new WrkMast();
@@ -274,19 +277,26 @@
        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("保存工作档失败,出库库位号:"+locNo);
            throw new CoolException("保存工作档失败,出库库位号:" + locNo);
        }
        return wrkMast;
    }
    private void createWrkDetl(List<LocDetl> locDetls, WrkMast wrkMast,String orderNo, Date now){
    private void createWrkDetl(List<LocDetl> locDetls, WrkMast wrkMast, String orderNo, Date now) {
        locDetls.forEach(locDetl -> {
            WrkDetl wrkDetl = new WrkDetl();
            BeanUtils.copyProperties(locDetl,wrkDetl);
            BeanUtils.copyProperties(locDetl, wrkDetl);
            wrkDetl.setZpallet(wrkMast.getBarcode());
            wrkDetl.setIoTime(now);
            wrkDetl.setWrkNo(wrkMast.getWrkNo());
src/main/java/com/zy/common/config/ThreadPoolConfig.java
@@ -14,20 +14,20 @@
@EnableAsync
public class ThreadPoolConfig {
    @Bean(name = "orderThreadPool")
    @Bean(name = "reportThreadPool")
    public ThreadPoolTaskExecutor orderThreadPool() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        int core = Runtime.getRuntime().availableProcessors();
        core = 2;
        core = 1;
        //设置核心线程数
        executor.setCorePoolSize(core);
        //设置最大线程数
        executor.setMaxPoolSize(core * 10 + core);
        executor.setMaxPoolSize(1);
        //除核心线程外的线程存活时间
        executor.setKeepAliveSeconds(3);
        //缓冲队列
        executor.setQueueCapacity(core);
        executor.setThreadNamePrefix("order-task-");
        executor.setThreadNamePrefix("report-task-");
        //设置拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;