#
zzgtfwq
2 天以前 28ea25cc817e78f1023b8a7c7826441a4acadfc1
src/main/java/com/zy/asrs/controller/RgvController.java
@@ -2,50 +2,45 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.annotations.ManagerAuth;
import com.core.common.Cools;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.domain.enums.RgvStatusType;
import com.zy.asrs.domain.param.CrnOperatorParam;
import com.zy.asrs.domain.param.RgvOperatorParam;
import com.zy.asrs.domain.vo.RgvMsgTableVo;
import com.zy.asrs.domain.vo.RgvStateTableVo;
import com.zy.asrs.entity.BasRgv;
import com.zy.asrs.entity.BasRgvErr;
import com.zy.asrs.entity.WrkMast;
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.*;
import com.zy.asrs.mapper.BasRgvErrMapper;
import com.zy.asrs.service.BasRgvService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.MainServiceImpl;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.asrs.utils.Utils;
import com.zy.core.cache.*;
import com.zy.core.enums.RgvModeType;
import com.zy.core.enums.RgvTaskModeType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.RgvCommand;
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 lombok.extern.slf4j.Slf4j;
import com.zy.core.thread.SiemensDevpThread;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
 * RGV接口
 * 输送设备接口
 * Created by vincent on 2020-06-01
 */
@Slf4j
@RestController
@RequestMapping("/rgv")
public class RgvController {
    @Autowired
    private BasDevpPositionService basDevpPositionService;
    @Autowired
    private SlaveProperties slaveProperties;
@@ -54,283 +49,585 @@
    @Autowired
    private BasRgvErrMapper basRgvErrMapper;
    @Autowired
    private BasRgvOptService basRgvOptService;
    @Autowired
    private BasRgvService basRgvService;
    @Autowired
    private MainServiceImpl mainService;
    private BasDevpService basDevpService;
    @Autowired
    private LocMastService locMastService;
    private MainServiceImpl mainService;
    @ManagerAuth(memo = "解锁小车")
    @PostMapping("/lock")
    public R lock(CrnOperatorParam param){
        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, param.getRgvNo());
        rgvThread.setPakMk(true);
    @Value("${constant-parameters.trackEntireLength}")
    private Long trackEntireLength;
    @GetMapping("/status/all")
//    @ManagerAuth(memo = "全部信息")
    public R allStatus(){
        List<Map<String, Object>> res = new ArrayList<>();
        ConcurrentHashMap<Integer, RgvProtocol> allRgvStatus = RgvStatusCache.getAllRgvStatus();
        for (RgvProtocol rgvProtocol : allRgvStatus.values()){
            Map<String, Object> map2 = new HashMap<>();
            map2.put("rgvNo", rgvProtocol.getRgvNo());
            map2.put("taskNo", rgvProtocol.getTaskNo());
            map2.put("mode", rgvProtocol.getModeType().desc);
            map2.put("status", rgvProtocol.getStatusType().desc);
            map2.put("rgvPos", rgvProtocol.getRgvPos());
            map2.put("rgvPosDestination", rgvProtocol.getRgvPosDestination());
            map2.put("loaded", rgvProtocol.getLoaded().equals((short)-1)? "未知":rgvProtocol.getLoaded()==1? "有物":"无物");
            map2.put("errorRgv", RgvErrCache.getErrorDev(rgvProtocol.getRgvNo()));
            res.add(map2);
        }
        return R.ok().add(res);
    }
    @PostMapping("/task/cache/all")
//    @ManagerAuth(memo = "全部信息")
    public R allTaskCache(@RequestParam(defaultValue = "0")  Integer rgvNo){
        List<Map<String, Object>> res = new ArrayList<>();
        try{
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
            TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
            for (TaskProtocol taskProtocol : allTaskProtocol.values()){
                Map<String, Object> map2 = new HashMap<>();
                map2.put("rgvNo", rgvNo);
                map2.put("taskNo", taskProtocol.getTaskNo());
                map2.put("targetPosition", taskProtocol.getTargetPosition());
                map2.put("isRunning", taskProtocol.getIsRunning());
                map2.put("taskStatus", taskProtocol.getTaskStatus());
                map2.put("direction", taskProtocol.isDirection());
                res.add(map2);
            }
        } catch (Exception e){
//            return R.error("异常"+e.getMessage());
        }
        return R.ok().add(res);
    }
    @PostMapping("/run/del")//Take  Put  Walk
//    @ManagerAuth(memo = "清空任务")
    public R rgvRunDel(@RequestParam(defaultValue = "0")  Integer rgvNo
    ) {
        if (rgvNo==null || rgvNo==0){
            return R.error("请选择小车");
        }
        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
        try {
            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
            for (TaskProtocol taskProtocol : allTaskProtocol.values()){
                taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection());
            }
        } catch (Exception e) {
            return R.error("任务删除失败"+e.getMessage());
        }
        return R.ok("任务清空成功");
    }
    @PostMapping("/run/del2")//Take  Put  Walk
