| | |
| | | // ringThroughParam.setIndex(i); |
| | | // double[] doubles = Utils.RingThroughXY2(perimeter, NumUtils.GetRandomIntInRange(183)); |
| | | // double[] doubles = Utils.RingThroughXYRgv(perimeter, perimeter-rgvProtocol.RgvPos.doubleValue()); |
| | | double[] doubles = Utils.getRgvPosNew(trackEntireLength, rgvProtocol.RgvPos.doubleValue()); |
| | | double v = rgvProtocol.RgvPos.doubleValue() ; |
| | | if (rgv.getId()>2){ |
| | | v = rgvProtocol.RgvPos.doubleValue() + 1000000.0; |
| | | } |
| | | double[] doubles = Utils.getRgvPosNew(trackEntireLength, v); |
| | | |
| | | ringThroughParam.setValueX(doubles[0]); |
| | | ringThroughParam.setValueY(doubles[1]); |
| | |
| | | // double[] doubles = Utils.RingThroughXYSta(perimeter, perimeter-basDevpPosition.getPlcPosition()); |
| | | // ringThroughParam.setValueX(doubles[0]>50? doubles[0]+6:doubles[0]-1); |
| | | // ringThroughParam.setValueY(doubles[1]>50? doubles[1]+6:doubles[1]-1); |
| | | double[] doubles = Utils.getRgvPosNew(basDevpPosition.getDevNo(),trackEntireLength, basDevpPosition.getPlcPosition()); |
| | | double v = basDevpPosition.getPlcPosition() ; |
| | | if (basDevpPosition.getDevNo()>200){ |
| | | v = basDevpPosition.getPlcPosition() + 1000000.0; |
| | | } |
| | | double[] doubles = Utils.getRgvPosNew(basDevpPosition.getDevNo(),trackEntireLength, v); |
| | | ringThroughParam.setValueX(doubles[0]); |
| | | ringThroughParam.setValueY(doubles[1]); |
| | | result.add(ringThroughParam); |
| | |
| | | switch (sourceStaNo){ |
| | | case 118: |
| | | case 121: |
| | | case 122: |
| | | case 124: |
| | | case 218: |
| | | case 221: |
| | | case 222: |
| | | return sourceStaNo+1; |
| | | case 224: |
| | | return sourceStaNo-1; |
| | | } |
| | | return staNo; |
| | | } |
| | |
| | | @Mapper |
| | | @Repository |
| | | public interface BasDevpOptMapper extends BaseMapper<BasDevpOpt> { |
| | | String getErr(Integer wrkNo); |
| | | |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.service.IService; |
| | | |
| | | public interface BasDevpOptService extends IService<BasDevpOpt> { |
| | | String getErr(Integer wrkNo); |
| | | |
| | | } |
| | |
| | | |
| | | @Service("basDevpOptService") |
| | | public class BasDevpOptServiceImpl extends ServiceImpl<BasDevpOptMapper, BasDevpOpt> implements BasDevpOptService { |
| | | @Override |
| | | public String getErr(Integer wrkNo){ |
| | | return baseMapper.getErr(wrkNo); |
| | | } |
| | | |
| | | } |
| | |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.asrs.utils.*; |
| | | 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.common.utils.News; |
| | | import com.zy.core.CrnThread; |
| | | import com.zy.core.DevpThread; |
| | | import com.zy.core.cache.*; |
| | | 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.protocol.*; |
| | | import com.zy.core.properties.SlaveProperties; |
| | | import com.zy.core.thread.BarcodeThread; |
| | | import com.zy.core.thread.LedThread; |
| | | import com.zy.core.thread.RgvThread; |
| | | import com.zy.core.thread.SiemensDevpThread; |
| | | import com.zy.system.entity.license.LicenseVerify; |
| | |
| | | import java.util.*; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * 立体仓库WCS系统主流程业务 |
| | |
| | | private WrkMastMapper wrkMastMapper; |
| | | @Autowired |
| | | private WrkDetlService wrkDetlService; |
| | | @Autowired |
| | | private BasDevpOptService basDevpOptService; |
| | | @Autowired |
| | | private LocMastService locMastService; |
| | | @Autowired |
| | |
| | | if (barcodeThread == null) { |
| | | continue; |
| | | } |
| | | String barcode = barcodeThread.getBarcode(); |
| | | |
| | | if (!Cools.isEmpty(barcode)) { |
| | | // log.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode); |
| | | if ("00000000".endsWith(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || !CodeDetectionUtil.barcodeDetection(barcode)) { |
| | | continue; |
| | | } |
| | | } else { |
| | | continue; |
| | | } |
| | | |
| | | // 获取入库站信息 |
| | | // SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); |
| | |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | String barcode = barcodeThread.getBarcode(); |
| | | |
| | | if (!Cools.isEmpty(barcode)) { |
| | | // log.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode); |
| | | if ("00000000".endsWith(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || !CodeDetectionUtil.barcodeDetection(barcode)) { |
| | | continue; |
| | | } |
| | | } else { |
| | | continue; |
| | | } |
| | | |
| | | // 尺寸检测异常 |
| | |
| | | } |
| | | // 退回 |
| | | if (back) { |
| | | barcodeThread.setBarcode(""); |
| | | // 获取工作号 |
| | | int workNo = commonService.getWorkNo(3); |
| | | |
| | | staProtocol.setWorkNo(workNo); |
| | | staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | | |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false,201); |
| | | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | // led 异常显示 |
| | | LedErrorThreadUtil.ledErrorThread(errMsg,inSta.getLed(), LedErrorAreaType.FOUR_BARCODE.getDesc()); |
| | | continue; |
| | |
| | | // if(Cools.isEmpty(dto.getRgvNo()) || dto.getRgvNo() <= 0) { |
| | | // staProtocol.setStaNo(607);//607 |
| | | // } else {//如果存在RGV编号,说明需要RGV接驳,先下发任务到RGV源站 |
| | | staProtocol.setStaNo(dto.getRgvSstaNo().shortValue()); |
| | | // staProtocol.setStaNo(dto.getRgvSstaNo().shortValue()); |
| | | staProtocol.setStaNo(wrkMast.getStaNoSou$().shortValue()); |
| | | |
| | | // } |
| | | |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false,283); |
| | |
| | | throw new CoolException("更新plc站点信息失败"); |
| | | } |
| | | } else { |
| | | // 获取工作号 |
| | | int workNo = commonService.getWorkNo(3); |
| | | |
| | | staProtocol.setWorkNo(workNo); |
| | | staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | | |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false,201); |
| | | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | // led 异常显示 |
| | | LedErrorThreadUtil.ledErrorThread("入库请求失败"+jsonObject.getInteger("code"),inSta.getLed(), LedErrorAreaType.ONE_OTHER.getDesc()); |
| | | log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); |
| | |
| | | } |
| | | |
| | | // 双深库位且浅库位有货,则需先对浅库位进行库位移转 |
| | | if (Utils.isDeepLoc(slaveProperties, wrkMast.getLocNo())) { |
| | | if (Utils.isDeepLoc(slaveProperties, wrkMast.getLocNo()) && crnProtocol.getCrnNo()!=3) { |
| | | String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getLocNo()); |
| | | LocMast shallowLoc = locMastService.selectById(shallowLocNo); |
| | | // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬! |
| | |
| | | } |
| | | |
| | | // 双深库位且浅库位有货,则需先对浅库位进行库位移转 |
| | | if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo())) { |
| | | if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo()) && crnProtocol.getCrnNo()!=3) { |
| | | String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo()); |
| | | LocMast shallowLoc = locMastService.selectById(shallowLocNo); |
| | | // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬! |
| | |
| | | log.error("{}库位异常,未检索到相应工作档!", shallowLocNo); |
| | | } else { |
| | | if (waitWrkMast.getWrkSts() == 11) { |
| | | if (waitWrkMast.getIoPri() + 100000D < 999999999D) { |
| | | waitWrkMast.setIoPri(waitWrkMast.getIoPri()+100000D); |
| | | if (waitWrkMast.getIoPri() + 10D < 9999D) { |
| | | waitWrkMast.setIoPri(waitWrkMast.getIoPri()+10D); |
| | | } else { |
| | | waitWrkMast.setIoPri(999999999D); |
| | | waitWrkMast.setIoPri(9999D); |
| | | } |
| | | waitWrkMast.setModiTime(new Date()); |
| | | if (wrkMastMapper.updateById(waitWrkMast) == 0) { |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 出库 ===>> 工作档信息写入led显示器 |
| | | */ |
| | | public synchronized void ledExecute() { |
| | | for (LedSlave led : slaveProperties.getLed()) { |
| | | // 获取输送线plc线程 |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId()); |
| | | // 命令集合 |
| | | List<LedCommand> commands = new ArrayList<>(); |
| | | // 工作档集合 |
| | | List<WrkMast> wrkMasts = new ArrayList<>(); |
| | | for (Integer staNo : led.getStaArr()) { |
| | | // 获取叉车站点 |
| | | StaProtocol staProtocol = devpThread.getStation().get(staNo); |
| | | if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) { |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | // 获取工作档数据 |
| | | WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo()); |
| | | if (null == wrkMast) { |
| | | if(staProtocol.getWorkNo() > 9999){ //异常退出 |
| | | String err = basDevpOptService.getErr(staProtocol.getWorkNo()); |
| | | MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, err)); |
| | | } |
| | | continue; |
| | | } |
| | | wrkMasts.add(wrkMast); |
| | | // 组装命令 |
| | | LedCommand ledCommand = new LedCommand(); |
| | | ledCommand.setWorkNo(wrkMast.getWrkNo()); |
| | | ledCommand.setIoType(wrkMast.getIoType()); |
| | | // 出库模式 |
| | | switch (wrkMast.getIoType()) { |
| | | case 1: |
| | | ledCommand.setTitle("全板入库"); |
| | | break; |
| | | case 10: |
| | | ledCommand.setTitle("空板入库"); |
| | | break; |
| | | case 12: |
| | | ledCommand.setTitle("物料衔接"); |
| | | break; |
| | | case 57: |
| | | ledCommand.setTitle("盘点再入库"); |
| | | break; |
| | | case 53: |
| | | ledCommand.setTitle("拣料再入库"); |
| | | break; |
| | | case 101: |
| | | ledCommand.setTitle("全板出库"); |
| | | break; |
| | | case 103: |
| | | ledCommand.setTitle("拣料出库"); |
| | | break; |
| | | case 104: |
| | | ledCommand.setTitle("并板出库"); |
| | | break; |
| | | case 107: |
| | | ledCommand.setTitle("盘点出库"); |
| | | break; |
| | | case 110: |
| | | ledCommand.setTitle("空板出库"); |
| | | ledCommand.setEmptyMk(true); |
| | | break; |
| | | default: |
| | | News.error("任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType()); |
| | | break; |
| | | } |
| | | ledCommand.setSourceLocNo(wrkMast.getSourceLocNo()); |
| | | ledCommand.setStaNo(wrkMast.getStaNo()); |
| | | ledCommand.setBarcode(wrkMast.getBarcode()); |
| | | if(wrkMast.getIoType() == 12){ |
| | | List<WrkDetl> wrkDetls = wrkDetlService.findByBarcode(wrkMast.getBarcode()); |
| | | wrkDetls.forEach(wrkDetl -> { |
| | | Double total = 0.0; |
| | | EntityWrapper<LocDetl> wrapper = new EntityWrapper<>(); |
| | | LocDetl locDetl = locDetlService.selectOne(wrapper.eq("zpallet", wrkDetl.getZpallet()).eq("matnr", wrkDetl.getMatnr())); |
| | | if (Cools.isEmpty(locDetl)) { |
| | | total = wrkDetl.getAnfme(); |
| | | } else { |
| | | total = locDetl.getAnfme(); |
| | | } |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total)); |
| | | }); |
| | | } |
| | | if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) { |
| | | List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo()); |
| | | |
| | | wrkDetls.forEach(wrkDetl -> { |
| | | Double total = 0.0; |
| | | EntityWrapper<LocDetl> wrapper = new EntityWrapper<>(); |
| | | LocDetl locDetl = locDetlService.selectOne(wrapper.eq("zpallet", wrkDetl.getZpallet()).eq("matnr", wrkDetl.getMatnr())); |
| | | if (Cools.isEmpty(locDetl)) { |
| | | total = wrkDetl.getAnfme(); |
| | | } else { |
| | | total = locDetl.getAnfme(); |
| | | } |
| | | if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 1) { |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total)); |
| | | } |
| | | if (wrkMast.getIoType() == 103 && (null == wrkDetl.getInspect() || 0 == wrkDetl.getInspect())) { |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total)); |
| | | } |
| | | if (wrkMast.getIoType() == 107) { |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total)); |
| | | } |
| | | }); |
| | | } |
| | | commands.add(ledCommand); |
| | | } |
| | | Set<Integer> workNos = wrkMasts.stream().map(WrkMast::getWrkNo).collect(Collectors.toSet()); |
| | | // 获取LED线程 |
| | | LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId()); |
| | | // 相同工作号集合则过滤 |
| | | if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) { |
| | | continue; |
| | | } |
| | | // 命令下发 ------------------------------------------------------------------------------- |
| | | if (!commands.isEmpty()) { |
| | | if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) { |
| | | News.error("{}号LED显示内容命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | try { |
| | | // 修改主档led标记 |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | wrkMast.setOveMk("Y"); |
| | | wrkMast.setModiTime(new Date()); |
| | | if (wrkMastMapper.updateById(wrkMast) == 0) { |
| | | throw new CoolException("更新工作档失败"); |
| | | } |
| | | } |
| | | |
| | | // 更新线程当前工作号集合 |
| | | ledThread.setWorkNos(workNos); |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 其他 ===>> LED显示器复位,显示默认信息 |
| | | */ |
| | | public synchronized void ledReset() { |
| | | for (LedSlave led : slaveProperties.getLed()) { |
| | | // 获取输送线plc线程 |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId()); |
| | | // 命令集合 |
| | | boolean reset = true; |
| | | for (Integer staNo : led.getStaArr()) { |
| | | // System.out.println("staArr = " + staNo); |
| | | |
| | | // 获取叉车站点 |
| | | StaProtocol staProtocol = devpThread.getStation().get(staNo); |
| | | if (staProtocol == null) { continue; } |
| | | if (staProtocol.getWorkNo() != 0 || staProtocol.isErr()) { |
| | | reset = false; |
| | | break; |
| | | } |
| | | } |
| | | // 获取led线程 |
| | | LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId()); |
| | | // led显示默认内容 |
| | | if (reset) { |
| | | if (ledThread == null) { |
| | | continue; |
| | | } |
| | | if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(2, new ArrayList<>()))) { |
| | | News.error("{}号LED显示默认命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); |
| | | } |
| | | // if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(4, new ArrayList<>()))) { |
| | | // News.error("{}号LED显示默认命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); |
| | | // } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 堆垛机5分钟无任务则回到源点 |
| | | */ |
| | |
| | | if (!WrkMastLogList.isEmpty()) { |
| | | boolean signT = false; |
| | | for (WrkMast wrkMast : WrkMastLogList){ |
| | | Date completeTime = wrkMast.getIoTime(); |
| | | Date completeTime = wrkMast.getModiTime(); |
| | | if (completeTime==null){ |
| | | continue; |
| | | } |
| | |
| | | */ |
| | | public static String getShallowLoc(SlaveProperties slaveProperties, String deepLoc) { |
| | | int row = getRow(deepLoc); |
| | | int remainder = (int) Arith.remainder(row, slaveProperties.getGroupCount()); |
| | | int shallowRow = remainder == 1 ? (row + 1) : (row - 1); |
| | | int shallowRow = row; |
| | | if (row==1 || row == 5 || row==11){ |
| | | shallowRow = row+1; |
| | | } else if (row==4 || row==8 || row == 14){ |
| | | shallowRow = row-1; |
| | | } |
| | | // int remainder = (int) Arith.remainder(row, slaveProperties.getGroupCount()); |
| | | // int shallowRow = remainder == 1 ? (row + 1) : (row - 1); |
| | | return zerofill(String.valueOf(shallowRow), 2) + deepLoc.substring(2); |
| | | } |
| | | |
| | |
| | | */ |
| | | public static String getDeepLoc(SlaveProperties slaveProperties, String shallowLoc) { |
| | | int row = getRow(shallowLoc); |
| | | int remainder = (int) Arith.remainder(row, slaveProperties.getGroupCount()); |
| | | // int remainder = (int) Arith.remainder(row, slaveProperties.getGroupCount()); |
| | | int targetRow; |
| | | if (remainder == 2) { |
| | | targetRow = row - 1; |
| | | } else if (remainder == 3) { |
| | | targetRow = row + 1; |
| | | } else { |
| | | // int targetRow = row; |
| | | if (row==2 || row == 6 || row==12){ |
| | | targetRow = row-1; |
| | | } else if (row==3 || row==7 || row == 13){ |
| | | targetRow = row+1; |
| | | }else { |
| | | throw new RuntimeException(shallowLoc + "不是浅库位,系统繁忙"); |
| | | } |
| | | // if (remainder == 2) { |
| | | // targetRow = row - 1; |
| | | // } else if (remainder == 3) { |
| | | // targetRow = row + 1; |
| | | // } else { |
| | | // throw new RuntimeException(shallowLoc + "不是浅库位,系统繁忙"); |
| | | // } |
| | | return zerofill(String.valueOf(targetRow), 2) + shallowLoc.substring(2); |
| | | } |
| | | |
| | |
| | | * 获取 浅库位排对应的深库位排 |
| | | */ |
| | | public static Integer getDeepRow(SlaveProperties slaveProperties, Integer shallowRow) { |
| | | int remainder = (int) Arith.remainder(shallowRow, slaveProperties.getGroupCount()); |
| | | // int remainder = (int) Arith.remainder(shallowRow, slaveProperties.getGroupCount()); |
| | | int targetRow; |
| | | if (remainder == 2) { |
| | | targetRow = shallowRow - 1; |
| | | } else if (remainder == 3) { |
| | | targetRow = shallowRow + 1; |
| | | } else { |
| | | throw new RuntimeException(shallowRow + "不是浅库位排,系统繁忙"); |
| | | // if (remainder == 2) { |
| | | // targetRow = shallowRow - 1; |
| | | // } else if (remainder == 3) { |
| | | // targetRow = shallowRow + 1; |
| | | // } else { |
| | | // throw new RuntimeException(shallowRow + "不是浅库位排,系统繁忙"); |
| | | // } |
| | | |
| | | // int targetRow = row; |
| | | if (shallowRow==2 || shallowRow == 6 || shallowRow==12){ |
| | | targetRow = shallowRow-1; |
| | | } else if (shallowRow==3 || shallowRow==7 || shallowRow == 13){ |
| | | targetRow = shallowRow+1; |
| | | }else { |
| | | throw new RuntimeException(shallowRow + "不是浅库位,系统繁忙"); |
| | | } |
| | | return targetRow; |
| | | } |
| | |
| | | // {680103, 731550, 1115, 882, 1215, 775, 1125, 882}, |
| | | // 直线区间(0-134400) |
| | | // {起点, 终点, 类型, x1, y1, x2, y2, |
| | | {0.0, 120000.0, 0, 390.0, 750.0, 60.0, 750.0}, |
| | | // 圆弧区间(拐点116-115)新参数:圆心(1115,775) |
| | | {120000.0, 127500.0, 2, 60.0, 750.0, 10.0, 800.0, 60.0, 800.0}, // 修正终点坐标 |
| | | {127500.0, 134900.0, 2, 10.0, 800.0, 60.0, 850.0, 60.0, 800.0}, |
| | | {134900.0, 680103.0,0, 60.0, 850.0, 1100.0, 850.0}, |
| | | {680103.0, 731550.0, 2, 1100.0, 850.0, 1200.0, 750.0, 1100.0, 750.0}, |
| | | {731550.0, 972950.0,0, 1200.0, 750.0, 1200.0, 100.0}, |
| | | {972950.0, 1016193.0, 2, 1200.0, 100.0, 1150.0, 50.0, 1150.0, 100.0}, |
| | | {1016193.0, 1063563.0, 2, 1150.0, 50.0, 1100.0, 100.0, 1150.0, 100.0}, |
| | | {1063563.0, 1315250.0,0, 1100.0, 100.0, 1100.0, 700.0}, |
| | | {1315250.0, 1322829.0, 2, 1100.0, 700.0, 1050.0, 750.0, 1050.0, 700.0}, |
| | | {1322829.0, 1737000.0,0, 1050.0, 750.0, 390.0, 750.0}, |
| | | {0.0, 240000.0, 0, 100.0, 225.0, 1100.0, 225.0}, |
| | | {1000000.0, 1240000.0, 0, 100.0, 625.0, 1100.0, 625.0}, |
| | | // // 圆弧区间(拐点116-115)新参数:圆心(1115,775) |
| | | // {120000.0, 127500.0, 2, 60.0, 750.0, 10.0, 800.0, 60.0, 800.0}, // 修正终点坐标 |
| | | // {127500.0, 134900.0, 2, 10.0, 800.0, 60.0, 850.0, 60.0, 800.0}, |
| | | // {134900.0, 680103.0,0, 60.0, 850.0, 1100.0, 850.0}, |
| | | // {680103.0, 731550.0, 2, 1100.0, 850.0, 1200.0, 750.0, 1100.0, 750.0}, |
| | | // {731550.0, 972950.0,0, 1200.0, 750.0, 1200.0, 100.0}, |
| | | // {972950.0, 1016193.0, 2, 1200.0, 100.0, 1150.0, 50.0, 1150.0, 100.0}, |
| | | // {1016193.0, 1063563.0, 2, 1150.0, 50.0, 1100.0, 100.0, 1150.0, 100.0}, |
| | | // {1063563.0, 1315250.0,0, 1100.0, 100.0, 1100.0, 700.0}, |
| | | // {1315250.0, 1322829.0, 2, 1100.0, 700.0, 1050.0, 750.0, 1050.0, 700.0}, |
| | | // {1322829.0, 1737000.0,0, 1050.0, 750.0, 390.0, 750.0}, |
| | | }; |
| | | |
| | | for (Object[] interval : intervals) { |
| | |
| | | switch (sourceStaNo){ |
| | | case 118: |
| | | case 121: |
| | | case 122: |
| | | case 124: |
| | | case 218: |
| | | case 221: |
| | | case 222: |
| | | return sourceStaNo+1; |
| | | case 224: |
| | | return sourceStaNo-1; |
| | | } |
| | | return staNoE; |
| | | } |
| | |
| | | mainService.crnIoExecute(); |
| | | // 入库 ===>> 执行对工作档的完成操作 |
| | | mainService.storeFinished(); |
| | | // 出库 ===>> 工作档信息写入led显示器 |
| | | mainService.ledExecute(); |
| | | // 其他 ===>> LED显示器复位,显示默认信息 |
| | | mainService.ledReset(); |
| | | // 出库 ===>> 堆垛机10分钟无任务则回到源点 |
| | | mainService.crnStnToOutStnSou(); |
| | | |
| | |
| | | private void reset() { |
| | | commandList = null; |
| | | stringBuffer.delete(0, stringBuffer.length()); |
| | | this.errorMsg.delete(0, errorMsg.length()); |
| | | } |
| | | |
| | | |
| | |
| | | //# 轨道基准点 |
| | | private Long trackBenchmark = 1L; |
| | | // # 避让距离 |
| | | private Long avoidDistance = 14000L; |
| | | private Long avoidDistance = 11200L; |
| | | private String errorRgv = "-"; |
| | | |
| | | /** |
| | |
| | | initRgv(); |
| | | continue; |
| | | } |
| | | Thread.sleep(20); |
| | | Thread.sleep(100L); |
| | | // System.out.println("读线程,小车号"+ slave.getId()+"时间戳:"+System.currentTimeMillis()); |
| | | |
| | | readStatus(); |
| | |
| | | } |
| | | continue; |
| | | } |
| | | // if (delRgvTask){ |
| | | // writeDelRgvTask(); |
| | | // delRgvTask = false; |
| | | // continue; |
| | | // } |
| | | if (delRgvTask){ |
| | | writeDelRgvTask(); |
| | | delRgvTask = false; |
| | | continue; |
| | | } |
| | | Thread.sleep(50L); |
| | | |
| | | // 构建设备状态对象 |
| | |
| | | rgvProtocol = new RgvProtocol(); |
| | | } |
| | | if (rgvProtocol.getStatusType().equals(RgvStatusType.WAITING) || rgvProtocol.getStatusType().equals(RgvStatusType.FETCHWAITING)){ |
| | | OperateResult result2 = siemensNet.Write("DB100.2",(int) 0); |
| | | OperateResult result = siemensNet.Write("DB100.14", (int) 0); |
| | | OperateResult result1 = siemensNet.Write("DB100.6", (short) 0); |
| | | OperateResult result4 = siemensNet.Write("DB100.0", (short) 1); |
| | | boolean sign = true; |
| | | int i = 1; |
| | | while (sign && i<5){ |
| | | i++; |
| | | sign = false; |
| | | OperateResult result2 = siemensNet.Write("DB100.2",(int) 0); |
| | | OperateResult result14 = siemensNet.Write("DB100.14", (int) 0); |
| | | OperateResult result6 = siemensNet.Write("DB100.6", (short) 0); |
| | | OperateResult result8 = siemensNet.Write("DB100.8", (short) 0); |
| | | OperateResult result10 = siemensNet.Write("DB100.10", (short) 0); |
| | | OperateResult result12 = siemensNet.Write("DB100.12", (short) 0); |
| | | Thread.sleep(10L); |
| | | |
| | | OperateResultExOne<byte[]> resultRead0 = siemensNet.Read("DB100.0", (short) 20); |
| | | Integer i2 = siemensNet.getByteTransform().TransInt32(resultRead0.Content, 2); |
| | | short i6 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 6); |
| | | short i8 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 8); |
| | | short i10 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 10); |
| | | Integer i14 = siemensNet.getByteTransform().TransInt32(resultRead0.Content, 14); |
| | | if (i2!=0 || i6 != (short) 0 |
| | | || i8!=(short)0 || i10 != (short) 0 |
| | | || i14!=0){ |
| | | sign = true; |
| | | } |
| | | } |
| | | |
| | | OperateResult result0 = siemensNet.Write("DB100.0", (short) 1); |
| | | |
| | | Thread.sleep(20L); |
| | | |
| | | OperateResult result00 = siemensNet.Write("DB100.0", (short) 0); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("RGV数据任务下发复位线程异常!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); |
| | |
| | | continue; |
| | | } |
| | | // 休眠 1 秒 |
| | | Thread.sleep(100); |
| | | Thread.sleep(200L); |
| | | |
| | | if (!deviceDetection()) { |
| | | continue; |
| | |
| | | } |
| | | continue; |
| | | } |
| | | |
| | | Thread.sleep(50L); |
| | | |
| | | RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); |
| | | RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); |
| | |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | |
| | | this.wrkSign = 1; |
| | | // convertRow(command); |
| | | // taskProtocol.setRgvNo(slave.getId()); |
| | | // Long[] array = new Long[11]; |
| | | OperateResult result41 = siemensNet.Write("DB100.0", (short) 0); |
| | | OperateResult result0 = siemensNet.Write("DB100.0", (short) 0); |
| | | // array[0] = taskProtocol.getAckFinish1(); |
| | | // array[1] = taskProtocol.getTaskNo(); |
| | | // array[2] = taskProtocol.getTaskMode(); |
| | |
| | | int taskStatus = taskProtocol.getTaskStatus$(); |
| | | int targetPositionStaNo = taskProtocol.getTargetPositionStaNo(); |
| | | int targetPositionStaNoEnd = taskProtocol.getTargetPositionStaNoEnd(); |
| | | |
| | | OperateResult result2 = siemensNet.Write("DB100.2", taskProtocol.getTaskNo().intValue()); |
| | | OperateResult result1 = siemensNet.Write("DB100.6", (short) taskStatus); |
| | | OperateResult result11 = siemensNet.Write("DB100.8", (short) targetPositionStaNo); |
| | | OperateResult result12 = siemensNet.Write("DB100.10", (short) targetPositionStaNo); |
| | | OperateResult result = siemensNet.Write("DB100.14", taskProtocol.getTargetPosition().intValue()); |
| | | OperateResult result13 = siemensNet.Write("DB100.18", (short) targetPositionStaNoEnd); |
| | | boolean sign = true; |
| | | int i = 1; |
| | | while (sign && i<5){ |
| | | i++; |
| | | sign = false; |
| | | OperateResult result2 = siemensNet.Write("DB100.2", taskProtocol.getTaskNo().intValue()); |
| | | OperateResult result6 = siemensNet.Write("DB100.6", (short) taskStatus); |
| | | OperateResult result8 = siemensNet.Write("DB100.8", (short) targetPositionStaNo); |
| | | OperateResult result10 = siemensNet.Write("DB100.10", (short) targetPositionStaNo); |
| | | OperateResult result14 = siemensNet.Write("DB100.14", taskProtocol.getTargetPosition().intValue()); |
| | | OperateResult result18 = siemensNet.Write("DB100.18", (short) targetPositionStaNoEnd); |
| | | // OperateResult result3 = siemensNet.Write("DB100.10", taskProtocol.isDirection()? (short) 1 : (short) 2); // 执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | Thread.sleep(10L); |
| | | Thread.sleep(10L); |
| | | |
| | | OperateResult result4 = siemensNet.Write("DB100.12", (short) 1); |
| | | this.wrkSign = 1; |
| | | OperateResultExOne<byte[]> resultRead0 = siemensNet.Read("DB100.0", (short) 20); |
| | | short i0 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 0); |
| | | Integer i2 = siemensNet.getByteTransform().TransInt32(resultRead0.Content, 2); |
| | | short i6 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 6); |
| | | short i8 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 8); |
| | | short i10 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 10); |
| | | Integer i14 = siemensNet.getByteTransform().TransInt32(resultRead0.Content, 14); |
| | | short i18 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 18); |
| | | if (i0 !=(short) 0 || i2!=taskProtocol.getTaskNo().intValue() || i6 != (short) taskStatus |
| | | || i8!=(short)targetPositionStaNo || i10 != (short) targetPositionStaNo |
| | | || i14!=taskProtocol.getTargetPosition().intValue() || i18 != (short) targetPositionStaNoEnd){ |
| | | sign = true; |
| | | } |
| | | } |
| | | sign = true; |
| | | OperateResult result12 = siemensNet.Write("DB100.12", (short) 1); |
| | | // |
| | | i = 1; |
| | | sign = true; |
| | | while (sign && i<5){ |
| | | i++; |
| | | sign = false; |
| | | // OperateResult result3 = siemensNet.Write("DB100.10", taskProtocol.isDirection()? (short) 1 : (short) 2); // 执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | Thread.sleep(10L); |
| | | |
| | | OperateResultExOne<byte[]> resultRead0 = siemensNet.Read("DB100.0", (short) 20); |
| | | short i12 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 12); |
| | | if (i12 != (short) 1 ){ |
| | | sign = true; |
| | | } |
| | | result12 = siemensNet.Write("DB100.12", (short) 1); |
| | | } |
| | | |
| | | // log.info("任务下发线程,小车号"+ slave.getId()+"时间戳:"+System.currentTimeMillis()); |
| | | |
| | |
| | | null, |
| | | null, |
| | | null, |
| | | result.IsSuccess ? 1 : 0, |
| | | result12.IsSuccess ? 1 : 0, |
| | | null, |
| | | new Date(), |
| | | null |
| | |
| | | } |
| | | |
| | | readStatus(); |
| | | if (result != null && result.IsSuccess) { |
| | | if (result12 != null && result0.IsSuccess) { |
| | | // Thread.sleep(50); |
| | | // this.readStatus(); |
| | | log.info("RGV 命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(taskProtocol)); |
| | |
| | | |
| | | private boolean writeDelRgvTask() throws InterruptedException { |
| | | // |
| | | OperateResult result = siemensNet.Write("DB100.12.0", false); |
| | | OperateResult result0 = siemensNet.Write("DB100.0", (int) 0); |
| | | OperateResult result1 = siemensNet.Write("DB100.4", (short) 0); |
| | | OperateResult result2 = siemensNet.Write("DB100.6", (int) 0); |
| | | OperateResult result3 = siemensNet.Write("DB100.10", (short) 0); // 执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | int i = 1; |
| | | boolean sign = true; |
| | | while (sign && i<5){ |
| | | i++; |
| | | sign = false; |
| | | OperateResult result0 = siemensNet.Write("DB100.0", (short) 0); |
| | | OperateResult result2 = siemensNet.Write("DB100.2", 0); |
| | | OperateResult result6 = siemensNet.Write("DB100.6", (short) 0); |
| | | OperateResult result8 = siemensNet.Write("DB100.8", (short) 0); |
| | | OperateResult result10 = siemensNet.Write("DB100.10", (short) 0); |
| | | OperateResult result12 = siemensNet.Write("DB100.12",(short)0); |
| | | OperateResult result14 = siemensNet.Write("DB100.14",0); |
| | | OperateResult result18 = siemensNet.Write("DB100.18", (short) 0); |
| | | // OperateResult result3 = siemensNet.Write("DB100.10", taskProtocol.isDirection()? (short) 1 : (short) 2); // 执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | Thread.sleep(10L); |
| | | |
| | | OperateResultExOne<byte[]> resultRead0 = siemensNet.Read("DB100.0", (short) 20); |
| | | short i0 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 0); |
| | | Integer i2 = siemensNet.getByteTransform().TransInt32(resultRead0.Content, 2); |
| | | short i6 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 6); |
| | | short i8 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 8); |
| | | short i10 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 10); |
| | | short i12 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 12); |
| | | Integer i14 = siemensNet.getByteTransform().TransInt32(resultRead0.Content, 14); |
| | | short i18 = siemensNet.getByteTransform().TransInt16(resultRead0.Content, 18); |
| | | if (i0 !=(short) 0 || i2!=0 || i6 != (short) 0 |
| | | || i8!=(short)0 || i10 != (short) 0 || i12 != (short) 0 |
| | | || i14!=0 || i18 != (short) 0){ |
| | | sign = true; |
| | | } |
| | | } |
| | | log.info("任务完成下发线程,小车号"+ slave.getId()+"时间戳:"+System.currentTimeMillis()); |
| | | |
| | | try { |
| | |
| | | null, |
| | | null, |
| | | null, |
| | | result.IsSuccess ? 1 : 0, |
| | | sign ? 1 : 0, |
| | | null, |
| | | new Date(), |
| | | null |
| | |
| | | } catch (Exception ignore) { |
| | | } |
| | | |
| | | if (result != null && result.IsSuccess) { |
| | | if (sign) { |
| | | // Thread.sleep(200); |
| | | // this.readStatus(); |
| | | log.info("RGV 命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON("null")); |
| | |
| | | public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{ |
| | | add(101);add(102);add(103);add(104);add(105);add(106);add(107);add(108);add(109);add(110); |
| | | add(111);add(112);add(113);add(114);add(115);add(116);add(117);add(118);add(119);add(120); |
| | | add(121);add(122);add(124);add(125); |
| | | add(121);add(122);add(123);add(124);add(125); |
| | | }}; |
| | | |
| | | public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{ |
| | | add(201);add(202);add(203);add(204);add(205);add(206);add(207);add(208);add(209);add(210); |
| | | add(211);add(212);add(213);add(214);add(215);add(216);add(217);add(218);add(219);add(220); |
| | | add(221);add(222);add(224);add(225); |
| | | add(221);add(222);add(223);add(224);add(225); |
| | | }}; |
| | | public static final ArrayList<Integer> staNos1W = new ArrayList<Integer>() {{ |
| | | add(118);add(121);add(124); |
| | |
| | | station.put(siteId, staProtocol); |
| | | } |
| | | String barcode = siemensS7Net.getByteTransform().TransString(result2.Content,i*8,8, "UTF-8"); |
| | | BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, i + 1+3*slave.getId()); |
| | | BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, i + 1+3*(slave.getId()-1)); |
| | | if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) { |
| | | barcodeThread.setBarcode(barcode); |
| | | if (!Cools.isEmpty(barcode) && !barcode.equals("00000000")){ |
| | |
| | | # 轨道转换为米比例 |
| | | trackProportion: 10000 |
| | | # 避让距离 |
| | | avoidDistance: 13300 |
| | | avoidDistance: 11200 |
| | | inventory: |
| | | number: 7 |
| | | |
| | |
| | | # 双深 |
| | | doubleDeep: true |
| | | # 双深库位排号 |
| | | doubleLocs: 1,4,5,8,9,12,13,16,17,20 |
| | | doubleLocs: 1,4,5,8,11,14 |
| | | # 一个堆垛机负责的货架排数 |
| | | groupCount: 4 |
| | | # 堆垛机1 |
| | |
| | | directionOther: false |
| | | rgvOutSta[3]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 116 |
| | | staNo: 102 |
| | | direction: true |
| | | staNoOther: 116 |
| | | staNoOther: 102 |
| | | directionOther: false |
| | | rgvOutSta[4]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | |
| | | directionOther: false |
| | | rgvSuperSta[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 116 |
| | | staNo: 102 |
| | | direction: true |
| | | staNoOther: 116 |
| | | staNoOther: 102 |
| | | directionOther: false |
| | | # RGV穿梭车2 |
| | | rgv[1]: |
| | |
| | | directionOther: false |
| | | rgvOutSta[3]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 102 |
| | | staNo: 116 |
| | | direction: true |
| | | staNoOther: 102 |
| | | staNoOther: 116 |
| | | directionOther: false |
| | | rgvOutSta[4]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | |
| | | directionOther: false |
| | | rgvSuperSta[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 102 |
| | | staNo: 116 |
| | | direction: true |
| | | staNoOther: 102 |
| | | staNoOther: 116 |
| | | directionOther: false |
| | | # RGV穿梭车3 |
| | | rgv[2]: |
| | |
| | | carBodyKunPeng: 2800 |
| | | #RGV源站点 |
| | | rgvInSta[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 217 |
| | | #执行方向(面朝轨道 定位值左小右大===> 后 前true后false) true:左 false:右 |
| | | direction: false |
| | | staNoOther: 217 |
| | | directionOther: false |
| | | rgvInSta[1]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 220 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: false |
| | | staNoOther: 220 |
| | | directionOther: false |
| | | rgvInSta[2]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 223 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: true |
| | | staNoOther: 223 |
| | | directionOther: false |
| | | rgvInSta[3]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 204 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: true |
| | | staNoOther: 204 |
| | | directionOther: false |
| | | rgvInSta[4]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 208 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: true |
| | | staNoOther: 208 |
| | | directionOther: false |
| | | rgvInSta[5]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 212 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: true |
| | | staNoOther: 212 |
| | | directionOther: false |
| | | rgvInSta[6]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 214 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: true |
| | |
| | | directionOther: false |
| | | #RGV目标站点 |
| | | rgvOutSta[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 217 |
| | | direction: false |
| | | staNoOther: 217 |
| | | directionOther: false |
| | | rgvOutSta[1]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 220 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: false |
| | | staNoOther: 220 |
| | | directionOther: false |
| | | rgvOutSta[2]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 123 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 223 |
| | | direction: false |
| | | staNoOther: 123 |
| | | staNoOther: 223 |
| | | directionOther: false |
| | | rgvOutSta[3]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 102 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 202 |
| | | direction: true |
| | | staNoOther: 102 |
| | | staNoOther: 202 |
| | | directionOther: false |
| | | rgvOutSta[4]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 106 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 206 |
| | | direction: true |
| | | staNoOther: 106 |
| | | staNoOther: 206 |
| | | directionOther: false |
| | | rgvOutSta[5]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 110 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 210 |
| | | direction: true |
| | | staNoOther: 110 |
| | | staNoOther: 210 |
| | | directionOther: false |
| | | rgvSuperSta[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 102 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 202 |
| | | direction: true |
| | | staNoOther: 102 |
| | | staNoOther: 202 |
| | | directionOther: false |
| | | # RGV穿梭车4 |
| | | rgv[3]: |
| | |
| | | carBodyKunPeng: 2800 |
| | | #RGV源站点 |
| | | rgvInSta[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 117 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 217 |
| | | #执行方向(面朝轨道 定位值左小右大===> 后 前true后false) true:左 false:右 |
| | | direction: false |
| | | staNoOther: 117 |
| | | staNoOther: 217 |
| | | directionOther: false |
| | | rgvInSta[1]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 120 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 220 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: false |
| | | staNoOther: 120 |
| | | staNoOther: 220 |
| | | directionOther: false |
| | | rgvInSta[2]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 123 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 223 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: true |
| | | staNoOther: 123 |
| | | staNoOther: 223 |
| | | directionOther: false |
| | | rgvInSta[3]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 104 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 204 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: true |
| | | staNoOther: 104 |
| | | staNoOther: 204 |
| | | directionOther: false |
| | | rgvInSta[4]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 108 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 208 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: true |
| | | staNoOther: 108 |
| | | staNoOther: 208 |
| | | directionOther: false |
| | | rgvInSta[5]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 112 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 212 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: true |
| | | staNoOther: 112 |
| | | staNoOther: 212 |
| | | directionOther: false |
| | | rgvInSta[6]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 114 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 214 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: true |
| | | staNoOther: 114 |
| | | staNoOther: 214 |
| | | directionOther: false |
| | | #RGV目标站点 |
| | | rgvOutSta[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 117 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 217 |
| | | direction: false |
| | | staNoOther: 117 |
| | | staNoOther: 217 |
| | | directionOther: false |
| | | rgvOutSta[1]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 120 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 220 |
| | | #执行方向(面朝轨道 定位值左小右大) true:左 false:右 |
| | | direction: false |
| | | staNoOther: 120 |
| | | staNoOther: 220 |
| | | directionOther: false |
| | | rgvOutSta[2]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 123 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 223 |
| | | direction: false |
| | | staNoOther: 123 |
| | | staNoOther: 223 |
| | | directionOther: false |
| | | rgvOutSta[3]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 116 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 216 |
| | | direction: true |
| | | staNoOther: 116 |
| | | staNoOther: 216 |
| | | directionOther: false |
| | | rgvOutSta[4]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 106 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 206 |
| | | direction: true |
| | | staNoOther: 106 |
| | | staNoOther: 206 |
| | | directionOther: false |
| | | rgvOutSta[5]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 110 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 210 |
| | | direction: true |
| | | staNoOther: 110 |
| | | staNoOther: 210 |
| | | directionOther: false |
| | | rgvSuperSta[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 116 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staNo: 216 |
| | | direction: true |
| | | staNoOther: 116 |
| | | staNoOther: 216 |
| | | directionOther: false |
| | | # 输送线1 |
| | | devp[0]: |
| | |
| | | ip: 10.10.10.209 |
| | | port: 5005 |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staArr: 1036 |
| | | staArr: 119 |
| | | # LED2 |
| | | led[1]: |
| | | id: 2 |
| | | ip: 10.10.10.210 |
| | | port: 5005 |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staArr: 1041 |
| | | staArr: 122 |
| | | # LED3 |
| | | led[2]: |
| | | id: 3 |
| | | ip: 10.10.10.211 |
| | | port: 5005 |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staArr: 1103 |
| | | staArr: 125 |
| | | # LED4 |
| | | led[3]: |
| | | id: 4 |
| | | ip: 10.10.10.212 |
| | | port: 5005 |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staArr: 1047 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staArr: 219 |
| | | # LED4 |
| | | led[4]: |
| | | id: 5 |
| | | ip: 10.10.10.213 |
| | | port: 5005 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staArr: 2037 |
| | | staArr: 222 |
| | | # LED5 |
| | | led[5]: |
| | | id: 6 |
| | | ip: 10.10.10.214 |
| | | port: 5005 |
| | | devpPlcId: ${wcs-slave.devp[1].id} |
| | | staArr: 4001 |
| | | staArr: 225 |
| | | # LED6 |
| | | led[6]: |
| | | id: 7 |
| | | ip: 10.10.10.208 |
| | | port: 5005 |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staArr: 1111 |
| | |
| | | |
| | | </resultMap> |
| | | |
| | | <select id="getErr" resultType="String"> |
| | | SELECT TOP 1 pos_loading |
| | | FROM asr_bas_devp_opt |
| | | WHERE wrk_no = #{wrkNo} |
| | | ORDER BY send_time DESC |
| | | </select> |
| | | |
| | | </mapper> |
| New file |
| | |
| | | .system-control-panel { |
| | | position: absolute; |
| | | top: 15px; |
| | | left: 50%; |
| | | transform: translateX(-50%); |
| | | background: rgba(240, 248, 255, 0.7); |
| | | border-radius: 16px; |
| | | padding: 8px 20px; |
| | | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); |
| | | backdrop-filter: blur(6px); |
| | | border: 1px solid rgba(255, 255, 255, 0.6); |
| | | z-index: 100; |
| | | display: flex; |
| | | align-items: center; |
| | | min-width: 260px; |
| | | justify-content: center; |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | .system-control-panel:hover { |
| | | background: rgba(240, 248, 255, 0.85); |
| | | box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12); |
| | | } |
| | | |
| | | .system-status { |
| | | display: flex; |
| | | align-items: center; |
| | | margin-right: 12px; |
| | | } |
| | | |
| | | .status-indicator { |
| | | width: 10px; |
| | | height: 10px; |
| | | border-radius: 50%; |
| | | margin-right: 8px; |
| | | } |
| | | |
| | | .status-running { |
| | | background-color: #13ce66; |
| | | box-shadow: 0 0 6px rgba(19, 206, 102, 0.8); |
| | | animation: pulse-green 2s infinite; |
| | | } |
| | | |
| | | .status-stopped { |
| | | background-color: #A64036; |
| | | box-shadow: 0 0 6px rgba(166, 64, 54, 0.6); |
| | | } |
| | | |
| | | .status-text { |
| | | font-weight: 600; |
| | | font-size: 13px; |
| | | color: #2c3e50; |
| | | } |
| | | |
| | | .custom-switch { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .el-switch { |
| | | transform: scale(0.9); |
| | | } |
| | | |
| | | @keyframes pulse-green { |
| | | 0% { box-shadow: 0 0 0 0 rgba(19, 206, 102, 0.5); } |
| | | 70% { box-shadow: 0 0 0 6px rgba(19, 206, 102, 0); } |
| | | 100% { box-shadow: 0 0 0 0 rgba(19, 206, 102, 0); } |
| | | } |
| | | |
| | | .license-info { |
| | | position: absolute; |
| | | top: 60px; |
| | | left: 50%; |
| | | transform: translateX(-50%); |
| | | background: rgba(255, 255, 255, 0.85); |
| | | padding: 8px 18px; |
| | | border-radius: 6px; |
| | | font-size: 22px; |
| | | font-weight: 600; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); |
| | | backdrop-filter: blur(4px); |
| | | border: 1px solid rgba(255, 255, 255, 0.6); |
| | | z-index: 99; |
| | | display: flex; |
| | | align-items: center; |
| | | transition: all 0.3s ease; |
| | | max-width: 80%; |
| | | text-align: center; |
| | | } |
| | | |
| | | .license-info.normal { |
| | | color: #13ce66; |
| | | background: rgba(255, 255, 255, 0.85); |
| | | display: none; /* 大于30天时隐藏 */ |
| | | } |
| | | |
| | | .license-info.warning { |
| | | color: #e6a23c; |
| | | background: rgba(255, 247, 230, 0.85); |
| | | border: 1px solid rgba(230, 162, 60, 0.3); |
| | | } |
| | | |
| | | .license-info.expired { |
| | | color: #f56c6c; |
| | | background: rgba(255, 235, 235, 0.85); |
| | | border: 1px solid rgba(245, 108, 108, 0.3); |
| | | animation: pulse-red 2s infinite; |
| | | } |
| | | |
| | | .license-icon { |
| | | margin-right: 8px; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | @keyframes pulse-red { |
| | | 0% { box-shadow: 0 0 0 0 rgba(245, 108, 108, 0.3); } |
| | | 70% { box-shadow: 0 0 0 6px rgba(245, 108, 108, 0); } |
| | | 100% { box-shadow: 0 0 0 0 rgba(245, 108, 108, 0); } |
| | | } |
| | | |
| | | body { |
| | | font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; |
| | | margin: 0; |
| | | padding: 0; |
| | | background-color: #a0d2eb; |
| | | color: #ffffff; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | height: 100vh; |
| | | |
| | | background: linear-gradient(135deg, #e6f7ff 0%, #f0f8ff 100%); |
| | | overflow: hidden; |
| | | position: relative; |
| | | } |
| | | .tech-background { |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | z-index: -1; |
| | | pointer-events: none; |
| | | opacity: 0.6; |
| | | } |
| | | |
| | | .grid-overlay { |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | background-image: |
| | | linear-gradient(rgba(66, 134, 244, 0.08) 1px, transparent 1px), |
| | | linear-gradient(90deg, rgba(66, 134, 244, 0.08) 1px, transparent 1px); |
| | | background-size: 40px 40px; |
| | | perspective: 1000px; |
| | | transform-style: preserve-3d; |
| | | transform: perspective(500px) rotateX(60deg); |
| | | } |
| | | |
| | | .glow-effect { |
| | | position: absolute; |
| | | width: 100%; |
| | | height: 100%; |
| | | top: 0; |
| | | left: 0; |
| | | background: |
| | | radial-gradient(circle at 20% 30%, rgba(41, 128, 185, 0.3) 0%, transparent 40%), |
| | | radial-gradient(circle at 80% 70%, rgba(46, 204, 113, 0.3) 0%, transparent 40%); |
| | | filter: blur(10px); |
| | | } |
| | | |
| | | .particles-container { |
| | | position: absolute; |
| | | width: 100%; |
| | | height: 100%; |
| | | top: 0; |
| | | left: 0; |
| | | } |
| | | |
| | | .particle { |
| | | position: absolute; |
| | | background-color: rgba(255, 255, 255, 0.5); |
| | | border-radius: 50%; |
| | | animation: float 15s infinite ease-in-out; |
| | | } |
| | | |
| | | @keyframes float { |
| | | 0%, 100% { |
| | | transform: translateY(0) translateX(0); |
| | | opacity: 0.2; |
| | | } |
| | | 50% { |
| | | transform: translateY(-20px) translateX(20px); |
| | | opacity: 0.6; |
| | | } |
| | | } |
| | | |
| | | header { |
| | | background-color: #2196F3; |
| | | color: white; |
| | | padding: 15px 20px; |
| | | text-align: center; |
| | | font-size: 24px; |
| | | letter-spacing: 1px; |
| | | box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); |
| | | } |
| | | .map { |
| | | position: relative; |
| | | width: 52vw; |
| | | height: 72vh; |
| | | border-radius: 50%; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | } |
| | | .inner-ring, .outer-ring { |
| | | position: absolute; |
| | | border-radius: 50%; |
| | | } |
| | | .inner-ring { |
| | | width: 72vh; |
| | | height: 72vh; |
| | | border: 4px solid #00E676; |
| | | box-shadow: inset 0 0 30px rgba(0, 230, 118, 0.5), 0 0 20px rgba(0, 230, 118, 0.5); |
| | | } |
| | | .outer-ring { |
| | | width: 80vh; |
| | | height: 80vh; |
| | | border: 4px solid #00E676; |
| | | box-shadow: inset 0 0 30px rgba(0, 230, 118, 0.5), 0 0 20px rgba(0, 230, 118, 0.5); |
| | | } |
| | | .station { |
| | | position: absolute; |
| | | width: 20px; |
| | | height: 14px; |
| | | text-align: center; |
| | | line-height: 1.5; /* 调整行高与字体大小的比值 */ |
| | | font-size: 10px; /* 设置更小的字体 */ |
| | | font-weight: bold; |
| | | transition: transform 0.3s ease; |
| | | background-color: #ab1839; |
| | | transform: scale(1); /* 可选:如果不需要放大效果 */ |
| | | } |
| | | .bus { |
| | | font-size: 10px; |
| | | background-color: #2196F3; |
| | | /*border: 10px solid #ffffff;*/ |
| | | position: absolute; |
| | | width: 15px; |
| | | height: 15px; |
| | | border-radius: 50%; |
| | | text-align: center; |
| | | line-height: 15px; |
| | | font-weight: bold; |
| | | transition: transform 0.3s ease; |
| | | /* 3D效果 */ |
| | | transform: translateZ(0); |
| | | border: 10px solid rgba(255, 255, 255, 0.8); |
| | | } |
| | | |
| | | @keyframes pulse { |
| | | 0% { box-shadow: 0 0 0 0 rgba(33, 150, 243, 0.7); } |
| | | 70% { box-shadow: 0 0 0 10px rgba(33, 150, 243, 0); } |
| | | 100% { box-shadow: 0 0 0 0 rgba(33, 150, 243, 0); } |
| | | } |
| | | .station:hover, .bus:hover { |
| | | transform: scale(1.4); |
| | | z-index: 999; |
| | | } |
| | | |
| | | .task-bar-left { |
| | | position: fixed; |
| | | top: 1%; |
| | | /*transform: translateY(-50%);*/ |
| | | width: 25%; /* 设置宽度 */ |
| | | background-color: rgba(255, 255, 255, 0); /* 半透明背景 */ |
| | | |
| | | border-radius: 5px; |
| | | padding: 10px; |
| | | box-shadow: 0 0 10px rgba(0, 0, 0, 0); |
| | | z-index: 1000; /* 确保在其他元素之上 */ |
| | | } |
| | | |
| | | .task-bar-left1 { |
| | | position: fixed; |
| | | top: 8%; |
| | | /*transform: translateY(-50%);*/ |
| | | width: 25%; /* 设置宽度 */ |
| | | background-color: rgba(255, 255, 255, 0); /* 半透明背景 */ |
| | | |
| | | border-radius: 5px; |
| | | padding: 10px; |
| | | box-shadow: 0 0 10px rgba(0, 0, 0, 0); |
| | | z-index: 1000; /* 确保在其他元素之上 */ |
| | | } |
| | | |
| | | .task-bar-right { |
| | | position: fixed; |
| | | top: 1%; |
| | | /*transform: translateY(-50%);*/ |
| | | width: 25%; /* 设置宽度 */ |
| | | background-color: rgba(255, 255, 255, 0); /* 半透明背景 */ |
| | | |
| | | border-radius: 5px; |
| | | padding: 10px; |
| | | box-shadow: 0 0 10px rgba(0, 0, 0, 0); |
| | | z-index: 1000; /* 确保在其他元素之上 */ |
| | | } |
| | | |
| | | .task-bar-right1 { |
| | | position: fixed; |
| | | top: 5%; |
| | | /*transform: translateY(-50%);*/ |
| | | width: 25%; /* 设置宽度 */ |
| | | background-color: rgba(255, 255, 255, 0); |
| | | |
| | | border-radius: 5px; |
| | | padding: 10px; |
| | | box-shadow: 0 0 10px rgba(0, 0, 0, 0); |
| | | z-index: 1000; |
| | | } |
| | | |
| | | .task-bar-div1 { |
| | | /*width: 100%; !* 设置宽度 *!*/ |
| | | background-color: rgba(255, 255, 255, 0.8); |
| | | box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); |
| | | } |
| | | |
| | | .left-task-bar { |
| | | left: 20px; |
| | | /*bottom: 100px;*/ |
| | | } |
| | | |
| | | .right-task-bar { |
| | | /*bottom: 100px;*/ |
| | | right: 20px; |
| | | } |
| | | |
| | | .el-table .warning-row { |
| | | background: oldlace; |
| | | } |
| | | |
| | | .el-table .success-row { |
| | | background: #f0f9eb; |
| | | } |
| | | .container { |
| | | width: 52vw; |
| | | height: 72vh; |
| | | position: absolute; |
| | | /*background: #8c939d;*/ |
| | | } |
| | | .bus-station { |
| | | width: 100vh; |
| | | height: 72vh; |
| | | position: absolute; |
| | | display: flex; |
| | | /*background: #8c939d;*/ |
| | | } |
| | | .bus-item-top { |
| | | background: red; |
| | | position: relative; |
| | | width: 40px; |
| | | height: 60px; |
| | | line-height: 60px; |
| | | top: 880px; |
| | | text-align: center; |
| | | } |
| | | .bus-item-left { |
| | | background: red; |
| | | position: relative; |
| | | width: 60px; |
| | | height: 40px; |
| | | line-height: 40px; |
| | | left: 1230px; |
| | | text-align: center; |
| | | } |
| | | .bus-item-left2 { |
| | | background: red; |
| | | position: relative; |
| | | width: 60px; |
| | | height: 40px; |
| | | line-height: 40px; |
| | | left: 1000px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .station { |
| | | position: absolute; |
| | | width: 24px; |
| | | height: 24px; |
| | | text-align: center; |
| | | line-height: 24px; |
| | | font-size: 10px; |
| | | font-weight: bold; |
| | | transition: all 0.3s ease; |
| | | background-color: #ab1839; |
| | | border-radius: 4px; |
| | | color: white; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); |
| | | transform: scale(1); |
| | | z-index: 10; |
| | | /* 嵌套效果 */ |
| | | border: 2px solid white; |
| | | } |
| | | |
| | | .station::before { |
| | | content: ''; |
| | | position: absolute; |
| | | top: 3px; |
| | | left: 3px; |
| | | right: 3px; |
| | | bottom: 3px; |
| | | /*border: 1px solid rgba(255, 255, 255, 0.8);*/ |
| | | border-radius: 2px; |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .station::after { |
| | | content: ''; |
| | | position: absolute; |
| | | width: 100%; |
| | | height: 100%; |
| | | top: 0; |
| | | left: 0; |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .station .corner { |
| | | position: absolute; |
| | | width: 0; |
| | | height: 0; |
| | | border-style: solid; |
| | | border-width: 0 4px 4px 0; |
| | | border-color: transparent #ffffff transparent transparent; |
| | | } |
| | | |
| | | .station .corner-tl { |
| | | top: -2px; |
| | | left: -2px; |
| | | transform: rotate(0deg); |
| | | } |
| | | |
| | | .station .corner-tr { |
| | | top: -2px; |
| | | right: -2px; |
| | | transform: rotate(90deg); |
| | | } |
| | | |
| | | .station .corner-bl { |
| | | bottom: -2px; |
| | | left: -2px; |
| | | transform: rotate(270deg); |
| | | } |
| | | |
| | | .station .corner-br { |
| | | bottom: -2px; |
| | | right: -2px; |
| | | transform: rotate(180deg); |
| | | } |
| | | |
| | | .station:hover { |
| | | transform: scale(1.6); |
| | | z-index: 999; |
| | | box-shadow: 0 0 15px rgba(171, 24, 57, 0.8); |
| | | } |
| New file |
| | |
| | | var busPsto = [ |
| | | { |
| | | index: 1, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 775 |
| | | }, |
| | | // 121, 132, 143, 154 |
| | | { |
| | | index: 2, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 800 |
| | | }, |
| | | { |
| | | index: 3, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1210, |
| | | valueY: 820 |
| | | }, |
| | | { |
| | | index: 3, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 220, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 4, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1200, |
| | | valueY: 840 |
| | | }, |
| | | { |
| | | index: 5, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1190, |
| | | valueY: 855 |
| | | }, |
| | | { |
| | | index: 6, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1155, |
| | | valueY: 875 |
| | | }, |
| | | { |
| | | index: 7, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1145, |
| | | valueY: 877 |
| | | }, |
| | | { |
| | | index: 8, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1135, |
| | | valueY: 878 |
| | | }, |
| | | { |
| | | index: 9, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1125, |
| | | valueY: 880 |
| | | }, |
| | | { |
| | | index: 10, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 11, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 660, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 12, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 715, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 13, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 770, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 14, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 825, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 15, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 880, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 16, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 935, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 17, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 990, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 18, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 620 |
| | | }, |
| | | { |
| | | index: 19, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 520 |
| | | }, |
| | | { |
| | | index: 20, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 430 |
| | | }, |
| | | { |
| | | index: 21, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 340 |
| | | }, |
| | | { |
| | | index: 22, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 250 |
| | | }, |
| | | { |
| | | index: 23, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 150 |
| | | }, |
| | | { |
| | | index: 24, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 200 |
| | | }, |
| | | { |
| | | index: 25, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 250 |
| | | }, |
| | | { |
| | | index: 26, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 300 |
| | | }, |
| | | { |
| | | index: 27, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 350 |
| | | }, |
| | | { |
| | | index: 28, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 400 |
| | | }, |
| | | { |
| | | index: 29, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 450 |
| | | }, |
| | | { |
| | | index: 30, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 500 |
| | | }, |
| | | { |
| | | index: 31, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 550 |
| | | }, |
| | | { |
| | | index: 32, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 600 |
| | | }, |
| | | { |
| | | index: 33, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 650 |
| | | }, |
| | | ] |
| | | |
| | | // 空白区域 |
| | | var busPsto1 = [ |
| | | |
| | | { |
| | | index: 1, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 65, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 2, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 3, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1185, |
| | | valueY: 850 |
| | | }, |
| | | { |
| | | index: 4, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 775 |
| | | }, |
| | | { |
| | | index: 5, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 125 |
| | | }, |
| | | { |
| | | index: 6, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1164, |
| | | valueY: 80 |
| | | }, |
| | | { |
| | | index: 7, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 125 |
| | | }, |
| | | { |
| | | index: 8, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 720 |
| | | }, |
| | | { |
| | | index: 9, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 720 |
| | | }, |
| | | { |
| | | index: 10, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1100, |
| | | valueY: 750 |
| | | }, |
| | | { |
| | | index: 11, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1075, |
| | | valueY: 775 |
| | | }, |
| | | { |
| | | index: 12, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 65, |
| | | valueY: 775 |
| | | }, |
| | | { |
| | | index: 13, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 25, |
| | | valueY: 830 |
| | | }, |
| | | |
| | | ] |
| | | |
| | | var busPsto3 = [ |
| | | { |
| | | index: 1, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 83, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 2, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 138, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 3, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 193, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 4, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 248, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 5, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 303, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 6, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 358, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 7, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 413, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 8, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 468, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 9, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 523, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 10, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 578, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 11, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 633, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 12, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 688, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 13, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 743, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 14, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 798, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 15, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 853, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 16, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 908, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 17, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 963, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 18, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1018, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 19, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1073, |
| | | valueY: 882 |
| | | }, |
| | | { |
| | | index: 20, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 565 |
| | | }, |
| | | { |
| | | index: 21, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 475 |
| | | }, |
| | | { |
| | | index: 22, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 385 |
| | | }, |
| | | { |
| | | index: 23, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 295 |
| | | }, |
| | | { |
| | | index: 24, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1215, |
| | | valueY: 205 |
| | | }, |
| | | { |
| | | index: 25, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 175 |
| | | }, |
| | | { |
| | | index: 26, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 225 |
| | | }, |
| | | { |
| | | index: 27, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 275 |
| | | }, |
| | | { |
| | | index: 28, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 325 |
| | | }, |
| | | { |
| | | index: 29, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 375 |
| | | }, |
| | | { |
| | | index: 30, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 425 |
| | | }, |
| | | { |
| | | index: 31, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 475 |
| | | }, |
| | | { |
| | | index: 32, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 525 |
| | | }, |
| | | { |
| | | index: 33, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 575 |
| | | }, |
| | | { |
| | | index: 34, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 625 |
| | | }, |
| | | { |
| | | index: 35, |
| | | modeColor: "#4B5CC4", |
| | | statusColor: "#1F3696", |
| | | valueX: 1115, |
| | | valueY: 675 |
| | | }, |
| | | ] |
| | |
| | | <html lang="en"> |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <title>环形穿梭车智能系统</title> |
| | | <title>智能系统</title> |
| | | <link rel="icon" href="../../static/images/favicon.ico" type="image/x-icon"> |
| | | |
| | | <link rel="stylesheet" href="../../static/wcs/css/element.css"> |
| | | <link rel="stylesheet" href="../../static/wcs/css/indexHCDD.css"> |
| | | <link rel="stylesheet" href="../../static/wcs/css/element-ui.css"> |
| | | <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script> |
| | | <script type="text/javascript" src="../../static/js/common.js"></script> |
| | | <script type="text/javascript" src="../../static/wcs/js/vue.min.js"></script> |
| | | <script type="text/javascript" src="../../static/wcs/js/element.js"></script> |
| | | <script type="text/javascript" src="../../static/wcs/js/testPosition.js"></script> |
| | | <style> |
| | | body { |
| | | font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; |
| | | margin: 0; |
| | | padding: 0; |
| | | background-color: #a0d2eb; |
| | | color: #ffffff; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | height: 100vh; |
| | | } |
| | | header { |
| | | background-color: #2196F3; |
| | | color: white; |
| | | padding: 15px 20px; |
| | | text-align: center; |
| | | font-size: 24px; |
| | | letter-spacing: 1px; |
| | | box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); |
| | | } |
| | | .map { |
| | | position: relative; |
| | | width: 52vw; |
| | | height: 80vh; |
| | | border-radius: 50%; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | } |
| | | .inner-ring, .outer-ring { |
| | | position: absolute; |
| | | border-radius: 50%; |
| | | } |
| | | .inner-ring { |
| | | width: 72vh; |
| | | height: 72vh; |
| | | border: 4px solid #00E676; |
| | | box-shadow: inset 0 0 30px rgba(0, 230, 118, 0.5), 0 0 20px rgba(0, 230, 118, 0.5); |
| | | } |
| | | .outer-ring { |
| | | width: 80vh; |
| | | height: 80vh; |
| | | border: 4px solid #00E676; |
| | | box-shadow: inset 0 0 30px rgba(0, 230, 118, 0.5), 0 0 20px rgba(0, 230, 118, 0.5); |
| | | } |
| | | .station { |
| | | position: absolute; |
| | | width: 20px; |
| | | height: 14px; |
| | | text-align: center; |
| | | line-height: 1.5; /* 调整行高与字体大小的比值 */ |
| | | font-size: 10px; /* 设置更小的字体 */ |
| | | font-weight: bold; |
| | | transition: transform 0.3s ease; |
| | | background-color: #ab1839; |
| | | transform: scale(1); /* 可选:如果不需要放大效果 */ |
| | | } |
| | | .bus { |
| | | font-size: 10px; |
| | | background-color: #2196F3; |
| | | border: 10px solid #ffffff; |
| | | position: absolute; |
| | | width: 15px; |
| | | height: 15px; |
| | | border-radius: 50%; |
| | | text-align: center; |
| | | line-height: 15px; |
| | | font-weight: bold; |
| | | transition: transform 0.3s ease; |
| | | } |
| | | .station:hover, .bus:hover { |
| | | transform: scale(1.4); |
| | | z-index: 999; |
| | | |
| | | .site-logo { |
| | | position: absolute; /* 使用绝对定位,将Logo脱离正常文档流 */ |
| | | top: 10px; /* 距离顶部10像素,可根据需要调整 */ |
| | | left: 10px; /* 距离左侧10像素,可根据需要调整 */ |
| | | padding: 0; /* 移除原有的内边距 */ |
| | | text-align: left; /* 将图片对齐方式改为左对齐 */ |
| | | z-index: 1000; /* 确保Logo显示在最上层,避免被其他元素遮挡 */ |
| | | } |
| | | |
| | | .task-bar-left { |
| | | position: fixed; |
| | | top: 1%; |
| | | /*transform: translateY(-50%);*/ |
| | | width: 25%; /* 设置宽度 */ |
| | | background-color: rgba(255, 255, 255, 0); /* 半透明背景 */ |
| | | |
| | | border-radius: 5px; |
| | | padding: 10px; |
| | | box-shadow: 0 0 10px rgba(0, 0, 0, 0); |
| | | z-index: 1000; /* 确保在其他元素之上 */ |
| | | } |
| | | |
| | | .task-bar-left1 { |
| | | position: fixed; |
| | | top: 8%; |
| | | /*transform: translateY(-50%);*/ |
| | | width: 25%; /* 设置宽度 */ |
| | | background-color: rgba(255, 255, 255, 0); /* 半透明背景 */ |
| | | |
| | | border-radius: 5px; |
| | | padding: 10px; |
| | | box-shadow: 0 0 10px rgba(0, 0, 0, 0); |
| | | z-index: 1000; /* 确保在其他元素之上 */ |
| | | } |
| | | |
| | | .task-bar-right { |
| | | position: fixed; |
| | | top: 1%; |
| | | /*transform: translateY(-50%);*/ |
| | | width: 25%; /* 设置宽度 */ |
| | | background-color: rgba(255, 255, 255, 0); /* 半透明背景 */ |
| | | |
| | | border-radius: 5px; |
| | | padding: 10px; |
| | | box-shadow: 0 0 10px rgba(0, 0, 0, 0); |
| | | z-index: 1000; /* 确保在其他元素之上 */ |
| | | } |
| | | |
| | | .task-bar-right1 { |
| | | position: fixed; |
| | | top: 5%; |
| | | /*transform: translateY(-50%);*/ |
| | | width: 25%; /* 设置宽度 */ |
| | | background-color: rgba(255, 255, 255, 0); /* 半透明背景 */ |
| | | |
| | | border-radius: 5px; |
| | | padding: 10px; |
| | | box-shadow: 0 0 10px rgba(0, 0, 0, 0); |
| | | z-index: 1000; /* 确保在其他元素之上 */ |
| | | } |
| | | |
| | | .task-bar-div1 { |
| | | /*width: 100%; !* 设置宽度 *!*/ |
| | | background-color: rgba(255, 255, 255, 0.8); /* 半透明背景 */ |
| | | box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); |
| | | } |
| | | |
| | | .left-task-bar { |
| | | left: 20px; /* 距离左边的距离 */ |
| | | /*bottom: 100px;*/ |
| | | } |
| | | |
| | | .right-task-bar { |
| | | /*bottom: 100px;*/ |
| | | right: 20px; /* 距离右边的距离 */ |
| | | } |
| | | |
| | | .el-table .warning-row { |
| | | background: oldlace; |
| | | } |
| | | |
| | | .el-table .success-row { |
| | | background: #f0f9eb; |
| | | } |
| | | .container { |
| | | width: 100vh; |
| | | height: 72vh; |
| | | position: absolute; |
| | | /*background: #8c939d;*/ |
| | | } |
| | | .bus-station { |
| | | width: 100vh; |
| | | height: 72vh; |
| | | position: absolute; |
| | | display: flex; |
| | | /*background: #8c939d;*/ |
| | | } |
| | | .bus-item-top { |
| | | background: red; |
| | | position: relative; |
| | | width: 40px; |
| | | height: 60px; |
| | | line-height: 60px; |
| | | top: 880px; |
| | | text-align: center; |
| | | } |
| | | .bus-item-left { |
| | | background: red; |
| | | position: relative; |
| | | width: 60px; |
| | | height: 40px; |
| | | line-height: 40px; |
| | | left: 1230px; |
| | | text-align: center; |
| | | } |
| | | .bus-item-left2 { |
| | | background: red; |
| | | position: relative; |
| | | width: 60px; |
| | | height: 40px; |
| | | line-height: 40px; |
| | | left: 1000px; |
| | | text-align: center; |
| | | .site-logo img { |
| | | max-width: 80%; /* Logo最大宽度为容器宽度的80% */ |
| | | height: auto; /* 高度自动,保持比例 */ |
| | | max-height: 60px; /* 设置Logo最大高度 */ |
| | | } |
| | | </style> |
| | | </head> |
| | | <body> |
| | | <!--<header>--> |
| | | <!-- 环形穿梭车智能系统--> |
| | | <!--</header>--> |
| | | <body > |
| | | <div class="tech-background"> |
| | | <div class="grid-overlay"></div> |
| | | <div class="glow-effect"></div> |
| | | <div class="particles-container" id="particles-container"></div> |
| | | </div> |
| | | <div id="app"> |
| | | <!-- 添加Logo --> |
| | | <div class="site-logo"> |
| | | <img src="../../static/images/zy_logo_dark_color.png" alt="自动仓库WCS系统 Logo"> |
| | | </div> |
| | | <div class="map"> |
| | | <div v-if="licenseDayI <=30 "> |
| | | <div style="color: red">{{licenseDay}}</div> |
| | | <div class="system-control-panel"> |
| | | <div class="system-status"> |
| | | <div class="status-indicator" :class="valueSystem ? 'status-running' : 'status-stopped'"></div> |
| | | <span class="status-text">{{ valueSystem ? '系统运行中' : '系统已停止' }}</span> |
| | | </div> |
| | | <div class="custom-switch"> |
| | | <el-switch |
| | | v-model="valueSystem" |
| | | active-color="#13ce66" |
| | | inactive-color="#A64036" |
| | | @change='upDateValueSystem'> |
| | | </el-switch> |
| | | </div> |
| | | </div> |
| | | <svg class="container"> |
| | | <path d="M 1200,750 |
| | | L 1200,100 |
| | | C 1200,100 1200,50 1150,50 |
| | | C 1150,50 1100,50 1100,100 |
| | | L 1100,700 |
| | | C 1100,700 1100,750 1050,750 |
| | | L 60,750 |
| | | C 60,750 10,750 10,800 |
| | | C 10,800 10,850 60,850 |
| | | L 1100,850 |
| | | C 1100,850 1200,850 1200,750 |
| | | " |
| | | style="fill:none; stroke:blue; stroke-width:4;" /> |
| | | |
| | | <div class="license-info" :class="getLicenseClass()" v-if="licenseDayI <=30"> |
| | | <span class="license-icon">📄</span> |
| | | {{ licenseDay }} |
| | | </div> |
| | | <!-- <div class="inner-ring"></div>--> |
| | | <!-- <div class="outer-ring"></div>--> |
| | | <!-- <div v-for="track in energyGatheringRing" class="inner-ring" :style="{ borderColor: track.trackColor , boxShadow : 'inset 0 0 30px '+track.radiationColor+', 0 0 20px '+track.radiationColor}"></div>--> |
| | | <!-- <div v-for="track in energyGatheringRing" class="outer-ring" :style="{ borderColor: track.trackColor , boxShadow : 'inset 0 0 30px '+track.radiationColor+', 0 0 20px '+track.radiationColor}"></div>--> |
| | | <svg class="container" |
| | | viewBox="0 0 1200 850" |
| | | preserveAspectRatio="xMidYMid meet"> |
| | | <path d="M 100,225 L 1100,225" |
| | | style="fill:none; stroke:blue; stroke-width:3; stroke-dasharray:10,1;"/> |
| | | <path d="M 100,625 L 1100,625" |
| | | style="fill:none; stroke:blue; stroke-width:3; stroke-dasharray:10,1;"/> |
| | | </svg> |
| | | <div v-for="station in tableDataDev" class="station" :style="{ top: station.valueY + 'px', left: station.valueX + 'px' }">{{ station.index }}</div> |
| | | <div> |
| | | <el-switch |
| | | style="display: block" |
| | | v-model="valueSystem" |
| | | active-color="#13ce66" |
| | | inactive-color="#A64036" |
| | | active-text="系统运行中..." |
| | | inactive-text="系统已停止!" |
| | | @change='upDateValueSystem'> |
| | | </el-switch> |
| | | |
| | | <div v-for="station in tableDataDev" class="station" :style="{ |
| | | top: convertToCSSPosition2(station.index,station.valueX, station.valueY).y + 'px', |
| | | left: convertToCSSPosition2(station.index,station.valueX, station.valueY).x + 'px', |
| | | backgroundColor: station.modeColor}"> |
| | | <div class="corner corner-tl"></div> |
| | | <div class="corner corner-tr"></div> |
| | | <div class="corner corner-bl"></div> |
| | | <div class="corner corner-br"></div> |
| | | {{ station.index }} |
| | | </div> |
| | | <div v-for="bus in tableDataRgv" class="bus" :style="{ top: bus.valueY + 'px', left: bus.valueX + 'px' , borderColor: bus.modeColor, backgroundColor: bus.statusColor}">{{ bus.index }}</div> |
| | | |
| | | <!-- Buses --> |
| | | <div v-for="bus in tableDataRgv" class="bus" :style="{ |
| | | top: convertToCSSPositionWithOffset(bus.valueX, bus.valueY).y + 'px', |
| | | left: convertToCSSPositionWithOffset(bus.valueX, bus.valueY).x + 'px', |
| | | animation: 'pulse ' + bus.animation + 's infinite', |
| | | borderColor: bus.modeColor, backgroundColor: bus.statusColor}">{{ bus.index }} |
| | | </div> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | <script> |
| | | // 在Vue实例外添加粒子生成函数 |
| | | function createParticles() { |
| | | const container = document.getElementById('particles-container'); |
| | | const particleCount = 30; |
| | | |
| | | for (let i = 0; i < particleCount; i++) { |
| | | const particle = document.createElement('div'); |
| | | particle.classList.add('particle'); |
| | | |
| | | // 随机大小和位置 |
| | | const size = Math.random() * 3 + 1; |
| | | const posX = Math.random() * 100; |
| | | const posY = Math.random() * 100; |
| | | const delay = Math.random() * 15; |
| | | |
| | | particle.style.width = `${size}px`; |
| | | particle.style.height = `${size}px`; |
| | | particle.style.left = `${posX}vw`; |
| | | particle.style.top = `${posY}vh`; |
| | | particle.style.animationDelay = `${delay}s`; |
| | | |
| | | container.appendChild(particle); |
| | | } |
| | | } |
| | | |
| | | // 页面加载完成后创建粒子 |
| | | document.addEventListener('DOMContentLoaded', createParticles); |
| | | // 在Vue实例外获取body尺寸 |
| | | function getBodySize() { |
| | | return { |
| | | width: document.body.clientWidth, |
| | | height: document.body.clientHeight |
| | | }; |
| | | } |
| | | var app = new Vue({ |
| | | el: '#app', |
| | | data: { |
| | | containerSize: { width: 0, height: 0}, |
| | | bodySize: { width: 0, height: 0 }, |
| | | activeNames: ['1'], |
| | | valueLeft: '0', |
| | | valueLeft1: '0', |
| | |
| | | tableDataLeft: [], |
| | | tableDataLeft1: [], |
| | | tableDataRight: [], |
| | | tableDataRight1: [], |
| | | devpPos1:[ |
| | | {dev_no: 116,pos:633980}, |
| | | {dev_no: 117,pos:604043}, |
| | | {dev_no: 118,pos:574323}, |
| | | {dev_no: 119,pos:559534}, |
| | | {dev_no: 120,pos:544682}, |
| | | {dev_no: 121,pos:514912}, |
| | | {dev_no: 122,pos:485227}, |
| | | {dev_no: 123,pos:470367}, |
| | | {dev_no: 124,pos:455514}, |
| | | {dev_no: 125,pos:425768}, |
| | | {dev_no: 126,pos:396268}, |
| | | {dev_no: 127,pos:381106}, |
| | | {dev_no: 128,pos:366311}, |
| | | {dev_no: 129,pos:336638}, |
| | | {dev_no: 130,pos:306820}, |
| | | {dev_no: 131,pos:277067}, |
| | | {dev_no: 132,pos:257418}, |
| | | {dev_no: 133,pos:217730}, |
| | | ], |
| | | devpPos2:[ |
| | | {dev_no: 112,pos:891000}, |
| | | {dev_no: 113,pos:865000}, |
| | | {dev_no: 114,pos:800000}, |
| | | {dev_no: 115,pos:780000}, |
| | | ], |
| | | devpPos3:[ |
| | | {dev_no: 101,pos:1269958}, |
| | | {dev_no: 102,pos:1243454}, |
| | | {dev_no: 103,pos:1229081}, |
| | | {dev_no: 104,pos:1202099}, |
| | | {dev_no: 105,pos:1187564}, |
| | | {dev_no: 106,pos:1160630}, |
| | | {dev_no: 107,pos:1146152}, |
| | | {dev_no: 108,pos:1119463}, |
| | | {dev_no: 109,pos:1105038}, |
| | | {dev_no: 110,pos:1077961}, |
| | | {dev_no: 111,pos:1063813}, |
| | | ], |
| | | tableDataRight1: [] |
| | | }, |
| | | created(){ |
| | | this.init(); |
| | | this.devpPos1.reverse() |
| | | this.devpPos3.reverse() |
| | | }, |
| | | watch: { |
| | | |
| | | }, |
| | | |
| | | // 在 mounted 中初始化尺寸和监听 |
| | | mounted() { |
| | | this.updateContainerSize(); |
| | | this.updateBodySize(); |
| | | window.addEventListener('resize', this.handleResize); |
| | | }, |
| | | beforeDestroy() { |
| | | window.removeEventListener('resize', this.handleResize); |
| | | }, |
| | | computed: { |
| | | mappedStations() { |
| | | return this.tableDataDev.map(station => ({ |
| | | ...station, |
| | | position: this.convertToCSSPosition2(station.index,station.valueX, station.valueY) |
| | | })); |
| | | } |
| | | }, |
| | | methods: { |
| | | init(){ |
| | |
| | | this.getValueSystem() |
| | | this.getLicenseDays() |
| | | |
| | | // 高频更新:小车和设备位置(1.5秒) |
| | | setInterval(() => { |
| | | this.getTableDataRgv() |
| | | this.getTableDataDev() |
| | | this.getTableDataTrack() |
| | | }, 1000) |
| | | |
| | | // 高频更新:实时任务列表等(2秒) |
| | | setInterval(() => { |
| | | this.getTableDataLeft() |
| | | this.getTableDataLeft1() |
| | | this.getTableDataRight() |
| | | }, 2000) |
| | | |
| | | // 高频更新:实时站点信息等(3秒) |
| | | setInterval(() => { |
| | | this.getTableDataDev() |
| | | }, 3000) |
| | | |
| | | // 低频更新:任务列表等(10秒) |
| | | setInterval(() => { |
| | | this.getTableDataLeft1() |
| | | this.getTableDataRight1() |
| | | this.getValueSystem() |
| | | this.getLicenseDays() |
| | | }, 10*1000) |
| | | |
| | | }, 1000) |
| | | // 低频更新:许可证信息(30秒) |
| | | setInterval(() => { |
| | | this.getLicenseDays() |
| | | }, 30000) |
| | | |
| | | // 静态低频更新:PLC(1小时) |
| | | setInterval(() => { |
| | | this.getTableDataTrack() |
| | | }, 60*60*1000) |
| | | }, |
| | | // 获取容器实际尺寸 |
| | | updateContainerSize() { |
| | | const mapEl = this.$el.querySelector('.map'); |
| | | this.containerSize = { |
| | | width: mapEl.clientWidth, |
| | | height: mapEl.clientHeight |
| | | }; |
| | | }, |
| | | convertToCSSPositionWithOffset(svgX, svgY, radius) { |
| | | const basePos = this.convertToCSSPosition(svgX, svgY); |
| | | return { |
| | | x: basePos.x-16.5, |
| | | y: basePos.y-16.5 |
| | | }; |
| | | }, |
| | | // 更新body尺寸 |
| | | updateBodySize() { |
| | | this.bodySize = getBodySize(); |
| | | }, |
| | | |
| | | // 坐标转换函数 |
| | | convertToCSSPosition(svgX, svgY) { |
| | | const svgWidth = 1200; // SVG 原始宽度 |
| | | let svgWidthR = 0; // |
| | | const svgHeight = 850; // SVG 原始高度 |
| | | let svgHeightR = 0; // |
| | | if (svgX>svgWidth/2){ |
| | | svgWidthR = (((svgX-svgWidth/2)/svgWidth) * this.containerSize.width) + this.bodySize.width/2 - this.bodySize.width*((1-0.52)/2); |
| | | } else { |
| | | svgWidthR = this.bodySize.width/2 - (((svgWidth/2 - svgX)/svgWidth) * this.containerSize.width) - this.bodySize.width*((1-0.52)/2); |
| | | } |
| | | if (svgY>svgHeight/2){ |
| | | svgHeightR = (((svgY-svgHeight/2)/svgHeight) * this.containerSize.height) + this.bodySize.height/2 - this.bodySize.height*((1-0.72)/2); |
| | | } else { |
| | | svgHeightR = this.bodySize.height/2 - (((svgHeight/2 - svgY)/svgHeight) * this.containerSize.height) - this.bodySize.height*((1-0.72)/2); |
| | | } |
| | | return { |
| | | x: svgWidthR, |
| | | y: svgHeightR |
| | | }; |
| | | }, |
| | | |
| | | // 坐标转换函数 |
| | | convertToCSSPosition2(devNo,svgX, svgY) { |
| | | const svgWidth = 1200; // SVG 原始宽度 |
| | | let svgWidthR = 0; // |
| | | const svgHeight = 850; // SVG 原始高度 |
| | | let svgHeightR = 0; // |
| | | if (svgX>svgWidth/2){ |
| | | svgWidthR = (((svgX-svgWidth/2)/svgWidth) * this.containerSize.width) + this.bodySize.width/2 - this.bodySize.width*((1-0.52)/2); |
| | | } else { |
| | | svgWidthR = this.bodySize.width/2 - (((svgWidth/2 - svgX)/svgWidth) * this.containerSize.width) - this.bodySize.width*((1-0.52)/2); |
| | | } |
| | | if (svgY>svgHeight/2){ |
| | | svgHeightR = (((svgY-svgHeight/2)/svgHeight) * this.containerSize.height) + this.bodySize.height/2 - this.bodySize.height*((1-0.72)/2); |
| | | } else { |
| | | svgHeightR = this.bodySize.height/2 - (((svgHeight/2 - svgY)/svgHeight) * this.containerSize.height) - this.bodySize.height*((1-0.72)/2); |
| | | } |
| | | svgHeightR = svgHeightR-60; |
| | | if(devNo>200){ |
| | | if (devNo>216){ |
| | | svgHeightR = svgHeightR+80; |
| | | } |
| | | } else { |
| | | if (devNo>116){ |
| | | svgHeightR = svgHeightR+80; |
| | | } else { |
| | | if(devNo === 114 || devNo === 112 ){ |
| | | svgWidthR = svgWidthR-20; |
| | | } else { |
| | | svgWidthR = svgWidthR+40; |
| | | } |
| | | |
| | | } |
| | | } |
| | | if(devNo === 116){ |
| | | svgHeightR = svgHeightR-35; |
| | | } |
| | | return { |
| | | x: svgWidthR, |
| | | y: svgHeightR |
| | | }; |
| | | }, |
| | | |
| | | handleZoom(e) { |
| | | const scaleDelta = e.deltaY > 0 ? 0.9 : 1.1; |
| | | const currentScale = this.scale || 1; |
| | | const newScale = Math.max(0.5, Math.min(2, currentScale * scaleDelta)); |
| | | |
| | | // 应用缩放 |
| | | const svgEl = this.$el.querySelector('.container'); |
| | | svgEl.style.transform = `scale(${newScale})`; |
| | | this.scale = newScale; |
| | | }, |
| | | verifyPassword(callback) { |
| | | this.$prompt('请输入管理员密码: root', '验证', { |
| | | confirmButtonText: '确定', |
| | |
| | | }); |
| | | }, |
| | | handleChange(val) { |
| | | console.log(val); |
| | | if (val.length === 0){ |
| | | valueRight = '0'; |
| | | } else { |
| | | console.log("2222"+val); |
| | | |
| | | if (val.length >= 1){ |
| | | this.handleChangeValueRight(1) |
| | |
| | | } |
| | | }, |
| | | handleChange1(val) { |
| | | console.log(val); |
| | | if (val.length === 0){ |
| | | valueRight1 = '0'; |
| | | } else { |
| | | console.log("2222"+val); |
| | | |
| | | if (val.length >= 1){ |
| | | this.handleChangeValueRight1(1) |
| | | } |
| | |
| | | }, |
| | | taskDelete(row) { |
| | | let that = this; |
| | | that.$confirm('确认要删除该任务吗?', '提示', { |
| | | that.$confirm('确认要删除该设备吗?', '提示', { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning' |
| | |
| | | }); |
| | | }, |
| | | handleChangeValueRight(val) { |
| | | console.log("33333"+val); |
| | | |
| | | switch (val){ |
| | | case 1: |
| | | valueRight = '100'; |
| | |
| | | } |
| | | }, |
| | | handleChangeValueRight1(val) { |
| | | console.log("33333"+val); |
| | | |
| | | switch (val){ |
| | | case 1: |
| | | valueRight1 = '100'; |
| | |
| | | return 'success-row'; |
| | | } |
| | | return ''; |
| | | }, |
| | | |
| | | // 获取许可证样式类 |
| | | getLicenseClass() { |
| | | if (this.licenseDayI > 30) { |
| | | return 'normal'; |
| | | } else if (this.licenseDayI > 0) { |
| | | return 'warning'; |
| | | } else { |
| | | return 'expired'; |
| | | } |
| | | }, |
| | | getLicenseDays(){ |
| | | let that = this; |
| | |
| | | method: 'POST', |
| | | success: function (res) { |
| | | if (res.code === 200) { |
| | | that.valueSystem = res.data.status; |
| | | that.$message.success(`状态更新成功`); |
| | | } else { |
| | | that.$message.error('状态更新失败'); |
| | | } |
| | | } |
| | | }); |
| | |
| | | }, |
| | | getTableDataRgv() { |
| | | let that = this; |
| | | // that.tableDataRgv = busPsto |
| | | // return |
| | | $.ajax({ |
| | | url: baseUrl + "/rgv/ring/through/rgv/position/data", |
| | | headers: { |
| | |
| | | that.energyGatheringRing = res.data |
| | | } |
| | | }); |
| | | } |
| | | }, |
| | | // 处理窗口大小变化 |
| | | handleResize: _.debounce(function() { |
| | | this.updateContainerSize(); |
| | | this.updateBodySize(); |
| | | }, 100) |
| | | } |
| | | }) |
| | | |
| | |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <title>自动仓库WCS系统</title> |
| | | <link rel="icon" href="../static/images/favicon.ico" type="image/x-icon"> |
| | | <link rel="stylesheet" href="../static/css/index.css"> |
| | | <link rel="stylesheet" href="../static/css/layx.min.css" type="text/css" /> |
| | | <script src="../static/js/jquery/jquery-3.3.1.min.js"></script> |
| New file |
| | |
| | | <!DOCTYPE html> |
| | | <html> |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <title>自动仓库WCS系统</title> |
| | | <link rel="icon" href="../static/images/favicon.ico" type="image/x-icon"> |
| | | <link rel="stylesheet" href="../static/css/index.css"> |
| | | <link rel="stylesheet" href="../static/css/layx.min.css" type="text/css" /> |
| | | <script src="../static/js/jquery/jquery-3.3.1.min.js"></script> |
| | | <script src="../static/js/tools/layx.min.js"></script> |
| | | <style> |
| | | .layx-window.layx-skin-news .layx-control-bar { |
| | | background-color: #333333; |
| | | } |
| | | html{ |
| | | /*transform: scale(1) translate(0,0);*/ |
| | | transform: scale(0.5) translate(-50%,-50%); |
| | | height: 190%; |
| | | width: 190%; |
| | | } |
| | | .site-logo { |
| | | text-align: center; /* 让Logo水平居中 */ |
| | | padding: 15px 0; /* 在Logo上下添加内边距 */ |
| | | border-bottom: 1px solid #eee; /* 可选:添加一条分隔线 */ |
| | | } |
| | | |
| | | .site-logo img { |
| | | max-width: 80%; /* Logo最大宽度为容器宽度的80% */ |
| | | height: auto; /* 高度自动,保持比例 */ |
| | | max-height: 60px; /* 设置Logo最大高度 */ |
| | | } |
| | | </style> |
| | | </head> |
| | | <body> |
| | | <!-- 添加Logo --> |
| | | <div class="site-logo"> |
| | | <img src="../static/images/zy_logo_dark_color.png" alt="自动仓库WCS系统 Logo"> |
| | | </div> |
| | | <!-- 导航栏 --> |
| | | <!-- <div class="nav">--> |
| | | <!-- <li class="right">注销<a id="about" class="nav-unselect" onclick="logout()" href="#"></a></li>--> |
| | | <!-- </div>--> |
| | | <div class="sidebar"> |
| | | <div class="nav"> |
| | | <ul class="cl-effect-4"> |
| | | <li><a id="console" onclick="nav(this.id)" class="nav-select" href="#">主控图</a></li> |
| | | <li><a id="pipeline" onclick="nav(this.id)" class="nav-unselect" href="#">输送设备</a></li> |
| | | <li><a id="crn" onclick="nav(this.id)" class="nav-unselect" href="#">堆垛机</a></li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | <!--<div style="z-index: 999; position: absolute; top: 250px; left: 900px; width: 200px; height: 200px; opacity: 0.5;background-color: #0000FF">--> |
| | | |
| | | <!--</div>--> |
| | | <!-- 主体内容 --> |
| | | <iframe id="content" src="console.html"></iframe> |
| | | <!--<footer class="footer">--> |
| | | <!-- Copyright © 2023 All Rights Reserved. <a href="http://www.zoneyung.com" target="_blank">浙江中扬立库技术有限公司</a> 保留所有权利--> |
| | | <!--</footer>--> |
| | | </body> |
| | | <script> |
| | | // 导航栏 |
| | | function nav(id) { |
| | | $('.nav-select').attr("class", "nav-unselect"); |
| | | $('#'+id).attr("class", "nav-select"); |
| | | $('#content').attr("src", id+".html"); |
| | | } |
| | | |
| | | // function logout() { |
| | | // localStorage.removeItem("token"); |
| | | // window.location.href = baseUrl + "/login"; |
| | | // } |
| | | |
| | | // 系统运行状态 |
| | | var systemRunning = true; |
| | | </script> |
| | | </html> |
| | |
| | | height: 190%; |
| | | width: 190%; |
| | | } |
| | | |
| | | </style> |
| | | </head> |
| | | <body> |
| | | |
| | | <!-- 导航栏 --> |
| | | <!-- <div class="nav">--> |
| | | <!-- <li class="right">注销<a id="about" class="nav-unselect" onclick="logout()" href="#"></a></li>--> |
| | |
| | | $('#content').attr("src", id+".html"); |
| | | } |
| | | |
| | | function logout() { |
| | | localStorage.removeItem("token"); |
| | | window.location.href = baseUrl + "/login"; |
| | | } |
| | | // function logout() { |
| | | // localStorage.removeItem("token"); |
| | | // window.location.href = baseUrl + "/login"; |
| | | // } |
| | | |
| | | // 系统运行状态 |
| | | var systemRunning = true; |