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.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/a1.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/a2.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/b.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/b1.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/b2.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/background.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner1.jpgBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner2.jpgBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner3.jpgBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner4.jpgBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/banner/banner5.jpgBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/c.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/c1.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/c2.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/d.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/d1.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/d2.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/e.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/e1.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/e2.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/f.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/f1.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/f2.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/g.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/g1.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/g2.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/left.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/right.pngBinary files differ
zy-acs-cv/src/main/webapp/views/monitor/img/wxCode.jpgBinary 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">