package com.zy.acs.wcs.asrs.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zy.acs.wcs.asrs.entity.Loc; import com.zy.acs.wcs.asrs.entity.WrkMast; import com.zy.acs.wcs.asrs.service.BasDevpService; import com.zy.acs.wcs.asrs.service.LocService; import com.zy.acs.wcs.asrs.service.StaDescService; import com.zy.acs.wcs.asrs.service.WrkMastService; import com.zy.acs.wcs.common.OpenBusSubmitParam; import com.zy.acs.wcs.common.TaskDto; import com.zy.acs.wcs.common.utils.HttpHandler; import com.zy.acs.wcs.core.DevpThread; import com.zy.acs.wcs.core.cache.MessageQueue; import com.zy.acs.wcs.core.cache.SlaveConnection; import com.zy.acs.wcs.core.enums.SlaveType; import com.zy.acs.wcs.core.model.DevpSlave; import com.zy.acs.wcs.core.model.Task; import com.zy.acs.wcs.core.model.protocol.StaProtocol; import com.zy.acs.wcs.core.properties.SlaveProperties; import com.zy.acs.wcs.core.thread.BarcodeThread; import com.zy.acs.wcs.core.thread.SiemensDevpThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; /** * 立体仓库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 SlaveProperties slaveProperties; @Autowired private WrkMastService wrkMastService; @Autowired private BasDevpService basDevpService; @Autowired private StaDescService staDescService; @Autowired private LocService locService; public static final ArrayList locRow = new ArrayList() {{ add(49); add(50); add(51); add(52); add(53); add(54); add(55); add(56); add(57); add(58); add(59); }}; private short workNo = 1000; private short workNo2 = 3000; private Short getWorkNo() { if (workNo > 2000) { workNo = 1000; } else { workNo++; } return workNo; } private Short getOutWorkNo() { if (workNo2 > 4000) { workNo2 = 3000; } else { workNo2++; } return workNo2; } public synchronized void generateStoreWrkFile() { try { // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { // 遍历入库口 for (DevpSlave.Sta inSta : devp.getInSta()) { // 获取入库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } Short workNo = staProtocol.getWorkNo(); // 尺寸检测异常 boolean back = false; String errMsg = ""; if (staProtocol.isFrontErr()) { errMsg = "前超限"; back = true; } if (!back && staProtocol.isBackErr()) { errMsg = "后超限"; back = true; } if (!back && staProtocol.isHighErr()) { errMsg = "高超限"; back = true; } if (!back && staProtocol.isLeftErr()) { errMsg = "左超限"; back = true; } if (!back && staProtocol.isRightErr()) { errMsg = "右超限"; back = true; } if (!back && staProtocol.isWeightErr()) { errMsg = "超重"; back = true; } if (!back && staProtocol.isBarcodeErr()) { errMsg = "扫码失败"; back = true; } // 判断是否满足入库条件 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && !staProtocol.isEmptyMk() && workNo >= 9000 && staProtocol.isPakMk()) { // // 获取条码扫描仪信息 BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); if (barcodeThread == null) { continue; } String BoxNo = barcodeThread.getBarcode(); // if (Cools.isEmpty(BoxNo)) { // log.error("{}号条码扫描失败,值:{}", inSta.getBarcode(), BoxNo); // continue; // } if (back) { staProtocol.setStaNo(inSta.getBackSta().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); log.info("组托入库托盘退回命令推送输送线队列成功==>{},{},{}", BoxNo, errMsg); } else { // TODO OpenBusSubmitParam data = getData(inSta.getStaNo()); String response = new HttpHandler.Builder() .setUri("10.10.10.200:8088") .setPath("/api/open/bus/submit") .setJson(JSON.toJSONString(data)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getInteger("code").equals(200)) { createInWrk(); staProtocol.setWorkNo(getWorkNo()); staProtocol.setStaNo((short) 102); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); log.info("组托入库命令推送输送线队列成功:{}", staProtocol); } } } } } } catch (Exception e) { log.error("generateStoreWrkFile e", e); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } private Loc getLoc() { List list = locService.list(new LambdaQueryWrapper().eq(Loc::getLocSts, 15).in(Loc::getRow, locRow)); Collections.shuffle(list); return list.get(0); } private OpenBusSubmitParam getData(Integer stnNo) { OpenBusSubmitParam param = new OpenBusSubmitParam(); param.setBatch(String.valueOf(System.currentTimeMillis())); TaskDto taskDto = new TaskDto(); taskDto.setOriSta(stnNo + ""); taskDto.setDestLoc(getLoc().getLocNo()); taskDto.setPriority(100); taskDto.setSeqNum(String.valueOf(System.currentTimeMillis()).substring(15, 19)); param.getTaskList().add(taskDto); return param; } private WrkMast createInWrk() { Date date = new Date(); // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(getWorkNo().intValue()); wrkMast.setIoTime(new Date()); wrkMast.setWrkSts(2L); // 工作状态:生成入库ID wrkMast.setIoType(10); // 入出库状态:1.入库 wrkMast.setIoPri(13D); // 优先级 wrkMast.setCrnNo(1); wrkMast.setSourceStaNo(101); wrkMast.setStaNo(103); wrkMast.setLocNo(getLoc().getLocNo()); wrkMast.setBarcode(""); // 托盘码 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("Y"); // 操作人员数据 wrkMast.setAppeTime(date); wrkMast.setModiTime(date); boolean res = wrkMastService.save(wrkMast); return wrkMast; } private WrkMast createOutWrk() { Date date = new Date(); // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(getOutWorkNo().intValue()); wrkMast.setIoTime(new Date()); wrkMast.setWrkSts(2L); // 工作状态:生成入库ID wrkMast.setIoType(10); // 入出库状态:1.入库 wrkMast.setIoPri(13D); // 优先级 wrkMast.setCrnNo(1); wrkMast.setSourceStaNo(101); wrkMast.setStaNo(103); wrkMast.setLocNo(getLoc().getLocNo()); wrkMast.setBarcode(""); // 托盘码 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("Y"); // 操作人员数据 wrkMast.setAppeTime(date); wrkMast.setModiTime(date); boolean res = wrkMastService.save(wrkMast); return wrkMast; } /** * 出库 */ public synchronized void out() throws IOException { for (DevpSlave devpSlave : slaveProperties.getDevp()) { for (DevpSlave.Sta sta : devpSlave.getOutSta()) { try { // 获取堆垛机出库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devpSlave.getId()); StaProtocol staProtocol = devpThread.getStation().get(sta.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) { WrkMast one = wrkMastService.getOne(new QueryWrapper().eq("sta_no", sta.getStaNo()).eq("wrk_sts", 14)); if (one != null) { // 查询工作档 staProtocol.setWorkNo(getOutWorkNo()); staProtocol.setStaNo((short) 101); MessageQueue.offer(SlaveType.Devp, devpSlave.getId(), new Task(2, staProtocol)); one.setWrkSts(15L); wrkMastService.updateById(one); } } } catch (Exception e) { log.error("出库到出库站异常:异常信息:" + e); } } } } /** * 入出库模式切换函数 */ public synchronized void ioConvert() { try { // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); // for (DevpSlave.Sta inSta : devp.getInSta()) { // TaskWrk taskWrk = taskWrkService.selectByTargetPoint(inSta.getBackSta() + ""); // switch (inSta.getBackSta()) { // case 101: // if (taskWrk != null) { // if (devpThread.ioModeOf1F1 != IoModeType.PAKOUT_MODE) { // // 出库切换中 // devpThread.ioModeOf1F1 = IoModeType.PAKOUT_BOOTING; // TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); // if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() // && !devpThread.getStation().get(inSta.getBackSta()).isLoading() // && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { // // 出库模式 // devpThread.ioModeOf1F1 = IoModeType.PAKOUT_MODE; // } // } // } else { // // 入库模式 // devpThread.ioModeOf1F1 = IoModeType.PAKIN_MODE; // } // break; // case 104: // if (taskWrk != null) { // if (devpThread.ioModeOf1F2 != IoModeType.PAKOUT_MODE) { // // 出库切换中 // devpThread.ioModeOf1F2 = IoModeType.PAKOUT_BOOTING; // TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); // if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() // && !devpThread.getStation().get(inSta.getBackSta()).isLoading() // && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { // // 出库模式 // devpThread.ioModeOf1F2 = IoModeType.PAKOUT_MODE; // } // } // } else { // // 入库模式 // devpThread.ioModeOf1F2 = IoModeType.PAKIN_MODE; // } // break; // case 107: // if (taskWrk != null) { // if (devpThread.ioModeOf1F3 != IoModeType.PAKOUT_MODE) { // // 出库切换中 // devpThread.ioModeOf1F3 = IoModeType.PAKOUT_BOOTING; // TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); // if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() // && !devpThread.getStation().get(inSta.getBackSta()).isLoading() // && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { // // 出库模式 // devpThread.ioModeOf1F3 = IoModeType.PAKOUT_MODE; // } // } // } else { // // 入库模式 // devpThread.ioModeOf1F3 = IoModeType.PAKIN_MODE; // } // break; // case 110: // if (taskWrk != null) { // if (devpThread.ioModeOf1F4 != IoModeType.PAKOUT_MODE) { // // 出库切换中 // devpThread.ioModeOf1F4 = IoModeType.PAKOUT_BOOTING; // TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); // if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() // && !devpThread.getStation().get(inSta.getBackSta()).isLoading() // && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { // // 出库模式 // devpThread.ioModeOf1F4 = IoModeType.PAKOUT_MODE; // } // } // } else { // // 入库模式 // devpThread.ioModeOf1F4 = IoModeType.PAKIN_MODE; // } // break; // case 113: // if (taskWrk != null) { // if (devpThread.ioModeOf1F5 != IoModeType.PAKOUT_MODE) { // // 出库切换中 // devpThread.ioModeOf1F5 = IoModeType.PAKOUT_BOOTING; // TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); // if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() // && !devpThread.getStation().get(inSta.getBackSta()).isLoading() // && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { // // 出库模式 // devpThread.ioModeOf1F5 = IoModeType.PAKOUT_MODE; // } // } // } else { // // 入库模式 // devpThread.ioModeOf1F5 = IoModeType.PAKIN_MODE; // } // break; // case 203: // if (taskWrk != null) { // if (devpThread.ioModeOf2F1 != IoModeType.PAKOUT_MODE) { // // 出库切换中 // devpThread.ioModeOf2F1 = IoModeType.PAKOUT_BOOTING; // TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); // if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() // && !devpThread.getStation().get(inSta.getBackSta()).isLoading() // && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { // // 出库模式 // devpThread.ioModeOf2F1 = IoModeType.PAKOUT_MODE; // } // } // } else { // // 入库模式 // devpThread.ioModeOf2F1 = IoModeType.PAKIN_MODE; // } // break; // // case 207: // if (taskWrk != null) { // if (devpThread.ioModeOf2F2 != IoModeType.PAKOUT_MODE) { // // 出库切换中 // devpThread.ioModeOf2F2 = IoModeType.PAKOUT_BOOTING; // TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); // if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() // && !devpThread.getStation().get(inSta.getBackSta()).isLoading() // && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { // // 出库模式 // devpThread.ioModeOf2F2 = IoModeType.PAKOUT_MODE; // } // } // } else { // // 入库模式 // devpThread.ioModeOf2F2 = IoModeType.PAKIN_MODE; // } // break; // // case 212: // if (taskWrk != null) { // if (devpThread.ioModeOf2F3 != IoModeType.PAKOUT_MODE) { // // 出库切换中 // devpThread.ioModeOf2F3 = IoModeType.PAKOUT_BOOTING; // TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); // if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() // && !devpThread.getStation().get(inSta.getBackSta()).isLoading() // && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { // // 出库模式 // devpThread.ioModeOf2F3 = IoModeType.PAKOUT_MODE; // } // } // } else { // // 入库模式 // devpThread.ioModeOf2F3 = IoModeType.PAKIN_MODE; // } // break; // } // } } } catch (Exception e) { e.printStackTrace(); } } }