//    @ManagerAuth(memo = "清除作业启动中")
    public R rgvRunDel2(@RequestParam(defaultValue = "0")  Integer rgvNo
    ) {
        if (rgvNo==null || rgvNo==0){
            return R.error("请选择小车");
        }
        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
        try {
            rgvThread.setWrkSign();
        } catch (Exception e) {
            return R.error("清除作业启动中失败"+e.getMessage());
        }
        return R.ok("任务清空成功");
    }
    @PostMapping("/run/walk")//Take  Put  Walk
//    @ManagerAuth(memo = "小车行走")
    public R rgvRunWalk(@RequestParam(defaultValue = "0")  Integer rgvNo,
                        @RequestParam(defaultValue = "9999")  Integer taskNo,
                        @RequestParam(defaultValue = "0")  Integer rgvStaNoPut,
                        @RequestParam(defaultValue = "0")  Long rgvPosDestination
    ) {
        if (rgvNo==null || rgvNo==0){
            return R.error("请选择小车");
        }
        if ((rgvStaNoPut == null || rgvStaNoPut == 0) && (rgvPosDestination==null || rgvPosDestination==0L)){
            return R.error("目标站点请填写");
        }
        if (rgvPosDestination == null || rgvPosDestination == 0){
            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoPut));
            if (Cools.isEmpty(basDevpPosition)){
                return R.error("目标站点不存在");
            }
            rgvPosDestination = basDevpPosition.getPlcPosition();
        }
        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
        TaskProtocol issued = new TaskProtocol();
        try {
            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
            if (allTaskProtocol.size() > 0) {
                return R.error("存在执行中任务,请先处理!!!");
            }
            //执行
            issued.setTaskNo(Long.valueOf(taskNo));
            issued.setTaskStatus(1);
            issued.setTaskNoDirection(issued.gettaskNoDirection$(issued.getTaskNo(), issued.getTaskStatus()));
            issued.setTargetPosition(rgvPosDestination);
            issued.setIsRunning(1);
            issued.setDirection(true);
            taskProtocolCache.updateTaskProtocol(issued);
        } catch (Exception e) {
            return R.error("任务生成失败"+e.getMessage());
        }
        return R.ok("任务生成成功");
    }
    @PostMapping("/run/put")//Take  Put  Walk
//    @ManagerAuth(memo = "小车放货")
    public R rgvPutWalk(@RequestParam(defaultValue = "0")  Integer rgvNo,
                        @RequestParam(defaultValue = "9999")  Integer taskNo,
                        @RequestParam(defaultValue = "0")  Integer rgvStaNoPut,
                        @RequestParam(defaultValue = "0")  Long rgvPosDestination
    ) {
        if (rgvNo==null || rgvNo==0){
            return R.error("请选择小车");
        }
        if (rgvStaNoPut == null || rgvStaNoPut == 0){
            return R.error("目标站点请填写");
        }
        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
        TaskProtocol issuedPut = new TaskProtocol();
        try {
            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
            if (allTaskProtocol.size() > 0) {
                return R.error("存在执行中任务,请先处理!!!");
            }
            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoPut));
            if (Cools.isEmpty(basDevpPosition)){
                return R.error("目标站点不存在");
            }
            //执行
            issuedPut.setTaskNo(Long.valueOf(taskNo));
            issuedPut.setTaskStatus(3);
            issuedPut.setTargetPositionStaNo(basDevpPosition.getDevNo());
            issuedPut.setTargetPositionStaNoEnd(basDevpPosition.getDevNo$());
            issuedPut.setTargetPositionStaNoPlcId(basDevpPosition.getPlcId());
            issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(), issuedPut.getTaskStatus()));
            issuedPut.setTargetPosition(basDevpPosition.getPlcPosition());
            issuedPut.setIsRunning(1);
            issuedPut.setDirection(basDevpPosition.getRgvSign()==1);
            taskProtocolCache.updateTaskProtocol(issuedPut);
        } catch (Exception e) {
            return R.error("任务生成失败"+e.getMessage());
        }
        return R.ok("任务生成成功");
    }
    @PostMapping("/run/take")//Take  Put  Walk
