*
lsh
2025-11-25 c289447144f4599fe2e13d342c28a3c4d49f750f
*
4个文件已添加
5个文件已修改
794 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/CrnController.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/RgvController.java 296 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/EnergyGatheringRingParam.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/RingThroughParam.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/CrnListVo.java 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/CrnController.java
@@ -10,12 +10,10 @@
import com.zy.asrs.domain.param.CrnDemoParam;
import com.zy.asrs.domain.param.CrnOperatorParam;
import com.zy.asrs.domain.vo.CommandLogVo;
import com.zy.asrs.domain.vo.CrnListVo;
import com.zy.asrs.domain.vo.CrnMsgTableVo;
import com.zy.asrs.domain.vo.CrnStateTableVo;
import com.zy.asrs.entity.BasCrnError;
import com.zy.asrs.entity.BasCrnp;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.entity.*;
import com.zy.asrs.mapper.BasCrnErrorMapper;
import com.zy.asrs.service.BasCrnpService;
import com.zy.asrs.service.LocMastService;
@@ -524,5 +522,85 @@
        return false;
    }
    @GetMapping("/crn/list/auth")
    @ManagerAuth(memo = "堆垛机数据表")
    public R crnList(){
        List<CrnListVo> list = new ArrayList<>();
        List<BasCrnp> crnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().orderBy("crn_no"));
        for (BasCrnp basCrnp : crnps) {
            // 表格行
            CrnListVo vo = new CrnListVo();
            vo.setCrnNo(basCrnp.getCrnNo());   //  堆垛机号
            list.add(vo);
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
            if (crnThread == null) {
                continue;
            }
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) {
                continue;
            }
            vo.setWorkNo(crnProtocol.getTaskNo());  //  任务号
            if (crnProtocol.getTaskNo()>0) {
                WrkMast wrkMast = wrkMastService.selectByWrkNo(crnProtocol.getTaskNo().intValue());
//                WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo());
                if (wrkMast != null) {
                    vo.setDeviceStatus(CrnStatusType.process(wrkMast.getIoType()).getDesc());   //  模式状态
                    vo.setSourceStaNo(wrkMast.getLocNo());    //  源站
                    vo.setStaNo(wrkMast.getStaNo().toString());   //  目标站
//                    vo.setSourceLocNo(taskWrk.getTargetPoint());    //  源库位
//                    vo.setLocNo(taskWrk.getLocNo());    //  目标库位
                }
            } else {
                if (Cools.isEmpty(crnProtocol.modeType)){
                    vo.setDeviceStatus(CrnStatusType.MACHINE_UN_AUTO.getDesc());   //  模式状态
                } else {
                    vo.setDeviceStatus(crnProtocol.modeType.equals(CrnModeType.AUTO)? CrnStatusType.MACHINE_AUTO.getDesc(): CrnStatusType.MACHINE_UN_AUTO.getDesc());   //  模式状态
                }
            }
            vo.setLaneNo(crnProtocol.getCrnNo());  //
            vo.setErrorCrn("-");  //
            vo.setXspeed(crnProtocol.getXSpeed());  //  走行速度(m/min)
            vo.setYspeed(crnProtocol.getYSpeed());  //  升降速度(m/min)
            vo.setZspeed(crnProtocol.getZSpeed());  //  叉牙速度(m/min)
            vo.setXdistance(crnProtocol.getXDistance());  //  走行距离(Km)
            vo.setYdistance(crnProtocol.getYDistance());  //  升降距离(Km)
            vo.setXduration(crnProtocol.getXDuration());    //  走行时长(H)
            vo.setYduration(crnProtocol.getYDuration());    //  升降时长(H)
            if (Cools.isEmpty(crnProtocol.modeType)){
                vo.setStatusType(CrnStatusType.MACHINE_UN_AUTO.getDesc());   //  模式状态
            } else {
                vo.setStatusType(crnProtocol.modeType.desc);   //  模式状态
            }
            vo.setWrkStatus(crnProtocol.getStatusType().id);     //  任务状态
            vo.setLoading((crnProtocol.getLoaded() != null && crnProtocol.getLoaded() == 1) ? "有物" : "无物");  //  有物
            vo.setBay(crnProtocol.getBay());    //  列
            vo.setLev(crnProtocol.getLevel());  //  层
            vo.setForkOffset(crnProtocol.getForkPosType().desc);    // 货叉位置
            vo.setLiftPos(crnProtocol.getLiftPosType().desc);
            vo.setWalkPos(crnProtocol.getWalkPos()==1?"不在定位":"在定位");
            vo.setWarnCode(String.valueOf(crnProtocol.getAlarm()));
            if (crnProtocol.getAlarm() > 0) {
                BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm());
                vo.setAlarm(crnError==null?"未知异常":crnError.getErrName());
            }
            vo.setInEnable(basCrnp.getInEnable());
            vo.setOutEnable(basCrnp.getOutEnable());
            vo.setHpMk(basCrnp.getHpMk());
