自动化立体仓库 - WMS系统
ZY
2025-02-06 89a2971d0a728641f1745ae7acb41b4800592a38
四期
17个文件已修改
3个文件已添加
453 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvMobileController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderLogController.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/AgvMobileStartPakin.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/excel/CloseOrderReadListener.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/excel/ExcelOrder.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvLocMastService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvMobileService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvLocMastServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderLogScheduler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/TimeUtils.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/AgvCommonService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/四期sql/2.新增2楼库位.txt 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/四期sql/4.初始化1.txt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/四期sql/未上线前禁用库位.txt 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvMobileController.java
@@ -812,6 +812,15 @@
        return R.ok();
    }
    @PostMapping("/hand/control/processed/v2")
    @Transactional
    @ManagerAuth(memo = "确认加工完成V2")
    @Synchronized
    public R processedV2(@RequestBody AgvMobileStartPakin param) {
        agvMobileService.processedV2(param, getUserId());
        return R.ok();
    }
    public static void main(String[] args) {
        List<AgvLocDetl> agvLocDetls1 = new ArrayList<>();
src/main/java/com/zy/asrs/controller/OrderLogController.java
@@ -1,5 +1,6 @@
package com.zy.asrs.controller;
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
@@ -8,13 +9,18 @@
import com.core.common.*;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.result.WrkTraceVo;
import com.zy.asrs.excel.CloseOrderReadListener;
import com.zy.asrs.excel.ExcelOrder;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.OrderServiceImpl;
import com.zy.common.web.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.*;
@Slf4j
@@ -39,6 +45,8 @@
    private LocDetlService locDetlService;
    @Autowired
    private MatService matService;
    @Autowired
    private OrderServiceImpl orderService;
    @RequestMapping(value = "/orderLog/nav/list/auth")
    @ManagerAuth
@@ -78,7 +86,9 @@
        EntityWrapper<OrderLog> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} else {
        if (!Cools.isEmpty(orderByField)) {
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        } else {
            wrapper.orderBy("settle").orderBy("create_time", false);
        }
        wrapper.eq("status", 1);
@@ -90,9 +100,6 @@
    public R head(@RequestParam Long orderId){
        return R.ok().add(orderDetlLogService.selectList(new EntityWrapper<OrderDetlLog>().eq("order_id", orderId)));
    }
    @PostMapping(value = "/orderLog/wrk/trace/auth")
@@ -182,7 +189,9 @@
        EntityWrapper<OrderLog> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        if (!Cools.isEmpty(orderByField)) {
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        }
        return R.ok(orderLogService.selectPage(new Page<>(curr, limit), wrapper));
    }
@@ -237,4 +246,15 @@
        return R.ok();
    }
    /**
     * æ–‡ä»¶ä¸Šä¼ ,关闭单据
     */
    @PostMapping("/order/close")
    @ResponseBody
    @ManagerAuth
    public R upload(MultipartFile file) throws IOException {
        EasyExcel.read(file.getInputStream(), ExcelOrder.class, new CloseOrderReadListener(orderService)).sheet().doRead();
        return R.ok();
    }
}
src/main/java/com/zy/asrs/entity/param/AgvMobileStartPakin.java
@@ -19,6 +19,8 @@
    // ç«™ç‚¹ç 
    private String devNo;
    //订单编号里有B是二厂,G是三厂
    private String factory;
    private List<CombParam> combParams;
