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