894c928ebbf5c0256b3ff92315b30db47cf8fd90..976a9752aca2a0e04876a873c9fab343bcff45b7
2025-05-09 1
#
976a97 对比 | 目录
2025-05-09 1
#
3ceabb 对比 | 目录
2025-05-09 1
#
000658 对比 | 目录
2025-05-09 1
#
a09bae 对比 | 目录
2025-05-09 1
#
67809d 对比 | 目录
2025-05-09 1
#
779c4e 对比 | 目录
2025-05-09 1
#
402347 对比 | 目录
2025-05-09 1
#
e4c910 对比 | 目录
2025-05-09 1
#
45d7fb 对比 | 目录
1个文件已添加
20个文件已修改
703 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ConsoleController.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/CrnController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/RgvController.java 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/SiteController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/enums/WorkNoType.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasDevpPosition.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/TaskWrkServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnModeType.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/TaskProtocol.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/LedThread.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/ScaleThread.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasDevpPositionMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/deviceOperate/rgvOperate.html 121 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -21,6 +21,7 @@
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.DeviceErrorService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.service.impl.TaskWrkServiceImpl;
import com.zy.common.CodeRes;
import com.zy.core.CrnThread;
import com.zy.core.DevpThread;
@@ -70,6 +71,8 @@
    private DeviceErrorService deviceErrorService;
    @Autowired
    private BasCrnpService basCrnpService;
    @Autowired
    private TaskWrkServiceImpl taskWrkService;
    @PostMapping("/system/running/status")
    @ManagerAuth(memo = "系统运行状态")
