自动化立体仓库 - WCS系统
#
lsh
2024-01-16 d9131e43a1fa8fe4d5e086d02d4037997cb13bde
#
11个文件已修改
540 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MonitorController.java 422 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/RgvController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastSta.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/MatDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/DevpSlave.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/console.html 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MonitorController.java
@@ -7,11 +7,15 @@
import com.zy.asrs.domain.dto.WorkChartAxis;
import com.zy.asrs.domain.vo.LocChartPie;
import com.zy.asrs.mapper.ReportQueryMapper;
import com.zy.common.model.MatDto;
import com.zy.common.service.CommonService;
import com.zy.core.CrnThread;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.LedSlave;
import com.zy.core.model.command.LedCommand;
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.LedThread;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@@ -33,6 +37,8 @@
    @Autowired
    private ReportQueryMapper reportQueryMapper;
    @Autowired
    private SlaveProperties slaveProperties;
    /**
     * 获取当前时间
@@ -44,77 +50,15 @@
        calendar.setTime(now);
        return R.ok(
                Cools.add("year", calendar.get(Calendar.YEAR))
                .add("month", CommonService.zerofill(String.valueOf(calendar.get(Calendar.MONTH)+1), 2))
                .add("day", CommonService.zerofill(String.valueOf(calendar.get(Calendar.DATE)), 2))
                .add("hour", CommonService.zerofill(String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)), 2))
                .add("minute", CommonService.zerofill(String.valueOf(calendar.get(Calendar.MINUTE)), 2))
                .add("second", CommonService.zerofill(String.valueOf(calendar.get(Calendar.SECOND)) , 2))
                .add("week", WEEK[calendar.get(Calendar.DAY_OF_WEEK)-1])
                        .add("month", CommonService.zerofill(String.valueOf(calendar.get(Calendar.MONTH)+1), 2))
                        .add("day", CommonService.zerofill(String.valueOf(calendar.get(Calendar.DATE)), 2))
                        .add("hour", CommonService.zerofill(String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)), 2))
                        .add("minute", CommonService.zerofill(String.valueOf(calendar.get(Calendar.MINUTE)), 2))
                        .add("second", CommonService.zerofill(String.valueOf(calendar.get(Calendar.SECOND)) , 2))
                        .add("week", WEEK[calendar.get(Calendar.DAY_OF_WEEK)-1])
        );
    }
    /**
     * 获取其他信息
     */
    @GetMapping("/other")
    public R monitorOther(@RequestParam("crnId") Integer crnId, @RequestParam("ledId") Integer ledId) {
        Double xSpeed = 0.0D;
        Double ySpeed = 0.0D;
        Double zSpeed = 0.0D;
        Short forkPos = 1;
        Double xDistance = 0.0D;
        Double yDistance = 0.0D;
        Double xDuration = 0.0D;
        Double yDuration = 0.0D;
        if (null != crnId) {
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnId);
            if (crnThread != null) {
                CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                if (crnProtocol != null) {
                    xSpeed = Double.valueOf(crnProtocol.getXSpeed());
                    ySpeed = Double.valueOf(crnProtocol.getYSpeed());
                    zSpeed = Double.valueOf(crnProtocol.getZSpeed());
                    switch (crnProtocol.getForkPos()) {
                        case 0:
                            forkPos = 1;
                            break;
                        case 1:
                            forkPos = 2;
                            break;
                        case 2:
                            forkPos = 0;
                            break;
                        default:
                            forkPos = 1;
                            break;
                    }
                    xDistance = Double.valueOf(crnProtocol.getXDistance());
                    yDistance = Double.valueOf(crnProtocol.getYDistance());
                    xDuration = Double.valueOf(crnProtocol.getXDuration());
                    yDuration = Double.valueOf(crnProtocol.getYDuration());
                }
            }
        }
        // 获取输送线plc线程
        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, ledId);
        String ledContent = ledThread.getWorkNos().toString();