//            vo.setTaskComplete(crnThread.getResetFlag()? "任务完成下发等待":"-");
            vo.setTaskComplete("-");
            vo.setDemo(SystemProperties.WCS_RUNNING_STATUS_DEMO.get()? "开启":"关闭");
            vo.setDemoValue(SystemProperties.WCS_RUNNING_STATUS_DEMO_VALUE);
            if (vo.getHpMk().equals("N")){
                vo.setDemo("未开启");
                vo.setDemoValue(0);
            }
        }
        return R.ok().add(list);
    }
}
src/main/java/com/zy/asrs/controller/RgvController.java
@@ -4,24 +4,31 @@
import com.core.annotations.ManagerAuth;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.domain.param.EnergyGatheringRingParam;
import com.zy.asrs.domain.param.RgvCircularShuttleParam;
import com.zy.asrs.domain.param.RgvWrkMastParam;
import com.zy.asrs.domain.param.RingThroughParam;
import com.zy.asrs.entity.BasDevpPosition;
import com.zy.asrs.service.BasDevpPositionService;
import com.zy.core.cache.RgvErrCache;
import com.zy.core.cache.RgvStatusCache;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.cache.TaskProtocolCache;
import com.zy.asrs.entity.*;
import com.zy.asrs.mapper.BasRgvErrMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.MainServiceImpl;
import com.zy.asrs.utils.Utils;
import com.zy.core.cache.*;
import com.zy.core.enums.RgvModeType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.core.model.protocol.RgvTaskProtocol;
import com.zy.core.model.protocol.TaskProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.RgvThread;
import com.zy.core.thread.SiemensDevpThread;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
@@ -35,6 +42,24 @@
    @Autowired
    private BasDevpPositionService basDevpPositionService;
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private BasRgvErrMapper basRgvErrMapper;
    @Autowired
    private BasRgvOptService basRgvOptService;
    @Autowired
    private BasRgvService basRgvService;
    @Autowired
    private BasDevpService basDevpService;
    @Autowired
    private MainServiceImpl mainService;
    @Value("${constant-parameters.trackEntireLength}")
    private Long trackEntireLength;
    @GetMapping("/status/all")
//    @ManagerAuth(memo = "全部信息")
    public R allStatus(){
@@ -342,28 +367,37 @@
        return R.ok("任务生成成功");
    }
    @PostMapping("/ring/through/rgv/position/data")
