自动化立体仓库 - WCS系统
1ec7833aff728861936180a7e1159373272d9e2b..f11edf2a41cd186ce46581f0b72ebccfc650674f
3 天以前 zc
初步调试
f11edf 对比 | 目录
3 天以前 zc
初步调试
8e6af2 对比 | 目录
3 天以前 zc
初步调试
f0a87e 对比 | 目录
3 天以前 zc
初步调试
4ea361 对比 | 目录
3 天以前 zc
初步调试
58eaf5 对比 | 目录
3 天以前 ZY
还没有写完
5ca00e 对比 | 目录
5个文件已添加
5个文件已修改
771 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/TVController.java 471 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/dto/AxisBean.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/dto/LocChartPie.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/dto/MatDto.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/dto/WorkChartAxis.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 86 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/FyDevpThread.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/NormalLedThread.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/TVController.java
New file
@@ -0,0 +1,471 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Arith;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.domain.dto.AxisBean;
import com.zy.asrs.domain.dto.WorkChartAxis;
import com.zy.asrs.domain.dto.LocChartPie;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.BasShuttle;
import com.zy.asrs.entity.BasShuttleErr;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.mapper.ReportQueryMapper;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.BasShuttleErrService;
import com.zy.asrs.service.BasShuttleService;
import com.zy.asrs.service.WrkMastService;
import com.zy.common.model.MatDto;
import com.zy.common.model.SearchLocParam;
import com.zy.common.service.CommonService;
import com.zy.common.utils.HttpHandler;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.LedSlave;
import com.zy.core.model.ShuttleSlave;
import com.zy.core.model.command.LedCommand;
import com.zy.core.model.protocol.ShuttleProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.LedThread;
import com.zy.core.thread.ShuttleThread;
import com.zy.core.thread.impl.NormalLedThread;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * Created by vincent on 2020/11/16
 */