@@ -151,9 +154,10 @@
                vo.setCrnStatus(CrnStatusType.MACHINE_ERROR);
            } else {
                if (crnProtocol.getTaskNo()>0) {
                    WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo());
                    if (wrkMast != null) {
                        vo.setCrnStatus(CrnStatusType.process(wrkMast.getIoType()));
                    TaskWrk taskWrk = taskWrkService.selectByWrkNo(crnProtocol.getTaskNo().intValue());
//                    WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo());
                    if (taskWrk != null) {
                        vo.setCrnStatus(CrnStatusType.process(taskWrk.getIoType()));
                    } else {
                        vo.setCrnStatus(crnProtocol.modeType.equals(CrnModeType.AUTO)? CrnStatusType.MACHINE_AUTO: CrnStatusType.MACHINE_UN_AUTO);
                    }
@@ -279,14 +283,16 @@
                    vo.setWorkNo(staProtocol.getWorkNo());   // 工作号
                    if (staProtocol.getWorkNo() > 0) {
                        WrkMast wrkMast = wrkMastService.selectById(staProtocol.getWorkNo());
                        if (wrkMast != null) {
                            vo.setWrkSts(wrkMast.getWrkSts$());   // 工作状态
                            vo.setIoType(wrkMast.getIoType$());   //  入出库类型
                            vo.setSourceStaNo(wrkMast.getSourceStaNo$());
                            vo.setStaNo(wrkMast.getStaNo$());
                            vo.setSourceLocNo(wrkMast.getSourceLocNo$());
                            vo.setLocNo(wrkMast.getLocNo$());
                        TaskWrk taskWrk = taskWrkService.selectByWrkNo(staProtocol.getWorkNo());
//                        WrkMast wrkMast = wrkMastService.selectById(staProtocol.getWorkNo());
                        if (taskWrk != null) {
                            vo.setWrkSts(taskWrk.getWrkSts$());   // 工作状态
                            vo.setIoType(taskWrk.getIoType$());   //  入出库类型
                            vo.setSourceStaNo(taskWrk.getStartPoint());
                            vo.setStaNo(taskWrk.getTargetPoint());
//                            vo.setSourceLocNo(wrkMast.getSourceLocNo$());
//                            vo.setLocNo(wrkMast.getLocNo$());
                        }
                    }
@@ -330,16 +336,12 @@
                }
                if (crnProtocol.getTaskNo() > 0) {
                    WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo());
                    if (wrkMast != null) {
                        vo.setSourceStaNo(wrkMast.getSourceStaNo$());
                        vo.setStaNo(wrkMast.getStaNo$());
                        vo.setWrkSts(wrkMast.getWrkSts$());   // 工作状态
                        vo.setIoType(wrkMast.getIoType$());   //  入出库类型
                        vo.setSourceLocNo(wrkMast.getSourceLocNo$());
                        vo.setLocNo(wrkMast.getLocNo$());
                        vo.setCrnStatus(crnProtocol.getStatusType().desc);
                        vo.setError("");    // todo
                    TaskWrk taskWrk = taskWrkService.selectByWrkNo(crnProtocol.getTaskNo().intValue());
                    if (taskWrk != null) {
                        vo.setWrkSts(taskWrk.getWrkSts$());   // 工作状态
                        vo.setIoType(taskWrk.getIoType$());   //  入出库类型
                        vo.setSourceStaNo(taskWrk.getStartPoint());
                        vo.setStaNo(taskWrk.getTargetPoint());
                    }
                }
                vo.setInEnable(basCrnp.getInEnable());//可入
src/main/java/com/zy/asrs/controller/CrnController.java
@@ -19,6 +19,7 @@
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.service.impl.MainServiceImpl;
import com.zy.asrs.service.impl.TaskWrkServiceImpl;
import com.zy.asrs.utils.CommandUtils;
import com.zy.asrs.utils.VersionUtils;
import com.zy.core.CrnThread;
@@ -72,6 +73,8 @@
    private MainServiceImpl mainService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private TaskWrkServiceImpl taskWrkService;
    @ManagerAuth(memo = "进行中的命令")
@@ -195,13 +198,12 @@
            vo.setWorkNo(crnProtocol.getTaskNo());  //  任务号
            if (crnProtocol.getTaskNo()>0) {
                WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo());
                if (wrkMast != null) {
                    vo.setStatus(CrnStatusType.process(wrkMast.getIoType()).getDesc());   //  模式状态
                    vo.setSourceStaNo(wrkMast.getSourceStaNo$());    //  源站
                    vo.setStaNo(wrkMast.getStaNo$());   //  目标站
                    vo.setSourceLocNo(wrkMast.getSourceLocNo());    //  源库位
                    vo.setLocNo(wrkMast.getLocNo());    //  目标库位
                TaskWrk taskWrk = taskWrkService.selectByWrkNo(crnProtocol.getTaskNo().intValue());
                if (taskWrk != null) {
//                    vo.setWrkSts(taskWrk.getWrkSts$());   // 工作状态
//                    vo.setIoType(taskWrk.getIoType$());   //  入出库类型
                    vo.setSourceStaNo(taskWrk.getStartPoint());
                    vo.setStaNo(taskWrk.getTargetPoint());
                }
            } else {
                vo.setStatus(crnProtocol.modeType.equals(CrnModeType.AUTO)? CrnStatusType.MACHINE_AUTO.getDesc(): CrnStatusType.MACHINE_UN_AUTO.getDesc());   //  模式状态
@@ -236,13 +238,18 @@
        vo.setWorkNo(crnProtocol.getTaskNo());  //  任务号
        if (crnProtocol.getTaskNo()>0) {
            WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo());
            if (wrkMast != null) {
                vo.setStatus(CrnStatusType.process(wrkMast.getIoType()).getDesc());   //  模式状态
                vo.setSourceStaNo(wrkMast.getSourceStaNo$());    //  源站
                vo.setStaNo(wrkMast.getStaNo$());   //  目标站
                vo.setSourceLocNo(wrkMast.getSourceLocNo());    //  源库位
                vo.setLocNo(wrkMast.getLocNo());    //  目标库位
            TaskWrk taskWrk = taskWrkService.selectByWrkNo(crnProtocol.getTaskNo().intValue());
            if (taskWrk != null) {
//                vo.setWrkSts(taskWrk.getWrkSts$());   // 工作状态
//                vo.setIoType(taskWrk.getIoType$());   //  入出库类型
                vo.setSourceStaNo(taskWrk.getStartPoint());
                vo.setStaNo(taskWrk.getTargetPoint());
//            if (wrkMast != null) {
//                vo.setStatus(CrnStatusType.process(wrkMast.getIoType()).getDesc());   //  模式状态
//                vo.setSourceStaNo(wrkMast.getSourceStaNo$());    //  源站
//                vo.setStaNo(wrkMast.getStaNo$());   //  目标站
//                vo.setSourceLocNo(wrkMast.getSourceLocNo());    //  源库位
//                vo.setLocNo(wrkMast.getLocNo());    //  目标库位
            }
        } else {
            vo.setStatus(crnProtocol.modeType.equals(CrnModeType.AUTO)? CrnStatusType.MACHINE_AUTO.getDesc(): CrnStatusType.MACHINE_UN_AUTO.getDesc());   //  模式状态
@@ -279,13 +286,14 @@
            vo.setWorkNo(crnProtocol.getTaskNo());  //  任务号
            if (crnProtocol.getTaskNo()>0) {
                WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo());
                if (wrkMast != null) {
                    vo.setDeviceStatus(CrnStatusType.process(wrkMast.getIoType()).getDesc());   //  模式状态
                    vo.setSourceStaNo(wrkMast.getSourceStaNo$());    //  源站
                    vo.setStaNo(wrkMast.getStaNo$());   //  目标站
                    vo.setSourceLocNo(wrkMast.getSourceLocNo());    //  源库位
                    vo.setLocNo(wrkMast.getLocNo());    //  目标库位
                TaskWrk taskWrk = taskWrkService.selectByWrkNo(crnProtocol.getTaskNo().intValue());
//                WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo());
                if (taskWrk != null) {
                    vo.setDeviceStatus(CrnStatusType.process(taskWrk.getIoType()).getDesc());   //  模式状态
                    vo.setSourceStaNo(taskWrk.getStartPoint());    //  源站
                    vo.setStaNo(taskWrk.getTargetPoint());   //  目标站
//                    vo.setSourceLocNo(taskWrk.getTargetPoint());    //  源库位
//                    vo.setLocNo(taskWrk.getLocNo());    //  目标库位
                }
            } else {
                if (Cools.isEmpty(crnProtocol.modeType)){
@@ -620,7 +628,7 @@
                crnCommand.setCommand((short) 0);  // 任务完成确认位
                // 延时发送
                Thread.sleep(1000L);
                if (CommandUtils.offer(SlaveType.Crn, crn.getId(), new Task(5, crnCommand), false)) {
                if (MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(5, crnCommand))) {
                    return R.ok();
                } else {
                    throw new CoolException("命令下发失败");
@@ -774,7 +782,7 @@
                }
                // 空闲判断
//                if (crnProtocol.getStatusType().equals(com.zy.core.enums.CrnStatusType.IDLE) && crnProtocol.getTaskNo() == 0) {
                if (CommandUtils.offer(SlaveType.Crn, crn.getId(), new Task(4, command), false)) {
                if (MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(4, command))) {
                    return true;
                } else {
                    throw new CoolException("命令下发失败");
@@ -808,7 +816,7 @@
                }
                // 空闲判断
//                if (crnProtocol.getStatusType().equals(com.zy.core.enums.CrnStatusType.IDLE) && crnProtocol.getTaskNo() == 0) {
                if (CommandUtils.offer(SlaveType.Crn, crn.getId(), new Task(2, command), false)) {
                if (MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, command))) {
                    return true;
                } else {
                    throw new CoolException("命令下发失败");
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -400,7 +400,7 @@
                if(Cools.isEmpty(staDesc)){
                    return R.error("出库路劲不存在");
                }
                r = openService.taskCreate(new TaskCreateParam(param,staDesc.getCrnNo(),staDesc.getCrnStn()));
                r = openService.taskCreate(new TaskCreateParam(param,staDesc.getCrnNo(),staDesc.getStnNo()));
            }else if (param.getIoType() == 3){
                LocMast locMast2 = locMastService.selectByLocNo(param.getTargetPoint());
                if(Cools.isEmpty(locMast2)){
src/main/java/com/zy/asrs/controller/RgvController.java
New file
@@ -0,0 +1,212 @@
package com.zy.asrs.controller;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.annotations.ManagerAuth;
import com.core.common.R;
import com.zy.asrs.entity.BasDevpPosition;
import com.zy.asrs.service.BasDevpPositionService;
import com.zy.core.cache.RgvStatusCache;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.cache.TaskProtocolCache;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.core.model.protocol.TaskProtocol;
import com.zy.core.thread.RgvThread;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
 * 输送设备接口
 * Created by vincent on 2020-06-01
 */
@RestController
@RequestMapping("/rgv")
public class RgvController {
    @Autowired
    private BasDevpPositionService basDevpPositionService;
    @GetMapping("/status/all")
    @ManagerAuth(memo = "全部信息")
    public R allStatus(){
        List<Map<String, Object>> res = new ArrayList<>();
        ConcurrentHashMap<Integer, RgvProtocol> allRgvStatus = RgvStatusCache.getAllRgvStatus();
        for (RgvProtocol rgvProtocol : allRgvStatus.values()){
            Map<String, Object> map2 = new HashMap<>();
            map2.put("rgvNo", rgvProtocol.getRgvNo());
            map2.put("taskNo", rgvProtocol.getTaskNo());
            map2.put("mode", rgvProtocol.getModeType().desc);
            map2.put("status", rgvProtocol.getStatusType().desc);
            map2.put("rgvPos", rgvProtocol.getRgvPos());
            map2.put("rgvPosDestination", rgvProtocol.getRgvPosDestination());
            map2.put("loaded", rgvProtocol.getLoaded().equals((short)-1)? "未知":rgvProtocol.getLoaded()==1? "有物":"无物");
            res.add(map2);
        }
        return R.ok().add(res);
    }
    @PostMapping("/task/cache/all")
    @ManagerAuth(memo = "全部信息")
    public R allTaskCache(@RequestParam(defaultValue = "0")  Integer rgvNo){
        List<Map<String, Object>> res = new ArrayList<>();
        try{
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
            TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
            for (TaskProtocol taskProtocol : allTaskProtocol.values()){
                Map<String, Object> map2 = new HashMap<>();
                map2.put("rgvNo", rgvNo);
                map2.put("taskNo", taskProtocol.getTaskNo());
                map2.put("targetPosition", taskProtocol.getTargetPosition());
                map2.put("isRunning", taskProtocol.getIsRunning());
                map2.put("taskStatus", taskProtocol.getTaskStatus());
                map2.put("direction", taskProtocol.isDirection());
                res.add(map2);
            }
        } catch (Exception e){
//            return R.error("异常"+e.getMessage());
        }
        return R.ok().add(res);
    }
    @PostMapping("/run/walk")//Take  Put  Walk
    @ManagerAuth(memo = "小车行走")
    public R rgvRunWalk(@RequestParam(defaultValue = "0")  Integer rgvNo,
                            @RequestParam(defaultValue = "0")  Integer taskNo,
                            @RequestParam(defaultValue = "0")  Integer rgvStaNo,
                            @RequestParam(defaultValue = "0")  Long rgvPosDestination
    ) {
        if (rgvNo==null || rgvNo==0){
            return R.error("请选择小车");
        }
        if (taskNo==null || taskNo==0){
            return R.error("作业号请填写");
        }
        if ((rgvStaNo == null || rgvStaNo == 0) && (rgvPosDestination==null || rgvPosDestination==0L)){
            return R.error("目标站点请填写");
        }
        if (rgvPosDestination == null || rgvPosDestination == 0){
            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNo));
            rgvPosDestination = basDevpPosition.getPlcPosition();
        }
        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
        TaskProtocol issued = new TaskProtocol();
        try {
            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
            if (allTaskProtocol.size() > 0) {
                return R.error("存在执行中任务,请先处理!!!");
            }
            //执行
            issued.setTaskNo(Long.valueOf(taskNo));
            issued.setTaskStatus(1);
            issued.setTaskNoDirection(issued.gettaskNoDirection$(issued.getTaskNo(), issued.getTaskStatus()));
            issued.setTargetPosition(rgvPosDestination);
            issued.setIsRunning(1);
            issued.setDirection(true);
            taskProtocolCache.updateTaskProtocol(issued);
        } catch (Exception e) {
            return R.error("任务生成失败"+e.getMessage());
        }
        return R.ok("任务生成成功");
    }
    @PostMapping("/run/put")//Take  Put  Walk
    @ManagerAuth(memo = "小车放货")
    public R rgvPutWalk(@RequestParam(defaultValue = "0")  Integer rgvNo,
                        @RequestParam(defaultValue = "0")  Integer taskNo,
                        @RequestParam(defaultValue = "0")  Integer rgvStaNo,
                        @RequestParam(defaultValue = "0")  Long rgvPosDestination
    ) {
        if (rgvNo==null || rgvNo==0){
            return R.error("请选择小车");
        }
        if (taskNo==null || taskNo==0){
            return R.error("作业号请填写");
        }
        if (rgvStaNo == null || rgvStaNo == 0){
            return R.error("目标站点请填写");
        }
        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
        TaskProtocol issuedPut = new TaskProtocol();
        try {
            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
            if (allTaskProtocol.size() > 0) {
                return R.error("存在执行中任务,请先处理!!!");
            }
            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNo));
            //执行
            issuedPut.setTaskNo(Long.valueOf(taskNo));
            issuedPut.setTaskStatus(3);
            issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(), issuedPut.getTaskStatus()));
            issuedPut.setTargetPosition(basDevpPosition.getPlcPosition());
            issuedPut.setIsRunning(1);
            issuedPut.setDirection(basDevpPosition.getRgvSign()==1);
            taskProtocolCache.updateTaskProtocol(issuedPut);
        } catch (Exception e) {
            return R.error("任务生成失败"+e.getMessage());
        }
        return R.ok("任务生成成功");
    }
    @PostMapping("/run/take")//Take  Put  Walk
    @ManagerAuth(memo = "小车取货")
    public R rgvTakeWalk(@RequestParam(defaultValue = "0") Integer rgvNo,
                        @RequestParam(defaultValue = "0") Integer taskNo,
                        @RequestParam(defaultValue = "0") Integer rgvStaNo,
                        @RequestParam(defaultValue = "0") Long rgvPosDestination
    ) {
        if (rgvNo==null || rgvNo==0){
            return R.error("请选择小车");
        }
        if (taskNo==null || taskNo==0){
            return R.error("作业号请填写");
        }
        if (rgvStaNo == null || rgvStaNo == 0){
            return R.error("目标站点请填写");
        }
        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
        TaskProtocol issuedTake = new TaskProtocol();
        try {
            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
            if (allTaskProtocol.size() > 0) {
                return R.error("存在执行中任务,请先处理!!!");
            }
            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNo));
            //执行
            issuedTake.setTaskNo(Long.valueOf(taskNo));
            issuedTake.setTaskStatus(2);
            issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(), issuedTake.getTaskStatus()));
            issuedTake.setTargetPosition(basDevpPosition.getPlcPosition());
            issuedTake.setIsRunning(1);
            issuedTake.setDirection(basDevpPosition.getRgvSign()==1);
            taskProtocolCache.updateTaskProtocol(issuedTake);
        } catch (Exception e) {
            return R.error("任务生成失败"+e.getMessage());
        }
        return R.ok("任务生成成功");
    }
}
src/main/java/com/zy/asrs/controller/SiteController.java
@@ -270,7 +270,7 @@
                    staProtocol.setWorkNo(0);
                    staProtocol.setStaNo(0);
                    basDevpService.updateById(basDevp);
                    boolean result = CommandUtils.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol));
                    if (result) {
                        return R.ok();
                    } else {
@@ -310,7 +310,7 @@
                }
                staProtocol.setWorkNo( 9999);
                staProtocol.setStaNo(inSta.getStaNo());
                boolean result = CommandUtils.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol), false);
                boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol));
                if (result) {
                    return R.ok();
                } else {
src/main/java/com/zy/asrs/domain/enums/WorkNoType.java
@@ -7,10 +7,10 @@
 */
public enum WorkNoType {
    PAKIN(0),
    PICK(1),
    PAKIN(1),
    PICK(3),
    PAKOUT(2),
    OTHER(3),
    OTHER(4),
    ;
    public Integer type;
src/main/java/com/zy/asrs/entity/BasDevpPosition.java
@@ -34,6 +34,10 @@
    @TableField("PLC_POSITION")
    private Long plcPosition;
    @ApiModelProperty(value= "")
    @TableField("RGV_SIGN")
    private Integer rgvSign;
    public BasDevpPosition() {}
    public BasDevpPosition(Integer devNo, Integer plcId, Long plcPosition) {
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -795,7 +795,7 @@
                crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint()));     // 目标库位层
                crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位排
                crnCommand.setCommand((short) 1);
                if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand), false)) {
                if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) {
                    log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
                    throw new CoolException("堆垛机命令生成失败");
                } else {
@@ -907,7 +907,7 @@
                        command.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列
                        command.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层
                        command.setCommand((short) 1);
                        if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, command), false)) {
                        if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, command))) {
                            log.error("堆垛机命令生成失败,堆垛机号={},巷道={},任务数据={}", slave.getId(), taskWrk.getCrnNo(), JSON.toJSON(command));
                            throw new CoolException("堆垛机命令生成失败");
                        } else {
@@ -1017,7 +1017,7 @@
                crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint()));     // 目标库位列
                crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位层
                crnCommand.setCommand((short) 1);
                if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand), false)) {
                if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) {
                    log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
                } else {
                    // 修改工作档状态 11.生成出库ID => 12.吊车出库中
@@ -1085,14 +1085,14 @@
            }
            //  状态:等待确认 并且  任务完成位 = 1
            if (!Cools.isEmpty(crnProtocol.getTaskFinish()) && crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
            if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
                //获取入库待确认工作档
                TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crnProtocol.getLaneNo(), crnProtocol.getTaskNo().intValue());
                if (Cools.isEmpty(taskWrk) && crnProtocol.getTaskNo() != 999) {
                    log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},巷道号={},工作号={}", crn.getId(), crnProtocol.getLaneNo(), crnProtocol.getTaskNo());
                    continue;
                }
                Thread.sleep(300);