//    @ManagerAuth(memo = "小车位置信息")
//    @ManagerAuth(memo = "环穿位置信息")
    public R ringThroughRgv(){
        List<RingThroughParam> result = new ArrayList<>();
        ConcurrentHashMap<Integer, RgvProtocol> allRgvStatus = RgvStatusCache.getAllRgvStatus();
        for (RgvProtocol rgvProtocol : allRgvStatus.values()){
        for (RgvSlave rgv : slaveProperties.getRgv()) {
//        for (int i = 1;i<2;i++) {
//            // 获取RGV信息
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
            if (rgvThread == null) {
                continue;
            }
            RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(rgv.getId());
            RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(rgv.getId());
            if (rgvTaskProtocol == null) {
                continue;
            }
            RingThroughParam ringThroughParam = new RingThroughParam();
            ringThroughParam.setIndex(rgvProtocol.getRgvNo());
            ringThroughParam.setIndex(rgv.getId());
//            ringThroughParam.setIndex(i);
//            double[] doubles = Utils.RingThroughXY2(perimeter, NumUtils.GetRandomIntInRange(183));
//            double[] doubles = Utils.RingThroughXYRgv(perimeter, perimeter-rgvProtocol.RgvPos.doubleValue());
//            double[] doubles = Utils.getRgvPosNew(perimeter, rgvProtocol.RgvPos.doubleValue());
//            double[] doubles = Utils.RingThroughXY2(183.0, 100*i );
            double[] doubles = Utils.getRgvPosNew(trackEntireLength, rgvProtocol.RgvPos.doubleValue());
            ringThroughParam.setValueX(rgvProtocol.getRgvNo()*100*1D);
            ringThroughParam.setValueY(rgvProtocol.getRgvNo()*100*2D);
            ringThroughParam.setValueX(doubles[0]);
            ringThroughParam.setValueY(doubles[1]);
            ringThroughParam.setModeColor(rgvProtocol.modeType.color);
            ringThroughParam.setStatusColor(rgvProtocol.statusType.color);
            if (rgvProtocol.getModeType() == RgvModeType.AUTO){
                ringThroughParam.setAnimation(2);
            }
            result.add(ringThroughParam);
        }
        return R.ok().add(result);
@@ -374,40 +408,44 @@
    //  站点位置信息
    public R ringThroughDev(){
        List<RingThroughParam> result = new ArrayList<>();
        ArrayList<Integer> arrayList = new ArrayList<Integer>() {{
            add(1001);
            add(1002);
            add(1003);
            add(1004);
            add(1005);
            add(1006);
            add(1007);
            add(1008);
            add(1009);
            add(1010);
            add(1011);
            add(1012);
            add(1013);
            add(1014);
            add(1015);
            add(1016);
            add(1017);
            add(1018);
            add(1019);
            add(1020);
            add(1021);
            add(1022);
            add(1023);
        }};
        for (Integer staNo : arrayList){
        List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<>());
        for (BasDevpPosition basDevpPosition : basDevpPositions){
//            if (basDevpPosition.getDevRegion() == 0){
//                continue;
//            }
            RingThroughParam ringThroughParam = new RingThroughParam();
            ringThroughParam.setIndex(staNo);
            ringThroughParam.setModeColor("#FFFFFF");
            ringThroughParam.setStatusColor("#FFFFFF");
            try{
                BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no",basDevpPosition.getDevNo()));
                if (basDevp.getAutoing().equals("Y")){
                    if (basDevp.getLoading().equals("Y")){
                        ringThroughParam.setModeColor("#ab1839");
                        ringThroughParam.setStatusColor("#ab1839");
                    }
                    if (basDevp.getLoading().equals("N")){
                        ringThroughParam.setModeColor("#27AE60");
                        ringThroughParam.setStatusColor("#27AE60");
                    }
                } else {
                    ringThroughParam.setModeColor("#C0392B");
                    ringThroughParam.setStatusColor("#C0392B");
                }
            } catch (Exception e){
                System.out.println(e.getMessage());
                ringThroughParam.setModeColor("#000000");
                ringThroughParam.setStatusColor("#000000");
            }
            ringThroughParam.setIndex(basDevpPosition.getDevNo());
//            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(),perimeter, basDevpPosition.getPlcPosition());
            ringThroughParam.setValueX(staNo*100*1D);
            ringThroughParam.setValueY(staNo*100*2D);
            double[] doubles = Utils.getRgvPosNew(basDevpPosition.getDevNo(),trackEntireLength, basDevpPosition.getPlcPosition());
            ringThroughParam.setValueX(doubles[0]);
            ringThroughParam.setValueY(doubles[1]);
            result.add(ringThroughParam);
        }
        return R.ok().add(result);
@@ -416,30 +454,178 @@
    @PostMapping("/ring/through/track/position/data")
//    @ManagerAuth(memo = "轨道PLC状态信息")
    public R wnergyGatheringRingParamTrack(){
        return R.ok();
        List<EnergyGatheringRingParam> result = new ArrayList<>();
        try{
            for (DevpSlave devp : slaveProperties.getDevp()) {
                if (devp.getId()!=1){
                    break;
                }
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                if (devpThread.isResult()){
                    if (true){
                        EnergyGatheringRingParam energyGatheringRingParam = new EnergyGatheringRingParam();
                        energyGatheringRingParam.setTrackColor("rgba(0, 230, 118, 0.5)");
                        energyGatheringRingParam.setRadiationColor("rgba(0, 230, 118, 0.5)");
                        result.add(energyGatheringRingParam);
                    } else {
                        EnergyGatheringRingParam energyGatheringRingParam = new EnergyGatheringRingParam();
                        energyGatheringRingParam.setTrackColor("rgba(0, 230, 118, 0.5)");
                        energyGatheringRingParam.setRadiationColor("rgba(0, 230, 118, 0.5)");
                        result.add(energyGatheringRingParam);
                    }
                }
            }
            if (result.isEmpty()){
                EnergyGatheringRingParam energyGatheringRingParam = new EnergyGatheringRingParam();
                energyGatheringRingParam.setTrackColor("rgba(0, 0, 0, 81)");
                energyGatheringRingParam.setRadiationColor("rgba(0, 0, 0, 81)");
                result.add(energyGatheringRingParam);
            }
        } catch (Exception e){
            EnergyGatheringRingParam energyGatheringRingParam = new EnergyGatheringRingParam();
            energyGatheringRingParam.setTrackColor("rgba(0, 0, 0, 81)");
            energyGatheringRingParam.setRadiationColor("rgba(0, 0, 0, 81)");
            result.add(energyGatheringRingParam);
        }
        return R.ok().add(result);
    }
    @PostMapping("/ring/through/task/wrk/mast/position/data")
//    @ManagerAuth(memo = "作业信息")
    public R ringThroughTaskWrkMast(){
        return R.ok();
        List<RgvWrkMastParam> result = new ArrayList<>();
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<>());
        for (WrkMast wrkMast : wrkMasts){
            RgvWrkMastParam rgvWrkMastParam = new RgvWrkMastParam(wrkMast);
            if (Cools.isEmpty(rgvWrkMastParam.getRgvNo())){
                rgvWrkMastParam.setRgvSts("未绑定");
            } else {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvWrkMastParam.getRgvNo());
                if (rgvThread == null) {
                    rgvWrkMastParam.setRgvSts("未知");
                } else {
                    RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(rgvWrkMastParam.getRgvNo());
                    RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(rgvWrkMastParam.getRgvNo());
                    if (rgvTaskProtocol == null) {
                        rgvWrkMastParam.setRgvSts("未知");
                    } else {
                        rgvWrkMastParam.setRgvSts(rgvProtocol.statusType.desc);
                    }
                }
            }
            result.add(rgvWrkMastParam);
        }
        return R.ok().add(result);
    }
    @PostMapping("/ring/through/task/wrk/mast/position/data/v1")
//    @ManagerAuth(memo = "作业信息")
    public R ringThroughTaskWrkMastV1(){
        return R.ok();
        List<BasRgvOpt> result = new ArrayList<>();
        for (int i = 1 ; i<11; i ++){
            BasRgvOpt basRgvOpt = basRgvOptService.selectOne(new EntityWrapper<BasRgvOpt>().eq("rgv_no", i).orderBy("id", false));
            if (basRgvOpt!=null){
                result.add(basRgvOpt);
            }
        }
        return R.ok().add(result);
    }
    @PostMapping("/task/rgv/circular/shuttle/mast/position/data")
//    @ManagerAuth(memo = "作业信息")
    public R rgvCircularShuttle(){
        return R.ok();
        List<RgvCircularShuttleParam> result = new ArrayList<>();
//        List<BasCircularShuttle> basCircularShuttleList = basCircularShuttleService.selectList(new EntityWrapper<>());
//        for (BasCircularShuttle basCircularShuttle : basCircularShuttleList){
//            RgvCircularShuttleParam rgvCircularShuttleParam = new RgvCircularShuttleParam(basCircularShuttle);
//            if (!Cools.isEmpty(rgvCircularShuttleParam.getRgvNo())){
//                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvCircularShuttleParam.getRgvNo());
//                if (rgvThread != null) {
//                    RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
//                    if (rgvProtocol != null) {
//                        rgvCircularShuttleParam.setPosition(rgvProtocol.getRgvPos());
//                        if (rgvCircularShuttleParam.getStatus()==0){
//                            rgvCircularShuttleParam.setStatus$(rgvProtocol.statusType.desc);
//                        }
//                        if (rgvProtocol.getAlarmList().isEmpty()){
//                            rgvCircularShuttleParam.setError(0);
//                            rgvCircularShuttleParam.setError$("-");
//                        } else {
//                            StringBuilder alarmList = new StringBuilder();
//                            for (Integer alarm : rgvProtocol.getAlarmList()){
//                                BasRgvErr rgvErr = basRgvErrMapper.selectById(alarm);
//                                alarmList.append((rgvErr==null || rgvErr.getErrName()==null)? "未知异常:"+alarm:rgvErr.getErrName());
//                                if (alarm.equals(rgvProtocol.getAlarmList().get(rgvProtocol.getAlarmList().size() - 1))){
//                                    break;
//                                }
//                                alarmList.append("---");
//                            }
//                            rgvCircularShuttleParam.setError$(alarmList.toString());
//                        }
//                    }
//                }
//            }
//            result.add(rgvCircularShuttleParam);
//        }
        return R.ok().add(result);
    }
    @PostMapping("/task/rgv/circular/shuttle/mast/position/data/v1")
//    @ManagerAuth(memo = "作业信息")
    public R rgvCircularShuttleV1(){
//        List<BasRgvErrLog> result = new ArrayList<>();
//        for (int i = 1 ; i<11; i ++){
//            BasRgvErrLog basRgvErrLog = basRgvErrLogService.selectOne(new EntityWrapper<BasRgvErrLog>().eq("rgv_no", i).orderBy("id", false));
//            if (basRgvErrLog!=null){
//                result.add(basRgvErrLog);
//            }
//        }
        return R.ok();
    }
    @PostMapping("/disable/rgv/status")
//    @ManagerAuth(memo = "修改RGV状态")
    public R rgvDisableStatus(@RequestParam Integer rgvNo,
                              @RequestParam Integer status){
//        log.info("/disable/rgv/status===》修改RGV状态!!!rgvNo:{},status:{},data:{}",rgvNo,status,new Date());
//        BasCircularShuttle basCircularShuttle = basCircularShuttleService.selectOne(new EntityWrapper<BasCircularShuttle>().eq("rgv_no", rgvNo));
//        if (basCircularShuttle == null){
//            return R.error().add("未找到此RGV,异常!!!");
//        }
//        basCircularShuttle.setStatus(status);
//        basCircularShuttleService.updateById(basCircularShuttle);
        return R.ok();
    }
    @PostMapping("/disable/task/delete")
//    @ManagerAuth(memo = "删除任务")
    public R taskDisabledelete(@RequestParam Long wrkNo){
//        log.info("/disable/task/delete===》删除任务!!!wrkNo:{},data:{}",wrkNo,new Date());
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", wrkNo));
        if (Cools.isEmpty(wrkMast)){
            return R.error().add("未找到此任务,异常!!!");
        }
        wrkMastService.deleteById(wrkMast);
        return R.ok();
    }
    @PostMapping("/disable/task/delete1")
//    @ManagerAuth(memo = "初始化任务")
    public R taskDisabledelete1(@RequestParam Long wrkNo){
        Date now = new Date();
//        log.info("/disable/task/delete1===》初始化任务!!!wrkNo:{},data:{}",wrkNo,new Date());
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", wrkNo));
        if (Cools.isEmpty(wrkMast)){
            return R.error().add("未找到此任务,异常!!!");
        }
        wrkMast.setWrkSts(1L);
//        wrkMast.setRgvNo(0);
        wrkMast.setAppeTime(now);
        wrkMast.setLogErrTime(now);
        if (wrkMastService.updateById(wrkMast)){
            return R.ok();
        }
        return R.error("初始化失败!!!");
    }
}
src/main/java/com/zy/asrs/domain/param/EnergyGatheringRingParam.java
New file
@@ -0,0 +1,11 @@
package com.zy.asrs.domain.param;
import lombok.Data;
@Data
public class EnergyGatheringRingParam {
    private String trackColor;
    private String radiationColor;
}
src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java
New file
@@ -0,0 +1,38 @@
package com.zy.asrs.domain.param;
//import com.zy.asrs.entity.BasCircularShuttle;
import lombok.Data;
/**
 * Created by vincent on 2020-06-02
 */