@RestController
@RequestMapping("/monitor")
public class TVController {
    private static final String[] WEEK = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
    @Autowired
    private ReportQueryMapper reportQueryMapper;
    @Autowired
    private BasDevpService basDevpService;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private BasShuttleService shuttleService;
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private BasShuttleErrService basShuttleErrService;
    @Value("${asrs.wmsUrl}")
    private String wmsUrl;
    /**
     * 获取当前时间
     */
    @GetMapping("/date")
    public R monitorDate() {
        Date now = new Date();
        Calendar calendar = Calendar.getInstance();
        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])
        );
    }
    /**
     * 获取其他信息
     */
    @GetMapping("/other")
    public R monitorOther(@RequestParam("crnId") Integer crnId, @RequestParam("ledId") Integer sta) {
        return R.ok(
                Cools.add("xSpeed", Arith.multiplys(1, 0, 1)) // 行走速度
                        .add("ySpeed", Arith.multiplys(1, 60, 1))  // 升降速度
                        .add("zSpeed", Arith.multiplys(1, 30, 1))  // 叉牙速度
                        .add("forkPos", 25)  // 叉牙速度
                        .add("xDistance", Arith.multiplys(1, 0, 1))    // 累计走行距离km
                        .add("yDistance", Arith.multiplys(1, 5, 1))   // 累计升降距离km
                        .add("xDuration", Arith.multiplys(1, 0, 1))    // 累计走行时长h
                        .add("yDuration", Arith.multiplys(1, 2, 1))    // 累计升降时长h
                        .add("isShow", !Cools.isEmpty(1)) // 是否显示内容
                        .add("content", 1) // 显示内容
        );
    }
    /**
     * 入库报表 -- 折线图
     */
    @GetMapping("/pakin/rep")
    public R monitorPakinRep() {
        // 入库
        List<Map<String, Object>> pakinRep = reportQueryMapper.queryPakinRep();
        for (Map<String, Object> map : pakinRep) {
            if (map.get("node") != null) {
                map.put("node", String.valueOf(map.get("node")).substring(5, 10));
            }
        }
        // 出库
        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)
        );
    }
    /**
     * 获取其他信息
     */
    @GetMapping("/led")
    public R monitorLed(@RequestParam("ledId") Integer ledId) {
        int dev_no = 1012;
        if (ledId == 1) {
            dev_no = 1012;
        } else if (ledId == 2) {
            dev_no = 1014;
        } else if (ledId == 3) {
            dev_no = 1022;
        } else if (ledId == 4) {
            dev_no = 1025;
        }
        BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", dev_no));
        if (Cools.isEmpty(basDevp)) {
            return R.ok();
        }
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wms_wrk_no", basDevp.getWrkNo()));
        if (Cools.isEmpty(wrkMast)) {
            return R.ok();
        }
        List<LedCommand> commands = new ArrayList<>();
        // 组装命令
        LedCommand ledCommand = new LedCommand();
        ledCommand.setWorkNo(wrkMast.getWmsWrkNo());
        ledCommand.setIoType(wrkMast.getIoType());
        // 出库模式
        switch (wrkMast.getIoType()) {
            case 1:
                ledCommand.setTitle("全板入库");
                break;
            case 10:
                ledCommand.setTitle("空板入库");
                break;
            case 101:
                ledCommand.setTitle("全板出库");
                break;
            case 103:
                ledCommand.setTitle("拣料出库");
                break;
            case 104:
                ledCommand.setTitle("并板出库");
                break;
            case 107:
                ledCommand.setTitle("盘点出库");
                break;
            case 110:
                ledCommand.setTitle("空板出库");
                ledCommand.setEmptyMk(true);
                break;
            case 53:
                ledCommand.setTitle("拣料入库");
                break;
            case 57:
                ledCommand.setTitle("盘点入库");
                break;
            case 54:
                ledCommand.setTitle("并板入库");
                break;
            default:
                break;
        }
        ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
        ledCommand.setLocNo(wrkMast.getLocNo());
        ledCommand.setStaNo(wrkMast.getStaNo());
        if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) {
            Map<String, Object> param = new HashMap<>();
            param.put("taskNo", wrkMast.getWmsWrkNo());
            param.put("sta", wrkMast.getStaNo());
            String response = null;
            try {
                response = new HttpHandler.Builder()
                        .setUri(wmsUrl)
                        .setPath("/rpc/led/getTask2")
                        .setJson(JSON.toJSONString(param))
                        .build()
                        .doPost();
            } catch (IOException e) {
                e.printStackTrace();
            }
            JSONObject jsonObject = JSON.parseObject(response);
            Integer code = jsonObject.getInteger("code");
            if (code.equals(200)) {
                String data = jsonObject.getString("data");
                List<LedCommand> wrkDetls = JSONArray.parseArray(data, LedCommand.class);
                commands.addAll(wrkDetls);
            }
        }
        return R.ok().add(commands);
    }
    /**
     * 异常通知
     */
    @GetMapping("/led/error")
    public R monitorLedError(@RequestParam("ledId") Integer ledId) {
        String errorMsg = "";
        for (LedSlave slave : slaveProperties.getLed()) {
            if (slave.getId() == ledId) {
                NormalLedThread ledThread = (NormalLedThread) SlaveConnection.get(SlaveType.Led, slave.getId());
                if (null != ledThread) {
                    errorMsg = ledThread.getErrorMsg().toString();
                }
            }
        }
        return R.ok().add(errorMsg);
    }
    /**
     * 异常通知
     */