//        ledContent = "ask的模块萨满大算了萨满大了\n 是窘境到埃及嗲家嗲\n 萨达姆打开萨满大凯撒麦当劳萨满大老师";
        return R.ok(
                Cools.add("xSpeed", Arith.multiplys(1, Math.abs(xSpeed), 1)) // 行走速度
                .add("ySpeed", Arith.multiplys(1, Math.abs(ySpeed), 1))  // 升降速度
                .add("zSpeed", Arith.multiplys(1, Math.abs(zSpeed), 1))  // 叉牙速度
                .add("forkPos", forkPos)  // 叉牙速度
                .add("xDistance", Arith.multiplys(1, Math.abs(xDistance), 1))    // 累计走行距离km
                .add("yDistance", Arith.multiplys(1, Math.abs(yDistance), 1))   // 累计升降距离km
                .add("xDuration", Arith.multiplys(1, Math.abs(xDuration), 1))    // 累计走行时长h
                .add("yDuration", Arith.multiplys(1, Math.abs(yDuration), 1))    // 累计升降时长h
                .add("isShow", !Cools.isEmpty(ledContent)) // 是否显示内容
                .add("content", ledContent) // 显示内容
        );
    }
    /**
     * 入库报表 -- 折线图
@@ -132,145 +76,6 @@
        List<Map<String, Object>> pakoutRep = reportQueryMapper.queryPakinRep();
        return R.ok(pakinRep);
    }
    @GetMapping("/line/charts")
    public R locIoLineCharts(){
        Map<String,Object> map=new HashMap<String, Object>();
        List<AxisBean> list = new ArrayList<AxisBean>();
        List<WorkChartAxis> listChart = reportQueryMapper.getChartAxis();
        if(listChart!=null) {
            ArrayList<Integer> data1 = new ArrayList<Integer>();
            ArrayList<Integer> data2 = new ArrayList<Integer>();
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, -12);
            for(int i=0;i<12;i++) {
                boolean flag = true;
                calendar.add(Calendar.DATE, 1);
                String str = sf.format(calendar.getTime());
                for(WorkChartAxis workChart : listChart) {
                    if(str.equals(workChart.getYmd())) {
                        data1.add(workChart.getInqty());
                        data2.add(workChart.getOutqty());
                        flag = false;
                        break;
                    }
                }
                if(flag) {
                    data1.add(0);
                    data2.add(0);
                }
            }
            AxisBean inqty = new AxisBean();
            inqty.setName("入库数量");
            Integer[] array1 = new Integer[data1.size()];
            inqty.setData(data1.toArray(array1));
            list.add(inqty);
            AxisBean outqty = new AxisBean();
            outqty.setName("出库数量");
            Integer[] array2 = new Integer[data2.size()];
            outqty.setData(data2.toArray(array2));
            list.add(outqty);
        }
        map.put("rows",list);
        return R.ok(map);
    }
    /**
     * 库位使用情况统计
     */
    @GetMapping("/loc/rep")
    public R monitorLocRep(){
        List<Map<String, Object>> pie = new ArrayList<>();
        LocChartPie locUseRate = reportQueryMapper.getLocUseRate();
        if(locUseRate!=null) {
            Map<String, Object> map = new HashMap<>();
            map.put("name", "在库");
            map.put("value", locUseRate.getFqty());
            pie.add(map);
            Map<String, Object> map1 = new HashMap<>();
            map1.put("name", "空");
            map1.put("value", locUseRate.getOqty());
            pie.add(map1);
            Map<String, Object> map2 = new HashMap<>();
            map2.put("name", "使用");
            map2.put("value", locUseRate.getUqty());
            pie.add(map2);
            Map<String, Object> map3 = new HashMap<>();
            map3.put("name", "禁用");
            map3.put("value", locUseRate.getXqty());
            pie.add(map3);
        }
        // 总库位数
        Integer total = (int) Arith.add(0, locUseRate.getFqty(), locUseRate.getOqty(), locUseRate.getUqty(), locUseRate.getXqty());
        // 使用中
        Integer used = locUseRate.getFqty() + locUseRate.getUqty();
        // 库位使用率
        double usedDivides = Arith.divides(3, used, total);
        double usedPr = Arith.multiplys(1, usedDivides, 100);
        return R.ok(
                Cools.add("pie", pie)
                .add("stockCunt", locUseRate.getFqty())
                .add("emptyCount", locUseRate.getOqty())
                .add("noneCount", locUseRate.getXqty())
                .add("total", total)
                .add("used", used)
                .add("usedPr", usedPr)
        );
    }
    /**
     * 自动补零
@@ -345,6 +150,209 @@
    }
    /*****  电视APP相关接口   ******/
    @GetMapping("/led/error")
    public R monitorLedError(@RequestParam("ledId") Integer ledId) {
        String errorMsg = "";
        for (LedSlave slave : slaveProperties.getLed()) {
            if (slave.getStaArr().contains(ledId)) {
                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, slave.getId());
                if (null != ledThread) {
                    errorMsg = ledThread.getErrorMsg().toString();
                }
            }
        }
        return R.ok().add(errorMsg);
    }
    @GetMapping("/line/charts")
    public R locIoLineCharts(){
        Map<String,Object> map=new HashMap<String, Object>();
        List<AxisBean> list = new ArrayList<AxisBean>();
        List<WorkChartAxis> listChart = reportQueryMapper.getChartAxis();
        if(listChart!=null) {
            ArrayList<Integer> data1 = new ArrayList<Integer>();
            ArrayList<Integer> data2 = new ArrayList<Integer>();
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, -12);
            for(int i=0;i<12;i++) {
                boolean flag = true;
                calendar.add(Calendar.DATE, 1);
                String str = sf.format(calendar.getTime());
                for(WorkChartAxis workChart : listChart) {
                    if(str.equals(workChart.getYmd())) {
                        data1.add(workChart.getInqty());
                        data2.add(workChart.getOutqty());
                        flag = false;
                        break;
                    }
                }
                if(flag) {
                    data1.add(0);
                    data2.add(0);
                }
            }
            AxisBean inqty = new AxisBean();
            inqty.setName("入库数量");
            Integer[] array1 = new Integer[data1.size()];
            inqty.setData(data1.toArray(array1));
            list.add(inqty);
            AxisBean outqty = new AxisBean();
            outqty.setName("出库数量");
            Integer[] array2 = new Integer[data2.size()];
            outqty.setData(data2.toArray(array2));
            list.add(outqty);
        }
        map.put("rows",list);
        return R.ok(map);
    }
    /**
     * 库位使用情况统计
     */
    @GetMapping("/loc/rep")
    public R monitorLocRep(){
        List<Map<String, Object>> pie = new ArrayList<>();
        LocChartPie locUseRate = reportQueryMapper.getLocUseRate();
        if(locUseRate!=null) {
            Map<String, Object> map = new HashMap<>();
            map.put("name", "在库");
            map.put("value", locUseRate.getFqty());
            pie.add(map);
            Map<String, Object> map1 = new HashMap<>();
            map1.put("name", "空");
            map1.put("value", locUseRate.getOqty());
            pie.add(map1);
            Map<String, Object> map2 = new HashMap<>();
            map2.put("name", "使用");
            map2.put("value", locUseRate.getUqty());
            pie.add(map2);
            Map<String, Object> map3 = new HashMap<>();
            map3.put("name", "禁用");
            map3.put("value", locUseRate.getXqty());
            pie.add(map3);
        }
        // 总库位数
        Integer total = (int) Arith.add(0, locUseRate.getFqty(), locUseRate.getOqty(), locUseRate.getUqty(), locUseRate.getXqty());
        // 使用中
        Integer used = locUseRate.getFqty() + locUseRate.getUqty();
        // 库位使用率
        double usedDivides = Arith.divides(3, used, total);
        double usedPr = Arith.multiplys(1, usedDivides, 100);
        return R.ok(
                Cools.add("pie", pie)
                        .add("stockCunt", locUseRate.getFqty())
                        .add("emptyCount", locUseRate.getOqty())
                        .add("noneCount", locUseRate.getXqty())
                        .add("total", total)
                        .add("used", used)
                        .add("usedPr", usedPr)
        );
    }
    /**
     * 获取其他信息
     */
    @GetMapping("/led")
    public R monitorLed(@RequestParam("ledId") Integer ledId) {
        String ledContent = "";
        List<LedCommand> commandList = null;
        for (LedSlave slave : slaveProperties.getLed()) {
            if (slave.getStaArr().contains(ledId)) {
                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, slave.getId());
                if (null != ledThread) {
                    ledContent = ledThread.getStringBuffer().toString();
                    commandList = ledThread.getCommandList();
                }
            }
        }