@Data
public class RgvCircularShuttleParam {
    private Long id;
    private Integer rgvId;
    private Integer rgvNo;
    /**
     * 0:正常,1:禁用
     */
    private Integer status;
    private Integer error;
    private String status$ = "未知";
    private String error$ = "-";
    private Long position = 0L;
    public RgvCircularShuttleParam(){};
//    public RgvCircularShuttleParam(BasCircularShuttle basCircularShuttle){
//        this.rgvNo = basCircularShuttle.getRgvNo();
//        this.rgvId = basCircularShuttle.getRgvId();
//        this.status = basCircularShuttle.getStatus();
//        this.status$ = basCircularShuttle.getStatus()==0? "正常":"禁用";
//        this.id = basCircularShuttle.getId();
//    }
}
src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java
New file
@@ -0,0 +1,46 @@
package com.zy.asrs.domain.param;
import com.zy.asrs.entity.WrkMast;
import lombok.Data;
/**
 * Created by vincent on 2020-06-02
 */
@Data
public class RgvWrkMastParam {
    // RGV号
    private Integer rgvNo;
    // 工作号
    private Long wrkNo;
    // 工作状态
    private Long wrkSts;
    private String wrkSts$;
    // 工位1目标站
    private Integer staNo;
    // 工位1源站
    private Integer sourceStaNo;
    //下发时间
    private String modiTime;
    //更新时间
    private String appeTime;
    private String crnStrTime;
    private String crnEndTime;
    private String rgvSts;
    public RgvWrkMastParam(){};
    public RgvWrkMastParam(WrkMast wrkMast){
        this.wrkNo = wrkMast.getWrkNo().longValue();
//        this.rgvNo = wrkMast.getRgvNo();
        this.sourceStaNo = wrkMast.getSourceStaNo();
        this.staNo = wrkMast.getStaNo();
        this.wrkSts = wrkMast.getWrkSts();
        this.wrkSts$ = wrkMast.getWrkSts$();
        this.modiTime = wrkMast.getModiTime$();
        this.appeTime = wrkMast.getAppeTime$();
        this.crnStrTime = wrkMast.getCrnStrTime$();
        this.crnEndTime = wrkMast.getCrnEndTime$();
    }
}
src/main/java/com/zy/asrs/domain/param/RingThroughParam.java
@@ -14,4 +14,6 @@
    private String modeColor;
    private String statusColor;
    private int animation = 0;//光效
}
src/main/java/com/zy/asrs/domain/vo/CrnListVo.java
New file
@@ -0,0 +1,170 @@
package com.zy.asrs.domain.vo;
import com.zy.asrs.utils.Utils;
import com.zy.core.enums.CrnStatusType;
import lombok.Data;
@Data
public class CrnListVo {
    // 堆垛机号
    private Integer crnNo;
    private Integer laneNo;
    // 模式
    private String statusType = "-";
    // 有物
    private String loading = "-";
    // 列
    private Short bay;
    // 层
    private Short lev;
    // 走行原点
    private String xOrigin = "-";
    // 升降原点
    private String yOrigin = "-";
    // 货叉位置
    private String forkOffset = "-";
    // 载货台位置
    private String liftPos = "-";
    // 走行定位
    private String walkPos = "-";
    // 急停
    private String stop = "-";
    // 列坐标
    private String bayCoor = "-";
    // 层坐标
    private String levCoor = "-";
    // 完成
    private String complete = "-";
    // 任务号
    private Short workNo = 0;
    // 任务状态
    private Integer wrkStatus;
    // 异常码
    private String warnCode = "-";
    // 垂直故障码
    private String alarm = "-";
    // 源站
    private String sourceStaNo = "-";
    // 目标站
    private String staNo = "-";
    // 源库位
    private String sourceLocNo = "-";
    // 目标库位
    private String locNo = "-";
    // 异常
    private String error = "";
    // 原点
    private String origin = "";
    // 命令
    private String command = "";
    // 走行速度(m/min)
    private Float xspeed = 0.0F;
    // 升降速度(m/min)
    private Float yspeed = 0.0F;
    // 叉牙速度(m/min)
    private Float zspeed = 0.0F;
    // 走行距离(Km)
    private Float xdistance = 0.0F;
    // 升降距离(Km)
    private Float ydistance = 0.0F;
    // 走行时长(H)
    private Float xduration = 0.0F;
    // 升降时长(H)
    private Float yduration = 0.0F;
    // 设备状态
    private String deviceStatus = "-";
    // 可入
    private String inEnable;
    // 可出
    private String outEnable;
    private String hpMk = "N";
    private String taskComplete = "无";
    private String errorCrn;
    private String demo = "-";
    private Integer demoValue = 0;
    public void setXspeed(Float xspeed) {
        this.xspeed = Utils.scale(xspeed);
    }
    public void setYspeed(Float yspeed) {
        this.yspeed = Utils.scale(yspeed);
    }
    public void setZspeed(Float zspeed) {
        this.zspeed = Utils.scale(zspeed);
    }
    public void setXdistance(Float xdistance) {
        this.xdistance = Utils.scale(xdistance);
    }
    public void setYdistance(Float ydistance) {
        this.ydistance = Utils.scale(ydistance);
    }
    public void setXduration(Float xduration) {
        this.xduration = Utils.scale(xduration);
    }
    public void setYduration(Float yduration) {
        this.yduration = Utils.scale(yduration);
    }
    public String getWrkStatus$() {
        if (this.wrkStatus == null) {
            return "-";
        }
        return CrnStatusType.get(this.wrkStatus.shortValue()).desc;
    }
    public String getDemoValue$() {
        switch (this.demoValue) {
            case 0:
                return "停止";
            case 1:
                return "运行启动中";
            case 2:
                return "运行中";
            case 3:
                return "停止中";
            default:
                return "未知状态";
        }
    }
}
src/main/java/com/zy/asrs/utils/Utils.java
@@ -161,6 +161,150 @@
    }
    public static double[] getRgvPosNew(Integer devNo,double a, double b) {
        double[] rgvPosNew = getRgvPosNew(a, b);
        switch (devNo){
            case 101:
            case 102:
            case 103:
            case 104:
            case 105:
            case 106:
            case 107:
            case 108:
            case 109:
            case 110:
            case 111:
                rgvPosNew[0] = rgvPosNew[0] - 70;
                break;
            case 112:
            case 113:
            case 114:
            case 115:
                rgvPosNew[0] = rgvPosNew[0] + 50;
                break;
            case 116:
            case 117:
            case 118:
            case 119:
            case 120:
            case 121:
            case 122:
            case 123:
            case 124:
            case 125:
            case 126:
            case 127:
            case 128:
            case 129:
            case 130:
            case 131:
            case 132:
            case 133:
                rgvPosNew[1] = rgvPosNew[1] + 50;
                break;
            case 134:
                rgvPosNew[1] = rgvPosNew[1] - 70;
                break;
        }
        return rgvPosNew;
    }
    public static double[] getRgvPosNew(double a, double b) {
        Object[][] intervals = {
//                // 弧线区间(拐点116-115),控制点假设为(1125, 882)
//                {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},
        };
        for (Object[] interval : intervals) {
            double start = (Double) interval[0];
            double end = (Double) interval[1];
            int type = (Integer) interval[2];
            if (b >= start && b <= end) {
                double t = (b - start) / (end - start);
                // 根据不同类型计算坐标
                switch (type) {
                    case 0: // 直线
                        return linearInterpolation(interval, t);
                    case 1: // 贝塞尔曲线
                        return bezierInterpolation(interval, t);
                    case 2: // 圆弧
                        return circularInterpolation(interval, t);
                }
            }
        }
        return new double[]{0, 0};
    }
    // 直线插值
    private static double[] linearInterpolation(Object[] interval, double t) {
        double x1 = (Double) interval[3];
        double y1 = (Double) interval[4];
        double x2 = (Double) interval[5];
        double y2 = (Double) interval[6];
        return new double[]{
                x1 + t * (x2 - x1),
                y1 + t * (y2 - y1)
        };
    }
    // 贝塞尔曲线插值
    private static double[] bezierInterpolation(Object[] interval, double t) {
        double x0 = (Double) interval[3];
        double y0 = (Double) interval[4];
        double x2 = (Double) interval[5];
        double y2 = (Double) interval[6];
        double cx = (Double) interval[7];
        double cy = (Double) interval[8];
        return new double[]{
                Math.pow(1-t, 2)*x0 + 2*(1-t)*t*cx + t*t*x2,
                Math.pow(1-t, 2)*y0 + 2*(1-t)*t*cy + t*t*y2
        };
    }
    // 圆弧插值(新增)
    private static double[] circularInterpolation(Object[] interval, double t) {
        // 参数解析
        double startX = (Double) interval[3];
        double startY = (Double) interval[4];
        double endX = (Double) interval[5];
        double endY = (Double) interval[6];
        double centerX = (Double) interval[7];
        double centerY = (Double) interval[8];
        // 计算起始角度和终止角度
        double startAngle = Math.atan2(startY - centerY, startX - centerX);
        double endAngle = Math.atan2(endY - centerY, endX - centerX);
        // 角度插值
        double currentAngle = startAngle + t * (endAngle - startAngle);
        double radius = Math.hypot(startX - centerX, startY - centerY);
        return new double[]{
                centerX + radius * Math.cos(currentAngle),
                centerY + radius * Math.sin(currentAngle)
        };
    }
    public static void main(String[] args) {
        SlaveProperties slaveProperties = new SlaveProperties();
        slaveProperties.setDoubleDeep(true);
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -43,6 +43,7 @@
    private SiemensS7Net siemensS7Net;
    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
    private short heartBeatVal = 1;
    private boolean result = false;
    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);