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 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 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 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 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; } } }