//    @GetMapping("/led/error")
//    public R monitorLedError(@RequestParam("ledId") Integer ledId) {
//        int dev_no = 1012;
//        if (ledId == 1) {
//            dev_no = 1012;
//        } else if (ledId == 2) {
//            dev_no = 1014;
//        } else if (ledId == 3) {
//            dev_no = 1022;
//        } else if (ledId == 4) {
//            dev_no = 1025;
//        }
//        BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", dev_no));
//        if (Cools.isEmpty(basDevp)) {
//            return R.ok();
//        }
//        if (Cools.isEmpty(basDevp.getArea())) {
//            return R.ok();
//        }
//        if (basDevp.getLoading().equals("N")) {
//            basDevp.setArea("");
//            basDevpService.updateById(basDevp);
//            return R.ok();
//        }
//        String errorMsg = basDevp.getArea();
//
//        return R.ok().add(errorMsg);
//    }
    /**
     * 设备异常通知
     */
    @GetMapping("/device/error")
    public R monitorDeviceError() {
        ArrayList<HashMap<String, Object>> list = new ArrayList<>();
        for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) {
            // 获取四向穿梭车信息
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleSlave.getId());
            if (shuttleThread == null) {
                continue;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                continue;
            }
            HashMap<String, Object> map = new HashMap<>();
            int i = Integer.parseInt(shuttleProtocol.getErrorCode());
            if (i > 0) {
                BasShuttleErr basShuttleErr = basShuttleErrService.queryByCode(i);
                String errName = basShuttleErr == null ? "未知异常" : basShuttleErr.getErrName();
                //故障中
                map.put("deviceNo", shuttleProtocol.getShuttleNo());//设备号-小车号
                map.put("errorMsg", errName);//异常信息
                map.put("device", "四向车");//异常信息
                list.add(map);
            }
        }
        return R.ok().add(list);
    }
    /**
     * 自动补零
     */
    private List<Map<String, Object>> fill(List<Map<String, Object>> list, int start, int end) {
        for (int i = start; i <= end; i++) {
            boolean exist = false;
            for (Map seq : list) {
                if (Integer.parseInt(String.valueOf(seq.get("node"))) == i) {
                    exist = true;
                }
            }
            if (!exist) {
                HashMap<String, Object> map = new HashMap<>();
                map.put("node", i);
                map.put("val", 0);
                list.add(map);
            }
        }
        list.sort(Comparator.comparingInt(o -> (int) o.get("node")));
        return list;
    }
    /**
     * x轴单位转换
     *
     * @param dot y轴数值保留小数位
     */
    private List<Map<String, Object>> convert(List<Map<String, Object>> list, StatsType statsType, int dot) {
        for (Map<String, Object> map : list) {
            Object val = map.get("val");
            map.put("val", Arith.multiplys(dot, 1, (Number) val));
            Object node = map.get("node");
            switch (statsType) {
                case MONTH:
                    map.put("node", node + "号");
                    break;
                case YEAR:
                    map.put("node", node + "月");
                    break;
                default:
                    break;
            }
        }
        return list;
    }
    enum StatsType {
        YEAR(1, 1, 12),
        MONTH(2, 1, 30),
        ;
        int id;
        int start;
        int end;
        StatsType(int id, int start, int end) {
            this.id = id;
            this.start = start;
            this.end = end;
        }
        static StatsType get(int id) {
            StatsType[] values = StatsType.values();
            for (StatsType statsType : values) {
                if (statsType.id == id) {
                    return statsType;
                }
            }
            throw new RuntimeException("找不到StatsType类型");
        }
    }
}
src/main/java/com/zy/asrs/domain/dto/AxisBean.java
New file
@@ -0,0 +1,24 @@
package com.zy.asrs.domain.dto;
/**
 * 曲线图表json键
 * @author admin
 *
 */
public class AxisBean {
    private String name;
    private Integer[] data;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer[] getData() {
        return data;
    }
    public void setData(Integer[] data) {
        this.data = data;
    }
}
src/main/java/com/zy/asrs/domain/dto/LocChartPie.java
New file
@@ -0,0 +1,37 @@
package com.zy.asrs.domain.dto;
/**
 * 库位占用百分比
 * @author admin
 * @date 2018年12月12日
 */
public class LocChartPie {
    private int fqty;
    private int oqty;
    private int uqty;
    private int xqty;
    public int getFqty() {
        return fqty;
    }
    public void setFqty(int fqty) {
        this.fqty = fqty;
    }
    public int getOqty() {
        return oqty;
    }
    public void setOqty(int oqty) {
        this.oqty = oqty;
    }
    public int getUqty() {
        return uqty;
    }
    public void setUqty(int uqty) {
        this.uqty = uqty;
    }
    public int getXqty() {
        return xqty;
    }
    public void setXqty(int xqty) {
        this.xqty = xqty;
    }
}
src/main/java/com/zy/asrs/domain/dto/MatDto.java
New file
@@ -0,0 +1,80 @@
package com.zy.asrs.domain.dto;
import lombok.Data;
/**
 * Created by vincent on 2020/8/6
 */
