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.RgvThread; 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; @Autowired private BasErrLogService basErrLogService; @Autowired private WrkMastStaService wrkMastStaService; @Autowired private BasRgvErrService basRgvErrService; @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); } List wrkMastStas = wrkMastStaMapper.selectList(new EntityWrapper().ne("wrk_sts",3).eq("wrk_no", rgvProtocol.getTaskNo1())); if (!Cools.isEmpty(wrkMastStas) || wrkMastStas.size()<=0){ WrkMastSta wrkMastSta = wrkMastStas.get(0); wrkMastSta.setWrkSts(3); wrkMastSta.setBignTime(new Date()); wrkMastStaMapper.updateById(wrkMastSta); } } } } 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; } } 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().ne("wrk_sts",3).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().ne("wrk_sts",3).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().ne("wrk_sts",3).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().ne("wrk_sts",3).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().ne("wrk_sts",3).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().ne("wrk_sts",3).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().ne("wrk_sts",3).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().ne("wrk_sts",3).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.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded1()==0 && rgvProtocol.getTaskNo1() == 0 && rgvThread.isPakMk() ) { Integer selectCount = wrkMastStaMapper.selectCount(new EntityWrapper().ne("wrk_sts", 3).ne("wrk_sts", 0)); if (selectCount>0){ log.error("存在执行RGV中任务,但是小车状态空闲!!!"); return; } List wrkMastStaList = wrkMastStaMapper.selectList(new EntityWrapper().eq("wrk_sts",0)); for (WrkMastSta wrkMastSta : wrkMastStaList){ if (wrkMastSta.getType()!=1 || wrkMastSta.getWrkType()!=3){//1:满版 3:取放 continue; } boolean sign = rgvTakeFullAll(1, wrkMastSta); //命令下发 if (sign){ wrkMastSta.setWrkSts(1); wrkMastSta.setUpdateTime(new Date()); 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) 0); //工位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; } } public synchronized void recCrnErr() { Date now = new Date(); // 获取堆垛机信息 SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, 1); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { return; } if (true) { // if (crnProtocol.getModeType() != CrnModeType.STOP) { // 有任务 if (rgvProtocol.getTaskNo1() != 0) { BasErrLog latest = basErrLogService.findLatestByTaskNo(1, rgvProtocol.getTaskNo1()); // 有异常 if (latest == null) { if (rgvProtocol.getAlarm() != null && rgvProtocol.getAlarm() > 0) { WrkMastSta wrkMastSta = wrkMastStaService.selectOne(new EntityWrapper() .setSqlSelect("TOP 1 wrk_no as wrkNo , wrk_sts as wrkSts,wrk_start as wrkStart,wrk_end as wrkEnd, create_time as createTime") .eq("wrk_No", rgvProtocol.getTaskNo1()) .orderBy("create_time", false) ); if (wrkMastSta == null) { return; } BasRgvErr rgvErr = basRgvErrService.selectById(rgvProtocol.getAlarm()); String errName = rgvErr == null ? String.valueOf(rgvProtocol.getAlarm()) : rgvErr.getErrName(); BasErrLog basErrLog = new BasErrLog( null, // 编号 wrkMastSta.getWrkNo().intValue(), // 工作号 now, // 发生时间 null, // 结束时间 wrkMastSta.getWrkSts().longValue(), // 工作状态 wrkMastSta.getType(), // 入出库类型 1, // 堆垛机 null, // plc null, // 目标库位 wrkMastSta.getWrkEnd(), // 目标站 wrkMastSta.getWrkEnd(), // 源站 null, // 源库位 null, // 条码 (int) rgvProtocol.getAlarm(), // 异常码 errName, // 异常 1, // 异常情况 now, // 添加时间 null, // 添加人员 now, // 修改时间 null, // 修改人员 "任务中异常" // 备注 ); if (!basErrLogService.insert(basErrLog)) { } } } else { // 异常修复 if (rgvProtocol.getAlarm() == null || rgvProtocol.getAlarm() == 0) { latest.setEndTime(now); latest.setUpdateTime(now); latest.setStatus(2); if (!basErrLogService.updateById(latest)) { } } } // 无任务 } else { BasErrLog latest = basErrLogService.findLatest(1); // 有异常 if (rgvProtocol.getAlarm() != null && rgvProtocol.getAlarm() > 0) { // 记录新异常 if (latest == null || (latest.getErrCode() != rgvProtocol.getAlarm().intValue())) { BasRgvErr rgvErr = basRgvErrService.selectById(rgvProtocol.getAlarm()); String errName = rgvErr == null ? String.valueOf(rgvProtocol.getAlarm()) : rgvErr.getErrName(); BasErrLog basErrLog = new BasErrLog( null, // 编号 null, // 工作号 now, // 发生时间 null, // 结束时间 null, // 工作状态 null, // 入出库类型 1, // 堆垛机 null, // plc null, // 目标库位 null, // 目标站 null, // 源站 null, // 源库位 null, // 条码 (int) rgvProtocol.getAlarm(), // 异常码 errName, // 异常 1, // 异常情况 now, // 添加时间 null, // 添加人员 now, // 修改时间 null, // 修改人员 "无任务异常" // 备注 ); if (!basErrLogService.insert(basErrLog)) { } } // 无异常 } else { // 异常修复 if (latest != null && latest.getStatus() == 1) { latest.setEndTime(now); latest.setUpdateTime(now); latest.setStatus(2); if (!basErrLogService.updateById(latest)) { } } } } } // News.infoNoLog(""+mark+" - 0"+" - 堆垛机异常信息记录执行完成"); } }