//                Thread.sleep(300);
                //确认完成信号
                CrnOperatorParam crnOperatorParam = new CrnOperatorParam();
                crnOperatorParam.setCrnNo(crn.getId());
@@ -1612,10 +1612,6 @@
                if (targetPointConvert == null) {
                    return false;
                }
                RgvSlave.RgvStn rgvStnEnd = getRgvStnNow(rgvSlave, targetPointConvert);
                if (rgvStnEnd == null) {
                    return false;
                }
                BasDevpPosition basDevpPositionSou = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStn.getStaNo()));
                BasDevpPosition basDevpPositionEnd = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", targetPointConvert));
@@ -1625,7 +1621,7 @@
                issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(), issuedTake.getTaskStatus()));
                issuedTake.setTargetPosition(basDevpPositionSou.getPlcPosition());
                issuedTake.setIsRunning(1);
                issuedTake.setDirection(rgvStn.isDirection());
                issuedTake.setDirection(basDevpPositionSou.getRgvSign()==1);
                issuedPut.setTaskNo(Long.valueOf(taskWrk.getTaskNo()));
@@ -1633,7 +1629,7 @@
                issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(), issuedPut.getTaskStatus()));
                issuedPut.setTargetPosition(basDevpPositionEnd.getPlcPosition());
                issuedPut.setIsRunning(1);
                issuedPut.setDirection(rgvStnEnd.isDirection());
                issuedPut.setDirection(basDevpPositionEnd.getRgvSign()==1);
            } catch (Exception e) {
                log.error("任务生成失败issued1===》异常信息:{}", e.getMessage());
                return false;
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -75,9 +75,11 @@
        taskWrk = new TaskWrk();
        int workNo1 = 0;//获取入库工作号
        if (param.getIoType() .equals(1)){
            workNo1 = commonService.getWorkNo(WorkNoType.PAKIN.type);
        } else if (param.getIoType() .equals(2)){
            workNo1 = commonService.getWorkNo(WorkNoType.PAKOUT.type);
        } else {
            workNo1 = commonService.getWorkNo(WorkNoType.PAKIN.type);
            workNo1 = commonService.getWorkNo(WorkNoType.PICK.type);
        }
        taskWrk.setTaskNo(param.getTaskNo());//任务号
        taskWrk.setWrkNo(workNo1);
src/main/java/com/zy/asrs/service/impl/TaskWrkServiceImpl.java
@@ -19,6 +19,7 @@
import com.zy.common.service.CommonService;
import com.zy.common.utils.HttpHandler;
import com.zy.core.DevpThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.CrnTaskModeType;
import com.zy.core.enums.SlaveType;
@@ -135,7 +136,7 @@
        crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint()));     // 目标库位层
        crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位排
        crnCommand.setCommand((short)1);
        if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(5, crnCommand),false)) {
        if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(5, crnCommand))) {
            log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
            throw new CoolException("堆垛机命令生成失败");
        }else{
@@ -206,7 +207,7 @@
        crnCommand.setDestinationPosY(crnStn.getLev().shortValue());     // 目标库位列
        crnCommand.setDestinationPosZ(crnStn.getRow().shortValue());     // 目标库位层
        crnCommand.setCommand((short)1);
        if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(5, crnCommand))) {
        if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(5, crnCommand))) {
            log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
            throw new CoolException("堆垛机命令生成失败");
        }
