dc23ab59268e6dccd7d50d10cf8cffe1bf67d551..3c56f3ed3ad8978f4cad3a684c4811026f31d17e
2025-05-14 1
#
3c56f3 对比 | 目录
2025-05-14 1
#
e86a2c 对比 | 目录
2025-05-14 1
#
ecfd53 对比 | 目录
2025-05-14 1
#
e72f4b 对比 | 目录
2025-05-14 1
#
7c75c8 对比 | 目录
2025-05-14 1
#
abb914 对比 | 目录
2025-05-14 1
#
e13244 对比 | 目录
2025-05-14 1
#
dcdfc9 对比 | 目录
15个文件已修改
466 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/RgvController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/TaskWrkController.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/enums/TaskStatusType.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/TaskWrk.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/TaskLogScheduler.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/TaskProtocol.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/TaskWrkMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/commandManage/commandManage.html 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/deviceOperate/crnOperate.html 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/deviceOperate/devpOperate.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/deviceOperate/rgvOperate.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/taskWrk/taskWrk.html 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/RgvController.java
@@ -171,6 +171,8 @@
            //执行
            issuedPut.setTaskNo(Long.valueOf(taskNo));
            issuedPut.setTaskStatus(3);
            issuedPut.setTargetPositionStaNo(basDevpPosition.getDevNo());
            issuedPut.setTargetPositionStaNoPlcId(basDevpPosition.getPlcId());
            issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(), issuedPut.getTaskStatus()));
            issuedPut.setTargetPosition(basDevpPosition.getPlcPosition());
            issuedPut.setIsRunning(1);
@@ -256,6 +258,8 @@
            //执行
            issuedTake.setTaskNo(Long.valueOf(taskNo));
            issuedTake.setTaskStatus(2);
            issuedTake.setTargetPositionStaNo(basDevpPositionTake.getDevNo());
            issuedTake.setTargetPositionStaNoPlcId(basDevpPositionTake.getPlcId());
            issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(), issuedTake.getTaskStatus()));
            issuedTake.setTargetPosition(basDevpPositionTake.getPlcPosition());
            issuedTake.setIsRunning(1);
@@ -265,6 +269,8 @@
            //执行
            issuedPut.setTaskNo(Long.valueOf(taskNo));
            issuedPut.setTaskStatus(3);
            issuedPut.setTargetPositionStaNo(basDevpPositionPut.getDevNo());
            issuedPut.setTargetPositionStaNoPlcId(basDevpPositionPut.getPlcId());
            issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(), issuedPut.getTaskStatus()));
            issuedPut.setTargetPosition(basDevpPositionPut.getPlcPosition());
            issuedPut.setIsRunning(1);
@@ -279,4 +285,22 @@
        return R.ok("任务生成成功");
    }
    @PostMapping("/run/delRgvTask")//Take  Put  Walk
    @ManagerAuth(memo = "小车取货")
    public R rgvDelRgvTask(@RequestParam(defaultValue = "0") Integer rgvNo
    ) {
        if (rgvNo==null || rgvNo==0){
            return R.error("请选择小车");
        }
        try {
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
            rgvThread.setDelRgvTask();
        } catch (Exception e) {
            return R.error("任务生成失败"+e.getMessage());
        }
        return R.ok("任务生成成功");
    }
}
src/main/java/com/zy/asrs/controller/TaskWrkController.java
@@ -8,10 +8,11 @@
import com.core.common.DateUtils;
import com.zy.asrs.domain.enums.TaskStatusType;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.StaDesc;
import com.zy.asrs.entity.TaskWrk;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.TaskWrkService;
import com.zy.asrs.entity.param.CarryParam;
import com.zy.asrs.entity.param.TaskCreateParam;
import com.zy.asrs.service.*;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
@@ -38,6 +39,12 @@
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private OpenService openService;
    @Autowired
    private StaDescService staDescService;
    @Value("${wms.taskStatusFeedbackPath}")
    private String taskStatusFeedbackPath;
