From dad3cd8ed8afa86b651bb1a053421e7aa2b8c7ac Mon Sep 17 00:00:00 2001 From: Junjie <540245094@qq.com> Date: 星期日, 05 五月 2024 16:31:09 +0800 Subject: [PATCH] # --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/FlowExecute.java | 345 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 298 insertions(+), 47 deletions(-) diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/FlowExecute.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/FlowExecute.java index 2725023..4efdbd0 100644 --- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/FlowExecute.java +++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/FlowExecute.java @@ -1,72 +1,323 @@ package com.zy.asrs.wcs.rcs.thread; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; 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.asrs.entity.param.FlowLogicCodeParam; +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 org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.codec.digest.Md5Crypt; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.List; import java.util.Map; @Component public class FlowExecute { + @Autowired + private RedisUtil redisUtil; + @Autowired + private TaskService taskService; + @Autowired + private ShuttleDispatcher shuttleDispatcher; + @Autowired + private KernelService kernelService; + //鎵ц娴佺▼鍥� - public boolean execute(List<FlowLogicCodeParam> list) { - for (FlowLogicCodeParam param : list) { - if (param.getId().equals("1")) { - return executeFlow(param.getLogicTrue()); + public boolean execute(List<JSONObject> list) { + String currentId = list.get(0).getString("id"); + + JSONObject devpType = list.get(0).getJSONObject("data").getJSONObject("devpType"); + String staNo = devpType.getString("staNo"); + //鎼滅储宸ヤ綔妗� + List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() + .eq(Task::getOriginSite, staNo) + .eq(Task::getStatus, 1)); + + for (Task task : tasks) { + String redisKey = DigestUtils.md5Hex(JSON.toJSONString(list)); + + redisSet(redisKey, "motionList", new ArrayList<Motion>()); + while (currentId != null) { + //鑾峰彇娴佺▼鍥� + JSONObject flow = findFLow(list, currentId); + if (flow == null) { + break; + } + + //鎵ц + boolean result = executeFlow(task, flow, redisKey); + + //鎵ц鍚庣画娴佺▼ + if (Cools.isEmpty(flow.get("nextTrue")) && Cools.isEmpty(flow.get("nextFalse"))) { + break;//鏃犲悗缁祦绋� + } + + //鏇存柊id + currentId = result ? flow.getString("nextTrue") : flow.getString("nextFalse"); } + + System.out.println("鎵ц瀹屾垚"); + redisUtil.del(redisKey);//閲婃斁缂撳瓨 } - System.out.println(list); - return false; + return true; } - private boolean executeFlow(List<Map<String, Object>> list) { - for (Map<String, Object> map : list) { - JSONObject data = (JSONObject) map.get("data"); - if (data.getString("type").equals("devp")) { - JSONObject devp = data.getJSONObject("devpType"); - String devpNo = devp.getString("devpNo");//杈撻�佺嚎PLC - String staNo = devp.getString("staNo");//绔欏彿 - Boolean enableStaStatus = devp.getBoolean("enableStaStatus");//鍒ゆ柇绔欑偣鐘舵�� - JSONArray staStatus = devp.getJSONArray("staStatus");//绔欑偣鐘舵�佸垪琛� - String staJudgementFailExecute = devp.getString("staJudgementFailExecute");//鍒ゆ柇澶辫触鍚庢槸鍚︾户缁墽琛屾祦绋� - Boolean writeWorkNoStatus = devp.getBoolean("writeWorkNoStatus");//鏄惁鍐欏叆宸ヤ綔鍙� - Boolean writeStaNoStatus = devp.getBoolean("writeStaNoStatus");//鏄惁鍐欏叆鐩爣绔� - String writeWorkNo = devp.getString("writeWorkNo");//鍐欏叆宸ヤ綔鍙锋暟鎹� - String writeStaNo = devp.getString("writeStaNo");//鍐欏叆鐩爣绔欐暟鎹� - if (enableStaStatus) { - //鍒ゆ柇绔欑偣鐘舵�� - boolean statusFlag = true;//榛樿鍒ゆ柇閫氳繃 - for (Object status : staStatus) { - System.out.println(status); - } + private boolean executeFlow(Task task, JSONObject flow, String redisKey) { + System.out.println(flow.getString("id") + "琚墽琛�"); + JSONObject data = flow.getJSONObject("data"); + String type = data.getString("type"); + boolean result = false; + if (type.equals("devp")) { + result = executeDevpFlow(task, data, redisKey); + } else if (type.equals("shuttle")) { + result = executeShuttleFlow(task, data, redisKey); + } else if (type.equals("lift")) { + result = executeLiftFlow(task, data, redisKey); + } + return result; + } - if (!statusFlag) { - //鍒ゆ柇涓嶉�氳繃 - if (staJudgementFailExecute.equals("stop")) { - //鍒ゆ柇澶辫触鍚庝笉缁х画鎵ц - return false; - } - } - - } - - if (writeWorkNoStatus) { - //鍐欏叆宸ヤ綔鍙� - } - - if (writeStaNoStatus) { - //鍐欏叆鐩爣绔� - } - System.out.println(devp); + private JSONObject findFLow(List<JSONObject> list, String id) { + for (JSONObject flow : list) { + if (flow.getString("id").equals(id)) { + return flow; } - System.out.println(data); + } + 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; + } } - System.out.println(list); - 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) { +// JSONObject data = (JSONObject) map.get("data"); +// if (data.getString("type").equals("devp")) { +// JSONObject devp = data.getJSONObject("devpType"); +// String devpNo = devp.getString("devpNo");//杈撻�佺嚎PLC +// String staNo = devp.getString("staNo");//绔欏彿 +// Boolean enableStaStatus = devp.getBoolean("enableStaStatus");//鍒ゆ柇绔欑偣鐘舵�� +// JSONArray staStatus = devp.getJSONArray("staStatus");//绔欑偣鐘舵�佸垪琛� +// String staJudgementFailExecute = devp.getString("staJudgementFailExecute");//鍒ゆ柇澶辫触鍚庢槸鍚︾户缁墽琛屾祦绋� +// Boolean writeWorkNoStatus = devp.getBoolean("writeWorkNoStatus");//鏄惁鍐欏叆宸ヤ綔鍙� +// Boolean writeStaNoStatus = devp.getBoolean("writeStaNoStatus");//鏄惁鍐欏叆鐩爣绔� +// String writeWorkNo = devp.getString("writeWorkNo");//鍐欏叆宸ヤ綔鍙锋暟鎹� +// String writeStaNo = devp.getString("writeStaNo");//鍐欏叆鐩爣绔欐暟鎹� +// if (enableStaStatus) { +// //鍒ゆ柇绔欑偣鐘舵�� +// boolean statusFlag = true;//榛樿鍒ゆ柇閫氳繃 +// for (Object status : staStatus) { +// System.out.println(status); +// } +// +// if (!statusFlag) { +// //鍒ゆ柇涓嶉�氳繃 +// if (staJudgementFailExecute.equals("stop")) { +// //鍒ゆ柇澶辫触鍚庝笉缁х画鎵ц +// return false; +// } +// } +// +// } +// +// if (writeWorkNoStatus) { +// //鍐欏叆宸ヤ綔鍙� +// } +// +// if (writeStaNoStatus) { +// //鍐欏叆鐩爣绔� +// } +// System.out.println(devp); +// } +// System.out.println(data); +// } +// +// System.out.println(list); +// return false; +// } + } -- Gitblit v1.9.1