//        MatDto matDto = new MatDto();
//        matDto.setMatNo("1111");
//        matDto.setCount(100.0);
//        matDto.setMaknx("测试用料");
//        LedCommand ledCommand = new LedCommand();
//        ledCommand.setStaNo(8);
//        ledCommand.setTitle("入库启动");
//        ledCommand.setLocNo("0100101");
//        ledCommand.setWorkNo(9998);
//        ledCommand.setEmptyMk(false);
//        ledCommand.setIoType(1);
//        ledCommand.setSourceStaNo(15);
//        ArrayList<MatDto> matDtos = new ArrayList<>();
//        matDtos.add(matDto);
//        ledCommand.setMatDtos(matDtos);
//        ArrayList<LedCommand> ledCommands = new ArrayList<>();
//        ledCommands.add(ledCommand);
//        return R.ok(ledCommands);
        return R.ok().add(commandList);
    }
    /**
     * 获取其他信息
     */
    @GetMapping("/other")
    public R monitorOther(@RequestParam("crnId") Integer crnId, @RequestParam("ledId") Integer ledId) {
        Double xSpeed = 0.0D;
        Double ySpeed = 0.0D;
        Double zSpeed = 0.0D;
        Short forkPos = 1;
        Double xDistance = 0.0D;
        Double yDistance = 0.0D;
        Double xDuration = 0.0D;
        Double yDuration = 0.0D;
        if (null != crnId) {
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnId);
            if (crnThread != null) {
                CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                if (crnProtocol != null) {
                    xSpeed = Double.valueOf(crnProtocol.getXSpeed());
                    ySpeed = Double.valueOf(crnProtocol.getYSpeed());
                    zSpeed = Double.valueOf(crnProtocol.getZSpeed());
                    switch (crnProtocol.getForkPos()) {
                        case 0:
                            forkPos = 1;
                            break;
                        case 1:
                            forkPos = 2;
                            break;
                        case 2:
                            forkPos = 0;
                            break;
                        default:
                            forkPos = 1;
                            break;
                    }
                    xDistance = Double.valueOf(crnProtocol.getXDistance());
                    yDistance = Double.valueOf(crnProtocol.getYDistance());
                    xDuration = Double.valueOf(crnProtocol.getXDuration());
                    yDuration = Double.valueOf(crnProtocol.getYDuration());
                }
            }
        }
