package com.zy.asrs.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.baomidou.mybatisplus.mapper.Wrapper;
|
import com.core.common.Cools;
|
import com.core.common.DateUtils;
|
import com.core.exception.CoolException;
|
import com.zy.asrs.entity.*;
|
import com.zy.asrs.mapper.*;
|
import com.zy.asrs.service.*;
|
import com.zy.asrs.utils.Utils;
|
import com.zy.asrs.utils.VersionUtils;
|
import com.zy.common.model.LocTypeDto;
|
import com.zy.common.model.MatDto;
|
import com.zy.common.model.SearchLocParam;
|
import com.zy.common.model.StartupDto;
|
import com.zy.common.service.CommonService;
|
import com.zy.common.utils.CollectionUtils;
|
import com.zy.common.utils.HttpHandler;
|
import com.zy.core.CrnThread;
|
import com.zy.core.DevpThread;
|
import com.zy.core.cache.MessageQueue;
|
import com.zy.core.cache.SlaveConnection;
|
import com.zy.core.enums.*;
|
import com.zy.core.model.*;
|
import com.zy.core.model.command.CrnCommand;
|
import com.zy.core.model.command.LedCommand;
|
import com.zy.core.model.command.RgvCommand;
|
import com.zy.core.model.protocol.CrnProtocol;
|
import com.zy.core.model.protocol.RgvProtocol;
|
import com.zy.core.model.protocol.StaProtocol;
|
import com.zy.core.properties.SlaveProperties;
|
import com.zy.core.thread.BarcodeThread;
|
import com.zy.core.thread.LedThread;
|
import com.zy.core.thread.SiemensDevpThread;
|
import com.zy.core.thread.SiemensRgvThread;
|
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.*;
|
import java.util.concurrent.TimeUnit;
|
import java.util.stream.Collectors;
|
|
/**
|
* 立体仓库WCS系统主流程业务
|
* Created by vincent on 2020/8/6
|
*/
|
@Slf4j
|
@Service("mainService")
|
@Transactional
|
public class MainServiceImpl {
|
|
public static final long COMMAND_TIMEOUT = 5 * 1000;
|
|
@Autowired
|
private CommonService commonService;
|
@Autowired
|
private SlaveProperties slaveProperties;
|
@Autowired
|
private WrkMastStaMapper wrkMastStaMapper;
|
@Autowired
|
private FillingMastService fillingMastService;
|
@Autowired
|
private VacuumMastService vacuumMastService;
|
|
@Value("${wms.url}")
|
private String wmsUrl;
|
|
public Integer wrkNo1 = 10000;
|
|
public Integer wrkNo2 = 20000;
|
|
|
|
/**
|
* 堆垛机演示 ===>> 库位移转
|
*/
|
public void getRgvTask() {
|
for (DevpSlave devp : slaveProperties.getDevp()) {
|
for (DevpSlave.Sta inSta : devp.getInSta()) {
|
for (RgvSlave rgv : slaveProperties.getRgv()) {
|
if (!rgv.getDemo()){
|
continue;
|
}
|
SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
|
StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
|
if (staProtocol == null) {
|
continue;
|
} else {
|
staProtocol = staProtocol.clone();
|
}
|
|
if (staProtocol.isPakMk()){
|
VacuumMast vacuumMast = vacuumMastService.selectByStatusIsN();
|
FillingMast fillingMast = fillingMastService.selectByStatusIsn();
|
Date now = new Date();
|
WrkMastSta wrkMastSta = new WrkMastSta();
|
int workNo = commonService.getWorkNo(0);
|
wrkMastSta.setWrkNo((long)workNo);
|
wrkMastSta.setWrkStart(2);
|
wrkMastSta.setWrkEnd(vacuumMast.getStaNo());
|
// wrkMastSta.setStaStart();
|
wrkMastSta.setStaEnd(fillingMast.getStaNo());
|
wrkMastSta.setCreateTime(now);
|
wrkMastSta.setUpdateTime(now);
|
wrkMastSta.setBignTime(now);
|
wrkMastSta.setType(0); //类型 0:非空 1:空板
|
wrkMastSta.setWrkType(3); //工作类型 1:取(叠盘) 2:放 3:取放 4:拆盘
|
Integer insert = wrkMastStaMapper.insert(wrkMastSta);
|
if (insert>0){
|
devpThread.setPakMk(devp.getId(),false);
|
}
|
}
|
}
|
|
}
|
}
|
}
|
public synchronized void RGVDemoShow0() {
|
try {
|
for (DevpSlave devp : slaveProperties.getDevp()) {
|
for (DevpSlave.Sta inSta : devp.getInSta()) {
|
SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
|
StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
|
if (staProtocol == null) {
|
continue;
|
} else {
|
staProtocol = staProtocol.clone();
|
}
|
// if (){ //输送线状态
|
//
|
// }
|
|
for (RgvSlave rgv : slaveProperties.getRgv()) {
|
|
SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
|
RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
|
if (rgvProtocol == null) {
|
continue;
|
}else {
|
rgvProtocol = rgvProtocol.clone();
|
}
|
if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
|
&& rgvProtocol.getModeType() == RgvModeType.AUTO
|
&& rgvProtocol.getLoaded1()==0
|
&& rgvProtocol.getTaskNo1() == 0
|
&& rgvThread.isPakMk()
|
){
|
WrkMastSta wrkMastSta = wrkMastStaMapper.selectWrkSts0();
|
if (!Cools.isEmpty(wrkMastSta)){
|
// 命令下发区 --------------------------------------------------------------------------
|
RgvCommand rgvCommand = new RgvCommand();
|
rgvCommand.setRgvNo(rgv.getId()); // RGV编号
|
rgvCommand.setAckFinish1(false); // 工位1任务完成确认位
|
rgvCommand.setTaskNo1(wrkNo1); // 工位1工作号
|
rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式: 取放货
|
rgvCommand.setSourceStaNo1(wrkMastSta.getWrkStart().shortValue()); //工位1起点
|
rgvCommand.setDestinationStaNo1(wrkMastSta.getWrkEnd().shortValue()); //工位1目标站点
|
rgvCommand.setCommand((short) 1); //工位1任务确认
|
if (!MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, rgvCommand))) {
|
//step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务
|
log.error("RGV命令下发失败,RGV号={},任务数据={}", rgv.getId(), JSON.toJSON(rgvCommand));
|
|
} else {
|
vacuumMastStatusSetY(wrkMastSta.getWrkEnd());
|
rgvThread.setPakMk(false);
|
|
wrkMastSta.setWrkSts(1);
|
Integer update = wrkMastStaMapper.updateById(wrkMastSta);
|
if (update>0){
|
|
}else {
|
log.error("RGV命令下发后,更新工作任务状态失败");
|
}
|
|
}
|
|
}
|
|
|
}
|
|
}
|
}
|
|
}
|
|
} catch (Exception e) {
|
log.error("Rgv演示 ===>> 失败", e);
|
e.printStackTrace();
|
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
}
|
}
|
|
public synchronized void RGVDemoShow1() {
|
try {
|
for (DevpSlave devp : slaveProperties.getDevp()) {
|
for (DevpSlave.Sta inSta : devp.getInSta()) {
|
SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
|
StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
|
if (staProtocol == null) {
|
continue;
|
} else {
|
staProtocol = staProtocol.clone();
|
}
|
// if (){ //输送线状态
|
//
|
// }
|
|
for (RgvSlave rgv : slaveProperties.getRgv()) {
|
if (!rgv.getDemo()) {
|
continue;
|
}
|
SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
|
RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
|
if (rgvProtocol == null) {
|
continue;
|
}else {
|
rgvProtocol = rgvProtocol.clone();
|
}
|
if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
|
&& rgvProtocol.getModeType() == RgvModeType.AUTO
|
&& rgvProtocol.getLoaded1()==0
|
&& rgvProtocol.getTaskNo1() == 0
|
&& rgvThread.isPakMk()
|
){
|
WrkMastSta wrkMastSta = wrkMastStaMapper.selectWrkSts1();
|
if (!Cools.isEmpty(wrkMastSta)){
|
// 命令下发区 --------------------------------------------------------------------------
|
RgvCommand rgvCommand = new RgvCommand();
|
rgvCommand.setRgvNo(rgv.getId()); // RGV编号
|
rgvCommand.setAckFinish1(false); // 工位1任务完成确认位
|
rgvCommand.setTaskNo1(wrkNo1); // 工位1工作号
|
rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式: 取放货
|
rgvCommand.setSourceStaNo1(wrkMastSta.getWrkEnd().shortValue()); //工位1起点
|
rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue()); //工位1目标站点
|
rgvCommand.setCommand((short) 1); //工位1任务确认
|
if (!MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, rgvCommand))) {
|
//step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务
|
log.error("RGV命令下发失败,RGV号={},任务数据={}", rgv.getId(), JSON.toJSON(rgvCommand));
|
|
} else {
|
rgvThread.setPakMk(false);
|
vacuumMastStatusSetN(wrkMastSta.getWrkEnd());
|
fillingMastStatusSetY(wrkMastSta.getStaEnd());
|
|
wrkMastSta.setWrkSts(2);
|
Integer update = wrkMastStaMapper.updateById(wrkMastSta);
|
if (update>0){
|
|
}else {
|
log.error("RGV命令下发后,更新工作任务状态失败");
|
}
|
|
}
|
|
}
|
|
|
}
|
|
}
|
}
|
|
}
|
|
} catch (Exception e) {
|
log.error("Rgv演示 ===>> 失败", e);
|
e.printStackTrace();
|
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
}
|
}
|
|
public synchronized void RGVDemoShow2() throws InterruptedException {
|
for (RgvSlave rgv : slaveProperties.getRgv()) {
|
// if (!rgv.getDemo()) {
|
// continue;
|
// }
|
SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
|
RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
|
if (rgvProtocol == null) {
|
continue;
|
}else {
|
rgvProtocol = rgvProtocol.clone();
|
}
|
if ((rgvProtocol.getStatusType1() == RgvStatusType.WAITING || rgvProtocol.getStatusType1()==RgvStatusType.FETCHWAITING)
|
&& rgvProtocol.getModeType() == RgvModeType.AUTO
|
&& rgvProtocol.getTaskNo1() >0
|
// && (rgvProtocol.getStatusType() == RgvStatusType.WORKING1)
|
){
|
boolean rgvComplete = rgvComplete(rgv.getId());
|
if (rgvComplete){
|
rgvThread.setPakMk(true);
|
}
|
|
}
|
|
}
|
}
|
|
public boolean vacuumMastStatusSetN(Integer staNo){
|
EntityWrapper<VacuumMast> vacuumMastEntityWrapper = new EntityWrapper<>();
|
vacuumMastEntityWrapper.eq("sta_no",staNo);
|
VacuumMast vacuumMast = vacuumMastService.selectOne(vacuumMastEntityWrapper);
|
vacuumMast.setStatus("N");
|
boolean update = vacuumMastService.update(vacuumMast, vacuumMastEntityWrapper);
|
return update;
|
}
|
public boolean vacuumMastStatusSetY(Integer staNo){
|
EntityWrapper<VacuumMast> vacuumMastEntityWrapper = new EntityWrapper<>();
|
vacuumMastEntityWrapper.eq("sta_no",staNo);
|
VacuumMast vacuumMast = vacuumMastService.selectOne(vacuumMastEntityWrapper);
|
vacuumMast.setStatus("Y");
|
boolean update = vacuumMastService.update(vacuumMast, vacuumMastEntityWrapper);
|
return update;
|
}
|
public boolean fillingMastStatusSetN(Integer staNo){
|
EntityWrapper<FillingMast> fillingMastEntityWrapper = new EntityWrapper<>();
|
fillingMastEntityWrapper.eq("sta_no",staNo);
|
FillingMast fillingMast = fillingMastService.selectOne(fillingMastEntityWrapper);
|
fillingMast.setStatus("N");
|
boolean update = fillingMastService.update(fillingMast, fillingMastEntityWrapper);
|
return update;
|
}
|
|
public boolean fillingMastStatusSetY(Integer staNo){
|
EntityWrapper<FillingMast> fillingMastEntityWrapper = new EntityWrapper<>();
|
fillingMastEntityWrapper.eq("sta_no",staNo);
|
FillingMast fillingMast = fillingMastService.selectOne(fillingMastEntityWrapper);
|
fillingMast.setStatus("Y");
|
boolean update = fillingMastService.update(fillingMast, fillingMastEntityWrapper);
|
return update;
|
}
|
|
|
|
/*
|
* 小车复位
|
* */
|
public synchronized boolean rgvComplete(Integer rgvId){
|
try{
|
// 命令下发区 --------------------------------------------------------------------------
|
if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(3, new RgvCommand()))) {
|
//step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务
|
log.error("RGV命令下发失败,RGV号={}",rgvId);
|
return false;
|
} else {
|
log.info("RGV命令下发成功,RGV号={}",rgvId);
|
return true;
|
}
|
}catch (Exception e){
|
log.error("RGV命令下发失败,RGV号={}。异常:"+e,rgvId);
|
return false;
|
}
|
}
|
|
|
|
}
|