1
zhang
2026-01-24 6f2e70d03c9dde5cdb26b8911d6c19e2993a38ab
1
45个文件已删除
12个文件已添加
9个文件已修改
3467 ■■■■ 已修改文件
zy-acs-cv/src/main/java/com/zy/asrs/controller/CtuController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/asrs/service/CtuMainService.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/asrs/service/JobService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/asrs/service/impl/CtuMainServiceImpl.java 279 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/asrs/service/impl/JobServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/ConveyorBackgroundService.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/ConveyorOperationExecutor.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/CtuMainProcess.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/ServerBootstrap.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/enums/ConveyorStateType.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/operation/OperationHandler.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/operation/handler/ClearOperationHandler.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/operation/handler/FakeUserOperationHandler.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/operation/handler/FakeWmsOperationHandler.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/operation/handler/InOperationHandler.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/operation/handler/OutOperationHandler.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/operation/handler/SendTaskOperationHandler.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/properties/CtuOperationConfig.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/properties/CtuServiceProperties.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/resources/application.yml 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/control.html 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/index.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/css/Pacifico.css 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/css/lunbo.css 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/css/monitor.css 656 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/data/map.json 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/echarts.js.map 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/a.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/a1.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/a2.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/b.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/b1.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/b2.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/background.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner1.jpg 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner2.jpg 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner3.jpg 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner4.jpg 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner5.jpg 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/c.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/c1.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/c2.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/d.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/d1.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/d2.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/e.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/e1.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/e2.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/f.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/f1.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/f2.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/g.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/g1.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/g2.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/left.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/right.png 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/img/wxCode.jpg 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/js/echarts/echarts.min.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/js/jquery-3.3.1.min.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/js/jquery.countup.min.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/js/jquery.waypoints.min.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/js/md5.js 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/js/monitor.js 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/js/vincent.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/monitor/monitor.html 928 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/pipeline.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/asrs/controller/CtuController.java
@@ -54,8 +54,8 @@
            stationResponseParam = new StationResponseParam();
            stationResponseParam.setStaNo(staNo);
            stationResponseParam.setOccupied(staProtocol.isLoading());
            stationResponseParam.setInEnable((staProtocol.isInEnable()&&staProtocol.getWorkNo() == 0 ? true : false));
            stationResponseParam.setOutEnable((staProtocol.isOutEnable()&&staProtocol.getWorkNo() > 0 ? true : false));
            stationResponseParam.setInEnable((staProtocol.isInEnable() && staProtocol.getWorkNo() == 0 ? true : false));
            stationResponseParam.setOutEnable((staProtocol.isOutEnable() && staProtocol.getWorkNo() > 0 ? true : false));
            stationResponseParam.setOnline(staProtocol.isAutoing());
            list.add(stationResponseParam);
        }