//        ledContent = "ask的模块萨满大算了萨满大了\n 是窘境到埃及嗲家嗲\n 萨达姆打开萨满大凯撒麦当劳萨满大老师";
        return R.ok(
                Cools.add("xSpeed", Arith.multiplys(1, Math.abs(xSpeed), 1)) // 行走速度
                        .add("ySpeed", Arith.multiplys(1, Math.abs(ySpeed), 1))  // 升降速度
                        .add("zSpeed", Arith.multiplys(1, Math.abs(zSpeed), 1))  // 叉牙速度
                        .add("forkPos", forkPos)  // 叉牙速度
                        .add("xDistance", Arith.multiplys(1, Math.abs(xDistance), 1))    // 累计走行距离km
                        .add("yDistance", Arith.multiplys(1, Math.abs(yDistance), 1))   // 累计升降距离km
                        .add("xDuration", Arith.multiplys(1, Math.abs(xDuration), 1))    // 累计走行时长h
                        .add("yDuration", Arith.multiplys(1, Math.abs(yDuration), 1))    // 累计升降时长h
        );
    }
}
src/main/java/com/zy/asrs/controller/RgvController.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.annotations.ManagerAuth;
import com.core.common.Arith;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.domain.enums.RgvStatusType;
@@ -14,6 +15,7 @@
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.service.impl.MainServiceImpl;
import com.zy.asrs.utils.VersionUtils;
import com.zy.core.Slave;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.cache.SlaveConnection;
@@ -26,6 +28,7 @@
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.RgvThread;
import com.zy.core.thread.ScaleThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@@ -321,4 +324,26 @@
        return false;
    }
    @PostMapping("/console/rgv/site/data")
    @ManagerAuth(memo = "小车实时位置")
    public R scaleLatestData(){
        List<Map> result = new ArrayList<>();
        for (RgvSlave rgv : slaveProperties.getRgv()) {
            // 获取RGV信息
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
            if (rgvThread == null) {
                throw new CoolException("RGV不在线");
            }
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                throw new CoolException("RGV不在线");
            }
            Map<String, Object> rgvMap = new HashMap<>();
            rgvMap.put("title", rgvProtocol.getRgvPosI());
            rgvMap.put("id", rgvProtocol.getRgvNo());
            result.add(rgvMap);
        }
        return R.ok().add(result);
    }
}
src/main/java/com/zy/asrs/entity/WrkMastSta.java
@@ -122,7 +122,7 @@
    public WrkMastSta() {}
    public WrkMastSta(Date now, Integer staStart) {
        this.wrkNo = staStart.longValue()+9999;
        this.wrkNo = staStart.longValue()+19999;
        this.wrkStart = staStart;
        this.wrkEnd = staStart;
        this.staStart = staStart;
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -57,6 +57,8 @@
//    @Select("select top 1 * from dbo.asr_wrk_mast where source_sta_no=#{sourceStaNo} and wrk_sts=12 and io_type>100 order by io_pri desc,io_time desc,wrk_no ASC")
    WrkMast selectPakOutStep2(@Param("sourceStaNo")Integer sourceStaNo);
    WrkMast selectPakOutStep3(@Param("sourceStaNo")Integer sourceStaNo);
    // 库位移转工作档,在进行一次入出库作业后紧跟库位移转
//    @Select("select top 1 * from dbo.asr_wrk_mast where wrk_sts=11 and (io_type=11 or io_type=110) and crn_no=#{crnNo} order by io_time,wrk_no")
    WrkMast selectLocMove(@Param("crnNo")Integer crnNo);
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -196,6 +196,9 @@
                        if (jsonObject.getInteger("code").equals(200)) {
                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
                            barcodeThread.setBarcode("");
                            staProtocol.setWorkNo(dto.getWorkNo());
@@ -3125,9 +3128,16 @@
                // 只有当RGV空闲、自动,工位二有物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                        &&  (rgvProtocol.getLoaded2()==2  || rgvProtocol.getLoaded2()==3 ) ////0 无物;1 一层无物二层有物  ;2一层有物二层无物 (只能满放);3  1、2层都有物
                ) {
                    try {
                        WrkMast wrkMast1 = wrkMastMapper.selectPakOutStep3(122);
                        if (!Cools.isEmpty(wrkMast1)){
                            continue;
                        }
                        // 获取空板入库站信息
                        SearchLocParam param = new SearchLocParam();
@@ -3148,7 +3158,7 @@
                            if (!Cools.isEmpty(wrkMast) && wrkMast.getIoType()==10 && wrkMast.getWrkSts()==2){
                                WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(wrkMast.getWrkNo().longValue());
                                if (Cools.isEmpty(wrkMastSta)){
                                    WrkMastSta wrkMastSta1 = new WrkMastSta(new Date(),0);
                                    WrkMastSta wrkMastSta1 = new WrkMastSta(new Date(),wrkMast.getStaNo());
                                    wrkMastSta1.setWrkNo(wrkMast.getWrkNo().longValue());
                                    wrkMastSta1.setType(2);
                                    wrkMastSta1.setWrkType(6);//工作类型  1:取(叠盘)  2:拆盘  3:取放 5:满取  6:满放
@@ -3235,7 +3245,7 @@
//                ledCommand.setSourceStaNo(wrkMast.getSourceStaNo());
                if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) {
                    List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo());
                    wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getAnfme())));
                    wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl)));
                }
                commands.add(ledCommand);
            }
