package com.zy.core.action;
|
|
import com.alibaba.fastjson.JSON;
|
import com.zy.asrs.entity.BasLiftOpt;
|
import com.zy.asrs.service.BasLiftOptService;
|
import com.zy.asrs.service.WrkMastService;
|
import com.zy.common.utils.RedisUtil;
|
import com.zy.core.News;
|
import com.zy.core.cache.SlaveConnection;
|
import com.zy.core.enums.*;
|
import com.zy.core.model.CommandResponse;
|
import com.zy.core.model.command.LiftAssignCommand;
|
import com.zy.core.model.command.LiftCommand;
|
import com.zy.core.model.command.LiftRedisCommand;
|
import com.zy.core.model.protocol.LiftProtocol;
|
import com.zy.core.thread.LiftThread;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
import java.util.Date;
|
import java.util.List;
|
|
@Component
|
public class LiftAction {
|
|
@Autowired
|
private RedisUtil redisUtil;
|
@Autowired
|
private WrkMastService wrkMastService;
|
@Autowired
|
private BasLiftOptService basLiftOptService;
|
|
public synchronized boolean assignWork(Integer liftNo, LiftAssignCommand assignCommand) {
|
LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo);
|
if (liftThread == null) {
|
return false;
|
}
|
|
LiftProtocol liftProtocol = liftThread.getStatus();
|
if (liftProtocol == null) {
|
return false;
|
}
|
|
LiftRedisCommand redisCommand = new LiftRedisCommand();
|
redisCommand.setLiftNo(assignCommand.getLiftNo());//提升机号
|
redisCommand.setWrkNo(assignCommand.getTaskNo());//工作号
|
redisCommand.setCommandStep(0);//命令执行步序
|
redisCommand.setAssignCommand(assignCommand);//命令
|
//任务数据保存到redis
|
if (redisUtil.set(RedisKeyType.LIFT_WORK_FLAG.key + assignCommand.getTaskNo(), JSON.toJSONString(redisCommand))) {
|
liftThread.setSyncTaskNo(assignCommand.getTaskNo().intValue());
|
return true;
|
}
|
return false;
|
}
|
|
public synchronized boolean executeWork(Integer liftNo, Integer taskNo) {
|
Object obj = redisUtil.get(RedisKeyType.LIFT_WORK_FLAG.key + taskNo);
|
if (obj == null) {
|
return false;
|
}
|
|
// WrkMast wrkMast = wrkMastService.selectByWorkNo(taskNo);
|
// if (wrkMast == null) {
|
// return false;
|
// }
|
|
LiftRedisCommand redisCommand = JSON.parseObject(obj.toString(), LiftRedisCommand.class);
|
if (redisCommand == null) {
|
return false;
|
}
|
|
LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo);
|
if (liftThread == null) {
|
return false;
|
}
|
|
LiftProtocol liftProtocol = liftThread.getStatus();
|
if (liftProtocol == null) {
|
return false;
|
}
|
|
List<LiftCommand> commands = redisCommand.getAssignCommand().getCommands();
|
if (commands.isEmpty()) {
|
return false;
|
}
|
|
LiftAssignCommand assignCommand = redisCommand.getAssignCommand();
|
int commandStep = redisCommand.getCommandStep();
|
|
if (commandStep == 0) {
|
//取出命令
|
LiftCommand command = commands.get(commandStep);
|
|
//判断提升机是否空闲
|
if (!liftThread.isDeviceIdle()) {
|
return false;
|
}
|
|
// 下发命令
|
CommandResponse response = write(command, liftNo);
|
|
//保存命令日志
|
BasLiftOpt basLiftOpt = new BasLiftOpt();
|
basLiftOpt.setWrkNo(taskNo);
|
basLiftOpt.setLiftNo(liftNo);
|
basLiftOpt.setCommand(JSON.toJSONString(command));
|
basLiftOpt.setSystemStatus(JSON.toJSONString(liftProtocol));
|
basLiftOpt.setDeviceWrk(String.valueOf(command.getTaskNo()));
|
basLiftOpt.setSendTime(new Date());//指令下发时间
|
//保存命令流水
|
basLiftOptService.insert(basLiftOpt);
|
|
if (!response.getResult()) {
|
News.error("提升机命令下发失败,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
|
return false;
|
} else {
|
News.info("提升机命令下发成功,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
|
}
|
|
commandStep++;
|
//更新redis数据
|
redisCommand.setCommandStep(commandStep);
|
// 更新redis数据
|
redisUtil.set(RedisKeyType.LIFT_WORK_FLAG.key + taskNo, JSON.toJSONString(redisCommand));
|
}else {
|
LiftCommand command = commands.get(commandStep - 1);
|
if (command.getMode() == LiftCommandModeType.MOVE.id) {
|
//提升机升降
|
Integer target = command.getTargetLev();
|
if (liftProtocol.getLev() == target) {
|
command.setComplete(true);
|
}
|
} else if (command.getMode() == LiftCommandModeType.PALLET_IN.id) {
|
//判断提升机托盘是否存在
|
if (!liftProtocol.getHasTray()) {
|
return false;
|
}
|
command.setComplete(true);
|
} else if (command.getMode() == LiftCommandModeType.PALLET_OUT.id) {
|
//判断提升机托盘是否存在
|
if (liftProtocol.getHasTray()) {
|
return false;
|
}
|
command.setComplete(true);
|
} else if (command.getMode() == LiftCommandModeType.RESET.id) {
|
//复位
|
command.setComplete(true);
|
}
|
|
// 更新redis数据
|
redisUtil.set(RedisKeyType.LIFT_WORK_FLAG.key + taskNo, JSON.toJSONString(redisCommand));
|
|
if (!command.getComplete()) {
|
return false;
|
}
|
|
//判断是否为最后一条命令且命令执行完成,抛出等待确认状态
|
LiftCommand endCommand = commands.get(commands.size() - 1);
|
if (endCommand.getComplete()) {
|
News.info("提升机任务执行下发完成等待执行结束,提升机号={},任务数据={}", liftProtocol.getLiftNo(), JSON.toJSON(commands));
|
|
//对主线程抛出等待确认状态waiting
|
liftThread.setProtocolStatus(LiftProtocolStatusType.WAITING);
|
redisUtil.del(RedisKeyType.LIFT_WORK_FLAG.key + taskNo);
|
return false;//禁止再下发命令
|
}
|
}
|
|
return true;
|
}
|
|
private synchronized CommandResponse write(LiftCommand command, Integer liftNo) {
|
CommandResponse response = new CommandResponse(false);
|
if (null == command) {
|
News.error("提升机写入命令为空");
|
response.setMessage("提升机写入命令为空");
|
return response;
|
}
|
|
LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo);
|
if (liftThread == null) {
|
return response;
|
}
|
|
if (command.getMode().intValue() == LiftCommandModeType.MOVE.id) {
|
response = liftThread.move(command);
|
} else if (command.getMode().intValue() == LiftCommandModeType.PALLET_IN.id) {
|
response = liftThread.palletInOut(command);
|
} else if (command.getMode().intValue() == LiftCommandModeType.PALLET_OUT.id) {
|
response = liftThread.palletInOut(command);
|
}
|
return response;
|
}
|
|
}
|