package com.zy.asrs.controller; 
 | 
  
 | 
import com.alibaba.fastjson.JSON; 
 | 
import com.baomidou.mybatisplus.mapper.EntityWrapper; 
 | 
import com.core.annotations.ManagerAuth; 
 | 
import com.core.common.BaseRes; 
 | 
import com.core.common.Cools; 
 | 
import com.core.common.R; 
 | 
import com.core.exception.CoolException; 
 | 
import com.zy.asrs.domain.param.LiftOperatorParam; 
 | 
import com.zy.asrs.domain.vo.*; 
 | 
import com.zy.asrs.entity.BasLift; 
 | 
import com.zy.asrs.service.BasLiftService; 
 | 
import com.zy.common.service.CommonService; 
 | 
import com.zy.common.utils.NyLiftUtils; 
 | 
import com.zy.common.utils.RedisUtil; 
 | 
import com.zy.core.cache.MessageQueue; 
 | 
import com.zy.core.cache.OutputQueue; 
 | 
import com.zy.core.cache.SlaveConnection; 
 | 
import com.zy.core.enums.LiftProtocolStatusType; 
 | 
import com.zy.core.enums.NyLiftTaskModelType; 
 | 
import com.zy.core.enums.SlaveType; 
 | 
import com.zy.core.model.LiftSlave; 
 | 
import com.zy.core.model.Task; 
 | 
import com.zy.core.model.command.*; 
 | 
import com.zy.core.model.protocol.LiftProtocol; 
 | 
import com.zy.core.model.protocol.LiftStaProtocol; 
 | 
import com.zy.core.properties.SlaveProperties; 
 | 
import com.zy.core.thread.LiftThread; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.web.bind.annotation.*; 
 | 
  
 | 
import java.util.ArrayList; 
 | 
import java.util.List; 
 | 
  
 | 
/** 
 | 
 * 提升机接口 
 | 
 */ 
 | 
@Slf4j 
 | 
@RestController 
 | 
@RequestMapping("/lift") 
 | 
public class LiftController { 
 | 
  
 | 
    @Autowired 
 | 
    private SlaveProperties slaveProperties; 
 | 
    @Autowired 
 | 
    private BasLiftService basLiftService; 
 | 
    @Autowired 
 | 
    private CommonService commonService; 
 | 
    @Autowired 
 | 
    private RedisUtil redisUtil; 
 | 
  
