package com.zy.core.action;
|
|
import com.alibaba.fastjson.JSON;
|
import com.zy.asrs.entity.BasLiftOpt;
|
import com.zy.asrs.entity.WrkMast;
|
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.ForkLiftTaskModeType;
|
import com.zy.core.enums.RedisKeyType;
|
import com.zy.core.enums.SlaveType;
|
import com.zy.core.model.CommandResponse;
|
import com.zy.core.model.command.ForkLiftCommand;
|
import com.zy.core.model.command.LiftAssignCommand;
|
import com.zy.core.model.command.LiftRedisCommand;
|
import com.zy.core.model.protocol.ForkLiftProtocol;
|
import com.zy.core.thread.ForkLiftThread;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
import java.util.Date;
|
import java.util.List;
|
|
@Component
|
public class ForkLiftAction {
|
|
@Autowired
|
private RedisUtil redisUtil;
|
@Autowired
|
private WrkMastService wrkMastService;
|
@Autowired
|
private BasLiftOptService basLiftOptService;
|
|
public synchronized boolean assignWork(Integer liftNo, LiftAssignCommand assignCommand) {
|
ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo);
|
if (forkLiftThread == null) {
|
return false;
|
}
|
|
ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
|
if (forkLiftProtocol == 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.FORK_LIFT_WORK_FLAG.key + assignCommand.getTaskNo(), JSON.toJSONString(redisCommand))) {
|
forkLiftThread.setSyncTaskNo(assignCommand.getTaskNo().intValue());
|
return true;
|
}
|
return false;
|
}
|
|
public synchronized boolean executeWork(Integer liftNo, Integer taskNo) {
|
Object obj = redisUtil.get(RedisKeyType.FORK_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;
|
}
|
|
ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo);
|
if (forkLiftThread == null) {
|
return false;
|
}
|
|
ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
|
if (forkLiftProtocol == null) {
|
return false;
|
}
|
|
List<ForkLiftCommand> commands = redisCommand.getAssignCommand().getCommands();
|
if (commands.isEmpty()) {
|
return false;
|
}
|
|
LiftAssignCommand assignCommand = redisCommand.getAssignCommand();
|
int commandStep = redisCommand.getCommandStep();
|
|
if (commandStep == 0) {
|
//取出命令
|
ForkLiftCommand command = commands.get(commandStep);
|
|
//判断提升机是否空闲
|
if (!forkLiftThread.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(forkLiftProtocol));
|
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.FORK_LIFT_WORK_FLAG.key + taskNo, JSON.toJSONString(redisCommand));
|
}
|
|
return true;
|
}
|
|
private synchronized CommandResponse write(ForkLiftCommand command, Integer liftNo) {
|
CommandResponse response = new CommandResponse(false);
|
if (null == command) {
|
News.error("提升机写入命令为空");
|
response.setMessage("提升机写入命令为空");
|
return response;
|
}
|
|
ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo);
|
if (forkLiftThread == null) {
|
return response;
|
}
|
|
if (command.getMode().intValue() == ForkLiftTaskModeType.PICK_PUT.id) {
|
response = forkLiftThread.pickAndPut(command);
|
} else if (command.getMode().intValue() == ForkLiftTaskModeType.SHUTTLE_SWITCH.id) {
|
response = forkLiftThread.shuttleSwitch(command);
|
} else if (command.getMode().intValue() == ForkLiftTaskModeType.MOVE.id) {
|
response = forkLiftThread.move(command);
|
}
|
return response;
|
}
|
|
}
|