@@ -147,6 +154,84 @@
        return R.ok();
    }
    @RequestMapping(value = "/taskWrk/addTask/auth")
    @ManagerAuth
    public R addTaskPoint(CarryParam param){
        try{
            param.updateIoTyoe(param.getIoType());//中航下发  1:出库,2:移库 3:入库   ====转换为====>  1:入库,2:出库,3:移库
            param.updateLocNo();
            if (Cools.isEmpty(param)){
                return R.error("参数为空!");
            } else if (Cools.isEmpty(param.getTaskNo())){
                return R.error("任务号为空!");
            } else if (Cools.isEmpty(param.getIoType())){
                return R.error("任务类型为空!");
            }
            if (Cools.isEmpty(param.getStartPoint()) || Cools.isEmpty(param.getTargetPoint())){
                return R.error("初始目标或者目标位为空");
            }
            String locNo=null;
            if(param.getIoType()==1){
                locNo=param.getTargetPoint();
            }else{
                locNo=param.getStartPoint();
            }
            LocMast locMast = locMastService.selectByLocNo(locNo);
            if(Cools.isEmpty(locMast)){
                return R.error("初始库位无法找到");
            }
            R r = null;
            if(param.getIoType() == 1){
                //入库任务创建
                StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                        .eq("type_no",1)
                        .eq("crn_no",locMast.getCrnNo())
                        .eq("stn_no",param.getStartPoint()));
                if(Cools.isEmpty(staDesc)){
                    return R.error("入库路劲不存在");
                }
                r = openService.taskCreate(new TaskCreateParam(param,staDesc.getCrnNo(),staDesc.getCrnStn()));
            }else if(param.getIoType() == 2){
                //出库任务创建
                StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                        .eq("type_no",2)
                        .eq("crn_no",locMast.getCrnNo())
                        .eq("stn_no",param.getTargetPoint()));
                if(Cools.isEmpty(staDesc)){
                    return R.error("出库路劲不存在");
                }
                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)){
                    return R.error("目标库位无法找到");
                }
                if (!locMast2.getCrnNo().equals(locMast.getCrnNo())){
                    return R.error("起始库位与目标库位不再同一巷道");
                }
                //移库任务创建
                r = openService.taskCreate(new TaskCreateParam(param,locMast.getCrnNo()));
            }
            apiLogService.save("wcs手动生成Wms任务"
                    ,request.getRemoteAddr()+request.getRequestURI()
                    ,null
                    ,request.getRemoteAddr()
                    ,JSON.toJSONString(param)
                    ,r.toString()
                    ,true
            );
        } catch (Exception e){
        }
        return R.ok();
    }
    @RequestMapping(value = "/taskWrk/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam String taskNo){
@@ -224,7 +309,7 @@
    @ManagerAuth(memo = "手动完成任务")
    public R complete(@RequestParam String taskNo) {
        TaskWrk taskWrk = taskWrkService.selectByTaskNo(taskNo);
        if (Cools.isEmpty(taskWrk) || taskWrk.getStatus()>=3){
        if ((Cools.isEmpty(taskWrk) || taskWrk.getStatus()>=3) && !taskWrk.getStatus().equals(TaskStatusType.OVER3.id)){
            return R.error("已完结或已取消") ;
        }
        LocMast locMast=new LocMast();
@@ -264,7 +349,7 @@
        Date now = new Date();
        locMast.setModiTime(now);
        taskWrk.setStatus(7);//手动完成任务
        taskWrk.setStatus(TaskStatusType.OVER2.id);//手动完成任务
        taskWrk.setModiTime(now);
        taskWrk.setCompleteTime(now);
//        try{
@@ -394,6 +479,22 @@
        }
    }
    @PostMapping(value = "/taskWrk/assign/auth")
    @ManagerAuth(memo = "输送线下发完成")
    public R returnAssign(@RequestParam String taskNo) {
        TaskWrk taskWrk = taskWrkService.selectByTaskNo(taskNo);
        if (!Cools.isEmpty(taskWrk) && taskWrk.getWrkSts()==1){
            taskWrk.setStatus(TaskStatusType.RECEIVE.id);//派发状态
            taskWrk.setWrkSts(2);
            if(!taskWrkService.updateById(taskWrk)){
                return R.error("更新任务状态失败");
            }
            return R.ok();
        }else{
            return R.error("任务状态不对无法跳转");
        }
    }
}
src/main/java/com/zy/asrs/domain/enums/TaskStatusType.java
@@ -6,7 +6,9 @@
    DISTRIBUTE(2,"派发"),
    COMPLETE(3,"命令完成"),
    CANCEL(4,"取消"),
    OVER(5,"完结")
    OVER(5,"完结"),
    OVER2(7,"手动完结"),
    OVER3(9,"出库到输送线")
    ;
    public Integer id;