@Data
public class MatDto {
    // 物料编号
    private String matnr;
    // 物料名称
    private String maknx;
    private String batch;
    private String specs;
    // 客户信息
    private String manu;
    // 备注
    private String memo;
    // 物料数量
    private Double count;
    private Double total;
    private String orderNo;
    private String customer;
    public MatDto() {
    }
    public MatDto(String matnr, String maknx, String batch, String specs, String manu, String memo, Double count, Double total) {
        this.matnr = matnr;
        this.maknx = maknx;
        this.batch = batch;
        this.specs = specs;
        this.manu = manu;
        this.memo = memo;
        this.count = count;
        this.total = total;
    }
    public MatDto(String matnr, String maknx, String batch, String specs, String manu, String memo, Double count, Double total, String orderNo, String customer) {
        this.matnr = matnr;
        this.maknx = maknx;
        this.batch = batch;
        this.specs = specs;
        this.manu = manu;
        this.memo = memo;
        this.count = count;
        this.total = total;
        this.orderNo = orderNo;
        this.customer = customer;
    }
    public MatDto(String matNo, String maknx, Double count) {
        this.matnr = matNo;
        this.maknx = maknx;
        this.count = count;
    }
    public MatDto(String matNo, String maknx, Double count, String specs) {
        this.specs = specs;
        this.matnr = matNo;
        this.maknx = maknx;
        this.count = count;
    }
    public MatDto(String matNo, String maknx, Double count, Double total, String specs) {
        this.specs = specs;
        this.matnr = matNo;
        this.maknx = maknx;
        this.count = count;
        this.total = total;
    }
}
src/main/java/com/zy/asrs/domain/dto/WorkChartAxis.java
New file
@@ -0,0 +1,31 @@
package com.zy.asrs.domain.dto;
/**
 * 入出库统计曲线图
 * @author admin
 * @date 2018年12月12日
 */
public class WorkChartAxis {
    private String ymd;
    private int inqty;
    private int outqty;
    public String getYmd() {
        return ymd;
    }
    public void setYmd(String ymd) {
        this.ymd = ymd;
    }
    public int getInqty() {
        return inqty;
    }
    public void setInqty(int inqty) {
        this.inqty = inqty;
    }
    public int getOutqty() {
        return outqty;
    }
    public void setOutqty(int outqty) {
        this.outqty = outqty;
    }
}
src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java
@@ -1,10 +1,38 @@
package com.zy.asrs.mapper;
import com.zy.asrs.domain.dto.LocChartPie;
import com.zy.asrs.domain.dto.WorkChartAxis;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Mapper
@Repository
public interface ReportQueryMapper {
    @Select("select \n" +
            "Min(wm.io_time) as node,\n" +
            "isnull(count(1), 0) as val\n" +
            "from asr_wrk_mast_log wm\n" +
            "where wm.wrk_sts = 5 \n" +
            "and (wm.io_type = 1 OR wm.io_type = 54)\n" +
            "and datediff(d, wm.io_time, getdate())<=7 \n" +
            "group by datediff(day,wm.io_time,getdate())\n" +
            "order by Min(wm.io_time) asc\n")
    List<Map<String, Object>> queryPakinRep();
    //饼状图
    @Select("select * from asr_loc_use_view")
    public LocChartPie getLocUseRate();
    //曲线图
    @Select("select ymd,SUM(sto_qty) inqty,SUM(ret_qty) outqty from asr_sta_inout_view "
            + "where ymd>DATE_FORMAT(NOW(),'%Y-%m-%d') group by ymd order by ymd")
    public List<WorkChartAxis> getChartAxis();
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -34,6 +34,7 @@
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.DevpThread;
import com.zy.core.thread.LedThread;
import com.zy.core.thread.LiftThread;
import com.zy.core.thread.ShuttleThread;
import com.zy.core.thread.impl.FyDevpThread;
@@ -177,12 +178,41 @@
                        staProtocol = staProtocol.clone();
                    }
                    Short workNo = staProtocol.getWorkNo();
                    // 尺寸检测异常
                    boolean back = false;
                    LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
                    String errMsg = "";
                    if (!back && staProtocol.isBackErr()) {
                        errMsg = "超宽异常";
                        back = true;
                    }
                    if (!back && staProtocol.isHighErr()) {
                        errMsg = "超高异常";
                        back = true;
                    }
                    if (!back && staProtocol.isRightErr()) {
                        errMsg = "超长异常";
                        back = true;
                    }
                    if (!back && staProtocol.isWeightErr()) {
                        errMsg = "超重";
                        back = true;
                    }
                    // 退回
                    if (back) {
                        if (!staProtocol.isLoading()) {
                            continue;
                        }
                        if (!staProtocol.isPakMk()) {
                            continue;
                        }
                        // led 异常显示
                        if (ledThread != null) {
                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
                            ledThread.error(errMsg);
                        }
                    }
