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.ExtProtocol;
|
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.*;
|
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);
|
}
|
WrkMastSta wrkMastSta = wrkMastStaMapper.selectById(rgvProtocol.getTaskNo1());
|
wrkMastSta.setWrkSts(3);
|
wrkMastStaMapper.updateById(wrkMastSta);
|
}
|
|
}
|
}
|
|
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;
|
}
|
}
|
|
public synchronized void ExtTaskAndPut() throws InterruptedException {
|
for (ExtSlave extSlave : slaveProperties.getExt()) {
|
// if (!rgv.getDemo()) {
|
// continue;
|
// }
|
MelsecExtThread extThread = (MelsecExtThread) SlaveConnection.get(SlaveType.Ext, extSlave.getId());
|
ExtProtocol extProtocol = extThread.getExtProtocol();
|
if (extProtocol == null) {
|
continue;
|
}
|
// else {
|
// extProtocol = extProtocol.clone();
|
// }
|
if (extProtocol.isTake()){//允许取
|
|
}else if (extProtocol.isPut()){//允许放
|
|
}
|
|
}
|
}
|
|
public synchronized void DevpTaskAndPut() throws InterruptedException {
|
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();
|
}
|
// System.out.println(JSON.toJSONString(staProtocol));
|
if (staProtocol.isAutoing()){
|
WrkMastSta wrkMastSta = new WrkMastSta(new Date(),2,1);
|
Integer count = wrkMastStaMapper.selectCount(new EntityWrapper<WrkMastSta>().eq("wrk_no", wrkMastSta.getWrkNo()));
|
if (count==0){
|
wrkMastSta.setType(1);
|
wrkMastSta.setWrkType(3);
|
wrkMastStaMapper.insert(wrkMastSta);
|
}
|
}else if (staProtocol.isLoading()){
|
WrkMastSta wrkMastSta = new WrkMastSta(new Date(),2,3);
|
Integer count = wrkMastStaMapper.selectCount(new EntityWrapper<WrkMastSta>().eq("wrk_no", wrkMastSta.getWrkNo()));
|
if (count==0){
|
wrkMastSta.setType(1);
|
wrkMastSta.setWrkType(3);
|
wrkMastStaMapper.insert(wrkMastSta);
|
}
|
}else if (staProtocol.isInEnable()){
|
WrkMastSta wrkMastSta = new WrkMastSta(new Date(),2,5);
|
Integer count = wrkMastStaMapper.selectCount(new EntityWrapper<WrkMastSta>().eq("wrk_no", wrkMastSta.getWrkNo()));
|
if (count==0){
|
wrkMastSta.setType(1);
|
wrkMastSta.setWrkType(3);
|
wrkMastStaMapper.insert(wrkMastSta);
|
}
|
}else if (staProtocol.isOutEnable()){
|
WrkMastSta wrkMastSta = new WrkMastSta(new Date(),2,7);
|
Integer count = wrkMastStaMapper.selectCount(new EntityWrapper<WrkMastSta>().eq("wrk_no", wrkMastSta.getWrkNo()));
|
if (count==0){
|
wrkMastSta.setType(1);
|
wrkMastSta.setWrkType(3);
|
wrkMastStaMapper.insert(wrkMastSta);
|
}
|
}
|
if (staProtocol.isEmptyMk()){
|
WrkMastSta wrkMastSta = new WrkMastSta(new Date(),1,10);
|
Integer count = wrkMastStaMapper.selectCount(new EntityWrapper<WrkMastSta>().eq("wrk_no", wrkMastSta.getWrkNo()));
|
if (count==0){
|
wrkMastSta.setType(1);
|
wrkMastSta.setWrkType(3);
|
wrkMastStaMapper.insert(wrkMastSta);
|
}
|
}
|
if (staProtocol.isFullPlt()){
|
WrkMastSta wrkMastSta = new WrkMastSta(new Date(),3,10);
|
Integer count = wrkMastStaMapper.selectCount(new EntityWrapper<WrkMastSta>().eq("wrk_no", wrkMastSta.getWrkNo()));
|
if (count==0){
|
wrkMastSta.setType(1);
|
wrkMastSta.setWrkType(3);
|
wrkMastStaMapper.insert(wrkMastSta);
|
}
|
}
|
if (staProtocol.isCar()){
|
WrkMastSta wrkMastSta = new WrkMastSta(new Date(),5,10);
|
Integer count = wrkMastStaMapper.selectCount(new EntityWrapper<WrkMastSta>().eq("wrk_no", wrkMastSta.getWrkNo()));
|
if (count==0){
|
wrkMastSta.setType(1);
|
wrkMastSta.setWrkType(3);
|
wrkMastStaMapper.insert(wrkMastSta);
|
}
|
}
|
if (staProtocol.isLow()){
|
WrkMastSta wrkMastSta = new WrkMastSta(new Date(),7,10);
|
Integer count = wrkMastStaMapper.selectCount(new EntityWrapper<WrkMastSta>().eq("wrk_no", wrkMastSta.getWrkNo()));
|
if (count==0){
|
wrkMastSta.setType(1);
|
wrkMastSta.setWrkType(3);
|
wrkMastStaMapper.insert(wrkMastSta);
|
}
|
}
|
}
|
}
|
} catch (Exception e) {
|
log.error("生成小车搬运任务 ===>> 失败", e);
|
e.printStackTrace();
|
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
}
|
}
|
|
/**
|
* 执行小车搬运任务
|
*/
|
public synchronized void rgvRunWrkMastFullSta() {
|
try{
|
SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, 1);
|
RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
|
if (rgvProtocol == null) {
|
log.error("RGV不在线");
|
return;
|
}
|
// 只有当RGV空闲、自动,工位一无物//rgv可用
|
if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
|
&& rgvProtocol.getModeType() == RgvModeType.AUTO
|
&& rgvProtocol.getLoaded1()==0
|
&& rgvProtocol.getTaskNo1() == 0
|
&& rgvThread.isPakMk()
|
) {
|
List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectList(new EntityWrapper<WrkMastSta>());
|
for (WrkMastSta wrkMastSta : wrkMastStaList){
|
if (wrkMastSta.getType()!=0 || wrkMastSta.getWrkType()!=3){//1:满版 3:取放
|
continue;
|
}
|
boolean sign = rgvTakeFullAll(1, wrkMastSta); //命令下发
|
if (sign){
|
wrkMastSta.setWrkSts(1);
|
wrkMastStaMapper.updateById(wrkMastSta);
|
} else {
|
log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
|
}
|
break;
|
}
|
}
|
}catch (Exception e){
|
log.error("3875行执行小车搬运任务下发失败");
|
log.error("3875行"+e);
|
}
|
}
|
/*
|
* 小车取货至工位任务
|
* */
|
public synchronized boolean rgvTakeFullAll(Integer rgvId,WrkMastSta wrkMastSta){
|
try{
|
// 命令下发区 --------------------------------------------------------------------------
|
RgvCommand rgvCommand = new RgvCommand();
|
rgvCommand.setRgvNo(rgvId); // RGV编号
|
rgvCommand.setAckFinish1(false); // 工位1任务完成确认位
|
rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().intValue()); // 工位1工作号
|
rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式: 取放货
|
rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue()); //工位1起点
|
rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue()); //工位1目标站点
|
rgvCommand.setCommand((short) 1); //工位1任务确认
|
if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
|
//step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务
|
log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
|
return false;
|
} else {
|
return true;
|
}
|
}catch (Exception e){
|
return false;
|
}
|
}
|
|
|
|
}
|