//    @ManagerAuth(memo = "小车取货")
    public R rgvTakeWalk(@RequestParam(defaultValue = "0") Integer rgvNo,
                         @RequestParam(defaultValue = "9999") Integer taskNo,
                         @RequestParam(defaultValue = "0") Integer rgvStaNoTake,
                         @RequestParam(defaultValue = "0") Long rgvPosDestination
    ) {
        if (rgvNo==null || rgvNo==0){
            return R.error("请选择小车");
        }
        if (rgvStaNoTake == null || rgvStaNoTake == 0){
            return R.error("取货站点请填写");
        }
        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
        TaskProtocol issuedTake = new TaskProtocol();
        try {
            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
            if (allTaskProtocol.size() > 0) {
                return R.error("存在执行中任务,请先处理!!!");
            }
            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoTake));
            if (Cools.isEmpty(basDevpPosition)){
                return R.error("取货站点不存在");
            }
            //执行
            issuedTake.setTaskNo(Long.valueOf(taskNo));
            issuedTake.setTaskStatus(2);
            issuedTake.setTargetPositionStaNo(basDevpPosition.getDevNo());
            issuedTake.setTargetPositionStaNoPlcId(basDevpPosition.getPlcId());
            issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(), issuedTake.getTaskStatus()));
            issuedTake.setTargetPosition(basDevpPosition.getPlcPosition());
            issuedTake.setIsRunning(1);
            issuedTake.setDirection(basDevpPosition.getRgvSign()==1);
            taskProtocolCache.updateTaskProtocol(issuedTake);
        } catch (Exception e) {
            return R.error("任务生成失败"+e.getMessage());
        }
        return R.ok("任务生成成功");
    }
    @PostMapping("/run/TakeAndPut")//Take  Put  Walk
//    @ManagerAuth(memo = "小车取货")
    public R rgvTakeAndPut(@RequestParam(defaultValue = "0") Integer rgvNo,
                           @RequestParam(defaultValue = "9999") Integer taskNo,
                           @RequestParam(defaultValue = "0") Integer rgvStaNoTake,
                           @RequestParam(defaultValue = "0") Integer rgvStaNoPut,
                           @RequestParam(defaultValue = "0") Long rgvPosDestination
    ) {
        if (rgvNo==null || rgvNo==0){
            return R.error("请选择小车");
        }
        if (rgvStaNoTake == null || rgvStaNoTake == 0){
            return R.error("取货站点请填写");
        }
        if (rgvStaNoPut == null || rgvStaNoPut == 0){
            return R.error("放货站点请填写");
        }
        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
        TaskProtocol issuedTake = new TaskProtocol();
        TaskProtocol issuedPut = new TaskProtocol();
        try {
            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
            if (allTaskProtocol.size() > 0) {
                return R.error("存在执行中任务,请先处理!!!");
            }
            BasDevpPosition basDevpPositionTake = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoTake));
            if (Cools.isEmpty(basDevpPositionTake)){
                return R.error("取货站点不存在");
            }
            //执行
            issuedTake.setTaskNo(Long.valueOf(taskNo));
            issuedTake.setTaskStatus(2);
            issuedTake.setTargetPositionStaNo(basDevpPositionTake.getDevNo());
            issuedTake.setTargetPositionStaNoPlcId(basDevpPositionTake.getPlcId());
            issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(), issuedTake.getTaskStatus()));
            issuedTake.setTargetPosition(basDevpPositionTake.getPlcPosition());
            issuedTake.setIsRunning(1);
            issuedTake.setDirection(basDevpPositionTake.getRgvSign()==1);
            BasDevpPosition basDevpPositionPut = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoPut));
            if (Cools.isEmpty(basDevpPositionPut)){
                return R.error("目标站点不存在");
            }
            //执行
            issuedPut.setTaskNo(Long.valueOf(taskNo));
            issuedPut.setTaskStatus(3);
            issuedPut.setTargetPositionStaNo(basDevpPositionPut.getDevNo());
            issuedPut.setTargetPositionStaNoEnd(basDevpPositionPut.getDevNo$());
            issuedPut.setTargetPositionStaNoPlcId(basDevpPositionPut.getPlcId());
            issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(), issuedPut.getTaskStatus()));
            issuedPut.setTargetPosition(basDevpPositionPut.getPlcPosition());
            issuedPut.setIsRunning(1);
            issuedPut.setDirection(basDevpPositionPut.getRgvSign()==1);
            taskProtocolCache.updateTaskProtocol(issuedTake);
            taskProtocolCache.updateTaskProtocol(issuedPut);
        } catch (Exception e) {
            return R.error("任务生成失败"+e.getMessage());
        }
        return R.ok("任务生成成功");
    }
    @PostMapping("/run/delRgvTask")//Take  Put  Walk
