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.Cools;
|
import com.core.common.R;
|
import com.core.exception.CoolException;
|
import com.zy.asrs.domain.enums.CrnStatusType;
|
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.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.WrkMast;
|
import com.zy.asrs.mapper.BasCrnErrorMapper;
|
import com.zy.asrs.service.BasCrnpService;
|
import com.zy.asrs.service.WrkMastService;
|
import com.zy.asrs.service.impl.MainServiceImpl;
|
import com.zy.core.CrnThread;
|
import com.zy.core.cache.MessageQueue;
|
import com.zy.core.cache.OutputQueue;
|
import com.zy.core.cache.SlaveConnection;
|
import com.zy.core.enums.CrnLiftPosType;
|
import com.zy.core.enums.CrnModeType;
|
import com.zy.core.enums.CrnTaskModeType;
|
import com.zy.core.enums.SlaveType;
|
import com.zy.core.model.CrnSlave;
|
import com.zy.core.model.Task;
|
import com.zy.core.model.command.CrnCommand;
|
import com.zy.core.model.protocol.CrnProtocol;
|
import com.zy.core.properties.SlaveProperties;
|
import com.zy.core.properties.SystemProperties;
|
import lombok.extern.slf4j.Slf4j;
|
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 java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* 堆垛机接口
|
* Created by vincent on 2020-06-01
|
*/
|
@Slf4j
|
@RestController
|
@RequestMapping("/crn")
|
public class CrnController {
|
|
@Autowired
|
private SlaveProperties slaveProperties;
|
@Autowired
|
private WrkMastService wrkMastService;
|
@Autowired
|
private BasCrnErrorMapper basCrnErrorMapper;
|
@Autowired
|
private BasCrnpService basCrnpService;
|
@Autowired
|
private MainServiceImpl mainService;
|
|
|
@ManagerAuth(memo = "进行中的命令")
|
@PostMapping("/command/ongoing")
|
public R ongoingCommand(){
|
List<CommandLogVo> list = new ArrayList<>();
|
for (CrnSlave crn : slaveProperties.getCrn()) {
|
CommandLogVo vo = new CommandLogVo();
|
vo.setCrnNo(crn.getId()); // 堆垛机号
|
vo.setStatus(0); // 状态
|
list.add(vo);
|
// 获取堆垛机信息
|
CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
|
if (crnThread == null) {
|
continue;
|
}
|
CrnProtocol crnProtocol = crnThread.getCrnProtocol();
|
if (crnProtocol == null) {
|
continue;
|
}
|
vo.setStatus(1); // 状态
|
Task task = MessageQueue.peek(SlaveType.Crn, crn.getId());
|
if (task != null) {
|
vo.setCommand(JSON.toJSONString((CrnCommand)task.getData()));
|
}
|
}
|
return R.ok().add(list);
|
}
|
|
@PostMapping("/table/crn/state")
|
@ManagerAuth(memo = "堆垛机信息表")
|
public R crnStateTable(){
|
List<CrnStateTableVo> list = new ArrayList<>();
|
List<BasCrnp> crnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().orderBy("crn_no"));
|
for (BasCrnp basCrnp : crnps) {
|
// 表格行
|
CrnStateTableVo vo = new CrnStateTableVo();
|
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.selectById(crnProtocol.getTaskNo());
|
// if (wrkMast != null) {
|
// vo.setStatusType(CrnStatusType.process(wrkMast.getIoType()).getDesc()); // 模式状态
|
// }
|
// } else {
|
//
|
// }
|
vo.setStatusType(crnProtocol.modeType.desc); // 模式状态
|
vo.setStatus(crnProtocol.getStatusType().desc); // 状态
|
vo.setLoading(crnProtocol.getLoaded()==1?"有物":"无物"); // 有物
|
vo.setBay(crnProtocol.getBay()); // 列
|
vo.setLev(crnProtocol.getLevel()); // 层
|
vo.setXOrigin(crnProtocol.getBay()==1?"是":"否"); // 走行原点
|
vo.setYOrigin(crnProtocol.getLevel()==1?"是":"否"); // 升降原点
|
vo.setForkOffset(crnProtocol.getForkPosType().desc); // 货叉位置
|
vo.setXLocation(crnProtocol.getWalkPos() == 1?"是":"否"); // 走行定位
|
vo.setYLocation(crnProtocol.getLiftPosType().equals(CrnLiftPosType.NONE)?"否":"是"); // 升降定位
|
// vo.setStop(crnProtocol.getCrnError1().controlStop||crnProtocol.getCrnError1().mainStop||crnProtocol.getCrnError1().remoteStop?"是":"否"); // 急停
|
vo.setWarnCode(String.valueOf(crnProtocol.getAlarm1())); // 异常码
|
}
|
return R.ok().add(list);
|
}
|
|
@PostMapping("/table/crn/msg")
|
@ManagerAuth(memo = "堆垛机数据表")
|
public R crnMsgTable(){
|
List<CrnMsgTableVo> list = new ArrayList<>();
|
List<BasCrnp> crnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().orderBy("crn_no"));
|
for (BasCrnp basCrnp : crnps) {
|
// 表格行
|
CrnMsgTableVo vo = new CrnMsgTableVo();
|
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()); // 任务号
|
BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm1());
|
if (null != crnError) {
|
vo.setError(crnError.getErrName());
|
}
|
if (crnProtocol.getTaskNo()>0) {
|
WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo());
|
if (wrkMast != null) {
|
vo.setStatus(CrnStatusType.process(wrkMast.getIoType()).getDesc()); // 模式状态
|
vo.setSourceStaNo(wrkMast.getSourceStaNo$()); // 源站
|
vo.setStaNo(wrkMast.getStaNo$()); // 目标站
|
vo.setSourceLocNo(wrkMast.getSourceLocNo()); // 源库位
|
vo.setLocNo(wrkMast.getLocNo()); // 目标库位
|
}
|
} else {
|
vo.setStatus(crnProtocol.modeType.equals(CrnModeType.AUTO)? CrnStatusType.MACHINE_AUTO.getDesc(): CrnStatusType.MACHINE_UN_AUTO.getDesc()); // 模式状态
|
}
|
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)
|
}
|
return R.ok().add(list);
|
}
|
|
@PostMapping("/output/site")
|
@ManagerAuth(memo = "堆垛机报文日志输出")
|
public R crnOutput(){
|
StringBuilder str = new StringBuilder();
|
String s;
|
int i = 0;
|
while((s = OutputQueue.CRN.poll()) != null && i <=10) {
|
str.append("\n").append(s);
|
i++;
|
}
|
return R.ok().add(str.toString());
|
}
|
|
@PostMapping("/demo/switch")
|
@ManagerAuth(memo = "堆垛机演示")
|
public R crnDemo(CrnDemoParam param) throws InterruptedException {
|
if (Cools.isEmpty(param.getCrnId())){
|
return R.error();
|
}
|
if (Cools.isEmpty(param.getPassword())){
|
return R.error("请输入口令");
|
}
|
if (!param.getPassword().equals(SystemProperties.WCS_PASSWORD)){
|
return R.error("口令错误");
|
}
|
Thread.sleep(200L);
|
mainService.crnDemoOfLocMove(param.getCrnId());
|
return R.ok();
|
}
|
|
|
/****************************************************************/
|
/************************** 手动操作 ******************************/
|
/****************************************************************/
|
|
@ManagerAuth(memo = "入库")
|
@PostMapping("/operator/put")
|
public R crnPut(CrnOperatorParam param){
|
CrnCommand command = new CrnCommand();
|
command.setCrnNo(param.getCrnNo()); // 堆垛机编号
|
command.setTaskNo((short) 0); // 工作号
|
command.setAckFinish((short) 0); // 任务完成确认位
|
command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式
|
command.setSourcePosX(param.getSourceRow()); // 源库位排
|
command.setSourcePosY(param.getSourceBay()); // 源库位列
|
command.setSourcePosZ(param.getSourceLev()); // 源库位层
|
command.setDestinationPosX(param.getRow()); // 目标库位排
|
command.setDestinationPosY(param.getBay()); // 目标库位列
|
command.setDestinationPosZ(param.getLev()); // 目标库位层
|
staNoProcess(param, command);
|
return crnControl(command)?R.ok():R.error();
|
}
|
|
@ManagerAuth(memo = "出库")
|
@PostMapping("/operator/take")
|
public R crnTake(CrnOperatorParam param){
|
CrnCommand command = new CrnCommand();
|
command.setCrnNo(param.getCrnNo()); // 堆垛机编号
|
command.setTaskNo((short) 0); // 工作号
|
command.setAckFinish((short) 0); // 任务完成确认位
|
command.setTaskMode(CrnTaskModeType.PAKOUT); // 任务模式
|
command.setSourcePosX(param.getSourceRow()); // 源库位排
|
command.setSourcePosY(param.getSourceBay()); // 源库位列
|
command.setSourcePosZ(param.getSourceLev()); // 源库位层
|
command.setDestinationPosX(param.getRow()); // 目标库位排
|
command.setDestinationPosY(param.getBay()); // 目标库位列
|
command.setDestinationPosZ(param.getLev()); // 目标库位层
|
staNoProcess(param, command);
|
return crnControl(command)?R.ok():R.error();
|
}
|
|
@ManagerAuth(memo = "库位转移")
|
@PostMapping("/operator/stockMove")
|
public R crnStockMove(CrnOperatorParam param){
|
CrnCommand command = new CrnCommand();
|
command.setCrnNo(param.getCrnNo()); // 堆垛机编号
|
command.setTaskNo((short) 0); // 工作号
|
command.setAckFinish((short) 0); // 任务完成确认位
|
command.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式
|
command.setSourcePosX(param.getSourceRow()); // 源库位排
|
command.setSourcePosY(param.getSourceBay()); // 源库位列
|
command.setSourcePosZ(param.getSourceLev()); // 源库位层
|
command.setDestinationPosX(param.getRow()); // 目标库位排
|
command.setDestinationPosY(param.getBay()); // 目标库位列
|
command.setDestinationPosZ(param.getLev()); // 目标库位层
|
staNoProcess(param, command);
|
return crnControl(command)?R.ok():R.error();
|
}
|
|
@ManagerAuth(memo = "站到站")
|
@PostMapping("/operator/siteMove")
|
public R crnSiteMove(CrnOperatorParam param){
|
CrnCommand command = new CrnCommand();
|
command.setCrnNo(param.getCrnNo()); // 堆垛机编号
|
command.setTaskNo((short) 0); // 工作号
|
command.setAckFinish((short) 0); // 任务完成确认位
|
command.setTaskMode(CrnTaskModeType.SITE_MOVE); // 任务模式
|
command.setSourcePosX(param.getSourceStaNo()); // 源库位排
|
command.setSourcePosY((short) 0); // 源库位列
|
command.setSourcePosZ((short) 1); // 源库位层
|
command.setDestinationPosX(param.getStaNo()); // 目标库位排
|
command.setDestinationPosY((short) 0); // 目标库位列
|
command.setDestinationPosZ((short) 1); // 目标库位层
|
staNoProcess(param, command);
|
return crnControl(command)?R.ok():R.error();
|
}
|
|
@ManagerAuth(memo = "回原点")
|
@PostMapping("/operator/bacOrigin")
|
public R crnBacOrigin(CrnOperatorParam param){
|
CrnCommand command = new CrnCommand();
|
command.setCrnNo(param.getCrnNo()); // 堆垛机编号
|
command.setTaskNo((short) 0); // 工作号
|
command.setAckFinish((short) 0); // 任务完成确认位
|
command.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式
|
command.setSourcePosX((short) 0); // 源库位排
|
command.setSourcePosY((short) 0); // 源库位列
|
command.setSourcePosZ((short) 0); // 源库位层
|
command.setDestinationPosX((short) 0); // 目标库位排
|
command.setDestinationPosY((short) 0); // 目标库位列
|
command.setDestinationPosZ((short) 0); // 目标库位层
|
return crnControl(command)?R.ok():R.error();
|
}
|
|
@ManagerAuth(memo = "反原点")
|
@PostMapping("/operator/reverseOrigin")
|
public R reverseOrigin(CrnOperatorParam param){
|
CrnCommand command = new CrnCommand();
|
command.setCrnNo(param.getCrnNo()); // 堆垛机编号
|
command.setTaskNo((short) 0); // 工作号
|
command.setAckFinish((short) 0); // 任务完成确认位
|
command.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式
|
command.setSourcePosX((short) 0); // 源库位排
|
command.setSourcePosY((short) 0); // 源库位列
|
command.setSourcePosZ((short) 0); // 源库位层
|
command.setDestinationPosX((short) 0); // 目标库位排
|
command.setDestinationPosY((short) 34); // 目标库位列
|
command.setDestinationPosZ((short) 5); // 目标库位层
|
return crnControl(command)?R.ok():R.error();
|
}
|
|
@ManagerAuth(memo = "坐标移动")
|
@PostMapping("/operator/coorMove")
|
public R crnCoorMove(CrnOperatorParam param){
|
CrnCommand command = new CrnCommand();
|
command.setCrnNo(param.getCrnNo()); // 堆垛机编号
|
command.setTaskNo((short) 0); // 工作号
|
command.setAckFinish((short) 0); // 任务完成确认位
|
command.setTaskMode(CrnTaskModeType.OFFSET_MOVE); // 任务模式
|
command.setSourcePosX(param.getSourceRow()); // 源库位排
|
command.setSourcePosY(param.getSourceBay()); // 源库位列
|
command.setSourcePosZ(param.getSourceLev()); // 源库位层
|
command.setDestinationPosX(param.getRow()); // 目标库位排
|
command.setDestinationPosY(param.getBay()); // 目标库位列
|
command.setDestinationPosZ(param.getLev()); // 目标库位层
|
staNoProcess(param, command);
|
return crnControl(command)?R.ok():R.error();
|
}
|
|
@ManagerAuth(memo = "任务完成")
|
@PostMapping("/operator/taskComplete")
|
public R crnTaskComplete(CrnOperatorParam param){
|
CrnCommand command = new CrnCommand();
|
command.setCrnNo(param.getCrnNo()); // 堆垛机编号
|
command.setTaskNo((short) 0); // 工作号
|
command.setAckFinish((short) 1); // 任务完成确认位
|
command.setTaskMode(CrnTaskModeType.NONE); // 任务模式
|
command.setSourcePosX((short) 0); // 源库位排
|
command.setSourcePosY((short) 0); // 源库位列
|
command.setSourcePosZ((short) 0); // 源库位层
|
command.setDestinationPosX((short) 0); // 目标库位排
|
command.setDestinationPosY((short) 0); // 目标库位列
|
command.setDestinationPosZ((short) 0); // 目标库位层
|
return crnControl(command)?R.ok():R.error();
|
}
|
|
// @ManagerAuth(memo = "暂停")
|
// @PostMapping("/operator/pause")
|
// public R crnPause(CrnOperatorParam param){
|
// return R.ok("暂停成功");
|
// }
|
//
|
// @ManagerAuth(memo = "启动")
|
// @PostMapping("/operator/boot")
|
// public R crnBoot(CrnOperatorParam param){
|
// return R.ok("启动成功");
|
// }
|
|
@ManagerAuth(memo = "清除命令")
|
@PostMapping("/operator/clearCommand")
|
public R crnClearCommand(CrnOperatorParam param){
|
if (param.getCrnNo() == null) {
|
throw new CoolException("请选择堆垛机");
|
}
|
MessageQueue.clear(SlaveType.Crn, param.getCrnNo());
|
return R.ok("清除命令成功");
|
}
|
|
@ManagerAuth(memo = "手动复位")
|
@PostMapping("/operator/handleReset")
|
public R handleReset(CrnOperatorParam param) throws Exception {
|
if (param.getCrnNo() == null) {
|
throw new CoolException("请选择堆垛机");
|
}
|
// 获取堆垛机缓存
|
for (CrnSlave crn : slaveProperties.getCrn()) {
|
// 获取堆垛机信息
|
if (param.getCrnNo().equals(crn.getId())) {
|
CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
|
if (crnThread == null) {
|
throw new CoolException("堆垛机不在线");
|
}
|
CrnProtocol crnProtocol = crnThread.getCrnProtocol();
|
if (crnProtocol == null) {
|
throw new CoolException("堆垛机不在线");
|
}
|
// 只有出现指定异常才进行复位
|
if (crnProtocol.getCrnError3().leftTakeNoneErr
|
|| crnProtocol.getCrnError3().rightTakeNoneErr
|
|| crnProtocol.getCrnError3().leftTakeThenLoadErr
|
|| crnProtocol.getCrnError3().rightTakeThenLoadErr) {
|
CrnCommand command = new CrnCommand();
|
command.setCrnNo(param.getCrnNo()); // 堆垛机编号
|
command.setAckFinish((short) 1); // 任务完成确认位
|
command.setTaskMode(CrnTaskModeType.NONE); // 任务模式
|
// 延时发送
|
Thread.sleep(3000L);
|
if (MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, command))) {
|
return R.ok();
|
} else {
|
throw new CoolException("命令下发失败");
|
}
|
}
|
}
|
}
|
|
return R.error();
|
}
|
|
private boolean crnControl(CrnCommand command){
|
if (command.getCrnNo() == null) {
|
throw new CoolException("请选择堆垛机");
|
}
|
for (CrnSlave crn : slaveProperties.getCrn()) {
|
// 获取堆垛机信息
|
if (command.getCrnNo().equals(crn.getId())) {
|
CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
|
if (crnThread == null) {
|
throw new CoolException("堆垛机不在线");
|
}
|
CrnProtocol crnProtocol = crnThread.getCrnProtocol();
|
if (crnProtocol == null) {
|
throw new CoolException("堆垛机不在线");
|
}
|
// 空闲判断
|
// if (crnProtocol.getStatusType().equals(com.zy.core.enums.CrnStatusType.IDLE) && crnProtocol.getTaskNo() == 0) {
|
if (MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, command))) {
|
return true;
|
} else {
|
throw new CoolException("命令下发失败");
|
}
|
// } else {
|
// throw new CoolException("堆垛机不在空闲状态");
|
// }
|
}
|
}
|
return false;
|
}
|
|
private void staNoProcess(CrnOperatorParam param, CrnCommand command){
|
if (param.getSourceStaNo()!=null) {
|
if (param.getSourceStaNo() == 5) {
|
command.setSourcePosX((short) 2); // 源库位排
|
command.setSourcePosY((short) 0); // 源库位列
|
command.setSourcePosZ((short) 1); // 源库位层
|
} else if (param.getSourceStaNo() == 6) {
|
command.setSourcePosX((short) 1); // 源库位排
|
command.setSourcePosY((short) 0); // 源库位列
|
command.setSourcePosZ((short) 1); // 源库位层
|
}
|
}
|
if (param.getStaNo()!=null) {
|
if (param.getStaNo() == 5) {
|
command.setDestinationPosX((short) 2); // 目标库位排
|
command.setDestinationPosY((short) 0); // 目标库位列
|
command.setDestinationPosZ((short) 1); // 目标库位层
|
} else if (param.getStaNo() == 6) {
|
command.setDestinationPosX((short) 1); // 目标库位排
|
command.setDestinationPosY((short) 0); // 目标库位列
|
command.setDestinationPosZ((short) 1); // 目标库位层
|
}
|
}
|
}
|
|
|
}
|