 | 
    @PostMapping("/table/lift/state") 
 | 
    @ManagerAuth(memo = "提升机信息表") 
 | 
    public R liftStateTable(){ 
 | 
        List<LiftStateTableVo> list = new ArrayList<>(); 
 | 
        for (LiftSlave slave : slaveProperties.getLift()) { 
 | 
            // 表格行 
 | 
            LiftStateTableVo vo = new LiftStateTableVo(); 
 | 
            vo.setLiftNo(slave.getId());   //提升机号 
 | 
            list.add(vo); 
 | 
            // 获取提升机信息 
 | 
            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, slave.getId()); 
 | 
            if (liftThread == null) { 
 | 
                vo.setProtocolStatus(LiftProtocolStatusType.OFFLINE.id);//离线 
 | 
                continue; 
 | 
            } 
 | 
            LiftProtocol liftProtocol = liftThread.getLiftProtocol(); 
 | 
            if (liftProtocol == null || liftProtocol.getLiftNo()==null) { 
 | 
                continue; 
 | 
            } 
 | 
            vo.setTaskNo(liftProtocol.getTaskNo());  //  任务号 
 | 
            vo.setProtocolStatus(liftProtocol.getProtocolStatusType().id); 
 | 
            vo.setModel(liftProtocol.getModel()); 
 | 
            vo.setBusy(liftProtocol.getBusy()); 
 | 
            vo.setHasTray(liftProtocol.getHasTray()); 
 | 
            vo.setHasCar(liftProtocol.getHasCar()); 
 | 
            vo.setDeviceError(liftProtocol.getDeviceError()); 
 | 
            vo.setFrontOverrun(liftProtocol.getFrontOverrun()); 
 | 
            vo.setBackOverrun(liftProtocol.getBackOverrun()); 
 | 
            vo.setLeftOverrun(liftProtocol.getLeftOverrun()); 
 | 
            vo.setRightOverrun(liftProtocol.getRightOverrun()); 
 | 
            vo.setOverHeight(liftProtocol.getOverHeight()); 
 | 
            vo.setOverWeight(liftProtocol.getOverWeight()); 
 | 
        } 
 | 
        return R.ok().add(list); 
 | 
    } 
 | 
  
 | 
    @PostMapping("/table/lift/msg") 
 | 
    @ManagerAuth(memo = "提升机数据表") 
 | 
    public R liftMsgTable(){ 
 | 
        List<LiftMsgTableVo> list = new ArrayList<>(); 
 | 
        for (LiftSlave slave : slaveProperties.getLift()) { 
 | 
            // 表格行 
 | 
            LiftMsgTableVo vo = new LiftMsgTableVo(); 
 | 
            vo.setLiftNo(slave.getId());   //  提升机号 
 | 
            list.add(vo); 
 | 
            // 获取提升机信息 
 | 
            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, slave.getId()); 
 | 
            if (liftThread == null) { 
 | 
                continue; 
 | 
            } 
 | 
            LiftProtocol liftProtocol = liftThread.getLiftProtocol(); 
 | 
            if (liftProtocol == null) { 
 | 
                continue; 
 | 
            } 
 | 
  
 | 
            vo.setWorkNo(liftProtocol.getTaskNo().intValue());//任务号 
 | 
            vo.setPakMk(liftProtocol.getPakMk()?"Y" : "N");    // 作业标记 
 | 
            vo.setLev(liftProtocol.getLev()); 
 | 
            vo.setTaskAddress(liftProtocol.getTaskAddress()); 
 | 
            vo.setDistAddress(liftProtocol.getDistAddress()); 
 | 
            vo.setCompleteTaskNo(liftProtocol.getCompleteTaskNo()); 
 | 
            vo.setShuttleNo(liftProtocol.getShuttleNo().intValue()); 
 | 
            vo.setToken(liftProtocol.getToken());//令牌 
 | 
        } 
 | 
        return R.ok().add(list); 
 | 
    } 
 | 
  
 | 
    @PostMapping("/output/lift") 
 | 
    @ManagerAuth 
 | 
    public R liftOutput(){ 
 | 
        StringBuilder str = new StringBuilder(); 
 | 
        String s; 
 | 
        int i = 0; 
 | 
        while((s = OutputQueue.LIFT.poll()) != null && i <=10) { 
 | 
            str.append("\n").append(s); 
 | 
            i++; 
 | 
        } 
 | 
        return R.ok().add(str.toString()); 
 | 
    } 
 | 
  
 | 
    @GetMapping("/detl/{liftNo}") 
 | 
    public R liftDetl(@PathVariable("liftNo") Integer liftNo){ 
 | 
        LiftDataVo vo = new LiftDataVo(); 
 | 
        for (LiftSlave liftSlave : slaveProperties.getLift()) { 
 | 
            if (liftNo.equals(liftSlave.getId())) { 
 | 
                vo.setLiftNo(liftSlave.getId()); 
 | 
                BasLift basLift = basLiftService.selectById(liftSlave.getId()); 
 | 
                if (!Cools.isEmpty(basLift)) { 
 | 
                    vo.setWorkNo(basLift.getWrkNo()); 
 | 
                    vo.setPakMk(basLift.getPakMk()); 
 | 
                } 
 | 
                break; 
 | 
            } 
 | 
        } 
 | 
        return R.ok().add(vo); 
 | 
    } 
 | 
  
 | 
    @GetMapping("/sensor/detl/{liftNo}") 
 | 
    public R liftSensorDetl(@PathVariable("liftNo") Integer liftNo){ 
 | 
        LiftSensorDataVo vo = new LiftSensorDataVo(); 
 | 
        for (LiftSlave liftSlave : slaveProperties.getLift()) { 
 | 
            if (liftNo.equals(liftSlave.getId())) { 
 | 
                vo.setLiftNo(liftSlave.getId()); 
 | 
                // 获取提升机信息 
 | 
                LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId()); 
 | 
                if (liftThread == null) { 
 | 
                    return R.error("设备不在线"); 
 | 
                } 
 | 
                LiftProtocol liftProtocol = liftThread.getLiftProtocol(); 
 | 
                if (liftProtocol == null) { 
 | 
                    return R.error("设备不在线"); 
 | 
                } 
 | 
  
 | 
                break; 
 | 
            } 
 | 
        } 
 | 
        return R.ok().add(vo); 
 | 
    } 
 | 
  
 | 
    /****************************************************************/ 
 | 
    /************************** 手动操作 ******************************/ 
 | 
    /****************************************************************/ 
 | 
  
 | 
    @ManagerAuth(memo = "手动操作") 
 | 
    @PostMapping("/operator/lift") 
 | 
    public R liftOperator(LiftOperatorParam param){ 
 | 
        if (Cools.isEmpty(param.getLiftNo())) { 
 | 
            return R.parse(BaseRes.PARAM); 
 | 
        } 
 | 
  
 | 
        for (LiftSlave liftSlave : slaveProperties.getLift()) { 
 | 
            if (param.getLiftNo().equals(liftSlave.getId())) { 
 | 
                LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId()); 
 | 
                if (liftThread == null) { 
 | 
                    throw new CoolException("提升机不在线"); 
 | 
                } 
 | 
                LiftProtocol liftProtocol = liftThread.getLiftProtocol(); 
 | 
                if (liftProtocol == null) { 
 | 
                    throw new CoolException("提升机不在线"); 
 | 
                } 
 | 
  
 | 
                if (param.getLiftTaskMode() == 1) { 
 | 
                    //提升机升降楼层 
 | 
                    int workNo = commonService.getWorkNo(3);//获取任务号 
 | 
  
 | 
                    Integer startSta = null; 
 | 
                    Integer targetSta = null; 
 | 
                    for (LiftStaProtocol liftStaProtocol : liftThread.getLiftStaProtocols()) { 
 | 
                        if (liftStaProtocol.getLev() == liftProtocol.getLev().intValue()) { 
 | 
                            startSta = liftStaProtocol.getStaNo(); 
 | 
                        } 
 | 
  
 | 
                        if (liftStaProtocol.getLev() == param.getLev()) { 
 | 
                            targetSta = liftStaProtocol.getStaNo(); 
 | 
                        } 
 | 
                    } 
 | 
  
 | 
                    if (startSta == null || targetSta == null) { 
 | 
                        throw new CoolException("起点或目标点不存在"); 
 | 
                    } 
 | 
  
 | 
                    //获取提升机命令 
 | 
                    NyLiftCommand liftCommand = NyLiftUtils.getLiftCommand(liftProtocol.getLiftNo().intValue(), NyLiftTaskModelType.MOVE_CAR.id, startSta, targetSta, workNo); 
 | 
                    ArrayList<NyLiftCommand> commands = new ArrayList<>(); 
 | 
                    commands.add(liftCommand); 
 | 
  
 | 
                    //提交到线程去工作 
 | 
                    LiftAssignCommand assignCommand = new LiftAssignCommand(); 
 | 
                    assignCommand.setCommands(commands); 
 | 
                    assignCommand.setLiftNo(liftProtocol.getLiftNo()); 
 | 
                    assignCommand.setTaskNo((short) workNo); 
 | 
                    assignCommand.setAuto(false);//手动模式 
 | 
                    assignCommand.setTaskMode(NyLiftTaskModelType.MOVE_CAR.id.shortValue()); 
 | 
  
 | 
                    if (MessageQueue.offer(SlaveType.Lift, liftSlave.getId(), new Task(3, assignCommand))) { 
 | 
                        return R.ok(); 
 | 
                    } else { 
 | 
                        throw new CoolException("命令下发失败"); 
 | 
                    } 
 | 
                } else if (param.getLiftTaskMode() == 2) { 
 | 
                    //移动托盘 
 | 
                    int workNo = commonService.getWorkNo(3);//获取任务号 
 | 
  
 | 
//                    LiftStaProtocol sourceLiftSta = NyLiftUtils.getLiftStaByStaNo(param.getSourceStaNo()); 
 | 
//                    LiftStaProtocol liftSta = NyLiftUtils.getLiftStaByStaNo(param.getStaNo()); 
 | 
//                    if (sourceLiftSta == null || liftSta == null) { 
 | 
//                        throw new CoolException("源站或目标站不存在"); 
 | 
//                    } 
 | 
  
 | 
                    //获取提升机命令 
 | 
                    NyLiftCommand liftCommand = NyLiftUtils.getLiftCommand(liftProtocol.getLiftNo().intValue(), NyLiftTaskModelType.MOVE_TRAY.id, param.getSourceStaNo(), param.getStaNo(), workNo); 
 | 
                    ArrayList<NyLiftCommand> commands = new ArrayList<>(); 
 | 
                    commands.add(liftCommand); 
 | 
  
 | 
                    //提交到线程去工作 
 | 
                    LiftAssignCommand assignCommand = new LiftAssignCommand(); 
 | 
                    assignCommand.setCommands(commands); 
 | 
                    assignCommand.setLiftNo(liftProtocol.getLiftNo()); 
 | 
                    assignCommand.setTaskNo((short) workNo); 
 | 
                    assignCommand.setAuto(false);//手动模式 
 | 
                    assignCommand.setTaskMode(NyLiftTaskModelType.MOVE_TRAY.id.shortValue()); 
 | 
  
 | 
                    if (MessageQueue.offer(SlaveType.Lift, liftSlave.getId(), new Task(3, assignCommand))) { 
 | 
                        return R.ok(); 
 | 
                    } else { 
 | 
                        throw new CoolException("命令下发失败"); 
 | 
                    } 
 | 
                } else if (param.getLiftTaskMode() == 0) { 
 | 
                    //提升机复位 
 | 
                    liftProtocol.setToken(0); 
 | 
                    liftProtocol.setProtocolStatusType(LiftProtocolStatusType.IDLE); 
 | 
                } else { 
 | 
                    throw new CoolException("未知命令"); 
 | 
                } 
 | 
  
 | 
            } 
 | 
        } 
 | 
        return R.error(); 
 | 
    } 
 | 
  
 | 
    @PostMapping("/detl/update") 
 | 
    @ManagerAuth(memo = "修改数据") 
 | 
    public R liftUpdate(@RequestParam Integer liftNo, 
 | 
                        @RequestParam Short workNo, 
 | 
                        @RequestParam String pakMk, 
 | 
                        @RequestParam Integer token) { 
 | 
        LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo); 
 | 
        if (liftThread == null) { 
 | 
            return R.error("plc已掉线"); 
 | 
        } 
 | 
        LiftProtocol liftProtocol = liftThread.getLiftProtocol(); 
 | 
        if (liftProtocol == null) { 
 | 
            return R.error("plc已掉线"); 
 | 
        } 
 | 
        if (workNo != null) { 
 | 
            liftProtocol.setTaskNo(workNo); 
 | 
        } 
 | 
        if (pakMk != null) { 
 | 
            liftProtocol.setPakMk(pakMk.equals("Y")); 
 | 
        } 
 | 
        if (token != null) { 
 | 
            liftProtocol.setToken(token); 
 | 
        } 
 | 
        return R.ok(); 
 | 
    } 
 | 
  
 | 
    @RequestMapping(value = "/command/query") 
 | 
    public R liftCommandQuery(@RequestParam("wrkNo") Integer wrkNo) { 
 | 
        Object o = redisUtil.get("lift_wrk_no_" + wrkNo); 
 | 
        if (o == null) { 
 | 
            return R.error(); 
 | 
        } 
 | 
        LiftRedisCommand redisCommand = JSON.parseObject(o.toString(), LiftRedisCommand.class); 
 | 
        return R.ok().add(redisCommand); 
 | 
    } 
 | 
  
 | 
    //回退命令 
 | 
    @RequestMapping(value = "/command/rollback") 
 | 
    public R liftCommandRollback(@RequestParam("wrkNo") Integer wrkNo 
 | 
            , @RequestParam("commandStep") Integer commandStep) { 
 | 
        Object o = redisUtil.get("lift_wrk_no_" + wrkNo); 
 | 
        if (o == null) { 
 | 
            return R.error(); 
 | 
        } 
 | 
        LiftRedisCommand redisCommand = JSON.parseObject(o.toString(), LiftRedisCommand.class); 
 | 
        redisCommand.setCommandStep(commandStep); 
 | 
        redisUtil.set("lift_wrk_no_" + wrkNo, JSON.toJSONString(redisCommand)); 
 | 
        return R.ok(); 
 | 
    } 
 | 
  
 | 
    //命令完成状态切换 
 | 
    @RequestMapping(value = "/command/completeSwitch") 
 | 
    public R liftCommandCompleteSwitch(@RequestParam("wrkNo") Integer wrkNo 
 | 
            , @RequestParam("commandStep") Integer commandStep 
 | 
            , @RequestParam("complete") Integer complete) { 
 | 
        Object o = redisUtil.get("lift_wrk_no_" + wrkNo); 
 | 
        if (o == null) { 
 | 
            return R.error(); 
 | 
        } 
 | 
        LiftRedisCommand redisCommand = JSON.parseObject(o.toString(), LiftRedisCommand.class); 
 | 
        LiftAssignCommand assignCommand = redisCommand.getAssignCommand(); 
 | 
        List<NyLiftCommand> commands = assignCommand.getCommands(); 
 | 
        NyLiftCommand command = commands.get(commandStep); 
 | 
        command.setComplete(complete != 0); 
 | 
        redisUtil.set("lift_wrk_no_" + wrkNo, JSON.toJSONString(redisCommand)); 
 | 
        return R.ok(); 
 | 
    } 
 | 
  
 | 
    //重启任务(命令) 
 | 
    @RequestMapping(value = "/command/restart") 
 | 
    public R liftCommandCompleteSwitch(@RequestParam("wrkNo") Integer wrkNo) { 
 | 
        Object o = redisUtil.get("lift_wrk_no_" + wrkNo); 
 | 
        if (o == null) { 
 | 
            return R.error(); 
 | 
        } 
 | 
        LiftRedisCommand redisCommand = JSON.parseObject(o.toString(), LiftRedisCommand.class); 
 | 
        Short liftNo = redisCommand.getLiftNo(); 
 | 
        LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo.intValue()); 
 | 
        if (liftThread == null) { 
 | 
            return R.error(); 
 | 
        } 
 | 
        LiftProtocol liftProtocol = liftThread.getLiftProtocol(); 
 | 
        if (liftProtocol == null) { 
 | 
            return R.error(); 
 | 
        } 
 | 
        if (!liftProtocol.isIdle()) { 
 | 
            return R.error(); 
 | 
        } 
 | 
        //提升机处于空闲状态,进行任务的恢复 
 | 
        liftProtocol.setTaskNo(redisCommand.getWrkNo());//将提升机线程分配任务号 
 | 
        liftProtocol.setProtocolStatus(LiftProtocolStatusType.WORKING);//工作状态 
 | 
        return R.ok(); 
 | 
    } 
 | 
  
 | 
    //删除任务(命令) 
 | 
    @RequestMapping(value = "/command/del") 
 | 
    public R liftCommandDel(@RequestParam("wrkNo") Integer wrkNo) { 
 | 
        Object o = redisUtil.get("lift_wrk_no_" + wrkNo); 
 | 
        if (o == null) { 
 | 
            return R.error(); 
 | 
        } 
 | 
        redisUtil.del("lift_wrk_no_" + wrkNo); 
 | 
        return R.ok(); 
 | 
    } 
 | 
  
 | 
} 
 |