//    @ManagerAuth(memo = "小车取货")
    public R rgvDelRgvTask(@RequestParam(defaultValue = "0") Integer rgvNo
    ) {
        if (rgvNo==null || rgvNo==0){
            return R.error("请选择小车");
        }
        try {
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
            rgvThread.setDelRgvTask();
        } catch (Exception e) {
            return R.error("任务生成失败"+e.getMessage());
        }
        return R.ok("任务生成成功");
    }
    @PostMapping("/ring/through/rgv/position/data")
//    @ManagerAuth(memo = "环穿位置信息")
    public R ringThroughRgv(){
        List<RingThroughParam> result = new ArrayList<>();
        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(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(trackEntireLength, rgvProtocol.RgvPos.doubleValue());
            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);
    }
    @PostMapping("/ring/through/dev/position/data")
//    @ManagerAuth(memo = "站点信息")
    //  站点位置信息
    public R ringThroughDev(){
        List<RingThroughParam> result = new ArrayList<>();
        List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<>());
        for (BasDevpPosition basDevpPosition : basDevpPositions){
//            if (basDevpPosition.getDevRegion() == 0){
//                continue;
//            }
            RingThroughParam ringThroughParam = new RingThroughParam();
            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(),trackEntireLength, basDevpPosition.getPlcPosition());
            ringThroughParam.setValueX(doubles[0]);
            ringThroughParam.setValueY(doubles[1]);
            result.add(ringThroughParam);
        }
        return R.ok().add(result);
    }
    @PostMapping("/ring/through/track/position/data")