src/main/java/com/zy/asrs/entity/TaskWrk.java
@@ -248,11 +248,15 @@
            case 2:
                return "派发";
            case 3:
                return "步序完成";
                return "命令完成";
            case 4:
                return "取消";
            case 5:
                return "完结";
            case 7:
                return "手动完结";
            case 9:
                return "出库到输送线";
            default:
                return String.valueOf(this.status);
        }
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -31,6 +31,7 @@
import com.zy.core.thread.RgvThread;
import com.zy.core.thread.SiemensDevpThread;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -166,7 +167,7 @@
                        }
//                        News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
                        staProtocol.setWorkNo(workNo);
                        staProtocol.setStaNo(inSta.getStaNo());
                        staProtocol.setStaNo(inSta.getBackSta());
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo));
@@ -205,7 +206,7 @@
                                        return;
                                    } else {
                                        staProtocol.setWorkNo(taskWrk1.getWrkNo());
                                        staProtocol.setStaNo(staDesc.getCrnStn());
                                        staProtocol.setStaNo(staProtocol.getSiteId());
                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                    }
                                }
@@ -238,7 +239,7 @@
                                    log.error("扫码检测程序异常" + inSta.getStaNo() + "异常信息" + e1);
                                }
                                staProtocol.setWorkNo(9999);
                                staProtocol.setStaNo(inSta.getStaNo());
                                staProtocol.setStaNo(inSta.getBackSta());
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                continue;
@@ -264,7 +265,7 @@
                                    log.error("扫码检测程序异常,异常信息" + e);
                                    staProtocol.setWorkNo(9999);
                                    staProtocol.setStaNo(inSta.getStaNo());
                                    staProtocol.setStaNo(inSta.getBackSta());
                                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                }
@@ -275,7 +276,7 @@
                            log.error("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
                            staProtocol.setWorkNo(9999);
                            staProtocol.setStaNo(inSta.getStaNo());
                            staProtocol.setStaNo(inSta.getBackSta());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo));
@@ -401,7 +402,7 @@
                                log.error("扫码检测程序异常" + inSta.getStaNo() + "异常信息" + e1);
                            }
                            staProtocol.setWorkNo(9999);
                            staProtocol.setStaNo(inSta.getStaNo());
                            staProtocol.setStaNo(inSta.getBackSta());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            continue;
@@ -428,7 +429,7 @@
                                log.error("扫码检测程序异常,异常信息" + e);
                                staProtocol.setWorkNo(9999);
                                staProtocol.setStaNo(inSta.getStaNo());
                                staProtocol.setStaNo(inSta.getBackSta());
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            }
@@ -621,7 +622,7 @@
                            if (offer) {
                                log.info("下发输送线任务成功:taskWrk:" + JSON.toJSONString(taskWrk));
                                Date now = new Date();
                                taskWrk.setStatus(9);
                                taskWrk.setStatus(TaskStatusType.OVER3.id);
                                taskWrk.setWrkSts(14);
                                taskWrk.setModiTime(now);
                                taskWrk.setCompleteTime(now);
@@ -924,7 +925,7 @@
                                // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                                Date now = new Date();
                                taskWrk.setWrkSts(12);
                                taskWrk.setStatus(2);
                                taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);
                                taskWrk.setModiTime(now);
                                taskWrk.setExecuteTime(now);
                                if (taskWrkMapper.updateById(taskWrk) == 0) {
@@ -1035,7 +1036,7 @@
                    // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                    Date now = new Date();
                    taskWrk.setWrkSts(12);
                    taskWrk.setStatus(2);
                    taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);
                    taskWrk.setModiTime(now);
                    taskWrk.setExecuteTime(now);
                    if (taskWrkMapper.updateById(taskWrk) == 0) {
@@ -1119,7 +1120,7 @@
                if (!Cools.isEmpty(taskWrk)) {
                    if (taskWrk.getIoType() == 1 && taskWrk.getWrkSts() == 3) {
                        taskWrk.setWrkSts(4);//入库完成
                        taskWrk.setStatus(5);//完结
                        taskWrk.setStatus(TaskStatusType.OVER.id);//完结
                        //更新库位状态
                        LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
                        locMast.setLocSts("F");//F.在库
@@ -1129,7 +1130,7 @@
                        locMastService.updateById(locMast);
                    } else if (taskWrk.getIoType() == 2 && taskWrk.getWrkSts() == 12) {
                        taskWrk.setWrkSts(13);//出库完成
                        taskWrk.setStatus(5);//完结
                        taskWrk.setStatus(TaskStatusType.OVER.id);//完结
                        //更新库位状态
                        LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint());
                        locMast.setLocSts("O");//O.空库位
@@ -1139,7 +1140,7 @@
                        locMastService.updateById(locMast);
                    } else if (taskWrk.getIoType() == 3 && taskWrk.getWrkSts() == 12) {
                        taskWrk.setWrkSts(4);//入库完成
                        taskWrk.setStatus(5);//完结
                        taskWrk.setStatus(TaskStatusType.OVER.id);//完结
                        //更新库位状态
                        LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
                        locMast.setLocSts("F");//F.在库
@@ -1734,6 +1735,8 @@
                //执行
                issuedTake.setTaskNo(Long.valueOf(taskWrk.getWrkNo()));
                issuedTake.setTaskStatus(2);
                issuedTake.setTargetPositionStaNo(basDevpPositionSou.getDevNo());
                issuedTake.setTargetPositionStaNoPlcId(basDevpPositionSou.getPlcId());
                issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(), issuedTake.getTaskStatus()));
                issuedTake.setTargetPosition(basDevpPositionSou.getPlcPosition());
                issuedTake.setIsRunning(1);