@@ -4430,7 +4440,7 @@
                            continue;
                        }
                        boolean sign = false;
                        if (wrkMastSta.getStaStart()==0 && wrkMastSta.getStaEnd()!=0){//满放
                        if ( wrkMastSta.getStaEnd()!=0){//满放
                            sign = rgvPutEmptyFull(rgvProtocol.getRgvNo(),wrkMastSta);
                        }else {
                            continue;
src/main/java/com/zy/common/model/MatDto.java
@@ -1,5 +1,6 @@
package com.zy.common.model;
import com.zy.asrs.entity.WrkDetl;
import lombok.Data;
/**
@@ -8,11 +9,20 @@
@Data
public class MatDto {
    // 物料编号
    // 物料编号  规格
    private String matNo;
    // 物料名称
    // 物料名称  规格
    private String maknx;
    //规格
    private String specs;
    //箱号
    private String batch;
    //批次
    private String model;
    // 物料数量
    private Double count;
@@ -25,4 +35,17 @@
        this.maknx = maknx;
        this.count = count;
    }
    public MatDto(String matNo, String maknx, String specs, Double count) {
        this.matNo = matNo;
        this.maknx = maknx;
        this.count = count;
    }
    public MatDto(WrkDetl wrkDetl) {
        this.matNo = wrkDetl.getMatnr();
        this.maknx = wrkDetl.getMaktx();
        this.specs = wrkDetl.getMatnr();
        this.batch = wrkDetl.getBatch();
        this.count = wrkDetl.getAnfme();
    }
}
src/main/java/com/zy/core/ServerBootstrap.java
@@ -32,6 +32,8 @@
    @Autowired
    private MainProcess mainProcess;
    int CRN_COUNT = 0;
    public static final Map<CrnThread, Thread> map = new ConcurrentHashMap<>();
@@ -142,13 +144,15 @@
        @Scheduled(cron = "0/3 * * * * ? ")
        public void kill() {
            int i = 0;
            for (Map.Entry<CrnThread, Thread> entry : map.entrySet()) {
                i++;
                CRN_COUNT++;
                SiemensCrnThread key = (SiemensCrnThread) entry.getKey();
//                System.out.println("第"+i+"个堆垛机线程重启线程条件:"+(System.currentTimeMillis() - key.getSign()));
                if (System.currentTimeMillis() - key.getSign() > 120000) {
                    System.out.println("第"+i+"个堆垛机线程被重启");
                if (CRN_COUNT>10000){
                    continue;
                }
                if (System.currentTimeMillis() - key.getSign() > 120000 && System.currentTimeMillis() - key.getSign()<1200000) {
                    System.out.println("第"+CRN_COUNT+"个堆垛机线程被重启");
                    // 请求线程安全停止
                    key.requestStop();
src/main/java/com/zy/core/model/DevpSlave.java
@@ -41,6 +41,8 @@
        private Integer barcode;
        private Integer led;
    }
}
src/main/resources/application.yml
@@ -36,7 +36,7 @@
  enable: false
wms:
  url: localhost:8080/hswms
  url: localhost:8080/jtwms
# 下位机配置
wcs-slave:
@@ -414,10 +414,12 @@
    inSta[0]:
      staNo: 217
      barcode: ${wcs-slave.barcode[0].id}
      led: ${wcs-slave.led[1].id}
    # 入库口1
    inSta[1]:
      staNo: 221
      barcode: ${wcs-slave.barcode[1].id}
      led: ${wcs-slave.led[2].id}
    # WMS入库口1
    inWmsSta[0]:
      staNo: 212
src/main/resources/mapper/WrkMastMapper.xml
@@ -126,6 +126,10 @@
        select top 1 * from dbo.asr_wrk_mast where source_sta_no=#{sourceStaNo} and wrk_sts=12 and io_type>100 order by io_pri desc,io_time desc,wrk_no ASC
    </select>
    <select id="selectPakOutStep3" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where source_sta_no=#{sourceStaNo} and wrk_sts=2 and io_type=10
    </select>
    <select id="selectLocMove" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where wrk_sts=11 and io_type=11 and crn_no=#{crnNo} order by io_time,wrk_no
    </select>
src/main/webapp/views/console.html
@@ -462,6 +462,8 @@
    getSystemRunningStatus();
    getBarcodeInfo();
    getScaleInfo();
    // carAnimate();
    carAnimate2();
    // 实时访问
    setInterval(function () {
        getCrnInfo();
@@ -772,6 +774,26 @@
        $(siteId).animate({top: sitePosition[staNo]}, 1000);
    }
    moveSite("#site-1", 117);//测试移动方法,可删除
    // moveSite("#site-1", 117);//测试移动方法,可删除
    // Rgv实时数据获取
    function carAnimate2() {
        // console.log("1=============1")
        $.ajax({
            url: baseUrl + "/console/rgv/site/data",
            headers: {'token': localStorage.getItem('token')},
            method: 'POST',
            success: function (res) {
                if (res.code === 200) {
                    var rgvMap = res.data;
                    for (var i = 0; i < rgvMap.length; i++) {
                        moveSite("#site-"+rgvMap[i].id, rgvMap[i].title);
                    }
                } else {
                    console.log(res.msg);
                }
            }
        });
    }
</script>