//                        // led 异常显示
//                        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
//                        if (ledThread != null) {
//                            ledThread.error(errMsg);
//                        }
                    // 判断是否满足入库条件
                    if (staProtocol.isAutoing() && staProtocol.isLoading() && isInEnable(devpThread, inSta.getStaNo()) && !staProtocol.isEmptyMk() && (workNo == 0 || (workNo >= 9990 && workNo <= 9999)) && staProtocol.isPakMk()) {
                        String barcode = staProtocol.getBarcode();
@@ -426,8 +456,12 @@
        ShuttleProtocol status1 = shuttleThread1.getStatus();
        ShuttleProtocol status2 = shuttleThread2.getStatus();
        List<String> loc = new ArrayList<>();
        loc.add(status1.getCurrentLocNo());
        loc.add(status2.getCurrentLocNo());
        if (status1 != null) {
            loc.add(status1.getCurrentLocNo());
        }
        if (status2 != null) {
            loc.add(status2.getCurrentLocNo());
        }
        DevpSlave devpSlave = slaveProperties.getDevp().get(0);
        // 遍历堆垛机出库站
        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devpSlave.getId());
@@ -848,7 +882,39 @@
            if (staProtocol == null) {
                return false;
            }
            int led = 1;
            if (wrkMast.getSourceStaNo() == 1022) {
                led = 3;
            } else if (wrkMast.getSourceStaNo() == 1031) {
            }
            // 尺寸检测异常
            boolean back = false;
            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led);
            String errMsg = "";
            if (!back && staProtocol.isBackErr()) {
                errMsg = "超宽异常";
                back = true;
            }
            if (!back && staProtocol.isHighErr()) {
                errMsg = "超高异常";
                back = true;
            }
            if (!back && staProtocol.isRightErr()) {
                errMsg = "超长异常";
                back = true;
            }
            if (!back && staProtocol.isWeightErr()) {
                errMsg = "超重";
                back = true;
            }
            // 退回
            if (back) {
                // led 异常显示
                if (ledThread != null) {
                    MessageQueue.offer(SlaveType.Led, led, new Task(3, errMsg));
                    ledThread.error(errMsg);
                }
            }
            if (!staProtocol.isAutoing()) {
                News.info("{}任务,{}站点,不在自动状态", wrkMast.getWrkNo(), staProtocol.getSiteId());
                return false;
@@ -1215,9 +1281,9 @@
            //获取提升机命令
            List<LiftCommand> liftCommands = liftThread.getPalletOutCommand(wrkMast.getWrkNo(), sourceLev, wrkMast.getStaNo());
            LiftCommand liftCommand = liftCommands.get(0);
            if ( wrkMast.getStaNo()==1031){
            if (wrkMast.getStaNo() == 1031) {
                liftCommand.setTaskNo(wrkMast.getWrkNo());
            }else {
            } else {
                int deviceWrk = commonService.getWorkNo(8);//生成提升机设备工作号
                liftCommand.setTaskNo(deviceWrk);//更换随机任务号
            }
src/main/java/com/zy/core/thread/impl/FyDevpThread.java
@@ -163,7 +163,7 @@
                staProtocol.setOutEnable(status[4]);// 可出
                staProtocol.setBackErr(status[5]);
                staProtocol.setLeftErr(status[6]);
                staProtocol.setHigh(status[6]);
                staProtocol.setRightErr(status[7]);
//                staProtocol.setHighErr(status[8]);
//                staProtocol.setWeightErr(status[9]);
src/main/java/com/zy/core/thread/impl/NormalLedThread.java
@@ -8,12 +8,14 @@
import com.zy.core.model.Task;
import com.zy.core.model.command.LedCommand;
import com.zy.core.thread.LedThread;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Data
@Slf4j
@SuppressWarnings("all")
public class NormalLedThread implements LedThread, Runnable {
src/main/resources/application.yml
@@ -31,7 +31,7 @@
logging:
  path: ./stock/out/@pom.build.finalName@/logs
  path: /stock/out/@pom.build.finalName@/logs
super:
  pwd: xltys1995
@@ -116,25 +116,25 @@
  # LED1
  led[0]:
    id: 1
    ip: 192.168.10.62
    ip: 192.168.10.160
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
  # LED2
  led[1]:
    id: 2
    ip: 192.168.10.63
    ip: 192.168.10.161
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
  # LED3
  led[2]:
    id: 3
    ip: 192.168.10.64
    ip: 192.168.10.162
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
  # LED4
  led[3]:
    id: 4
    ip: 192.168.10.65
    ip: 192.168.10.163
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}