@@ -216,7 +217,7 @@
        StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()).clone();
        staProtocol.setWorkNo(taskWrk.getWrkNo());
        staProtocol.setStaNo(Integer.parseInt(taskWrk.getTargetPoint()));
        if (!CommandUtils.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(3, staProtocol))) {
        if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(3, staProtocol))) {
            log.error("输送线命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
            throw new CoolException("输送线命令生成失败");
        }
src/main/java/com/zy/core/ServerBootstrap.java
@@ -68,10 +68,10 @@
//        for (Slave led : slaveProperties.getLed()) {
//            MessageQueue.init(SlaveType.Led, led);
//        }
//        // 初始化磅称mq
//        for (Slave scale : slaveProperties.getScale()) {
//            MessageQueue.init(SlaveType.Scale, scale);
//        }
        // 初始化磅称mq
        for (Slave scale : slaveProperties.getScale()) {
            MessageQueue.init(SlaveType.Scale, scale);
        }
//        // 初始化台车mq
//        for (Slave car : slaveProperties.getCar()) {
//            MessageQueue.init(SlaveType.Car, car);
@@ -114,13 +114,13 @@
//            new Thread(ledThread).start();
//            SlaveConnection.put(SlaveType.Led, led.getId(), ledThread);
//        }
//        // 初始化磅秤线程
//        log.info("初始化磅秤线程...................................................");
//        for (Slave scale : slaveProperties.getScale()) {
//            ScaleThread scaleThread = new ScaleThread(scale);
//            new Thread(scaleThread).start();
//            SlaveConnection.put(SlaveType.Scale, scale.getId(), scaleThread);
//        }
        // 初始化磅秤线程
        log.info("初始化磅秤线程...................................................");
        for (Slave scale : slaveProperties.getScale()) {
            ScaleThread scaleThread = new ScaleThread(scale);
            new Thread(scaleThread).start();
            SlaveConnection.put(SlaveType.Scale, scale.getId(), scaleThread);
        }
    }