src/main/java/com/zy/asrs/excel/CloseOrderReadListener.java
New file
@@ -0,0 +1,84 @@
package com.zy.asrs.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson.JSON;
import com.zy.asrs.controller.AgvMobileController;
import com.zy.asrs.entity.Order;
import com.zy.asrs.service.OrderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
public class CloseOrderReadListener implements ReadListener<ExcelOrder> {
    private static final Logger log = LoggerFactory.getLogger(CloseOrderReadListener.class);
    /**
     * æ¯éš”5条存储数据库,实际使用中可以100条,然后清理list ï¼Œæ–¹ä¾¿å†…存回收
     */
    private static final int BATCH_COUNT = 300;
    /**
     * ç¼“存的数据
     */
    private List<ExcelOrder> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    private OrderService orderService;
    /**
     * å¦‚果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     *
     * @param orderService
     */
    public CloseOrderReadListener(OrderService orderService) {
        this.orderService = orderService;
    }
    /**
     * è¿™ä¸ªæ¯ä¸€æ¡æ•°æ®è§£æžéƒ½ä¼šæ¥è°ƒç”¨
     *
     * @param data    one row value. Is is same as
     * @param context
     */
    @Override
    public void invoke(ExcelOrder data, AnalysisContext context) {
        log.info("解析到一条数据:{}", JSON.toJSONString(data));
        cachedDataList.add(data);
        // è¾¾åˆ°BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (cachedDataList.size() >= BATCH_COUNT) {
            saveData();
            // å­˜å‚¨å®Œæˆæ¸…理 list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }
    /**
     * æ‰€æœ‰æ•°æ®è§£æžå®Œæˆäº† éƒ½ä¼šæ¥è°ƒç”¨
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // è¿™é‡Œä¹Ÿè¦ä¿å­˜æ•°æ®ï¼Œç¡®ä¿æœ€åŽé—留的数据也存储到数据库
        saveData();
        log.info("所有数据解析完成!");
    }
    /**
     * åŠ ä¸Šå­˜å‚¨æ•°æ®åº“
     */
    private void saveData() {
        log.info("{}条数据,开始操作数据库!", cachedDataList.size());
        for (ExcelOrder excelOrder : cachedDataList) {
            Order order = orderService.selectByNo(excelOrder.getOrderNo());
            if (order != null) {
                orderService.updateSettle(order.getId(), 6L, 9529L);
            }
        }
        log.info("存储数据库成功!");
    }
}
src/main/java/com/zy/asrs/excel/ExcelOrder.java
New file
@@ -0,0 +1,14 @@
package com.zy.asrs.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class ExcelOrder implements Serializable {
    @ExcelProperty("单据编号")
    private String orderNo;
}
src/main/java/com/zy/asrs/service/AgvLocMastService.java
@@ -22,6 +22,9 @@
    public void updateLocStsByLocNo(String locNo, String locSts, String barcode,Short containerType);
    public void updateLocStsByLocNo(String locNo, String locSts, String barcode,Short containerType,String ctnNo);
    public void updateLocStsByLocNo(String locNo, String locSts, String barcode,Short containerType,String locType,Short locType3);
    public List<String> queryGroupEmptyStock(int floor);
src/main/java/com/zy/asrs/service/AgvMobileService.java
@@ -62,6 +62,10 @@
     * ç¡®è®¤åŠ å·¥å®Œæˆ
     */
    String processed(AgvMobileStartPakin param, Long userId);
    /**
     * ç¡®è®¤åŠ å·¥å®Œæˆï¼Œå››æœŸ
     */
    String processedV2(AgvMobileStartPakin param, Long userId);
    /**
     * ç©ºæž¶ç¦»åœº
src/main/java/com/zy/asrs/service/impl/AgvLocMastServiceImpl.java
@@ -373,6 +373,17 @@
        agvLocMast.setModiTime(new Date());
        this.updateById(agvLocMast);
    }
    public void updateLocStsByLocNo(String locNo, String locSts, String barcode,Short containerType,String ctnNo) {
        AgvLocMast agvLocMast = this.selectById(locNo);
        agvLocMast.setLocSts(locSts);
        agvLocMast.setBarcode(barcode);
        agvLocMast.setLocType2(containerType);
        agvLocMast.setCtnNo(ctnNo);
        agvLocMast.setModiTime(new Date());
        this.updateById(agvLocMast);
    }
    public void updateLocStsByLocNo(String locNo, String locSts, String barcode,Short containerType,String locType,Short locType3) {
        AgvLocMast agvLocMast = this.selectById(locNo);
        agvLocMast.setLocSts(locSts);
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java
@@ -4,11 +4,11 @@
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.constant.AsrsConstants;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.CodeDetectionUtil;
import com.zy.asrs.utils.OrderUtils;
import com.zy.common.model.DetlDto;
import com.zy.common.service.AgvCommonService;
import lombok.Synchronized;
@@ -797,14 +797,8 @@
        agvWrkMastLogService.save(agvWrkMast);
        agvWrkDetlLogService.save(agvWrkMast.getWrkNo());
        String sourceLocNo = agvWrkMast.getSourceLocNo();
        //AgvLocMast newLocMast = agvCommonService.getLocNo(3, 1, false, false);
        // TODO: å››æœŸ
        AgvLocMast newLocMast = agvCommonService.getLocNo(3, 1, false, false);
        List<AgvWrkDetl> agvWrkDetls = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("supp_code", param.getBarcode()));
        String factory = null;
        if (!Cools.isEmpty(agvWrkDetls)) {
            factory = OrderUtils.getFactory(agvWrkDetls.get(0).getThreeCode());
        }
        AgvLocMast newLocMast = agvCommonService.getLocByLocRule(3, 1, factory);
        if (newLocMast == null) {
            throw new CoolException("无可用库位");
        }
@@ -849,6 +843,77 @@
        return "ok";
    }
    /*
     * ç¡®è®¤åŠ å·¥å®Œæˆ
     */
    @Override
    @Transactional
    public String processedV2(AgvMobileStartPakin param, Long userId) {
        Date now = new Date();
        AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("barcode", param.getBarcode()).eq("loc_no", param.getDevNo()));
        if (Cools.isEmpty(agvWrkMast)) {
            throw new CoolException("暂无当前货架的工作档");
        }
        if (agvWrkMast.getWrkSts() != 205) {
            throw new CoolException("当前任务未完成,请确认");
        }
        //生成AGV工作历史档 + ç”ŸæˆAGV工作明细历史档
        agvWrkMastLogService.save(agvWrkMast);
        agvWrkDetlLogService.save(agvWrkMast.getWrkNo());
        String sourceLocNo = agvWrkMast.getSourceLocNo();
        // TODO: å››æœŸ
        List<AgvWrkDetl> agvWrkDetls = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("supp_code", param.getBarcode()));
        String factory = param.getFactory();
        AgvLocMast newLocMast = agvCommonService.getLocByLocRule(3, 1, factory);
        if (newLocMast == null) {
            throw new CoolException("无可用库位");
        }
        agvWrkMast.setSourceLocNo(agvWrkMast.getLocNo());
        agvWrkMast.setLocNo(newLocMast.getLocNo());
        agvWrkMast.setIoType(57);
        agvWrkMast.setWrkSts(201L);
        agvWrkMast.setModiUser(userId);
        agvWrkMast.setModiTime(now);
        agvWrkMast.setIoTime(now);
        // æ‰“标记,若库位不够,入库到别的楼层,那么需要跨层移库
        if (!Cools.isEmpty(factory)){
            if (newLocMast.getLev1() == 1 && factory.equals(AsrsConstants.SANCHANG)) {
                agvWrkMast.setPacked("1");
            } else if (newLocMast.getLev1() == 2 && factory.equals(AsrsConstants.ERCHANG)) {
                agvWrkMast.setPacked("1");
            }
        }
        if (!agvWrkMastService.update(agvWrkMast, new EntityWrapper<AgvWrkMast>().eq("wrk_no", agvWrkMast.getWrkNo()))) {
            throw new CoolException("更新工作档失败");
        }
        // æ›´æ–°æºç«™ç‚¹ + ç›®æ ‡åº“位状态 + åŽ†å²æºåº“ä½
        agvBasDevpService.updateLocStsAndBarcodeByDevNo(param.getDevNo(), "R", param.getBarcode(), agvWrkMast.getWhsType().shortValue());
        agvLocMastService.updateLocStsByLocNo(newLocMast.getLocNo(), "S", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue());
        agvLocMastService.updateLocStsByLocNo(sourceLocNo, "O", "", (short) 30);
        agvLocDetlService.delete(new EntityWrapper<AgvLocDetl>().eq("loc_no", sourceLocNo));
        agvWrkDetls.forEach(agvWrkDetl -> {
            for (AgvWrkDetl wrkDetl : param.getWrkDetls()) {
                if (wrkDetl.getMatnr().equals(agvWrkDetl.getMatnr()) && wrkDetl.getThreeCode().equals(agvWrkDetl.getThreeCode())) {
                    agvWrkDetl.setAnfme(wrkDetl.getAnfme());
                    break;
                }
            }
            agvWrkDetl.setProcessSts(2);
            agvWrkDetl.setOrderNo(agvWrkDetl.getOrderNo().substring(2));
            agvWrkDetl.setModiUser(userId);
            agvWrkDetl.setModiTime(now);
            agvWrkDetl.setIoTime(now);
            if (!agvWrkDetlService.update(agvWrkDetl, new EntityWrapper<AgvWrkDetl>()
                    .eq("matnr", agvWrkDetl.getMatnr())
                    .eq("three_code", agvWrkDetl.getThreeCode())
                    .eq("supp_code", param.getBarcode()))) {
                throw new CoolException("更新工作明细失败");
            }
        });
        return "ok";
    }
    /*
     * ç«™ç‚¹å›žé€€
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java
@@ -16,6 +16,8 @@
import com.zy.asrs.service.*;
import com.zy.common.service.AgvCommonService;
import com.zy.common.utils.HttpHandler;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -64,6 +66,8 @@
    private AgvCommonService agvCommonService;
    @Autowired
    private AgvWrkMastService agvWrkMastService;
    @Autowired
    private ConfigService configService;
    public Boolean updateWrkStsByWrkNo(int wrkNo, long wrkSts) {
@@ -227,6 +231,10 @@
            agvWrkMast.setWrkNo(-agvWrkMast.getWrkNo());
        }
        agvTaskCreateParam.setTaskCode(agvWrkMast.getWrkNo().toString());
        Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "FOUR"));
        if (config != null && config.getStatus() == 1 && config.getValue().equals("1") && processUseTiShengJi(agvWrkMast.getSourceLocNo(), agvWrkMast.getLocNo())) {
                // TODO å››æœŸ
        } else {
        switch (agvWrkMast.getIoType()) {
            case 114:
            case 108:
@@ -268,6 +276,7 @@
                agvTaskCreateParam.setTaskTyp("F01");
                break;
        }
        }
        agvTaskCreateParam.setPositionCodePath(agvTaskParamList);
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java
@@ -213,7 +213,7 @@
     * ä¼˜å…ˆé€‰æ‹©å…ˆåˆ°æŽ¥é©³ä½ï¼ˆæŽ¥é©³ä½å¯å…¥ï¼‰ åŽé€‰æ‹©ç›´æŽ¥å›žåº“
     * 2楼或3楼站点可入信号全部没有,代表走电梯自动搬运模式
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    @Scheduled(cron = "0/30 * * * * ? ")
    private void autoEmptyBack4() {
        // æŸ¥è¯¢ ä¸ä¸º1楼的空货架
        List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(new EntityWrapper<AgvLocMast>()
@@ -236,7 +236,7 @@
     * å°†äºŒåŽ‚çš„6类型的空货架调拨回吸塑二楼
     */
    // TODO å››æœŸ
    @Scheduled(cron = "0/2 * * * * ? ")
    @Scheduled(cron = "0/30 * * * * ? ")
    private void autoEmptyBackSiqi() {
        // æŸ¥è¯¢6类型空货架返回的执行时间点
        Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "RETURN_6_TIME"));
