| | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.zy.asrs.framework.common.Cools; |
| | | import com.zy.asrs.framework.exception.CoolException; |
| | | import com.zy.asrs.wcs.core.domain.dto.MotionDto; |
| | | import com.zy.asrs.wcs.core.entity.Motion; |
| | | import com.zy.asrs.wcs.core.entity.Task; |
| | | import com.zy.asrs.wcs.core.kernel.KernelService; |
| | | import com.zy.asrs.wcs.core.service.TaskService; |
| | | import com.zy.asrs.wcs.core.utils.RedisUtil; |
| | | import com.zy.asrs.wcs.core.utils.ShuttleDispatcher; |
| | | import com.zy.asrs.wcs.core.utils.Utils; |
| | | import com.zy.asrs.wcs.rcs.cache.SlaveConnection; |
| | | import com.zy.asrs.wcs.rcs.entity.Device; |
| | | import com.zy.asrs.wcs.rcs.model.enums.SlaveType; |
| | | import com.zy.asrs.wcs.rcs.model.protocol.LiftProtocol; |
| | | import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; |
| | | import com.zy.asrs.wcs.rcs.thread.LiftThread; |
| | | import com.zy.asrs.wcs.rcs.thread.ShuttleThread; |
| | | import org.apache.commons.codec.digest.DigestUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | |
| | | import java.util.List; |
| | | |
| | | @Component |
| | | public class FlowExecute { |
| | | public class FlowExecute extends BaseExecute { |
| | | |
| | | @Autowired |
| | | private RedisUtil redisUtil; |
| | | @Autowired |
| | | private TaskService taskService; |
| | | @Autowired |
| | | private ShuttleDispatcher shuttleDispatcher; |
| | | private ShuttleExecute shuttleExecute; |
| | | @Autowired |
| | | private KernelService kernelService; |
| | | private LiftExecute liftExecute; |
| | | @Autowired |
| | | private DevpExecute devpExecute; |
| | | |
| | | //执行流程图 |
| | | public boolean execute(List<JSONObject> list) { |
| | |
| | | String type = data.getString("type"); |
| | | boolean result = false; |
| | | if (type.equals("devp")) { |
| | | result = executeDevpFlow(task, data, redisKey); |
| | | result = devpExecute.execute(task, data, redisKey); |
| | | } else if (type.equals("shuttle")) { |
| | | result = executeShuttleFlow(task, data, redisKey); |
| | | result = shuttleExecute.execute(task, data, redisKey); |
| | | } else if (type.equals("lift")) { |
| | | result = executeLiftFlow(task, data, redisKey); |
| | | result = liftExecute.execute(task, data, redisKey); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | private JSONObject findFLow(List<JSONObject> list, String id) { |
| | | for (JSONObject flow : list) { |
| | | if (flow.getString("id").equals(id)) { |
| | | return flow; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private boolean executeDevpFlow(Task task, JSONObject data, String redisKey) { |
| | | JSONObject devpType = data.getJSONObject("devpType"); |
| | | String staNo = devpType.getString("staNo"); |
| | | //搜索工作 |
| | | |
| | | return true; |
| | | } |
| | | |
| | | private boolean executeShuttleFlow(Task task, JSONObject data, String redisKey) { |
| | | JSONObject shuttleType = data.getJSONObject("shuttleType"); |
| | | String oper = shuttleType.getString("shuttleOper"); |
| | | if (oper.equals("searchIdleShuttle")) { |
| | | //搜索空闲车 |
| | | ShuttleThread shuttleThread = shuttleDispatcher.searchIdleShuttle(task); |
| | | if (shuttleThread == null) { |
| | | throw new CoolException("穿梭车不存在"); |
| | | } |
| | | //存入缓存 |
| | | redisSet(redisKey, "shuttleDevice", shuttleThread.getDevice()); |
| | | return true; |
| | | } else if (oper.equals("judgeShuttleCurrentTaskLev")) { |
| | | //判断小车是否在任务楼层 |
| | | //取出缓存小车 |
| | | Object shuttleDeviceObj = redisGet(redisKey, "shuttleDevice"); |
| | | if (shuttleDeviceObj == null) { |
| | | throw new CoolException("穿梭车缓存为空"); |
| | | } |
| | | Device device = JSON.parseObject(String.valueOf(shuttleDeviceObj), Device.class); |
| | | if (device == null) { |
| | | throw new CoolException("穿梭车设备不存在"); |
| | | } |
| | | |
| | | ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue()); |
| | | if (shuttleThread == null) { |
| | | throw new CoolException("穿梭车不存在"); |
| | | } |
| | | |
| | | ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); |
| | | if (shuttleProtocol == null) { |
| | | throw new CoolException("穿梭车不存在"); |
| | | } |
| | | |
| | | //小车坐标 |
| | | String shuttleLocNo = shuttleProtocol.getCurrentLocNo(); |
| | | String taskLocNo = null; |
| | | if (task.getTaskSts() < 100) { |
| | | taskLocNo = task.getDestLoc(); |
| | | } else if (task.getTaskSts() > 100 && task.getTaskSts() < 200) { |
| | | taskLocNo = task.getOriginLoc(); |
| | | } |
| | | |
| | | // 小车和任务楼层一致 |
| | | if (Utils.getLev(shuttleLocNo) == Utils.getLev(taskLocNo)) { |
| | | return true; |
| | | }else { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | private boolean executeLiftFlow(Task task, JSONObject data, String redisKey) { |
| | | Object object = redisGet(redisKey, "motionList"); |
| | | List<Motion> motionList = JSON.parseArray(JSON.toJSONString(object), Motion.class); |
| | | |
| | | Object liftDeviceObj = redisGet(redisKey, "liftDevice"); |
| | | if (liftDeviceObj == null) { |
| | | throw new CoolException("提升机缓存为空"); |
| | | } |
| | | |
| | | Device device = JSON.parseObject(String.valueOf(liftDeviceObj), Device.class); |
| | | if (device == null) { |
| | | throw new CoolException("提升机设备不存在"); |
| | | } |
| | | |
| | | LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, device.getId().intValue()); |
| | | if (liftThread == null) { |
| | | throw new CoolException("提升机不存在"); |
| | | } |
| | | |
| | | LiftProtocol liftProtocol = liftThread.getStatus(); |
| | | if (liftProtocol == null) { |
| | | throw new CoolException("提升机不存在"); |
| | | } |
| | | |
| | | JSONObject liftType = data.getJSONObject("liftType"); |
| | | String opera = liftType.getString("liftOper"); |
| | | if (opera.equals("move")) { |
| | | //提升机升降 |
| | | String sourceLevStr = liftType.getString("sourceLev"); |
| | | String targetLevStr = liftType.getString("targetLev"); |
| | | Integer sourceLev = getLiftOperaLev(sourceLevStr, task, redisKey); |
| | | Integer targetLev = getLiftOperaLev(targetLevStr, task, redisKey); |
| | | |
| | | motionList.addAll(kernelService.liftMove( |
| | | MotionDto.build((dto -> { |
| | | dto.setLiftNo(device.getId().intValue()); |
| | | dto.setLev(sourceLev); |
| | | })) |
| | | , MotionDto.build((dto -> { |
| | | dto.setLiftNo(device.getId().intValue()); |
| | | dto.setLev(targetLev); |
| | | })) |
| | | )); |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | private Integer getLiftOperaLev(String opera, Task task, String redisKey) { |
| | | if (opera.equals("sourceLev")) { |
| | | return Utils.getLev(task.getOriginLoc()); |
| | | } else if (opera.equals("targetLev")) { |
| | | return Utils.getLev(task.getDestLoc()); |
| | | } else if (opera.equals("shuttleLev")) { |
| | | //取出缓存小车 |
| | | Object shuttleDeviceObj = redisGet(redisKey, "shuttleDevice"); |
| | | if (shuttleDeviceObj == null) { |
| | | throw new CoolException("穿梭车缓存为空"); |
| | | } |
| | | Device device = JSON.parseObject(String.valueOf(shuttleDeviceObj), Device.class); |
| | | if (device == null) { |
| | | throw new CoolException("穿梭车设备不存在"); |
| | | } |
| | | |
| | | ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue()); |
| | | if (shuttleThread == null) { |
| | | throw new CoolException("穿梭车不存在"); |
| | | } |
| | | |
| | | ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); |
| | | if (shuttleProtocol == null) { |
| | | throw new CoolException("穿梭车不存在"); |
| | | } |
| | | |
| | | return Utils.getLev(shuttleProtocol.getCurrentLocNo()); |
| | | } |
| | | |
| | | throw new CoolException("类型异常"); |
| | | } |
| | | |
| | | private boolean redisSet(String redisKey, String key, Object data) { |
| | | if (redisUtil.hasKey(redisKey)) { |
| | | Object obj = redisUtil.get(redisKey); |
| | | JSONObject object = JSON.parseObject(String.valueOf(obj)); |
| | | object.put(key, data); |
| | | redisUtil.set(redisKey, JSON.toJSONString(object)); |
| | | } else { |
| | | JSONObject object = new JSONObject(); |
| | | object.put(key, data); |
| | | redisUtil.set(redisKey, JSON.toJSONString(object)); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | private Object redisGet(String redisKey, String key) { |
| | | if (redisUtil.hasKey(redisKey)) { |
| | | Object obj = redisUtil.get(redisKey); |
| | | JSONObject object = JSON.parseObject(String.valueOf(obj)); |
| | | if (!object.containsKey(key)) { |
| | | return null; |
| | | } |
| | | return object.get(key); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | // private boolean executeFlow(List<Map<String, Object>> list) { |
| | | // for (Map<String, Object> map : list) { |