a38d955f816eb64f297cd587b507defd5839892e..9fd5e6fbcb1d8badf1835478d862ac40bfb60f3c
11 小时以前 zzgtfwq
#
9fd5e6 对比 | 目录
15 小时以前 zzgtfwq
#
de480b 对比 | 目录
15 小时以前 zzgtfwq
#
da3c86 对比 | 目录
18 小时以前 zzgtfwq
#
146d0b 对比 | 目录
19 小时以前 zzgtfwq
#
d91d1f 对比 | 目录
4个文件已添加
17个文件已修改
2395 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/RgvController.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMast.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasDevpOptMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasDevpOptService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasDevpOptServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 248 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/StartupDto.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/LedThread.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 156 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 173 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasDevpOptMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/images/zy_logo_dark_color.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wcs/css/indexHCDD.css 467 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wcs/js/testPosition.js 586 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/deviceOperate/wcsOperate.html 551 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/index.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/indexT.html 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/indexTV.html 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/RgvController.java
@@ -391,7 +391,11 @@
//            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]);
@@ -445,7 +449,11 @@
//            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);
src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -495,11 +495,11 @@
        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;
    }
src/main/java/com/zy/asrs/mapper/BasDevpOptMapper.java
@@ -8,5 +8,6 @@
@Mapper
@Repository
public interface BasDevpOptMapper extends BaseMapper<BasDevpOpt> {
    String getErr(Integer wrkNo);
}
src/main/java/com/zy/asrs/service/BasDevpOptService.java
@@ -4,5 +4,6 @@
import com.baomidou.mybatisplus.service.IService;
public interface BasDevpOptService extends IService<BasDevpOpt> {
    String getErr(Integer wrkNo);
}
src/main/java/com/zy/asrs/service/impl/BasDevpOptServiceImpl.java
@@ -8,5 +8,9 @@
@Service("basDevpOptService")
public class BasDevpOptServiceImpl extends ServiceImpl<BasDevpOptMapper, BasDevpOpt> implements BasDevpOptService {
    @Override
    public String getErr(Integer wrkNo){
        return baseMapper.getErr(wrkNo);
    }
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -14,19 +14,24 @@
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;
@@ -40,6 +45,7 @@
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
 * 立体仓库WCS系统主流程业务
@@ -60,6 +66,8 @@
    private WrkMastMapper wrkMastMapper;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private BasDevpOptService basDevpOptService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
@@ -129,16 +137,6 @@
                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());
@@ -148,6 +146,17 @@
                    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;
                }
                // 尺寸检测异常
@@ -183,6 +192,15 @@
                }
                // 退回
                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;
@@ -266,7 +284,9 @@
//                            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);
@@ -276,6 +296,14 @@
                                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);
@@ -722,7 +750,7 @@
            }
            // 双深库位且浅库位有货,则需先对浅库位进行库位移转
            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.禁用 直接搬!
@@ -869,7 +897,7 @@
                }
                // 双深库位且浅库位有货,则需先对浅库位进行库位移转
                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.禁用 直接搬!
@@ -879,10 +907,10 @@
                            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) {
@@ -1138,6 +1166,192 @@
        }
    }
    /**
     * 出库  ===>> 工作档信息写入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分钟无任务则回到源点
     */
@@ -1169,7 +1383,7 @@
                        if (!WrkMastLogList.isEmpty()) {
                            boolean signT = false;
                            for (WrkMast wrkMast : WrkMastLogList){
                                Date completeTime = wrkMast.getIoTime();
                                Date completeTime = wrkMast.getModiTime();
                                if (completeTime==null){
                                    continue;
                                }
src/main/java/com/zy/asrs/utils/Utils.java
@@ -87,8 +87,14 @@
     */
    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);
    }
@@ -105,15 +111,23 @@
     */
    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);
    }
@@ -121,14 +135,23 @@
     * 获取 浅库位排对应的深库位排
     */
    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;
    }
@@ -217,18 +240,19 @@
//                {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) {
src/main/java/com/zy/common/model/StartupDto.java
@@ -27,11 +27,11 @@
        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;
    }
src/main/java/com/zy/core/MainProcess.java
@@ -68,6 +68,10 @@
                mainService.crnIoExecute();
                // 入库  ===>> 执行对工作档的完成操作
                mainService.storeFinished();
                // 出库  ===>> 工作档信息写入led显示器
                mainService.ledExecute();
                // 其他  ===>> LED显示器复位,显示默认信息
                mainService.ledReset();
                // 出库  ===>>  堆垛机10分钟无任务则回到源点
                mainService.crnStnToOutStnSou();
src/main/java/com/zy/core/thread/LedThread.java
@@ -107,6 +107,7 @@
    private void reset() {
        commandList = null;
        stringBuffer.delete(0, stringBuffer.length());
        this.errorMsg.delete(0, errorMsg.length());
    }