@@ -245,7 +245,7 @@
            try {
                // åˆ¤æ–­æ˜¯å¦åœ¨æ‰§è¡Œæ—¶é—´å†…
                ProcesTimeData procesTimeData = JSONObject.parseObject(config.getValue(), ProcesTimeData.class);
                if (procesTimeData != null && TimeUtils.between(procesTimeData)) {
                if (procesTimeData != null && config.getStatus() == 1 && TimeUtils.between(procesTimeData)) {
                    flag = true;
                }
            } catch (Exception e) {
@@ -255,9 +255,10 @@
            if (flag) {
                executeLocType6();
            }
        } else {
            executeLocType6();
        }
//        else {
//            executeLocType6();
//        }
    }
@@ -298,7 +299,6 @@
     * è‡ªåŠ¨ï¼š ç”Ÿæˆ 109 è‡ªåŠ¨å›žæµ
     * æ‰‹åŠ¨ï¼š ç”Ÿæˆ 113 æ‰‹åŠ¨å›žæµ
     * ä¼˜å…ˆé€‰æ‹©å…ˆåˆ°æŽ¥é©³ä½ï¼ˆæŽ¥é©³ä½å¯å…¥ï¼‰ åŽé€‰æ‹©ç›´æŽ¥å›žåº“
     *
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack5() {
@@ -336,7 +336,6 @@
    /**
     * è‡ªåŠ¨ç§»åº“
     *
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack7() throws ParseException {
@@ -382,4 +381,50 @@
    }
    /**
     * è‡ªåŠ¨ç§»åº“ï¼Œå››æœŸ
     * åœ¨åº“位不够的情况下,箱壳入库别的楼层库位的时候,晚上进行跨层移库
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack8() throws ParseException {
        Date now = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String currentDay = sdf.format(now);
        Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "autoTime2"));
        if (Cools.isEmpty(config)) {
        } else {
            if (config.getStatus().intValue() == 0) {
                return;
            }
            JSONObject jsonObject = JSON.parseObject(config.getValue().toString());
            Integer maxTansk = jsonObject.getInteger("maxTansk");
            //Integer startTime = jsonObject.getInteger("startTime");
            String startTime = jsonObject.getString("startTime");
            long time1 = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(currentDay + " " + startTime).getTime();
            long time = now.getTime();
            long time3 = time - time1;
            if (time3 > 0 && time3 < (1000 * 60 * 10)) {
                List<AgvWrkMast> agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().eq("io_type", 12));
                if (agvWrkMasts != null && maxTansk <= agvWrkMasts.size()) {
                    return;
                }
                List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(new EntityWrapper<AgvLocMast>().eq("floor", 1).eq("loc_sts", "F").eq("loc_type1", 3).eq("ctn_no", "1"));
                if (agvLocMasts.isEmpty()) {
                    return;
                }
                for (AgvLocMast agvLocMast : agvLocMasts) {
                    try {
                        autoMoveHandler.autoTransfersV2(agvLocMast, maxTansk);
                    } catch (Exception e) {
                        log.error("库位号" + agvLocMast.getLocNo() + "四期定时移库任务 å¸å¡‘ --> å¸å¡‘,处理失败:===》异常原因:" + e.getMessage());
                    }
                }
            }
        }
    }
}
src/main/java/com/zy/asrs/task/OrderLogScheduler.java
@@ -24,7 +24,7 @@
//    private boolean isERP;
//
    //@Scheduled(cron = "0/10 * * * * ? ")
    @Scheduled(fixedDelay = 600000)
    @Scheduled(fixedDelay = 1000)
    private void execute() {
        List<Order> orders = orderService.selectToBeHistoryOrder();
        if (orders.isEmpty()) {
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
@@ -191,7 +191,7 @@
                    //更新库存明细
                    agvLocDetlService.updateStock(agvWrkMast.getSourceLocNo(), agvWrkMast.getLocNo());
                    //修改源库位状态为O
                    agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(), "O", "", null);
                    agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(), "O", "", null,null);
                    break;
                case 53:
                    //修改工作党明细
@@ -254,7 +254,7 @@
                    });
                    // æ›´æ–°ç«™ç‚¹ + åº“位状态     æºåº“位是站点
                    agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(), "O", "", agvWrkMast.getWhsType().shortValue());
                    agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue());
                    agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue(),agvWrkMast.getPacked());
                    break;
                case 58:
                    agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue());
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java
@@ -666,7 +666,8 @@
        //检索库位,选择合适的库位
        AgvLocMast LocMast = agvCommonService.getLocNo(3, 1, false, false);
        if (LocMast.getLev1() != 2) {
            throw new CoolException("目标楼层不是吸塑二楼");
            //throw new CoolException("目标楼层不是吸塑二楼");
            return FAIL;
        }
        List<AgvWrkMast> agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().like("loc_no", "02F1").like("source_loc_no", "F1").eq("io_type", 12));
        if (agvWrkMasts.size() >= maxTansk) {
@@ -722,4 +723,86 @@
        return SUCCESS;
    }
    /**
     * å››æœŸï¼Œè·¨å±‚移库,1楼到2楼,2楼到1楼
     *
     * @param agvLocMast
     * @param maxTansk
     * @return
     */
    public ReturnT<String> autoTransfersV2(AgvLocMast agvLocMast, Integer maxTansk) {
        Date now = new Date();
        List<AgvLocDetl> locDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", agvLocMast.getLocNo()));
        locDetls.forEach(agvLocDetl -> {
            if (agvLocDetl.getProcessSts().equals(1)) {
                throw new CoolException("当前库位有库存未加工");
            }
        });
        //查询工作档
        AgvWrkMast agvWrkMast = agvWrkMastService.selectByContainerCode(agvLocMast.getBarcode());
        if (!Cools.isEmpty(agvWrkMast)) {
            throw new CoolException("当前" + agvLocMast.getBarcode() + "货架码已在工作档中");
        }
        AgvLocMast LocMast;
        if (agvLocMast.getLev1() == 1) {
            //检索库位,选择合适的库位
            LocMast = agvCommonService.getLocByLocRule(3, 1, 2);
        } else {
            LocMast = agvCommonService.getLocByLocRule(3, 1, 1);
        }
        List<AgvWrkMast> agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().eq("io_type", 12));
        if (agvWrkMasts.size() >= maxTansk) {
            throw new CoolException("自动移库任务已到设定最大值:" + maxTansk);
        }
        //生成工作档
        AgvWrkMast mast = new AgvWrkMast();
        //工作状态
        mast.setWrkSts(201L);
        //入出库类型
        mast.setIoType(12);
        mast.setIoTime(now);
        //优先级
        mast.setIoPri(300.0);
        //源站点
        mast.setSourceLocNo(agvLocMast.getLocNo());
        //目标站点
        mast.setLocNo(LocMast.getLocNo());
        //货架编码
        mast.setBarcode(agvLocMast.getBarcode());
        //货架类型
        mast.setWhsType(30);
        mast.setAppeUser(9527L);
        mast.setAppeTime(now);
        mast.setModiUser(9527L);
        mast.setModiTime(now);
        mast.setLogErrMemo("doAutoMoveV4");
        if (!agvWrkMastService.insertByIncrease(mast)) {
            throw new CoolException("保存工作档失败");
        }
        AgvWrkMast mast1 = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", LocMast.getLocNo()).eq("source_loc_no", agvLocMast.getLocNo()));
        //生成工作档明细
        List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", agvLocMast.getLocNo()));
        agvLocDetls.forEach(agvLocDetl -> {
            AgvWrkDetl wrkDetl = new AgvWrkDetl();
            wrkDetl.setWrkNo(mast1.getWrkNo());
            wrkDetl.sync(agvLocDetl);
            wrkDetl.setSuppCode(agvLocDetl.getSuppCode());
            wrkDetl.setIoTime(now);
            wrkDetl.setAppeUser(9527L);
            wrkDetl.setAppeTime(now);
            wrkDetl.setModiUser(9527L);
            wrkDetl.setModiTime(now);
            if (!agvWrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作明细失败");
            }
        });
        //更新目标库位状态
        updateAgvLocMast(agvLocMast, "R");
        updateAgvLocMast(LocMast, "S");
        return SUCCESS;
    }
}
src/main/java/com/zy/asrs/utils/TimeUtils.java
@@ -1,5 +1,6 @@
package com.zy.asrs.utils;
import com.alibaba.fastjson.JSON;
import com.zy.asrs.task.core.ProcesTimeData;
import java.time.LocalDate;
@@ -16,14 +17,22 @@
        LocalDateTime startTime = LocalDateTime.of(LocalDate.now(), LocalTime.of(procesTimeData.getStartHour(), procesTimeData.getStartMinute()));
        LocalDateTime endTime = LocalDateTime.of(LocalDate.now(), LocalTime.of(procesTimeData.getEndHour(), procesTimeData.getEndMinute()));
        if (procesTimeData.getStartHour() > procesTimeData.getEndHour()) {
            endTime = endTime.plusDays(1);
            startTime = startTime.plusDays(-1);
        }
        LocalDateTime currentTime = LocalDateTime.now(); // èŽ·å–å½“å‰æ—¶é—´
        System.out.println(startTime);
        System.out.println(endTime);
        if (currentTime.isAfter(startTime) && currentTime.isBefore(endTime)) {
            return true;
        }
        return false;
    }
    public static void main(String[] args) {
        ProcesTimeData procesTimeData = new ProcesTimeData();
        procesTimeData.setStartHour(7);
        procesTimeData.setStartMinute(40);
        procesTimeData.setEndHour(15);
        procesTimeData.setEndMinute(0);
        System.out.println(between(procesTimeData));
        System.out.println(JSON.toJSONString(procesTimeData));
    }
}
src/main/java/com/zy/common/service/AgvCommonService.java
@@ -76,6 +76,7 @@
    /**
     * æ£€ç´¢åº“位号
     *
     * @return locNo æ£€ç´¢åˆ°çš„库位号
     */
    public AgvLocMast getLocNo(int type, int floor, boolean isEmpty, boolean isCurrLev) {
@@ -118,7 +119,6 @@
        try {
            // å¼€å§‹æŸ¥æ‰¾åº“位 ==============================>>
            // å››æœŸé¡¹ç›®ï¼šéœ€è¦æ”¹æŸ¥æ‰¾åº“位逻辑
            // ç®±å£³å…¥åº“
//            if (type == 3 && factory != null) {
//                //优先入库吸塑1楼,在2楼
@@ -169,6 +169,28 @@
            }
            agvLocMasts = agvLocMastService.selectList(wrapper);
            for (AgvLocMast agvLocMast : agvLocMasts) {
                AgvLocMast agvLocMast1 = agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>().eq("loc_no", agvLocMast.getLocNo()));
                if (agvLocMast1.getLocSts().equals("O")) {
                    return agvLocMast1;
                }
            }
            throw new CoolException("搜索库位时,未找到可入库库位。");
        } catch (Exception e) {
            throw new CoolException("搜索库位时,未找到可入库库位。");
        }
    }
    /**
     * åº“位规则查找
     */
    public AgvLocMast getLocByLocRule(int type, int floor, int lev1) {
        try {
            EntityWrapper<AgvLocMast> wrapper = new EntityWrapper<>();
            wrapper.eq("loc_sts", "O").eq("loc_type1", type);
            wrapper.eq("floor", floor).eq("lev1", lev1);
            List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(wrapper);
            for (AgvLocMast agvLocMast : agvLocMasts) {
                AgvLocMast agvLocMast1 = agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>().eq("loc_no", agvLocMast.getLocNo()));
                if (agvLocMast1.getLocSts().equals("O")) {
@@ -335,6 +357,7 @@
    /**
     * æ£€ç´¢åº“位号
     *
     * @return locNo æ£€ç´¢åˆ°çš„库位号
     */
    public AgvBasDevp getDevpNo(int type, int floor) {
@@ -354,6 +377,7 @@
    /**
     * æ£€ç´¢åº“位号
     *
     * @return locNo æ£€ç´¢è‡ªåŠ¨æŽ¥é©³ä½
     */
    public AgvBasDevp getDevpNo(int type, int floor, String auto) {
@@ -372,6 +396,7 @@
    /**
     * æ£€ç´¢åº“位号
     *
     * @return locNo æ£€ç´¢å¯å…¥æŽ¥é©³ä½
     */
    public AgvBasDevp getDevpNo(int type, int floor, String auto, String inEable) {
src/main/resources/application.yml
@@ -1,4 +1,4 @@
spring:
  profiles:
    #dev loc prod
    active: loc
    active: dev
src/main/resources/ËÄÆÚsql/2.ÐÂÔö2Â¥¿âλ.txt
@@ -1,7 +1,7 @@
DECLARE @locno VARCHAR(50); -- å£°æ˜Ž locno å­—段,指定长度
DECLARE @locsts NVARCHAR(50);
DECLARE @row1 INT = 27;
DECLARE @bay1 INT = 19;
DECLARE @bay1 INT = 14;
DECLARE @lev1 INT = 1;
DECLARE @fullplt VARCHAR(1); -- å‡è®¾ fullplt åªéœ€è¦ä¸€ä¸ªå­—符
DECLARE @loctype1 INT = 6;
@@ -12,7 +12,7 @@
DECLARE @stas INT;
DECLARE @floor INT;
DECLARE @maprow INT = 21;
DECLARE @mapbay INT = 19;
DECLARE @mapbay INT = 14;
DECLARE @rightside INT = 0;
DECLARE @plttype INT = 777;
@@ -22,8 +22,8 @@
WHILE @row1 <= 38
BEGIN
    -- åœ¨æ¯æ¬¡å¾ªçŽ¯ä¸­ï¼Œæ›´æ–° lev1 çš„值
    SET @bay1 = 19; -- é‡ç½® lev1
    SET @mapbay = 19; -- é‡ç½® lev1
    SET @bay1 = 14; -- é‡ç½® lev1
    SET @mapbay = 14; -- é‡ç½® lev1
    WHILE @bay1 <= 33
    BEGIN
src/main/resources/ËÄÆÚsql/4.³õʼ»¯1.txt
@@ -40,3 +40,6 @@
    
-- è®¾ç½®ä¸‰æ¥¼ä¸€å±‚é—´éš”
 UPDATE [dbo].[agv_loc_mast] SET right_side = 1 WHERE  floor = 3 AND lev1 = 1 AND row1 IN (1,3,5,7,8,9,11,13,14,16,18,20,21,23,25)
 UPDATE [dbo].[agv_loc_mast] SET loc_type2 = 31 WHERE  loc_type1 = 6
src/main/resources/ËÄÆÚsql/δÉÏÏßǰ½ûÓÿâλ.txt
New file
@@ -0,0 +1 @@
UPDATE [dbo].[agv_loc_mast] SET loc_sts = 'X' WHERE  loc_type1 = 6