src/main/java/com/zy/core/enums/CrnModeType.java
@@ -7,6 +7,7 @@
    HALF_AUTO(2, "半自动"),
    HAND(1, "手动"),
    STOP(4, "维修"),
    OTHER(100, "其他"),
    ;
    public Integer id;
@@ -18,25 +19,25 @@
    public static CrnModeType get(Short id) {
        if (null == id) {
            return null;
            return OTHER;
        }
        for (CrnModeType type : CrnModeType.values()) {
            if (type.id.equals(id.intValue())) {
                return type;
            }
        }
        return null;
        return OTHER;
    }
    public static CrnModeType get(CrnModeType type) {
        if (null == type) {
            return null;
            return OTHER;
        }
        for (CrnModeType crnModeType : CrnModeType.values()) {
            if (crnModeType == type) {
                return crnModeType;
            }
        }
        return null;
        return OTHER;
    }
}
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -43,7 +43,7 @@
    /**
     * 有物
     */
    public Short loaded;//0 无物;1 有物
    public Short loaded = -1;//0 无物;1 有物
    /**
     * RGV当前位置
src/main/java/com/zy/core/model/protocol/TaskProtocol.java
@@ -47,10 +47,10 @@
    public String gettaskNoDirection$(Long taskNo,int taskStatus){
        String taskStatusStr = "Walk";
        switch (taskStatus){
            case 1:
            case 2:
                taskStatusStr = "Tack";
                break;
            case 2:
            case 3:
                taskStatusStr = "Put";
                break;
        }
src/main/java/com/zy/core/thread/LedThread.java
@@ -202,14 +202,19 @@
            screen.turnOn();
        } catch (Exception ignore) {
        }
        DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
        if (connRes) {
            log.info("led连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            deviceErrorService.deleteDeviceError("led", slave.getId());
        } else {
            log.error("led连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            deviceErrorService.addDeviceError("led", slave.getId(), "led连接失败");
        try{
            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
            if (connRes) {
                log.info("led连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
                deviceErrorService.deleteDeviceError("led", slave.getId());
            } else {
                log.error("led连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
                deviceErrorService.addDeviceError("led", slave.getId(), "led连接失败");
            }
        } catch (Exception e){
            log.error("e:"+e.getMessage());
        }
        return connRes;
    }
src/main/java/com/zy/core/thread/RgvThread.java
@@ -81,6 +81,7 @@
            // 启动漫游线程
            new Thread(this::taskWalkIssued).start();
            new Thread(this::taskWalkIssued2).start();
            // 启动任务完成线程
            new Thread(this::taskComplete).start();
@@ -127,6 +128,64 @@
    }
    /**
     * 任务下发
     */
    private void taskWalkIssued2() {
        while (true) {
            try {
                // 休眠 1 秒
                Thread.sleep(100);
                if (!deviceDetection()) {
                    continue;
                }
                RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
                RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
                if (rgvProtocol == null || rgvTaskProtocol == null) {
                    initRgv();
                    rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
                    rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
                }
                if (rgvTaskProtocol.getAvoid() != 0) {
                    continue;
                }
                if (!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE)){
                    continue;
                }
                if (rgvProtocol.getLoaded() == -1){
                    continue;
                }
                List<TaskProtocol> allTakeTaskProtocol = taskProtocolCache.getAllWalkTaskProtocol();
                for (TaskProtocol taskProtocol : allTakeTaskProtocol) {
                    if (taskProtocol.getIsRunning() == 1) {//准备下发
                        // 双车
                        if (rgvOtherStatusEnable()) {
                            //另一台车是否允许此台车执行
                            if (!otherRgvAvoid(taskProtocol.getTargetPosition())) {
                                continue;
                            }
                        }
                        if (taskProtocol.getTargetPosition()<=rgvProtocol.getRgvPos()+50
                                && taskProtocol.getTargetPosition()>=rgvProtocol.getRgvPos()-50){
                            taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection());
                            break;
                        } else {
                            Thread.sleep(100);
                            TaskProtocol issued = new TaskProtocol(taskProtocol,true);
                            write(issued);
                            taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection());
                            break;
                        }
                    }
                }
            } catch (Exception e) {
                log.error("RGV取货任务下发线程异常!!!" + e.getMessage());
//                e.printStackTrace();
            }
        }
    }
    /**
     * 漫游
     */
    private void taskWalkIssued() {
@@ -149,6 +208,8 @@
                TaskProtocol issued = new TaskProtocol();
                issued.setTaskNo(32222L);
                issued.setTargetPosition(rgvTaskProtocol.getAvoidingTheDestination());
                issued.setTaskStatus(1);
                issued.setDirection(true);
                write(issued);
                rgvTaskProtocol.setAvoid(0);
@@ -186,11 +247,14 @@
                if (!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE)){
                    continue;
                }
                if (rgvProtocol.getLoaded() == -1){
                    continue;
                }
                List<TaskProtocol> allTakeTaskProtocol = taskProtocolCache.getTakeOrPutTaskProtocol(rgvProtocol.getLoaded());
                for (TaskProtocol taskProtocol : allTakeTaskProtocol) {
                    if (taskProtocol.getIsRunning() == 1) {//准备下发
                        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
//                        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
                        //双车
                        if (rgvOtherStatusEnable()) {
                            //另一台车是否允许此台车执行
@@ -203,15 +267,12 @@
                            Thread.sleep(100);
                            TaskProtocol issued = new TaskProtocol(taskProtocol);
                            write(issued);
                            taskProtocol.setIsRunning(4);
                            taskProtocolCache.updateTaskProtocol(taskProtocol);
                            taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection());
                            break;
                        } else {
                            Thread.sleep(100);
                            TaskProtocol issued = new TaskProtocol(taskProtocol,true);
                            write(issued);
//                            taskProtocol.setIsRunning(4);
//                            taskProtocolCache.updateTaskProtocol(taskProtocol);
                            break;
                        }
                    }