src/main/java/com/zy/core/thread/RgvThread.java
@@ -52,7 +52,7 @@
    //# 轨道基准点
    private Long trackBenchmark = 1L;
    //  # 避让距离
    private Long avoidDistance = 14000L;
    private Long avoidDistance = 11200L;
    private String errorRgv = "-";
    /**
@@ -134,7 +134,7 @@
                    initRgv();
                    continue;
                }
                Thread.sleep(20);
                Thread.sleep(100L);
//                System.out.println("读线程,小车号"+ slave.getId()+"时间戳:"+System.currentTimeMillis());
                readStatus();
@@ -169,11 +169,11 @@
                    }
                    continue;
                }
//                if (delRgvTask){
//                    writeDelRgvTask();
//                    delRgvTask = false;
//                    continue;
//                }
                if (delRgvTask){
                    writeDelRgvTask();
                    delRgvTask = false;
                    continue;
                }
                Thread.sleep(50L);
                // 构建设备状态对象
@@ -182,10 +182,37 @@
                    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());
@@ -218,7 +245,7 @@
                    continue;
                }
                // 休眠 1 秒
                Thread.sleep(100);
                Thread.sleep(200L);
                if (!deviceDetection()) {
                    continue;
@@ -286,6 +313,8 @@
                    }
                    continue;
                }
                Thread.sleep(50L);
                RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
                RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
@@ -1154,10 +1183,13 @@
            }
            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();
@@ -1166,18 +1198,52 @@
        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());
@@ -1199,7 +1265,7 @@
                    null,
                    null,
                    null,
                    result.IsSuccess ? 1 : 0,
                    result12.IsSuccess ? 1 : 0,
                    null,
                    new Date(),
                    null
@@ -1209,7 +1275,7 @@
        }
        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));
@@ -1232,11 +1298,37 @@
    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 {
@@ -1251,7 +1343,7 @@
                    null,
                    null,
                    null,
                    result.IsSuccess ? 1 : 0,
                    sign ? 1 : 0,
                    null,
                    new Date(),
                    null
@@ -1260,7 +1352,7 @@
        } catch (Exception ignore) {
        }
        if (result != null && result.IsSuccess) {
        if (sign) {
//            Thread.sleep(200);
//            this.readStatus();
            log.info("RGV 命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON("null"));
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -47,13 +47,13 @@
    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);
@@ -351,7 +351,7 @@
                    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")){
src/main/resources/application.yml
@@ -59,7 +59,7 @@
  # 轨道转换为米比例
  trackProportion: 10000
  # 避让距离
  avoidDistance: 13300
  avoidDistance: 11200
inventory:
  number: 7
@@ -68,7 +68,7 @@
  # 双深
  doubleDeep: true
  # 双深库位排号
  doubleLocs: 1,4,5,8,9,12,13,16,17,20
  doubleLocs: 1,4,5,8,11,14
  # 一个堆垛机负责的货架排数
  groupCount: 4
  # 堆垛机1
@@ -298,9 +298,9 @@
      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}
@@ -316,9 +316,9 @@
      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]:
@@ -402,9 +402,9 @@
      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}
@@ -420,9 +420,9 @@
      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]:
@@ -436,49 +436,49 @@
    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
@@ -486,47 +486,47 @@
      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]:
@@ -540,97 +540,97 @@
    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]:
@@ -808,39 +808,46 @@
    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
src/main/resources/mapper/BasDevpOptMapper.xml
@@ -23,4 +23,11 @@
    </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>
src/main/webapp/static/images/zy_logo_dark_color.png
src/main/webapp/static/wcs/css/indexHCDD.css
New file
@@ -0,0 +1,467 @@
.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);
}
src/main/webapp/static/wcs/js/testPosition.js
New file
@@ -0,0 +1,586 @@
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
    },
]
src/main/webapp/views/deviceOperate/wcsOperate.html
@@ -2,249 +2,141 @@
<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',
@@ -259,54 +151,31 @@
            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(){
@@ -320,20 +189,133 @@
                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: '确定',
@@ -350,11 +332,9 @@
                });
            },
            handleChange(val) {
                console.log(val);
                if (val.length === 0){
                    valueRight = '0';
                } else {
                    console.log("2222"+val);
                    if (val.length >= 1){
                        this.handleChangeValueRight(1)
@@ -362,12 +342,9 @@
                }
            },
            handleChange1(val) {
                console.log(val);
                if (val.length === 0){
                    valueRight1 = '0';
                } else {
                    console.log("2222"+val);
                    if (val.length >= 1){
                        this.handleChangeValueRight1(1)
                    }
@@ -375,7 +352,7 @@
            },
            taskDelete(row) {
                let that = this;
                that.$confirm('确认要删除该任务吗?', '提示', {
                that.$confirm('确认要删除该设备吗?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
@@ -455,8 +432,6 @@
                });
            },
            handleChangeValueRight(val) {
                console.log("33333"+val);
                switch (val){
                    case 1:
                        valueRight = '100';
@@ -471,8 +446,6 @@
                }
            },
            handleChangeValueRight1(val) {
                console.log("33333"+val);
                switch (val){
                    case 1:
                        valueRight1 = '100';
@@ -493,6 +466,17 @@
                    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;
@@ -549,7 +533,9 @@
                        method: 'POST',
                        success: function (res) {
                            if (res.code === 200) {
                                that.valueSystem = res.data.status;
                                that.$message.success(`状态更新成功`);
                            } else {
                                that.$message.error('状态更新失败');
                            }
                        }
                    });
@@ -621,8 +607,6 @@
            },
            getTableDataRgv() {
                let that = this;
                // that.tableDataRgv = busPsto
                // return
                $.ajax({
                    url: baseUrl + "/rgv/ring/through/rgv/position/data",
                    headers: {
@@ -668,7 +652,12 @@
                        that.energyGatheringRing = res.data
                    }
                });
            }
            },
            // 处理窗口大小变化
            handleResize: _.debounce(function() {
                this.updateContainerSize();
                this.updateBodySize();
            }, 100)
        }
    })
src/main/webapp/views/index.html
@@ -3,6 +3,7 @@
<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>
src/main/webapp/views/indexT.html
New file
@@ -0,0 +1,77 @@
<!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>
src/main/webapp/views/indexTV.html
@@ -17,11 +17,9 @@
            height: 190%;
            width: 190%;
        }
    </style>
</head>
<body>
<!-- 导航栏 -->
<!--        <div class="nav">-->
<!--            <li class="right">注销<a id="about" class="nav-unselect" onclick="logout()" href="#"></a></li>-->
@@ -52,10 +50,10 @@
        $('#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;