//    @ManagerAuth(memo = "轨道PLC状态信息")
    public R wnergyGatheringRingParamTrack(){
        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(){
        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(){
        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(){
        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("/table/rgv/state")
    @ManagerAuth(memo = "RGV信息表")
    public R rgvStateTable(){
        List<RgvStateTableVo> list = new ArrayList<>();
        List<BasRgv> rgvs = basRgvService.selectList(new EntityWrapper<BasRgv>().orderBy("rgv_no"));
        for (BasRgv basRgv : rgvs) {
            // 表格行
            RgvStateTableVo vo = new RgvStateTableVo();
            vo.setRgvNo(basRgv.getRgvNo());   //  RGV号
            list.add(vo);
            // 获取RGV信息
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo());
            if (rgvThread == null) {
                continue;
            }
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                continue;
            }
            vo.setStatusType(rgvProtocol.modeType.desc);   //  模式状态
            vo.setStatus(rgvProtocol.getStatusType().desc);     //  状态
            vo.setWorkNo1(rgvProtocol.getTaskNo1());  //  工位1任务号
            vo.setStatus1(rgvProtocol.getStatusType1().desc);  // 工位1状态
            vo.setLoading1(rgvProtocol.getLoaded1()==1?"有物":"无物");  // 工位1有物
            vo.setRgvPos(rgvProtocol.getRgvPos());
            vo.setRgvPos1(rgvProtocol.getRgvPosI());
            vo.setWalkPos(rgvProtocol.getWalkPos()==1?"在定位":"不在定位");
            vo.setPakMk(rgvThread.isPakMk()?"无锁":"锁定");
//            vo.setWorkNo2(rgvProtocol.getTaskNo2());  //  工位2任务号
//            vo.setStatus2(rgvProtocol.getStatusType2().desc);  // 工位2状态
//            vo.setLoading2(rgvProtocol.getLoaded2()==1?"有物":"无物");  // 工位2有物
            vo.setWarnCode(String.valueOf(rgvProtocol.getAlarm()));
            if (rgvProtocol.getAlarm() > 0) {
                BasRgvErr rgvErr = basRgvErrMapper.selectById(rgvProtocol.getAlarm());
                vo.setAlarm(rgvErr==null?"未知异常":rgvErr.getErrName());
            }
    @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("未找到此任务,异常!!!");
        }
        return R.ok().add(list);
        wrkMastService.deleteById(wrkMast);
        return R.ok();
    }
    @PostMapping("/table/rgv/msg")
    @ManagerAuth(memo = "RGV数据表")
    public R rgvMsgTable(){
        List<RgvMsgTableVo> list = new ArrayList<>();
        List<BasRgv> rgvs = basRgvService.selectList(new EntityWrapper<BasRgv>().orderBy("rgv_no"));
        for (BasRgv basRgv : rgvs) {
            // 表格行
            RgvMsgTableVo vo = new RgvMsgTableVo();
            vo.setRgvNo(basRgv.getRgvNo());   //  RGV号
            list.add(vo);
            // 获取RGV信息
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo());
            if (rgvThread == null) {
                continue;
            }
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                continue;
            }
            vo.setWorkNo(rgvProtocol.getTaskNo1());  //  任务号
            if (rgvProtocol.getTaskNo1()>0) {
                WrkMast wrkMast = wrkMastService.selectById(rgvProtocol.getTaskNo1());
                if (wrkMast != null) {
                    vo.setStatus(RgvStatusType.process(wrkMast.getIoType()).getDesc());   //  模式状态
                    vo.setSourceStaNo(wrkMast.getSourceStaNo$());    //  源站
                    vo.setStaNo(wrkMast.getStaNo$());   //  目标站
                    vo.setSourceLocNo(wrkMast.getSourceLocNo());    //  源库位
                    vo.setLocNo(wrkMast.getLocNo());    //  目标库位
                }
            } else {
                vo.setStatus(rgvProtocol.modeType.equals(RgvModeType.AUTO)? rgvProtocol.modeType.desc: RgvModeType.HAND.desc);   //  模式状态
            }
            vo.setXspeed(rgvProtocol.getXSpeed());  //  走行速度(m/min)
            vo.setXdistance(rgvProtocol.getXDistance());  //  走行距离(Km)
            vo.setXduration(rgvProtocol.getXDuration());    //  走行时长(H)
    @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("未找到此任务,异常!!!");
        }
        return R.ok().add(list);
    }
    @PostMapping("/output/site")
    @ManagerAuth(memo = "RGV报文日志输出")
    public R rgvOutput(){
        StringBuilder str = new StringBuilder();
        String s;
        int i = 0;
        while((s = OutputQueue.RGV.poll()) != null && i <=10) {
            str.append("\n").append(s);
            i++;
        wrkMast.setWrkSts(1L);
//        wrkMast.setRgvNo(0);
        wrkMast.setAppeTime(now);
        wrkMast.setLogErrTime(now);
        if (wrkMastService.updateById(wrkMast)){
            return R.ok();
        }
        return R.ok().add(str.toString());
        return R.error("初始化失败!!!");
    }
    /****************************************************************/
    /************************** 手动操作 ******************************/
    /****************************************************************/
    @ManagerAuth(memo = "取放货")
    @PostMapping("/operator/put")
    public R rgvFetchPut(RgvOperatorParam param){
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 0);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
        command.setSourceStaNo1(param.getSourceStaNo1()); // 源站
        command.setDestinationStaNo1(param.getStaNo1());  // 目标站
//        command.setAckFinish2((short) 0);  // 任务完成确认位
//        command.setTaskNo2((short) 0); // 工作号
//        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
//        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
//        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand((short) 0);
        return rgvControl(command)? R.ok(): R.error();
    }
    @ManagerAuth(memo = "取货")
    @PostMapping("/operator/take")
    public R rgvFetch(RgvOperatorParam param){
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 0);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setTaskMode1(RgvTaskModeType.FETCH); // 任务模式: 取货
        command.setSourceStaNo1(param.getSourceStaNo1()); // 源站
        command.setDestinationStaNo1(param.getStaNo1());  // 目标站
        command.setAckFinish2((short) 0);  // 任务完成确认位
        command.setTaskNo2((short) 0); // 工作号
        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand((short) 0);
        return rgvControl(command)? R.ok(): R.error();
    }
    @ManagerAuth(memo = "放货")
    @PostMapping("/operator/stockMove")
    public R rgvPut(RgvOperatorParam param){
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 0);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setTaskMode1(RgvTaskModeType.PUT); // 任务模式: 放货
        command.setSourceStaNo1(param.getSourceStaNo1()); // 源站
        command.setDestinationStaNo1(param.getStaNo1());  // 目标站
        command.setAckFinish2((short) 0);  // 任务完成确认位
        command.setTaskNo2((short) 0); // 工作号
        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand((short) 0);
        return rgvControl(command)? R.ok(): R.error();
    }
    @ManagerAuth(memo = "任务完成")
    @PostMapping("/operator/taskComplete")
    public R rgvTaskComplete(RgvOperatorParam param){
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 1);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo1((short) 0); // 源站
        command.setDestinationStaNo1((short) 0);  // 目标站
        command.setAckFinish2((short) 1);  // 任务完成确认位
        command.setTaskNo2((short) 0); // 工作号
        command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo2((short) 0); // 源站
        command.setDestinationStaNo2((short) 0);  // 目标站
        command.setCommand((short) 0);
        return rgvControl(command)? R.ok(): R.error();
    }
    @ManagerAuth(memo = "清除命令")
    @PostMapping("/operator/clearCommand")
    public R rgvClearCommand(RgvOperatorParam param){
        if (param.getRgvNo() == null) {
            throw new CoolException("请选择RGV号");
        }
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 0);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo1((short) 0); // 源站
        command.setDestinationStaNo1((short) 0);  // 目标站
        command.setAckFinish2((short) 0);  // 任务完成确认位
        command.setTaskNo2((short) 0); // 工作号
        command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo2((short) 0); // 源站
        command.setDestinationStaNo2((short) 0);  // 目标站
        command.setCommand((short) 0);
        return rgvControl(command)? R.ok(): R.error();
    }
    @ManagerAuth(memo = "手动复位")
    @PostMapping("/operator/handleReset")
    public R handleReset(RgvOperatorParam param) throws Exception {
        if (param.getRgvNo() == null) {
            throw new CoolException("请选择RGV");
        }
        // 获取RGV缓存
        for (RgvSlave rgv : slaveProperties.getRgv()) {
            // 获取RGV信息
            if (param.getRgvNo().equals(rgv.getId())) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
                if (rgvThread == null) {
                    throw new CoolException("RGV不在线");
                }
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    throw new CoolException("RGV不在线");
                }
                RgvCommand Command = new RgvCommand();
                Command.setRgvNo(rgv.getId()); // RGV编号
                Command.setTaskMode1(RgvTaskModeType.NONE);
                Command.setAckFinish1((short) 0);  // 任务完成确认位
                Command.setAckFinish2((short) 0);  // 任务完成确认位
                Command.setCommand((short) 0);  // 任务完成确认位
                // 延时发送
                Thread.sleep(1000L);
                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, Command))) {
                    return R.ok();
                } else {
                    throw new CoolException("命令下发失败");
                }
            }
        }
        return R.error();
    }
    private boolean rgvControl(RgvCommand command){
        if (command.getRgvNo() == null) {
            throw new CoolException("请选择RGV");
        }
        for (RgvSlave rgv : slaveProperties.getRgv()) {
            // 获取RGV信息
            if (command.getRgvNo().equals(rgv.getId())) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
                if (rgvThread == null) {
                    throw new CoolException("RGV不在线");
                }
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    throw new CoolException("RGV不在线");
                }
                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, command))) {
                    return true;
                } else {
                    throw new CoolException("命令下发失败");
                }
            }
        }
        return false;
    }
}
}