springboot-vue3/src/main/java/com/example/springboot/component/Plchome.java
@@ -1,38 +1,45 @@
package com.example.springboot.component;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.example.springboot.service.*;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import com.example.springboot.entity.Flowcard;
import com.example.springboot.entity.Glass;
import com.example.springboot.entity.GlassInfo;
import com.example.springboot.entity.MeasureSetting;
import com.example.springboot.entity.OutTask;
import com.example.springboot.entity.Out_slice;
import com.example.springboot.entity.Queue;
import com.example.springboot.entity.StorageCage;
import com.example.springboot.entity.StorageTask;
import com.example.springboot.entity.alarmmg;
import com.example.springboot.entity.north_glass_buffer1;
import com.example.springboot.entity.device.PlcParameterObject;
import com.example.springboot.mapper.HomeMapper;
import com.example.springboot.mapper.GlassInfoMapper;
import com.example.springboot.mapper.MeasureSettingMapper;
import com.example.springboot.mapper.QueueMapper;
import com.example.springboot.mapper.SpianMapper;
public class Plchome extends Thread {
    @Autowired
    private HomeMapper homeMapper;
    @Autowired
    private HomeService HomeService;
    @Autowired
    private GlassInfoMapper glassInfoMapper;
    private QueueMapper QueueMapper;
    private OutSliceServive outSliceServive;
    private SpianMapper spianMapper;
    private SpianService spianService;
    private North_Glass_Buffer1Service north_Glass_Buffer1Service;
    private JdbcConnections dbserve;
    // 出片队列是否允许出片
    public static Boolean isAllowQueue = true;
    public static Boolean isAllowReordering = true;
@@ -57,30 +64,39 @@
    // public static Map b=new HashMap<>();
    // b.put()
    public double carstart = 200;
    public double carend = 20000;
    @Override
    public void run() {
        while (this != null) {
            JSONObject jsonObject = new JSONObject();
            try {
                Thread.sleep(1000);
                Thread.sleep(500);
                // 注入mapper
                HomeService = WebSocketServer.applicationContext.getBean(HomeService.class);
                QueueMapper = WebSocketServer.applicationContext.getBean(QueueMapper.class);
                homeMapper = WebSocketServer.applicationContext.getBean(HomeMapper.class);
                spianMapper = WebSocketServer.applicationContext.getBean(SpianMapper.class);
                spianService = WebSocketServer.applicationContext.getBean(SpianService.class);
                outSliceServive = WebSocketServer.applicationContext.getBean(OutSliceServive.class);
                north_Glass_Buffer1Service = WebSocketServer.applicationContext
                        .getBean(North_Glass_Buffer1Service.class);
                storageCageService = WebSocketServer.applicationContext.getBean(StorageCageService.class);
                dbserve = WebSocketServer.applicationContext.getBean(JdbcConnections.class);
                glassInfoMapper = WebSocketServer.applicationContext.getBean(GlassInfoMapper.class);
                // 获取其车的位置
                if (S7control.getinstance().CheckConnected() == true && false) {
                    double carposition = 0;
                    float car = S7control.getinstance().readFloat32("DB10.1992");
                    carposition = (-40 + (car / (carend - carstart) * 595));
                    jsonObject.append("carposition", carposition);
                }
                // 笼子使用情况
                List<StorageCage> tableData = homeMapper.selectAll();
                List<StorageCage> tableData = homeMapper.selectAlls();
                jsonObject.append("tableData", tableData);
                // 格理片笼格子状态
                List<StorageCage> cagelist1 = homeMapper.selectRack1();
                List<StorageCage> cagelist2 = homeMapper.selectRack2();
                List<StorageCage> cagelist3 = homeMapper.selectRack3();
                List<StorageCage> cagelist4 = homeMapper.selectRack4();
                List<StorageCage> cagelist1 = storageCageService.SelectStorageCageByCage(1);
                List<StorageCage> cagelist2 = storageCageService.SelectStorageCageByCage(2);
                List<StorageCage> cagelist3 = storageCageService.SelectStorageCageByCage(3);
                List<StorageCage> cagelist4 = storageCageService.SelectStorageCageByCage(4);
                jsonObject.append("cagelist1", cagelist1);
                jsonObject.append("cagelist2", cagelist2);
                jsonObject.append("cagelist3", cagelist3);
@@ -94,20 +110,6 @@
                List<alarmmg> alarmmg = homeMapper.SelectAlarmmgInfo();
                jsonObject.append("alarmmg", alarmmg);
                // 伍 获取进是否有待确认的玻璃id
                String queid = spianMapper.Selectqueueid();
                int state = spianMapper.Selectqueuestate();
                jsonObject.append("queid", queid);
                jsonObject.append("state", state);
                // 获取扫码位与上片位玻璃信息
                Queue form2 = homeMapper.GetQueueInfo(2);
                Queue form3 = homeMapper.GetQueueInfo(1);
                if (form2.getglassId() != null && form2.getglassId() != "") {
                    jsonObject.append("form2", form2);
                }
                if (form3.getglassId() != null && form3.getglassId() != "") {
                    jsonObject.append("form3", form3);
                }
                // 获取出片队列信息
                List<Out_slice> listoutslice = outSliceServive.SelectProductionqueue();
                jsonObject.append("listoutslice", listoutslice);
@@ -120,207 +122,202 @@
                // 是否需要人工确认上片玻璃
                jsonObject.append("isConfirm", isConfirm);
                // 查询当前铝框信息
                Out_slice CurrentFrame = outSliceServive.SelectCurrentFrame();
                jsonObject.append("CurrentFrame", CurrentFrame);
                // Out_slice CurrentFrame = outSliceServive.SelectCurrentFrame();
                // jsonObject.append("CurrentFrame", CurrentFrame);
                // 读取DB105区文件
                PlcParameterObject plcmes = PLCAutoMes.PlcMesObject;
                // if(plcmes.==null){
                // }
                // 获取测量的长,宽
                boolean istest = true;
                // String PlcRequest = "1";
                // String MesSend = "0";
                // double width = 727;
                // double height = 414;
                // 匹配
                // System.err.println(PlcRequest+","+MesSend+","+width+","+height);
                if (plcmes.getPlcParameter("GaToMES").getValue() != null) {
                    String PlcRequest = plcmes.getPlcParameter("GaToMES").getValue();// plc请求字
                    String MesSend = plcmes.getPlcParameter("MESToGaStatus").getValue();// mes发送字
                    String A01ToMES = plcmes.getPlcParameter("A01ToMES").getValue();// 扫码请求
                    String MESToA01 = plcmes.getPlcParameter("MESToA01").getValue();// 确认扫码
                    String Layer = plcmes.getPlcParameter("Layer").getValue();// 层号
                    String Mateid = plcmes.getPlcParameter("A01MateID").getValue();// 配对号
                    String Order = plcmes.getPlcParameter("A01OrderID").getValue();// 订单号
                    double width = Double.valueOf(plcmes.getPlcParameter("width").getValue());//
                    // 宽
                    double height = Double.valueOf(plcmes.getPlcParameter("Height").getValue());// 高
                    String celanedOrders = Order.replaceAll("[^a-zA-Z0-9.]", "").trim().split("\\.")[0];
                    String cleanedMateids = Mateid.replaceAll("[^0-9.]", "").trim().split("\\.")[0]; // 移除所有非数字字符
                    String cleanedLayers = Layer.replaceAll("[^0-9.]", "").trim().split("\\.")[0]; //
                    String celanedOrder = celanedOrders.isEmpty() ? "" : celanedOrders;
                    String cleanedMateid = cleanedMateids.isEmpty() ? "" : cleanedMateids;
                    String cleanedLayer = cleanedLayers.isEmpty() ? "" : cleanedLayers;
                    if ("4".equals(PlcRequest)) {
                        S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToGaStatus").getAddress(),
                                (short) 0);
                        System.out.println("收四归零");
                    }
                    // 扫码请求时
                    if ("1".equals(A01ToMES) && "0".equals(MESToA01) && "0".equals(MesSend) && "0".equals(PlcRequest)) {
                        if (cleanedMateid == "" || cleanedLayer == "") {
                            cleanedMateid = "0";
                            cleanedLayer = "0";
                        }
                        int cont = storageCageService.ScanMatch(celanedOrder, Integer.parseInt(cleanedMateid),
                                Integer.parseInt(cleanedLayer));
                        if (cont > 0) {
                            System.out.println("扫码成功");
                            System.out.println(
                                    "Order:" + celanedOrder + " Mateid:" + cleanedMateid + " Layer:" + cleanedLayer);
                            S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToA01").getAddress(),
                                    (short) 1);
                            S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToGaStatus").getAddress(),
                                    (short) 1);
                        } else {
                            // QueueMapper.insertMatchFailure(1000, 1000, -1);
                            System.out.println(
                                    "Order:" + celanedOrder + " Mateid:" + cleanedMateid + " Layer:" + cleanedLayer);
                            System.out.println("扫码添加失败");
                        }
                    }
                    // 请求归零时
                    if ("4".equals(A01ToMES)) {
                        System.out.println("扫码归零成功");
                        S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToA01").getAddress(), (short) 0);
                    }
                    // 测量请求时
                    if ("1".equals(PlcRequest) && "0".equals(MesSend)) {
                        boolean is = HomeService.Normal(width, height, "1");
                        if (is && istest) {
                            // 测量成功
                            S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToGaStatus").getAddress(),
                                    (short) 1);
                        } else if (istest) {
                            // 匹配失败
                            S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToGaStatus").getAddress(),
                                    (short) 4);
                        }
                    }
                }
                // S7control.getinstance().WriteWord("DB14.170", (short)0);
                // 正在上片订单中的所有小片信息
                List<GlassInfo> glassInfoFlowCard = glassInfoMapper.selectOrderState(1);
                jsonObject.append("glassInfoFlowCard", glassInfoFlowCard);
                Queue LastQueue = QueueMapper.selectLastQueue2();
                if (LastQueue == null) {
                    Queue nullQueue = new Queue();
                    nullQueue.setglassId("");
                    nullQueue.setglassheight(0);
                    nullQueue.setglasswidth(0);
                    nullQueue.setglassheightmm(0);
                    nullQueue.setglasstype(0);
                    nullQueue.setglasswidthmm(0);
                    jsonObject.append("LastQueue", nullQueue);
                } else {
                    if (LastQueue.getstate() < 1) {
                        LastQueue.setglasswidth(LastQueue.getglasswidthmm());
                        LastQueue.setglassheight(LastQueue.getglassheightmm());
                    }
                    jsonObject.append("LastQueue", LastQueue);
                }
                // String E01id = new String( S7controlLK.getinstance().ReadByte("DB17.0",16));
                // String J01id = new String( S7controlLK.getinstance().ReadByte("DB17.22",14));
                if (S7control.getinstance().CheckConnected() == true) {
                // 查询理片笼信息
                List<StorageCage> StorageCageInfo = storageCageService.SelectStorageCageInfo();
                jsonObject.append("StorageCageInfo", StorageCageInfo);
                    // 铝框线交互
                    if (S7controlLK.getinstance().CheckConnected() == true) {
                        if (CurrentFrame != null) {
                            S7controlLK.getinstance().writeStrings(CurrentFrame.getBarCode(), "DB17.0");
                        }
                        String E01id = S7controlLK.getinstance().readStrings("DB17.0");
                        String J01id = S7controlLK.getinstance().readStrings("DB17.22");
                // 查询当前进片任务
                List<StorageTask> StoragTaskeTaskFeed = storageCageService.SelectStorageTask(0);
                jsonObject.append("StoragTaskeTaskFeed", StoragTaskeTaskFeed);
                        List<Short> liststates = S7controlLK.getinstance().ReadWord("DB17.38", 1);
                        List<Short> liststate = S7controlLK.getinstance().ReadWord("DB17.20", 1);
                        Short framerequest = liststate.get(0);
                        if (framerequest == 1) {
                            // 铝框id
                            String position;
                            try {
                                position = dbserve.SelectPositionByFrameBarcode(J01id);
                            } catch (SQLException e) {
                                // TODO Auto-generated catch block
                                position = "0";
                                e.printStackTrace();
                            }
                            Short send;
                            if (position.equals("0")) {
                                send = 0;
                            } else {
                                send = 1;
                            }
                            S7controlLK.getinstance().WriteWord("DB17.38", (short) send);
                        }
                    }
                // 查询当前出片任务
                List<StorageTask> StoragTaskeTaskOut = storageCageService.SelectStorageTask(1);
                jsonObject.append("StoragTaskeTaskOut", StoragTaskeTaskOut);
                    // 获取当前扫码方式
                    List<Boolean> Scanningmethods = S7control.getinstance().ReadBits("DB101.11.4", 1);
                    if (Scanningmethods != null) {
                        for (Boolean Scanningmethod : Scanningmethods) {
                            jsonObject.append("Scanningmethod", Scanningmethod);
                        }
                    }
                    // 获取当前扫码枪玻璃id
                    String CurrrentGlassId = spianService.queGlassid("DB103.256", 14).toString();
                    jsonObject.append("CurrrentGlassId", CurrrentGlassId);
                // 查询当前出片队列
                List<Map> OutTask = storageCageService.SelectOutTask();
                jsonObject.append("OutTask", OutTask);
                    // 获取D01-D06,A01,A02,B01,B02状态
                    List<Short> DeviceList = S7control.getinstance().ReadWord("DB103.0", 10);
                    jsonObject.append("DeviceList", DeviceList);
                    // 获取D01-D06,A01,A02,B01,B02玻璃id
                    List<String> GlassIdList = new ArrayList<String>();
                    GlassIdList.add(spianService.queGlassid("DB103.44", 14).toString());
                    GlassIdList.add(spianService.queGlassid("DB103.58", 14).toString());
                // 查询最后6次出片记录
                List<Map> OutLog = storageCageService.SelectOutLog();
                jsonObject.append("OutLog", OutLog);
                    GlassIdList.add(spianService.queGlassid("DB103.184", 14).toString());
                    GlassIdList.add(spianService.queGlassid("DB103.212", 14).toString());
                // 查询所有玻璃厚度和膜系
                List<GlassInfo> SelectMeasure = storageCageService.SelectMeasure();
                jsonObject.append("SelectMeasure", SelectMeasure);
                // 查询当前膜系厚度
                MeasureSetting SelectSetting = storageCageService.SelectSetting();
                jsonObject.append("SelectSetting", SelectSetting);
                // 查询现在的玻璃厚度和膜系
                Map StorageCageForm = storageCageService.StorageCageForm();
                jsonObject.append("StorageCageForm", StorageCageForm);
                    GlassIdList.add(spianService.queGlassid("DB103.128", 14).toString());
                    GlassIdList.add(spianService.queGlassid("DB103.142", 14).toString());
                    GlassIdList.add(spianService.queGlassid("DB103.156", 14).toString());
                // //查询当前订单任务
                List<Flowcard> OrderTask = storageCageService.SelectOrderTask();
                jsonObject.append("OrderTask", OrderTask);
                    GlassIdList.add(spianService.queGlassid("DB103.72", 14).toString());
                    GlassIdList.add(spianService.queGlassid("DB103.86", 14).toString());
                    GlassIdList.add(spianService.queGlassid("DB103.100", 14).toString());
                    GlassIdList.add(spianService.queGlassid("DB103.114", 14).toString());
                    jsonObject.append("GlassIdList", GlassIdList);
                // jsonObject.append("params", new short[] { 30, 40, });
                // System.out.println("jsonObject:" + jsonObject);
                    // 获取Plc进片车与出片车位置
                    List<String> addressList = new ArrayList<String>();
                    addressList.add("DB106.12");
                    addressList.add("DB106.0");
                    List<Short> paramlist = S7control.getinstance().ReadWord(addressList);
                    if (paramlist != null) {
                        jsonObject.append("params", paramlist);
                    }
                    // // 获取进片车状态
                    // List<Short> datas1ListState = S7control.getinstance().ReadWord("DB106.8",
                    // 1);// 获取进片车状态
                    // if (datas1ListState != null) {
                    // boolean exist1 = datas1ListState.contains((short) 0);
                    // jsonObject.append("zhuangtai", exist1);
                    // }
                ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("Home");
                    // // 获取进片玻璃信息
                    // List<Short> inglassInfo = S7control.getinstance().ReadWord("DB106.24", 1);
                    // if (inglassInfo != null) {
                    // if (inglassInfo.size() > 0) {
                    // jsonObject.append("loadglassheight", inglassInfo.get(0) * 70);
                    // }
                    // }
                    // // 获取铝框idDB106.DBW64,添加到出片队列
                    // String frameno="X21763329601FB";
                    String frameno = spianService.queGlassid("DB103.270", 14).toString();
                    if (!frameno.equals(Plchome.FrameNo)) {
                        Plchome.FrameNo = frameno;
                        try {
                            Short num = 0;
                            List<north_glass_buffer1> north_glass_buffer1s = north_Glass_Buffer1Service
                                    .SelectAluminumFrameInfoById(Plchome.FrameNo);
                            for (north_glass_buffer1 north_glass_buffer1 : north_glass_buffer1s) {
                                if (north_glass_buffer1.getstorageCage() == null) {
                                    break;
                                }
                                num++;
                            }
                            if (num == north_glass_buffer1s.size()) {
                                north_Glass_Buffer1Service.AddOutSliceS(Plchome.FrameNo);
                            } else {
                                Plchome.AluminumFrame = north_glass_buffer1s;
                            }
                        } catch (SQLException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    if (AluminumFrame != null) {
                        jsonObject.append("AluminumFrame", AluminumFrame);
                    }
                if (sendwServer != null) {
                    try {
                        Iterator<WebSocketServer> iterator = sendwServer.iterator();
                        while (iterator.hasNext()) {
                    // 复位倒计时
                    // 地址104.9.6
                    List<Boolean> countdown = S7control.getinstance().ReadBits("DB104.9.6", 1);
                    for (Boolean countdowns : countdown) {
                        jsonObject.append("countdown", countdowns);
                    }
                    // jsonObject.append("countdown", true);
                    // 复位完成信号
                    List<Boolean> resetss = S7control.getinstance().ReadBits("DB103.284", 1);
                    for (Boolean reset : resetss) {
                        jsonObject.append("reset", reset);
                    }
                    // 是否急停
                    List<Boolean> emergencystops = S7control.getinstance().ReadBits("DB104.5.1", 1);
                    for (Boolean emergencystop : emergencystops) {
                        jsonObject.append("emergencystop", emergencystop);
                    }
                    // 获取进片请求状态
                    List<Short> D01Request = S7control.getinstance().ReadWord("DB106.24", 1);
                    boolean D01RequestState = D01Request.contains((short) 1);
                    jsonObject.append("D01RequestState", D01RequestState);
                    // 获取进片发送状态
                    List<Short> D01respnse = S7control.getinstance().ReadWord("DB106.16", 1);
                    boolean D01ResponseState = D01respnse.contains((short) 1);
                    // jsonObject.append("D01RequestState", D01RequestState);
                    // 自动进片
                    isConfirm = true;
                    if (isConfirm == true && form3.getglassId() != null && form3.getglassId() != "") {
                        if ((form3.getglassheight() < 380 || form3.getglasswidth() < 390
                                || form3.getglassheight() > 1810
                                || form3.getglasswidth() > 2760)
                                || (form3.getglassheight() < 390 || form3.getglasswidth() < 380
                                        || form3.getglassheight() > 2760 || form3.getglasswidth() > 1810)) {
                            FeedState = true;
                            jsonObject.append("FeedState", FeedState);
                            FeedState = false;
                        } else {
                            if (D01RequestState == true && D01ResponseState != true) {
                                storageCageService.InsertQueueGlassId((short) 1, form3);
                            WebSocketServer webserver = iterator.next();
                            webserver.sendMessage(jsonObject.toString());
                            List<String> messages = webserver.getMessages();
                            if (!messages.isEmpty()) {
                                // // 将最后一个消息转换为整数类型的列表
                                webserver.clearMessages();
                            }
                        }
                    }
                    } catch (Exception e) {
                        e.printStackTrace(); // 打印堆栈信息,方便定位问题
                        System.out.println("webserver出现异常: " + e.getMessage());
                        // TODO: handle exception
                    }
                }
                // ArrayList<WebSocketServer> sendwServer =
                // WebSocketServer.sessionMap.get("Home");
                // if (sendwServer != null) {
                // for (WebSocketServer webserver : sendwServer) {
                // webserver.sendMessage(jsonObject.toString());
                // if (webserver != null) {
                // List<String> messages = webserver.getMessages();
                // if (!messages.isEmpty()) {
                // // // 将最后一个消息转换为整数类型的列表
                // webserver.clearMessages();
                // }
                // }
                // }
                // }
            } catch (InterruptedException e) {
                System.out.println("线程出现异常");
                e.printStackTrace();
            }
            boolean dbconnected = false;
            try {
                dbserve.getConn();
                dbconnected = true;
            } catch (Exception e) {
                // TODO: handle exception
                dbconnected = false;
            }
            jsonObject.append("dbconnected", dbconnected);
            // jsonObject.append("params", new short[] { 30, 40, });
            ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("Home");
            if (sendwServer != null) {
                for (WebSocketServer webserver : sendwServer) {
                    webserver.sendMessage(jsonObject.toString());
                    if (webserver != null) {
                        List<String> messages = webserver.getMessages();
                        if (!messages.isEmpty()) {
                            // // 将最后一个消息转换为整数类型的列表
                            webserver.clearMessages();
                        }
                    }
                }
            }
        }
    }