src/main/java/com/zy/core/thread/ScaleThread.java
@@ -53,14 +53,16 @@
                byte[] read = read(8, 100);
                if (null != read) {
                    String s = new String(read);
                    if (!Cools.isEmpty(s) && s.startsWith("=")) {
                        scale = Double.parseDouble(s.substring(1));
                    if (!Cools.isEmpty(s) && s.startsWith("\u0002+")) {
//                    if (!Cools.isEmpty(s) && s.startsWith("=")) {
                        scale = Double.parseDouble(s.substring(1))/100;
//                        System.out.println("scale:"+scale+ "ip:"+slave.getIp());
//                        String substring = s.substring(1);
//                        String s1 = new StringBuilder(substring).reverse().toString();//逆序
//                        scale = Double.parseDouble(s1);
                        //将称重重量写入设备基础数据中的gross_wt字段
                        if(scale > 20) {
//                        if(scale > 20) {
                            try{
                                // 获取站信息
                                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, slave.getDevpPlcId());
@@ -78,7 +80,7 @@
                                    OutputQueue.SCALE.offer(jsonObject);
                                }
                            } catch (Exception e){
                                log.error("称重模块异常"+e.getMessage());
                                log.error("称重模块异常"+e .getMessage());
                            }
//                            BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
//                            BasDevp basDevp = basDevpService.selectById(slave.getStaNo());
@@ -97,7 +99,7 @@
//                                OutputQueue.SCALE.offer(jsonObject);
//
//                            }
                        }
//                        }
                    }
                }
                Thread.sleep(100);
@@ -120,13 +122,23 @@
            dataOutputStream = new DataOutputStream(socket.getOutputStream());
            dataInputStream = new DataInputStream(socket.getInputStream());