@@ -1742,10 +1745,24 @@
                issuedPut.setTaskNo(Long.valueOf(taskWrk.getWrkNo()));
                issuedPut.setTaskStatus(3);
                issuedPut.setTargetPositionStaNo(basDevpPositionEnd.getDevNo());
                issuedPut.setTargetPositionStaNoPlcId(basDevpPositionEnd.getPlcId());
                issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(), issuedPut.getTaskStatus()));
                issuedPut.setTargetPosition(basDevpPositionEnd.getPlcPosition());
                issuedPut.setIsRunning(1);
                issuedPut.setDirection(basDevpPositionEnd.getRgvSign()==1);
                try{
                    if (taskWrk.getIoType()==2 && basDevpPositionEnd.getRgvSign()==1){
                        Date now = new Date();
                        taskWrk.setStatus(TaskStatusType.OVER.id);
                        taskWrk.setModiTime(now);//更新时间
                        taskWrk.setCompleteTime(now);//完结时间
                        taskWrkService.updateById(taskWrk);
                    }
                } catch (Exception e){
                }
            } catch (Exception e) {
                log.error("任务生成失败issued1===》异常信息:{}", e.getMessage());
                return false;
src/main/java/com/zy/asrs/task/TaskLogScheduler.java
@@ -57,10 +57,6 @@
    public void execute() throws IOException {
        List<TaskWrk> taskWrkList = taskWrkService.selectToBeHistoryData();
        for (TaskWrk taskWrk : taskWrkList) {
            if (taskWrkService.saveToHistory(taskWrk.getTaskNo()) == 0) {
                log.error("任务档转任务历史档失败" + taskWrk);
                return ;
            }
            JSONObject jsonObject = null;
            String response = null;
            boolean success = false;
src/main/java/com/zy/core/model/protocol/TaskProtocol.java
@@ -10,6 +10,8 @@
    private volatile String taskNoDirection; // 任务号(主属性)
    private volatile Long taskNo; // 任务号(主属性)
    private volatile Long targetPosition = 0L; // 目标位置
    private volatile Integer targetPositionStaNo = 0; // 目标位置
    private volatile Integer targetPositionStaNoPlcId = 1; // 目标位置
    private volatile int isRunning = 0; // 运行状态  0:初始  1:等待执行  2:执行中 3:执行中断 4:完结
src/main/java/com/zy/core/thread/RgvThread.java
@@ -14,6 +14,7 @@
import com.zy.asrs.service.BasRgvService;
import com.zy.asrs.utils.RouteUtils;
import com.zy.asrs.utils.TrackRangeUtils;
import com.zy.core.DevpThread;
import com.zy.core.ThreadHandler;
import com.zy.core.cache.*;
import com.zy.core.enums.RgvModeType;
@@ -25,6 +26,7 @@
import com.zy.core.model.command.RgvCommand;
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.core.model.protocol.RgvTaskProtocol;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.model.protocol.TaskProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -63,6 +65,9 @@
     */
    private boolean resetFlag2 = false;
    private boolean connectRgv = false;
    private boolean delRgvTask = false;
    public RgvThread(RgvSlave slave) {
        this.slave = slave;
    }
@@ -70,21 +75,48 @@
    @Override
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
        boolean connect = this.connect();
        if (connect) {
        connectRgv = this.connect();
        while(!connectRgv){
            try {
                connectRgv = this.connect();
                Thread.sleep(100);
            } catch (Exception e){
            // 启动读数据线程
            new Thread(this::readStatusRgv).start();
            }
        }
            // 启动任务下发线程
            new Thread(this::taskIssued).start();
        // 启动读数据线程
        new Thread(this::rgvConnect).start();
            // 启动漫游线程
            new Thread(this::taskWalkIssued).start();
            new Thread(this::taskWalkIssued2).start();
        new Thread(this::readStatusRgv).start();
            // 启动任务完成线程
            new Thread(this::taskComplete).start();
        // 启动任务下发线程
        new Thread(this::taskIssued).start();
        // 启动漫游线程
        new Thread(this::taskWalkIssued).start();
        new Thread(this::taskWalkIssued2).start();
        // 启动任务完成线程
        new Thread(this::taskComplete).start();
    }
    private void rgvConnect() {
        while (true) {
            try {
                if(!connectRgv){
                    try {
                        connectRgv = this.connect();
                        Thread.sleep(100);
                    } catch (Exception e){
                    }
                }
            } catch (Exception e) {
                log.error("RGV数据读取线程异常!!!" + e.getMessage());
                initRgv();
//                e.printStackTrace();
            }
        }
    }
@@ -111,6 +143,11 @@
    private void taskComplete() {
        while (true) {
            try {
                if (delRgvTask){
                    writeDelRgvTask();
                    delRgvTask = false;
                    continue;
                }
                Thread.sleep(100);
                OperateResultExOne<byte[]> result = siemensNet.Read("DB100.12", (short) 1);
                boolean[] status = siemensNet.getByteTransform().TransBool(result.Content, 0, 1);
@@ -170,7 +207,6 @@
                            taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection());
                            break;
                        } else {
                            Thread.sleep(100);
                            TaskProtocol issued = new TaskProtocol(taskProtocol,true);
                            write(issued);
                            taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection());
@@ -255,6 +291,21 @@
                for (TaskProtocol taskProtocol : allTakeTaskProtocol) {
                    if (taskProtocol.getIsRunning() == 1) {//准备下发
//                        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
                        if (taskProtocol.getTaskStatus()==3){
                            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, taskProtocol.getTargetPositionStaNoPlcId());
                            StaProtocol staProtocol = devpThread.getStation().get(taskProtocol.getTargetPositionStaNo());
                            if (staProtocol == null ) {
                                continue;
                            }
                            // 判断是否满足入库条件
                            if (!staProtocol.isAutoing() || staProtocol.isLoading()
                                    || staProtocol.getWorkNo() != 0
                            ){
                                Thread.sleep(500);
//                                    System.out.println("<放货目标站>" + taskProtocol.getTargetPositionStaNo() + "<非自动或者有物或者存在工作号!!!>");
//                                continue;
                            }
                        }
                        //双车
                        if (rgvOtherStatusEnable()) {
                            //另一台车是否允许此台车执行
@@ -264,13 +315,26 @@
                        }
                        if (taskProtocol.getTargetPosition()<=rgvProtocol.getRgvPos()+50
                                && taskProtocol.getTargetPosition()>=rgvProtocol.getRgvPos()-50){
                            Thread.sleep(100);
                            if (taskProtocol.getTaskStatus()==3){
                                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, taskProtocol.getTargetPositionStaNoPlcId());
                                StaProtocol staProtocol = devpThread.getStation().get(taskProtocol.getTargetPositionStaNo());
                                if (staProtocol == null ) {
                                    continue;
                                }
                                // 判断是否满足入库条件
                                if (!staProtocol.isAutoing() || staProtocol.isLoading()
                                        || staProtocol.getWorkNo() != 0
                                ){
                                    Thread.sleep(500);
//                                    System.out.println("<放货目标站>" + taskProtocol.getTargetPositionStaNo() + "<非自动或者有物或者存在工作号!!!>");
                                    continue;
                                }
                            }
                            TaskProtocol issued = new TaskProtocol(taskProtocol);
                            write(issued);
                            taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection());
                            break;
                        } else {
                            Thread.sleep(100);
                            TaskProtocol issued = new TaskProtocol(taskProtocol,true);
                            write(issued);
                            break;
@@ -618,6 +682,7 @@
            } else {
                initRgv();
                connectRgv = false;
//                OutputQueue.RGV.offer(MessageFormat.format("【{0}】读取RGV 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("读取RGV plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            }
@@ -695,6 +760,53 @@
        }
    }
    private boolean writeDelRgvTask() throws InterruptedException {
//
        OperateResult result = siemensNet.Write("DB100.12.0", false);
        OperateResult result0 = siemensNet.Write("DB100.0", (int) 0);
        OperateResult result1 = siemensNet.Write("DB100.4", (short) 0);
        OperateResult result2 = siemensNet.Write("DB100.6", (int) 0);
        OperateResult result3 = siemensNet.Write("DB100.10", (short) 0); // 执行方向(面朝轨道 定位值左小右大)    true:左   false:右
        try {
            // 日志记录
            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
            BasRgvOpt basRgvOpt = new BasRgvOpt(
                    0,
                    0,
                    slave.getId(),
                    new Date(),
                    String.valueOf(0),
                    null,
                    null,
                    null,
                    result.IsSuccess ? 1 : 0,
                    null,
                    new Date(),
                    null
            );
            bean.insert(basRgvOpt);
        } catch (Exception ignore) {
        }
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
            log.info("RGV 命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON("null"));
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON("null")));
            return true;
        } else {
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("写入RGV plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
    public void setDelRgvTask() {
        delRgvTask = true;
    }
    @Override
    public void close() {
        siemensNet.ConnectClose();
src/main/resources/application.yml
@@ -13,7 +13,8 @@
#    password: sa@123
    driver-class-name: dm.jdbc.driver.DmDriver
#    url: jdbc:dm://27.172.2.101:5236/SOURCE
    url: jdbc:dm://127.0.0.1:5236/SOURCE
    url: jdbc:dm://27.172.2.102:5236/SOURCE
#    url: jdbc:dm://127.0.0.1:5236/SOURCE
    username: SYSDBA
    password: Zy@12345
  mvc:
@@ -66,15 +67,15 @@
  #url: 10.32.53.195:8080
  # WMS系统ip
  #  url: 10.210.157.109:8090
  url: 27.172.2.107:9027
  url: 27.172.2.132:9027
  # 入库任务申请接口
  #inboundTaskApplyPath: api/InterFace/inboundTaskApply
  inboundTaskApplyPath: sugood/inboundTaskApply
  inboundTaskApplyPath: api/external/wcs/taskCancel
  #  inboundTaskApplyPath: open/asrs/inboundTaskApply
  # 任务状态反馈接口
  taskStatusFeedbackPath: external/wcs/taskStatusFeedback
  taskStatusFeedbackPath: api/external/wcs/taskStatusFeedback
  # 货位状态更新接口
#  locationUpdatePath: api/InterFace/get_InterFace_TestStorage
  # 移库申请接口
#  movePath: api/InterFace/get_InterFace_TestStorage
  wmsHeartBeat: external/wcs/wmsHeartBeat
  wmsHeartBeat: api/external/wcs/wmsHeartBeat
src/main/resources/mapper/TaskWrkMapper.xml
@@ -123,7 +123,7 @@
        select * from "SOURCE"."wcs_task_wrk"
        where 1=1
        and (("WRK_STS"=14 and "STATUS"=5) or "STATUS"=7 or "STATUS"=4
                 or ("WRK_STS"=4 and "STATUS"=5) or ("WRK_STS"=14 and "STATUS"=9))
                 or ("WRK_STS"=4 and "STATUS"=5))
        order by "IO_PRI" desc,"CREATE_TIME","WRK_NO" ASC
    </select>
@@ -131,7 +131,7 @@
        insert into "SOURCE"."wcs_task_wrk_log"
        select * from "SOURCE"."wcs_task_wrk"
        where "TASK_NO" = #{taskNo}
          and ("STATUS"=5 or "STATUS"=4 or "STATUS"=6 or "STATUS"=7  or "STATUS"=9)
          and ("STATUS"=5 or "STATUS"=4 or "STATUS"=7)
        and ("WRK_NO" not in (select "WRK_NO" from "SOURCE"."asr_bas_devp"))
    </insert>
src/main/webapp/views/commandManage/commandManage.html
@@ -178,6 +178,9 @@
                }
                this.getTableData()
            },
            addTask() {
                this.addTaskFormVisible = true
            },
            exportTable() {
                this.tableSearchParam = {
                    task_no: null,
src/main/webapp/views/deviceOperate/crnOperate.html
@@ -75,24 +75,24 @@
                            </el-form-item>
                        </el-form>
                        <div>
                            <el-button @click="requestOperate('put')" type="primary">入库</el-button>
                            <el-button @click="requestOperate('take')" type="primary">出库</el-button>
                            <el-button @click="requestOperate('stockMove')" type="primary">库位转移</el-button>
                            <el-button @click="requestOperate('siteMove')" type="primary">站到站</el-button>
                            <el-button @click="requestOperate('taskComplete')" type="primary">任务完成</el-button>
                            <el-button @click="requestOperate('clearCommand')" type="primary">清除命令</el-button>
                            <el-button @click="requestOperate('reset')" type="primary">复位</el-button>
<!--                            <el-button @click="requestOperate('put')" type="primary">入库</el-button>-->
<!--                            <el-button @click="requestOperate('take')" type="primary">出库</el-button>-->
<!--                            <el-button @click="requestOperate('stockMove')" type="primary">库位转移</el-button>-->
<!--                            <el-button @click="requestOperate('siteMove')" type="primary">站到站</el-button>-->
<!--                            <el-button @click="requestOperate('taskComplete')" type="primary">任务完成</el-button>-->
<!--                            <el-button @click="requestOperate('clearCommand')" type="primary">清除命令</el-button>-->
<!--                            <el-button @click="requestOperate('reset')" type="primary">复位</el-button>-->
                            <br/>
                            <br/>
                            <el-button @click="requestOperate('auto')" type="warning">联机</el-button>
                            <el-button @click="requestOperate('semiAutomatic')" type="warning">半自动</el-button>
                            <el-button @click="requestOperate('hand')" type="warning">手动</el-button>
                            <el-button @click="requestOperate('onlineWrk4')" type="warning">恢复联机任务</el-button>
                            <el-button @click="requestOperate('onlineWrk3')" type="warning">清除联机任务</el-button>
                            <el-button @click="requestOperate('onlineWrk1')" type="warning">申请完成任务</el-button>
<!--                            <el-button @click="requestOperate('auto')" type="warning">联机</el-button>-->
<!--                            <el-button @click="requestOperate('semiAutomatic')" type="warning">半自动</el-button>-->
<!--                            <el-button @click="requestOperate('hand')" type="warning">手动</el-button>-->
<!--                            <el-button @click="requestOperate('onlineWrk4')" type="warning">恢复联机任务</el-button>-->
<!--                            <el-button @click="requestOperate('onlineWrk3')" type="warning">清除联机任务</el-button>-->
<!--                            <el-button @click="requestOperate('onlineWrk1')" type="warning">申请完成任务</el-button>-->
                            <br/>
                            <br/>
                            <el-button @click="requestOperate('onlineWrk2')" type="warning">申请取消任务</el-button>
<!--                            <el-button @click="requestOperate('onlineWrk2')" type="warning">申请取消任务</el-button>-->
                        </div>
                    </div>
                </el-card>
src/main/webapp/views/deviceOperate/devpOperate.html
@@ -55,8 +55,8 @@
                        </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('out')" type="warning">取货完成</el-button>-->
<!--                            <el-button @click="requestOperate('in')" type="warning">放货完成</el-button>-->
                        </div>
                    </div>
                </el-card>
src/main/webapp/views/deviceOperate/rgvOperate.html
@@ -57,6 +57,7 @@
                            <el-button @click="requestOperate('TakeAndPut')" type="primary">取放货</el-button>
                            <el-button @click="requestOperate('walk')" type="warning">行走</el-button>
                            <el-button @click="requestOperate('del')" type="warning">任务清空</el-button>
                            <el-button @click="requestOperate('delRgvTask')" type="warning">小车强制复位(有任务或者运行时不要操作)</el-button>
                        </div>
                    </div>
                </el-card>
src/main/webapp/views/taskWrk/taskWrk.html
@@ -44,6 +44,7 @@
                <el-form-item>
                    <el-button type="primary" @click="getTableData">查询</el-button>
                    <el-button type="primary" @click="resetParam">重置</el-button>
                    <el-button type="primary" @click="addTask">手动添加任务</el-button>
                </el-form-item>
            </el-form>
            <el-table ref="singleTable" :data="tableData" style="width: 100%;">
@@ -55,7 +56,7 @@
                                <!--                                        <el-dropdown-item command="showCommand">查看指令</el-dropdown-item>-->
                                <el-dropdown-item command="returnWorkingCondition">重新给堆垛机下发任务</el-dropdown-item>
                                <el-dropdown-item command="changeCommand">修改</el-dropdown-item>
                                <el-dropdown-item command="assign">派发</el-dropdown-item>
                                <el-dropdown-item command="assign">跳转到输送线下发完成</el-dropdown-item>
                                <el-dropdown-item command="complete">完结</el-dropdown-item>
                                <el-dropdown-item command="cancel">取消</el-dropdown-item>
                                <el-dropdown-item command="delete">删除无需上报</el-dropdown-item>
@@ -113,6 +114,36 @@
        </div>
    </el-dialog>
    <el-dialog :title="addTaskFormTitle" :visible.sync="addTaskFormVisible">
        <el-form :model="addTaskForm">
            <el-form-item label="任务号" :label-width="addTaskFormLabelWidth">
                <el-input v-model="addTaskForm.taskNo" autocomplete="off"></el-input>
            </el-form-item>
            <el-form-item label="任务类型=》1:出库、2:移库、3:入库" :label-width="200">
                <el-input v-model="addTaskForm.ioType" autocomplete="off"></el-input>
            </el-form-item>
            <el-form-item label="优先级" :label-width="addTaskFormLabelWidth">
                <el-input v-model="addTaskForm.taskPriority" autocomplete="off"></el-input>
            </el-form-item>
            <el-form-item label="容器编码" :label-width="addTaskFormLabelWidth">
                <el-input v-model="addTaskForm.barcode" autocomplete="off"></el-input>
            </el-form-item>
            <el-form-item label="起点位置" :label-width="addTaskFormLabelWidth">
                <el-input v-model="addTaskForm.startPoint" autocomplete="off"></el-input>
            </el-form-item>
            <el-form-item label="终点位置" :label-width="addTaskFormLabelWidth">
                <el-input v-model="addTaskForm.targetPoint" autocomplete="off"></el-input>
            </el-form-item>
            <el-form-item label="备注" :label-width="addTaskFormLabelWidth">
                <el-input v-model="addTaskForm.memo" autocomplete="off"></el-input>
            </el-form-item>
        </el-form>
        <div slot="footer" class="dialog-footer">
            <el-button @click="addTaskFormVisible = false">取 消</el-button>
            <el-button type="primary" @click="addTaskFormConfirm">确 定</el-button>
        </div>
    </el-dialog>
</div>
<script>
    var $layui = layui.config({
@@ -135,9 +166,21 @@
                datetime: null,
            },
            taskWrkFormVisible: false,
            addTaskFormVisible: false,
            taskWrkForm: {},
            addTaskForm: {
                taskNo:"9001",
                ioType:"0",
                taskPriority:1,
                barcode:"10000001",
                startPoint:"1000",
                targetPoint:"F-F01-01-01-01",
                memo:"cs"
            },
            taskWrkFormLabelWidth: '80px',
            taskWrkFormTitle: ''
            addTaskFormLabelWidth: '80px',
            taskWrkFormTitle: '',
            addTaskFormTitle: '手动添加任务'
        },
        created() {
            this.init()
@@ -206,6 +249,9 @@
                }
                this.getTableData()
            },
            addTask() {
                this.addTaskFormVisible = true
            },
            handleCommand(command, row) {
                switch (command) {
                    case "returnWorkingCondition":
@@ -262,7 +308,7 @@
                //派发任务
                let that = this
                $.ajax({
                    url: baseUrl + "/taskWrk/distribute/auth",
                    url: baseUrl + "/taskWrk/assign/auth",
                    headers: {
                        'token': localStorage.getItem('token')
                    },
@@ -440,6 +486,35 @@
                        }
                    }
                });
            },
            addTaskFormConfirm() {
                //修改指定任务数据
                let that = this
                $.ajax({
                    url: baseUrl + "/taskWrk/addTask/auth",
                    headers: {
                        'token': localStorage.getItem('token')
                    },
                    data: this.addTaskForm,
                    method: 'POST',
                    success: function (res) {
                        if (res.code == 200) {
                            that.addTaskFormVisible = false
                            that.$message({
                                message: "更新成功",
                                type: 'success'
                            });
                            that.getTableData()
                        } else if (res.code === 403) {
                            top.location.href = baseUrl + "/";
                        } else {
                            that.$message({
                                message: res.msg,
                                type: 'error'
                            });
                        }
                    }
                });
            }
        }
    })