zy-acs-cv/src/main/java/com/zy/asrs/service/CtuMainService.java
@@ -1,5 +1,7 @@
package com.zy.asrs.service;
import com.zy.asrs.controller.vo.OpenBusSubmitParam;
/**
 * 立体仓库WCS系统主流程业务接口
 * Created by vincent on 2020/8/6
@@ -7,35 +9,19 @@
public interface CtuMainService {
    /**
     * 出库的时候,设备上走
     * 检查站点
     *
     * @param mark 标记
     * @param staNo
     * @return
     */
    void out(Integer mark);
    String checkStationStatus(Integer staNo);
    /**
     * 入库,从拣料站到入库站(CTU取货站)
     * 发送任务
     *
     * @param mark 标记
     * @param openBusSubmitParam
     * @return
     */
    void fake(Integer mark);
    /**
     * 清除数据
     *
     * @param mark 标记
     */
    void clear(Integer mark);
    /**
     * 入库往前走一步,等待ctu来取
     *
     * @param mark 标记
     */
    void waitTake(Integer mark);
    void createTake(Integer mark);
    void fakeWms(Integer mark);
    boolean sendTask(OpenBusSubmitParam openBusSubmitParam);
}
zy-acs-cv/src/main/java/com/zy/asrs/service/JobService.java
@@ -3,7 +3,19 @@
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.Job;
import java.util.List;
public interface JobService extends IService<Job> {
    Job getJobBySeqNum(String seqNum);
    Job getJobByJobNo(Integer jobNo);
    Job getJobByJobNoAndJobSts(Integer workNo, Integer jobSts);
    List<Job> listJobByJobSts(Integer jobSts);
    void saveJobLog(Job job);
}
zy-acs-cv/src/main/java/com/zy/asrs/service/impl/CtuMainServiceImpl.java
@@ -3,37 +3,19 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.core.common.DateUtils;
import com.core.exception.CoolException;
import com.zy.asrs.controller.requestParam.StationRequestParam;
import com.zy.asrs.controller.vo.OpenBusSubmitParam;
import com.zy.asrs.controller.vo.StationStatus;
import com.zy.asrs.controller.vo.TaskDto;
import com.zy.asrs.entity.Job;
import com.zy.asrs.enums.WorkNoTypeType;
import com.zy.asrs.mapper.JobMapper;
import com.zy.asrs.service.CtuMainService;
import com.zy.asrs.service.WrkLastnoService;
import com.zy.common.utils.HttpHandler;
import com.zy.common.utils.News;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.Task;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.SiemensDevpThread;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -47,10 +29,6 @@
@Data
public class CtuMainServiceImpl implements CtuMainService {
    public static final long COMMAND_TIMEOUT = 5 * 1000;
    public static final int LOG_STEP = 1;
    @Value("${ctu.url}")
    private String ctuUrl;
@@ -61,261 +39,6 @@
    @Value("${ctu.sendTask}")
    private String sendTask;
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkLastnoService wrkLastnoService;
    @Autowired
    private JobMapper jobMapper;
    /**
     * 出库的时候,设备上走
     */
    @Transactional
    public synchronized void out(Integer mark) {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历出库口
                for (DevpSlave.Sta releaseSta : devp.getReleaseSta()) {
                    // 获取入库站信息
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(releaseSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    // 判断是否满足条件
                    if (!staProtocol.isLoading()) {
                        continue;
                    }
                    //&& staProtocol.isOutEnable()
                    if (staProtocol.isAutoing() && staProtocol.getWorkNo() == 0) {
                        String seqNum = checkStationStatus(releaseSta.getStaNo());
                        if (seqNum != null) {
                            Job jobBySeqNum = jobMapper.getJobBySeqNum(seqNum);
                            if (jobBySeqNum == null) {
                                int workNo = wrkLastnoService.nextWorkNo(WorkNoTypeType.WORK_NO_TYPE.type);
                                // 下发移动 且 下发plc命令
                                staProtocol.setWorkNo(workNo);
                                staProtocol.setStaNo(releaseSta.getTargetSta());
                                Job job = new Job();
                                job.setSeqNum(seqNum);
                                job.setJobNo(workNo);
                                job.setJobSts(2);
                                if (jobMapper.insert(job) == 0) {
                                    throw new CoolException("插入输送线任务失败," + jobBySeqNum + " - " + workNo);
                                }
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                if (result) {
                                    log.info("输送线下发:{},{}", staProtocol.getWorkNo(), releaseSta.getTargetSta());
                                } else {
                                    News.error("" + (mark + LOG_STEP) + " - 发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId());
                                }
                            }
                        } else {
                            News.errorNoLog("" + (mark + LOG_STEP) + " - 站点信息不符合入库条件!!!" + " 调用RCS检验未通过,站点:" + staProtocol.getSiteId());
                        }
                    } else {
                        News.errorNoLog("" + (mark + LOG_STEP) + " - 站点信息不符合入库条件!!!" + " 自动信号:" + staProtocol.isLoading() + "、可入信号:" + staProtocol.isInEnable() + "、空板信号:" + staProtocol.isEmptyMk() + "、工作号:" + staProtocol.getWorkNo() + "、锁定标记" + staProtocol.isPakMk());
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    /**
     * 从拣料站到入库站(CTU取货站)
     */
    @Transactional
    public synchronized void fake(Integer mark) {
        try {
            // 根据输送线plc遍历
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
            StaProtocol staProtocol = devpThread.getStation().get(1004);
            if (staProtocol == null) {
                return;
            } else {
                staProtocol = staProtocol.clone();
            }
            // 判断是否满足条件
            if (!staProtocol.isLoading()) {
                return;
            }
            if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) {
                Job jobByWorkNo = jobMapper.getJobByJobNo(staProtocol.getWorkNo());
                if (jobByWorkNo != null && jobByWorkNo.getJobSts() == 1) {
                    staProtocol.setStaNo(1006);
                    boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                    if (result) {
                        jobByWorkNo.setJobSts(3);
                        jobByWorkNo.setMemo("模拟按按钮");
                        jobMapper.updateById(jobByWorkNo);
                        log.info("入库输送线下发:{},{}", staProtocol.getWorkNo(), 1006);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    public synchronized void clear(Integer mark) {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历等待ctu取货站
                for (DevpSlave.Sta takeSta : devp.getTakeSta()) {
                    // 根据输送线plc遍历
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(takeSta.getStaNo());
                    if (staProtocol == null) {
                        return;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    // 判断是否满足条件
                    if (staProtocol.isLoading()) {
                        return;
                    }
                    if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) {
                        Job job = jobMapper.getJobByJobNo(staProtocol.getWorkNo());
                        if (job != null && job.getJobSts() >= 5) {
                            staProtocol.setWorkNo(0);
                            staProtocol.setStaNo(0);
                            boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                            if (result) {
                                log.info("" + (mark + LOG_STEP) + "站点清空失败:{},{}", takeSta.getStaNo(), staProtocol.getWorkNo());
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    @Transactional
    public synchronized void waitTake(Integer mark) {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历入库口
                for (DevpSlave.Sta inSta : devp.getInSta()) {
                    // 根据输送线plc遍历
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                    if (staProtocol == null) {
                        return;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    // 判断是否满足条件
                    if (!staProtocol.isLoading()) {
                        return;
                    }
                    if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) {
                        StaProtocol targetStaProtocol = devpThread.getStation().get(inSta.getTargetSta());
                        if (targetStaProtocol.getWorkNo() == 0 && targetStaProtocol.isAutoing() && !targetStaProtocol.isLoading()) {
                            Job job = jobMapper.getJobByJobNoAndJobSts(staProtocol.getWorkNo(), 2);
                            if (job != null) {
                                staProtocol.setWorkNo(staProtocol.getWorkNo());
                                staProtocol.setStaNo(inSta.getTargetSta());
                                boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                                if (result) {
                                    job.setJobSts(4);
                                    job.setInTime(new Date());
                                    if (jobMapper.updateById(job) == 0) {
                                        throw new CoolException("更新输送线任务失败," + " - " + staProtocol.getWorkNo());
                                    }
                                    log.info("" + (mark + LOG_STEP) + "入库前进:{},{}", staProtocol.getWorkNo(), inSta.getTargetSta());
                                }
                            } else {
                                // 模拟操作逻辑
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    @Transactional
    public synchronized void createTake(Integer mark) {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历入库口
                for (DevpSlave.Sta inSta : devp.getInSta()) {
                    // 根据输送线plc遍历
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getTargetSta());
                    if (staProtocol == null) {
                        return;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    // 判断是否满足条件
                    if (!staProtocol.isLoading()) {
                        return;
                    }
                    if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) {
                        Job job = jobMapper.getJobByJobNo(staProtocol.getWorkNo());
                        if (job != null && job.getJobSts() == 4) {
                            job.setJobSts(5);
                            jobMapper.updateById(job);
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    @Transactional
    public synchronized void fakeWms(Integer mark) {
        List<Job> jobs = jobMapper.listJobByJobSts(5);
        for (Job job : jobs) {
            OpenBusSubmitParam openBusSubmitParam = new OpenBusSubmitParam();
            openBusSubmitParam.setBatch(DateUtils.convert(new Date()));
            List<TaskDto> taskList = new ArrayList<>();
            TaskDto taskDto = new TaskDto();
            taskDto.setSeqNum("SSX-RK" + job.getJobNo());
            taskDto.setOriSta("1007");
            taskDto.setPriority(9527);
            taskList.add(taskDto);
            openBusSubmitParam.setTaskList(taskList);
            boolean b = sendTask(openBusSubmitParam);
            if (b){
                job.setJobSts(6);
                job.setRcsTime(new Date());
                jobMapper.updateById(job);
                log.info("任务发送给RCS成功," + job.getSeqNum() + " - " + job.getJobNo());
            }else {
                log.info("任务发送给RCS失败," + job.getSeqNum() + " - " + job.getJobNo());
            }
        }
    }
    @Transactional
    public boolean sendTask(OpenBusSubmitParam openBusSubmitParam) {
@@ -345,7 +68,7 @@
     * @param staNo 站点编号
     * @return 站点是否可通行
     */
    private String checkStationStatus(Integer staNo) {
    public String checkStationStatus(Integer staNo) {
        StationRequestParam stationRequestParam = new StationRequestParam();
        List<String> staNos = new ArrayList<>();
        staNos.add(staNo + "");
zy-acs-cv/src/main/java/com/zy/asrs/service/impl/JobServiceImpl.java
@@ -11,6 +11,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
public class JobServiceImpl extends ServiceImpl<JobMapper, Job> implements JobService {
@@ -19,6 +21,27 @@
    @Override
    public Job getJobBySeqNum(String seqNum) {
        return baseMapper.getJobBySeqNum(seqNum);
    }
    @Override
    public Job getJobByJobNo(Integer jobNo) {
        return baseMapper.getJobByJobNo(jobNo);
    }
    @Override
    public Job getJobByJobNoAndJobSts(Integer workNo, Integer jobSts) {
        return baseMapper.getJobByJobNoAndJobSts(workNo, jobSts);
    }
    @Override
    public List<Job> listJobByJobSts(Integer jobSts) {
        return baseMapper.listJobByJobSts(jobSts);
    }
    @Override
    @Transactional
    public void saveJobLog(Job job) {
        JobLog jobLog = new JobLog();
zy-acs-cv/src/main/java/com/zy/core/ConveyorBackgroundService.java
New file
@@ -0,0 +1,90 @@
package com.zy.core;
import com.zy.core.properties.CtuOperationConfig;
import com.zy.core.properties.CtuServiceProperties;
import com.zy.core.properties.SystemProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@Slf4j
@Component
public class ConveyorBackgroundService {
    @Autowired
    private ApplicationContext applicationContext;
    @Autowired
    private ConveyorOperationExecutor operationExecutor;
    @Autowired
    private CtuServiceProperties properties;
    private ScheduledExecutorService executorService;
    private final AtomicBoolean running = new AtomicBoolean(false);
    @PostConstruct
    public void init() {
        // 初始化线程池
        executorService = Executors.newSingleThreadScheduledExecutor(r -> {
            Thread thread = new Thread(r);
            thread.setName("cv-background-thread");
            thread.setDaemon(true);
            return thread;
        });
        // 启动定时任务
        executorService.scheduleAtFixedRate(this::processConveyorTasks,
                properties.getInitialDelay(),
                properties.getInterval(),
                TimeUnit.MILLISECONDS);
        running.set(true);
        log.info("输送线后台服务线程初始化完成");
    }
    private void processConveyorTasks() {
        // 系统运行状态判断
        if (!SystemProperties.WCS_RUNNING_STATUS.get() || !running.get()) {
            log.debug("系统未运行或服务已停止,跳过输送线任务处理");
            return;
        }
        try {
            // 执行配置的操作序列
            for (CtuOperationConfig config : properties.getOperations()) {
                operationExecutor.execute(config);
            }
            //log.info("输送线任务处理完成");
        } catch (Exception e) {
            log.error("输送线任务处理异常", e);
        }
    }
    @PreDestroy
    public void shutDown() {
        running.set(false);
        if (executorService != null && !executorService.isShutdown()) {
            log.info("正在关闭输送线后台服务线程...");
            executorService.shutdown();
            try {
                if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
                    executorService.shutdownNow();
                }
            } catch (InterruptedException e) {
                executorService.shutdownNow();
                Thread.currentThread().interrupt();
            }
            log.info("输送线后台服务线程已关闭");
        }
    }
}
zy-acs-cv/src/main/java/com/zy/core/ConveyorOperationExecutor.java
New file
@@ -0,0 +1,59 @@
package com.zy.core;
import com.zy.core.enums.ConveyorStateType;
import com.zy.core.operation.OperationHandler;
import com.zy.core.properties.CtuOperationConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Component
public class ConveyorOperationExecutor {
    private final Map<ConveyorStateType, OperationHandler> handlerMap = new ConcurrentHashMap<>();
    @Autowired
    public ConveyorOperationExecutor(List<OperationHandler> handlers) {
        // 自动注册所有操作处理器
        for (OperationHandler handler : handlers) {
            handlerMap.put(handler.getType(), handler);
            log.info("注册输送线操作处理器: {}", handler.getType());
        }
    }
    public void execute(CtuOperationConfig config) {
        OperationHandler handler = handlerMap.get(config.getType());
        if (handler == null) {
            log.warn("未找到操作处理器: {}", config.getType());
            return;
        }
        int retryCount = 0;
        while (retryCount < config.getMaxRetries()) {
            try {
                handler.execute(config);
                return;
            } catch (Exception e) {
                retryCount++;
                if (retryCount >= config.getMaxRetries()) {
                    log.error("操作执行失败,已达到最大重试次数: {}", config.getType(), e);
                } else {
                    log.warn("操作执行失败,正在重试({}/{})",
                            retryCount, config.getMaxRetries(), e);
                    try {
                        Thread.sleep(config.getRetryDelay());
                    } catch (InterruptedException ie) {
                        Thread.currentThread().interrupt();
                        log.error("重试休眠被中断", ie);
                        return;
                    }
                }
            }
        }
    }
}
zy-acs-cv/src/main/java/com/zy/core/CtuMainProcess.java
File was deleted
zy-acs-cv/src/main/java/com/zy/core/ServerBootstrap.java
@@ -27,8 +27,8 @@
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private CtuMainProcess ctuMainProcess;
//    @Autowired
//    private CtuMainProcess ctuMainProcess;
    /**
     * PostConstruct会在加载servlet的时候运行一次
@@ -45,8 +45,7 @@
        initMq();
        // 初始化下位机线程
        initThread();
        // 开始主流程进程
        ctuMainProcess.start();
        News.info("核心控制层已启动...............................................");
    }
zy-acs-cv/src/main/java/com/zy/core/enums/ConveyorStateType.java
New file
@@ -0,0 +1,18 @@
package com.zy.core.enums;
public enum ConveyorStateType {
    OUTBOUND,
    FAKEWMS,
    INBOUND,
    FAKETASK,
    CLEARSIGNAL,
    SENDTASK;
    ConveyorStateType() {
    }
}
zy-acs-cv/src/main/java/com/zy/core/operation/OperationHandler.java
New file
@@ -0,0 +1,11 @@
package com.zy.core.operation;
import com.zy.core.enums.ConveyorStateType;
import com.zy.core.properties.CtuOperationConfig;
public interface OperationHandler {
    ConveyorStateType getType();
    void execute(CtuOperationConfig config);
}
zy-acs-cv/src/main/java/com/zy/core/operation/handler/ClearOperationHandler.java
New file
@@ -0,0 +1,87 @@
package com.zy.core.operation.handler;
import com.zy.asrs.entity.Job;
import com.zy.asrs.service.CtuMainService;
import com.zy.asrs.service.JobService;
import com.zy.asrs.service.WrkLastnoService;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.ConveyorStateType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.Task;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.operation.OperationHandler;
import com.zy.core.properties.CtuOperationConfig;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.SiemensDevpThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
/**
 * 清理站点信号
 */
@Slf4j
@Component
public class ClearOperationHandler implements OperationHandler {
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkLastnoService wrkLastnoService;
    @Autowired
    private CtuMainService ctuMainService;
    @Autowired
    private JobService jobService;
    @Override
    public ConveyorStateType getType() {
        return ConveyorStateType.CLEARSIGNAL;
    }
    @Override
    public void execute(CtuOperationConfig config) {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历等待ctu取货站
                for (DevpSlave.Sta takeSta : devp.getTakeSta()) {
                    // 根据输送线plc遍历
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(takeSta.getStaNo());
                    if (staProtocol == null) {
                        return;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    // 判断是否满足条件
                    if (staProtocol.isLoading()) {
                        return;
                    }
                    if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) {
                        Job job = jobService.getJobByJobNo(staProtocol.getWorkNo());
                        if (job != null && job.getJobSts() >= 5) {
                            staProtocol.setWorkNo(0);
                            staProtocol.setStaNo(0);
                            boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                            if (result) {
                                log.info("" + config.getMark() + "站点清空失败:{},{}", takeSta.getStaNo(), staProtocol.getWorkNo());
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
}
zy-acs-cv/src/main/java/com/zy/core/operation/handler/FakeUserOperationHandler.java
New file
@@ -0,0 +1,82 @@
package com.zy.core.operation.handler;
import com.zy.asrs.entity.Job;
import com.zy.asrs.service.CtuMainService;
import com.zy.asrs.service.JobService;
import com.zy.asrs.service.WrkLastnoService;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.ConveyorStateType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.Task;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.operation.OperationHandler;
import com.zy.core.properties.CtuOperationConfig;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.SiemensDevpThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
/**
 * 模拟用户按按钮
 */
@Slf4j
@Component
public class FakeUserOperationHandler implements OperationHandler {
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkLastnoService wrkLastnoService;
    @Autowired
    private CtuMainService ctuMainService;
    @Autowired
    private JobService jobService;
    @Override
    public ConveyorStateType getType() {
        return ConveyorStateType.FAKEWMS;
    }
    @Override
    public void execute(CtuOperationConfig config) {
        try {
            // 根据输送线plc遍历
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
            StaProtocol staProtocol = devpThread.getStation().get(1004);
            if (staProtocol == null) {
                return;
            } else {
                staProtocol = staProtocol.clone();
            }
            // 判断是否满足条件
            if (!staProtocol.isLoading()) {
                return;
            }
            if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) {
                Job jobByWorkNo = jobService.getJobByJobNo(staProtocol.getWorkNo());
                if (jobByWorkNo != null && jobByWorkNo.getJobSts() == 1) {
                    staProtocol.setStaNo(1006);
                    boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                    if (result) {
                        jobByWorkNo.setJobSts(3);
                        jobByWorkNo.setMemo("模拟按按钮");
                        jobService.updateById(jobByWorkNo);
                        log.info("入库输送线下发:{},{}", staProtocol.getWorkNo(), 1006);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
}
zy-acs-cv/src/main/java/com/zy/core/operation/handler/FakeWmsOperationHandler.java
New file
@@ -0,0 +1,72 @@
package com.zy.core.operation.handler;
import com.core.common.DateUtils;
import com.zy.asrs.controller.vo.OpenBusSubmitParam;
import com.zy.asrs.controller.vo.TaskDto;
import com.zy.asrs.entity.Job;
import com.zy.asrs.service.CtuMainService;
import com.zy.asrs.service.JobService;
import com.zy.asrs.service.WrkLastnoService;
import com.zy.core.enums.ConveyorStateType;
import com.zy.core.operation.OperationHandler;
import com.zy.core.properties.CtuOperationConfig;
import com.zy.core.properties.SlaveProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * 模拟WMS
 */
@Slf4j
@Component
public class FakeWmsOperationHandler implements OperationHandler {
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkLastnoService wrkLastnoService;
    @Autowired
    private CtuMainService ctuMainService;
    @Autowired
    private JobService jobService;
    @Override
    public ConveyorStateType getType() {
        return ConveyorStateType.FAKEWMS;
    }
    @Override
    public void execute(CtuOperationConfig config) {
        List<Job> jobs = jobService.listJobByJobSts(5);
        for (Job job : jobs) {
            OpenBusSubmitParam openBusSubmitParam = new OpenBusSubmitParam();
            openBusSubmitParam.setBatch(DateUtils.convert(new Date()));
            List<TaskDto> taskList = new ArrayList<>();
            TaskDto taskDto = new TaskDto();
            taskDto.setSeqNum("SSX-RK" + job.getJobNo());
            taskDto.setOriSta("1007");
            taskDto.setPriority(9527);
            taskList.add(taskDto);
            openBusSubmitParam.setTaskList(taskList);
            boolean b = ctuMainService.sendTask(openBusSubmitParam);
            if (b) {
                job.setJobSts(6);
                job.setRcsTime(new Date());
                jobService.updateById(job);
                log.info("任务发送给RCS成功," + job.getSeqNum() + " - " + job.getJobNo());
            } else {
                log.info("任务发送给RCS失败," + job.getSeqNum() + " - " + job.getJobNo());
            }
        }
    }
}
zy-acs-cv/src/main/java/com/zy/core/operation/handler/InOperationHandler.java
New file
@@ -0,0 +1,99 @@
package com.zy.core.operation.handler;
import com.core.exception.CoolException;
import com.zy.asrs.entity.Job;
import com.zy.asrs.service.CtuMainService;
import com.zy.asrs.service.JobService;
import com.zy.asrs.service.WrkLastnoService;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.ConveyorStateType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.Task;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.operation.OperationHandler;
import com.zy.core.properties.CtuOperationConfig;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.SiemensDevpThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.Date;
/**
 * 入库
 */
@Slf4j
@Component
public class InOperationHandler implements OperationHandler {
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkLastnoService wrkLastnoService;
    @Autowired
    private CtuMainService ctuMainService;
    @Autowired
    private JobService jobService;
    @Override
    public ConveyorStateType getType() {
        return ConveyorStateType.INBOUND;
    }
    @Override
    public void execute(CtuOperationConfig config) {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历入库口
                for (DevpSlave.Sta inSta : devp.getInSta()) {
                    // 根据输送线plc遍历
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                    if (staProtocol == null) {
                        return;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    // 判断是否满足条件
                    if (!staProtocol.isLoading()) {
                        return;
                    }
                    if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) {
                        StaProtocol targetStaProtocol = devpThread.getStation().get(inSta.getTargetSta());
                        if (targetStaProtocol.getWorkNo() == 0 && targetStaProtocol.isAutoing() && !targetStaProtocol.isLoading()) {
                            Job job = jobService.getJobByJobNoAndJobSts(staProtocol.getWorkNo(), 2);
                            if (job != null) {
                                staProtocol.setWorkNo(staProtocol.getWorkNo());
                                staProtocol.setStaNo(inSta.getTargetSta());
                                boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                                if (result) {
                                    job.setJobSts(4);
                                    job.setInTime(new Date());
                                    if (jobService.updateById(job)) {
                                        throw new CoolException("更新输送线任务失败," + " - " + staProtocol.getWorkNo());
                                    }
                                    log.info("" + config.getMark() + "入库前进:{},{}", staProtocol.getWorkNo(), inSta.getTargetSta());
                                }
                            } else {
                                // 模拟操作逻辑
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
}
zy-acs-cv/src/main/java/com/zy/core/operation/handler/OutOperationHandler.java
New file
@@ -0,0 +1,108 @@
package com.zy.core.operation.handler;
import com.core.exception.CoolException;
import com.zy.asrs.entity.Job;
import com.zy.asrs.enums.WorkNoTypeType;
import com.zy.asrs.service.CtuMainService;
import com.zy.asrs.service.JobService;
import com.zy.asrs.service.WrkLastnoService;
import com.zy.common.utils.News;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.ConveyorStateType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.Task;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.operation.OperationHandler;
import com.zy.core.properties.CtuOperationConfig;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.SiemensDevpThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
@Slf4j
@Component
public class OutOperationHandler implements OperationHandler {
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkLastnoService wrkLastnoService;
    @Autowired
    private CtuMainService ctuMainService;
    @Autowired
    private JobService jobService;
    @Override
    public ConveyorStateType getType() {
        return ConveyorStateType.OUTBOUND;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void execute(CtuOperationConfig config) {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历出库口
                for (DevpSlave.Sta releaseSta : devp.getReleaseSta()) {
                    // 获取入库站信息
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(releaseSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    // 判断是否满足条件
                    if (!staProtocol.isLoading()) {
                        continue;
                    }
                    //&& staProtocol.isOutEnable()
                    if (staProtocol.isAutoing() && staProtocol.getWorkNo() == 0) {
                        String seqNum = ctuMainService.checkStationStatus(releaseSta.getStaNo());
                        if (seqNum != null) {
                            Job jobBySeqNum = jobService.getJobBySeqNum(seqNum);
                            if (jobBySeqNum == null) {
                                int workNo = wrkLastnoService.nextWorkNo(WorkNoTypeType.WORK_NO_TYPE.type);
                                // 下发移动 且 下发plc命令
                                staProtocol.setWorkNo(workNo);
                                staProtocol.setStaNo(releaseSta.getTargetSta());
                                Job job = new Job();
                                job.setSeqNum(seqNum);
                                job.setJobNo(workNo);
                                job.setJobSts(2);
                                if (!jobService.insert(job)) {
                                    throw new CoolException("插入输送线任务失败," + jobBySeqNum + " - " + workNo);
                                }
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                if (result) {
                                    log.info("输送线下发:{},{}", staProtocol.getWorkNo(), releaseSta.getTargetSta());
                                } else {
                                    News.error("" + config.getMark() + " - 发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId());
                                }
                            }
                        } else {
                            News.errorNoLog("" + config.getMark() + " - 站点信息不符合入库条件!!!" + " 调用RCS检验未通过,站点:" + staProtocol.getSiteId());
                        }
                    } else {
                        News.errorNoLog("" + config.getMark() + " - 站点信息不符合入库条件!!!" + " 自动信号:" + staProtocol.isLoading() + "、可入信号:" + staProtocol.isInEnable() + "、空板信号:" + staProtocol.isEmptyMk() + "、工作号:" + staProtocol.getWorkNo() + "、锁定标记" + staProtocol.isPakMk());
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
}
zy-acs-cv/src/main/java/com/zy/core/operation/handler/SendTaskOperationHandler.java
New file
@@ -0,0 +1,72 @@
package com.zy.core.operation.handler;
import com.zy.asrs.entity.Job;
import com.zy.asrs.service.JobService;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.ConveyorStateType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.operation.OperationHandler;
import com.zy.core.properties.CtuOperationConfig;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.SiemensDevpThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
/**
 * 发送任务给RCS
 */
@Slf4j
@Component
public class SendTaskOperationHandler implements OperationHandler {
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private JobService jobService;
    @Override
    public ConveyorStateType getType() {
        return ConveyorStateType.SENDTASK;
    }
    @Override
    public void execute(CtuOperationConfig config) {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历入库口
                for (DevpSlave.Sta inSta : devp.getInSta()) {
                    // 根据输送线plc遍历
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getTargetSta());
                    if (staProtocol == null) {
                        return;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    // 判断是否满足条件
                    if (!staProtocol.isLoading()) {
                        return;
                    }
                    if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) {
                        Job job = jobService.getJobByJobNo(staProtocol.getWorkNo());
                        if (job != null && job.getJobSts() == 4) {
                            job.setJobSts(5);
                            jobService.updateById(job);
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
}
zy-acs-cv/src/main/java/com/zy/core/properties/CtuOperationConfig.java
New file
@@ -0,0 +1,16 @@
package com.zy.core.properties;
import com.zy.core.enums.ConveyorStateType;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class CtuOperationConfig {
    private ConveyorStateType type;
    private int mark;
    private int maxRetries = 3;
    private long retryDelay = 500;
    private Map<String, Object> params = new HashMap<>();
}
zy-acs-cv/src/main/java/com/zy/core/properties/CtuServiceProperties.java
New file
@@ -0,0 +1,19 @@
package com.zy.core.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
// 配置类
@ConfigurationProperties(prefix = "ctu.service")
@Component
@Data
public class CtuServiceProperties {
    private long initialDelay = 0;
    private long interval = 1000;
    private List<CtuOperationConfig> operations = new ArrayList<>();
}
zy-acs-cv/src/main/resources/application.yml
@@ -20,10 +20,31 @@
ctu:
  url: 10.10.10.200:8088
  station: /api/open/station/convey
  locSync: /api/open/loc/sync
  sendTask: /api/open/bus/submit
  getLoc: /api/open/loc/one
  update: /api/open/sta/update
  service:
    initial-delay: 0
    interval: 1000
    operations:
      - type: OUTBOUND
        mark: 10
        max-retries: 3
        retry-delay: 500
      - type: FAKEWMS
        mark: 30
        max-retries: 2
        retry-delay: 300
      - type: INBOUND
        mark: 40
        max-retries: 3
        retry-delay: 500
      - type: CLEARSIGNAL
        mark: 60
        max-retries: 2
        retry-delay: 300
      - type: SENDTASK
        mark: 60
        max-retries: 2
        retry-delay: 300
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
zy-acs-cv/src/main/webapp/views/control.html
File was deleted
zy-acs-cv/src/main/webapp/views/index.html
@@ -5,7 +5,7 @@
    <meta name="viewport"
          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>自动仓库WCS系统</title>
    <title>自动仓库输送线系统</title>
    <link rel="icon" type="image/x-icon" href="../static/images/favicon.ico">
    <link rel="stylesheet" href="../static/css/index.css">
    <link rel="stylesheet" href="../static/css/layx.min.css">
zy-acs-cv/src/main/webapp/views/monitor/css/Pacifico.css
File was deleted
zy-acs-cv/src/main/webapp/views/monitor/css/lunbo.css
File was deleted
zy-acs-cv/src/main/webapp/views/monitor/css/monitor.css
File was deleted
zy-acs-cv/src/main/webapp/views/monitor/data/map.json
File was deleted
zy-acs-cv/src/main/webapp/views/monitor/echarts.js.map
File was deleted
zy-acs-cv/src/main/webapp/views/monitor/img/a.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/a1.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/a2.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/b.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/b1.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/b2.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/background.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner1.jpg
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner2.jpg
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner3.jpg
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner4.jpg
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner5.jpg
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/c.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/c1.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/c2.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/d.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/d1.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/d2.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/e.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/e1.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/e2.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/f.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/f1.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/f2.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/g.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/g1.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/g2.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/left.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/right.png
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/wxCode.jpg
Binary files differ
zy-acs-cv/src/main/webapp/views/monitor/js/echarts/echarts.min.js
File was deleted
zy-acs-cv/src/main/webapp/views/monitor/js/jquery-3.3.1.min.js
File was deleted
zy-acs-cv/src/main/webapp/views/monitor/js/jquery.countup.min.js
File was deleted
zy-acs-cv/src/main/webapp/views/monitor/js/jquery.waypoints.min.js
File was deleted
zy-acs-cv/src/main/webapp/views/monitor/js/md5.js
File was deleted
zy-acs-cv/src/main/webapp/views/monitor/js/monitor.js
File was deleted
zy-acs-cv/src/main/webapp/views/monitor/js/vincent.js
File was deleted
zy-acs-cv/src/main/webapp/views/monitor/monitor.html
File was deleted
zy-acs-cv/src/main/webapp/views/pipeline.html
@@ -6,7 +6,7 @@
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport"
          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <title>WCS输送设备管理</title>
    <title>输送设备管理</title>
    <link rel="stylesheet" href="../static/css/normalize.css">
    <link rel="stylesheet" href="../static/css/common.css">
    <link rel="stylesheet" href="../static/css/pipeline.css">