//            log.info("条码扫描仪连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
            deviceErrorService.deleteDeviceError("scale", slave.getId());
            try{
                DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
                deviceErrorService.deleteDeviceError("devp", slave.getId());
            } catch (Exception e){
                log.error("e:"+e.getMessage());
            }
        } catch (Exception e) {
            socket = null;
            log.error("磅秤连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
            deviceErrorService.addDeviceError("scale", slave.getId(), "磅秤连接失败");
//            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
//            deviceErrorService.addDeviceError("scale", slave.getId(), "磅秤连接失败");
            try{
                DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
                deviceErrorService.deleteDeviceError("devp", slave.getId());
            } catch (Exception e1){
                log.error("e:"+e1.getMessage());
            }
            return false;
        }
        return true;
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -235,19 +235,27 @@
                    StaProtocol staProtocol = station.get(siteId);
                    basDevps.add(staProtocol.toSqlModel());
                }
                BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
                if (null != basDevpService && !basDevpService.updateBatchById(basDevps)) {
                    throw new Exception("更新数据库数据失败");
                try{
                    BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
                    if (null != basDevpService && !basDevpService.updateBatchById(basDevps)) {
                        throw new Exception("更新数据库数据失败");
                    }
                } catch (Exception e){
                    log.error("e:"+e.getMessage());
                }
            } catch (Exception e) {
                e.printStackTrace();
                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】更新数据库数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
                log.error("更新数据库数据失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            }
            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
            deviceErrorService.deleteDeviceError("devp", slave.getId());
            try{
                DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
                deviceErrorService.deleteDeviceError("devp", slave.getId());
            } catch (Exception e){
                log.error("e:"+e.getMessage());
            }
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】读取输送线plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
//            log.error("读取输送线plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
src/main/resources/application-prod.yml
@@ -243,9 +243,16 @@
    # 磅秤
  scale[0]:
    id: 1
    ip: 10.10.10.207
    ip: 10.10.10.202
    port: 5005
    staNo: 281
    staNo: 1004
    devpPlcId: 1
    # 磅秤
  scale[1]:
    id: 2
    ip: 10.10.10.203
    port: 5005
    staNo: 1022
    devpPlcId: 1
  crn[0]: #堆垛机1
    ip: 10.10.10.10
@@ -256,13 +263,13 @@
    offset: 2    #偏移量,当堆垛机站点列号=1时,偏移量=2
    port: 102
    crnOutStn[0]:    #堆垛机出库站点
      staNo: 101
      staNo: 1003
      row: 2
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    crnInStn[0]:    #堆垛机入库站点1
      staNo: 100
      staNo: 1001
      row: 1
      bay: 1
      lev: 1
@@ -276,14 +283,14 @@
    offset: 2    #偏移量,当堆垛机站点列号=1时,偏移量=2
    port: 102
    crnOutStn[0]:    #堆垛机出库站点
      staNo: 101
      row: 2
      staNo: 1007
      row: 4
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    crnInStn[0]:    #堆垛机入库站点1
      staNo: 100
      row: 1
      staNo: 1006
      row: 3
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
@@ -296,14 +303,14 @@
    offset: 2    #偏移量,当堆垛机站点列号=1时,偏移量=2
    port: 102
    crnOutStn[0]:    #堆垛机出库站点
      staNo: 101
      row: 2
      staNo: 1013
      row: 6
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    crnInStn[0]:    #堆垛机入库站点1
      staNo: 100
      row: 1
      staNo: 1008
      row: 5
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
@@ -316,14 +323,14 @@
    offset: 2    #偏移量,当堆垛机站点列号=1时,偏移量=2
    port: 102
    crnOutStn[0]:    #堆垛机出库站点
      staNo: 101
      row: 2
      staNo: 1018
      row: 8
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    crnInStn[0]:    #堆垛机入库站点1
      staNo: 100
      row: 1
      staNo: 1017
      row: 7
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
@@ -336,14 +343,14 @@
    offset: 2    #偏移量,当堆垛机站点列号=1时,偏移量=2
    port: 102
    crnOutStn[0]:    #堆垛机出库站点
      staNo: 101
      row: 2
      staNo: 1019
      row: 9
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    crnInStn[0]:    #堆垛机入库站点1
      staNo: 100
      row: 1
      staNo: 1022
      row: 10
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
src/main/resources/mapper/BasDevpPositionMapper.xml
@@ -8,6 +8,7 @@
        <result column="DEV_NO" property="devNo" />
        <result column="PLC_ID" property="plcId" />
        <result column="PLC_POSITION" property="plcPosition" />
        <result column="RGV_SIGN" property="rgvSign" />
    </resultMap>
src/main/webapp/views/deviceOperate/rgvOperate.html
@@ -16,13 +16,19 @@
        <div style="width: 100%;">
            <el-table ref="singleTable" :data="tableData" highlight-current-row @row-click="handleRowClick"
                max-height="450" style="width: 100%">
                <el-table-column property="devNo" label="站号">
                <el-table-column property="rgvNo" label="小车号">
                </el-table-column>
                <el-table-column property="workNo" label="工作号">
                <el-table-column property="taskNo" label="工作号">
                </el-table-column>
                <el-table-column property="locType1" label="高低库位">
                <el-table-column property="mode" label="作业模式">
                </el-table-column>
                <el-table-column property="pakMk" label="入库标记">
                <el-table-column property="status" label="状态">
                </el-table-column>
                <el-table-column property="rgvPos" label="当前定位值">
                </el-table-column>
                <el-table-column property="rgvPosDestination" label="目标定位置">
                </el-table-column>
                <el-table-column property="loaded" label="有物">
                </el-table-column>
            </el-table>
        </div>
@@ -36,27 +42,19 @@
                    <div>
                        <el-form :model="formParam" label-position="top" :inline="true" class="demo-form-inline">
                            <el-form-item label="工作号">
                                <el-input v-model="formParam.workNo" placeholder="工作号"></el-input>
                                <el-input v-model="formParam.taskNo" placeholder="工作号"></el-input>
                            </el-form-item>
                            <el-form-item label="目标站">
                                <el-input v-model="formParam.staNo" placeholder="目标站"></el-input>
                            <el-form-item label="目标定位置">
                                <el-input v-model="formParam.rgvPosDestination" placeholder="目标定位置"></el-input>
                            </el-form-item>
                            <el-form-item label="入库标记">
                                <el-input v-model="formParam.pakMk" placeholder="入库标记"></el-input>
                            </el-form-item>
                        </el-form>
                        <el-form label-position="top" :inline="true" class="demo-form-inline">
                            <el-form-item label="">
                                <el-checkbox v-model="formParam.inEnable">可入</el-checkbox>
                            </el-form-item>
                            <el-form-item label="">
                                <el-checkbox v-model="formParam.outEnable">可出</el-checkbox>
                            <el-form-item label="目标站点">
                                <el-input v-model="formParam.rgvStaNo" placeholder="目标站点"></el-input>
                            </el-form-item>
                        </el-form>
                        <div>
                            <el-button @click="requestOperate('update')" type="primary">更新</el-button>
                            <el-button @click="requestOperate('out')" type="warning">取货完成</el-button>
                            <el-button @click="requestOperate('in')" type="warning">放货完成</el-button>
                            <el-button @click="requestOperate('take')" type="primary">取货</el-button>
                            <el-button @click="requestOperate('put')" type="primary">放货</el-button>
                            <el-button @click="requestOperate('walk')" type="warning">行走</el-button>
                        </div>
                    </div>
                </el-card>
@@ -64,36 +62,28 @@
            <div style="width: 45%;">
                <el-card class="box-card">
                    <div slot="header" class="clearfix">
                        <span>设备状态</span>
                        <span>设备当前任务</span>
                    </div>
                    <div>
                        <div v-if="currentIndex == null">
                            <el-empty description="请选择设备"></el-empty>
                        </div>
                        <div v-else>
                            <el-descriptions :title="currentTitle" direction="vertical" :column="4" border>
                                <el-descriptions-item label="站点">{{ tableData[currentIndex].devNo }}
                                </el-descriptions-item>
                                <el-descriptions-item label="工作号">
                                    {{ tableData[currentIndex].workNo }}
                                </el-descriptions-item>
                                <el-descriptions-item label="自动">{{ tableData[currentIndex].autoing }}
                                </el-descriptions-item>
                                <el-descriptions-item label="有物">{{ tableData[currentIndex].loading }}
                                </el-descriptions-item>
                                <el-descriptions-item label="可入">{{ tableData[currentIndex].inEnable }}
                                </el-descriptions-item>
                                <el-descriptions-item label="可出">{{ tableData[currentIndex].outEnable }}
                                </el-descriptions-item>
                                <el-descriptions-item label="入库标记">{{ tableData[currentIndex].pakMk }}
                                </el-descriptions-item>
                                <el-descriptions-item label="空板信号">{{ tableData[currentIndex].emptyMk }}
                                </el-descriptions-item>
                                <el-descriptions-item label="目标站">{{ tableData[currentIndex].staNo }}
                                </el-descriptions-item>
                                <el-descriptions-item label="高低库位">{{ tableData[currentIndex].locType1 }}
                                </el-descriptions-item>
                            </el-descriptions>
                            <el-table ref="singleTable" :data="taskAllData" highlight-current-row @row-click="handleRowClick"
                                      max-height="450" style="width: 100%">
                                <el-table-column property="rgvNo" label="小车号">
                                </el-table-column>
                                <el-table-column property="taskNo" label="工作号">
                                </el-table-column>
                                <el-table-column property="taskStatus" label="作业模式">
                                </el-table-column>
                                <el-table-column property="isRunning" label="状态">
                                </el-table-column>
                                <el-table-column property="targetPosition" label="目标定位置">
                                </el-table-column>
                                <el-table-column property="direction" label="放向">
                                </el-table-column>
                            </el-table>
                        </div>
                    </div>
                </el-card>
@@ -105,16 +95,15 @@
            el: '#app',
            data: {
                tableData: [],
                taskAllData: [],
                currentRow: null,
                currentTitle: "未选择设备",
                currentIndex: null,
                formParam: {
                    devNo: null,
                    workNo: null,
                    staNo: null,
                    pakMk: null,
                    inEnable: false,
                    outEnable: false
                    rgvNo: 0,
                    taskNo: 0,
                    rgvStaNo: 0,
                    rgvPosDestination: 0
                }
            },
            created() {
@@ -135,19 +124,33 @@
                    const index = this.tableData.indexOf(row)
                    this.currentRow = row;
                    this.currentIndex = index
                    this.currentTitle = row.devNo + "站点"
                    this.currentTitle = row.rgvNo + "小车"
                    
                    this.formParam.devNo = row.devNo
                    this.formParam.workNo = row.workNo
                    this.formParam.staNo = row.staNo
                    this.formParam.pakMk = row.pakMk
                    this.formParam.inEnable = row.inEnable == "Y" ? true : false
                    this.formParam.outEnable = row.outEnable == "Y" ? true : false
                    this.formParam.rgvNo = row.rgvNo
                    this.formParam.taskNo = row.taskNo
                    this.formParam.rgvStaNo = row.rgvStaNo
                    this.formParam.rgvPosDestination = row.rgvPosDestination
                    this.getTaskAllData(index+1)
                },
                getTaskAllData(index) {
                    let that = this;
                    $.ajax({
                        url: baseUrl + "/rgv/task/cache/all",
                        headers: {
                            'token': localStorage.getItem('token')
                        },
                        data: {rgvNo: index},
                        method: 'POST',
                        success: function (res) {
                            that.taskAllData = res.data
                        }
                    });
                },
                getTableData() {
                    let that = this;
                    $.ajax({
                        url: baseUrl + "/site/list/auth",
                        url: baseUrl + "/rgv/status/all",
                        headers: {
                            'token': localStorage.getItem('token')
                        },
@@ -168,7 +171,7 @@
                        type: 'warning'
                    }).then(()=>{
                        $.ajax({
                            url: baseUrl + "/site/detl/"+method,
                            url: baseUrl + "/rgv/run/"+method,
                            headers: {
                                'token': localStorage.getItem('token')
                            },