using DG.Tweening;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Unity.Burst.CompilerServices;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using static DeviceQuery;
using static ENVQuery;
using static PortQuery;
using static TmsAlarmQuery;

public class GameManager : MonoBehaviour
{
    public static GameManager Inst;
    /// <summary>
    /// 接口地址
    /// </summary>
    public webURL Jk_URL;
    /// <summary>
    /// 全局变量
    /// </summary>
    public GlobalParameter arguments = new GlobalParameter();
    /// <summary>
    /// 是否加载完成
    /// </summary>
    public bool isLoading = false;
    string ct = null;

    //[Header("机柜点位集合")]
    //public List<Transform> Cabinets_POS;
    [Header("机柜区域集合")]
    public List<Transform> Cabinet_quYu;

    [Header("当前设备ID")] public string nowDeviceID = null;
    [Header("当前点击设备")] public GameObject nowDevice = null;

    [Header("上一个设备ID")] public string lastDeviceID = null;
    [Header("上一个点击设备")] public GameObject lastDevice = null;

    /// <summary>
    /// 当前聚焦机柜
    /// </summary>
    [Header("当前聚焦机柜")] public GameObject nowCabine;

    /// <summary>
    /// 当前查看的设备
    /// </summary>
    [Header("当前查看的设备")] public GameObject now_CK_Device = null;

    [Header("设备------------------------查询接口")] public DeviceQuery.Root root_AllDevice;

    ///// <summary>
    ///// 场景所有机柜
    ///// </summary>
    // public List<GameObject> Cabinets_go;
    /// <summary>
    /// 场景所有机柜
    /// </summary>
    [Header("场景所有机柜")] public List<GameObject> Cabinets_go;
    /// <summary>
    /// 场景所有机柜信息
    /// </summary>
    public List<DeviceList> Cabinets;


    /// <summary>
    /// 场景所有机框
    /// </summary>
    [Header("场景所有机框信息")] public List<GameObject> Racks_go = new List<GameObject>();
    /// <summary>
    /// 场景所有机框信息
    /// </summary>
    public List<DeviceList> Racks;

    /// <summary>
    /// 场景所有机槽
    /// </summary>
    [Header("场景所有机槽信息")] public List<GameObject> MachineSlots_go = new List<GameObject>();
    /// <summary>
    /// 场景所有机槽信息
    /// </summary>
    public List<DeviceList> MachineSlots;

    /// <summary>
    /// 场景所有板卡
    /// </summary>
    [Header("场景所有板卡信息")] public List<GameObject> TmsCards_go = new List<GameObject>();
    /// <summary>
    /// 场景所有板卡信息
    /// </summary>
    public List<DeviceList> TmsCards;

    [Header("端口------------------------查询接口")] public PortQuery.Root root_AllPort;

    /// <summary>
    /// 场景所有端口
    /// </summary>
    [Header("场景所有端口信息")] public List<GameObject> TmsPorts_go = new List<GameObject>();
    /// <summary>
    /// 场景所有端口信息
    /// </summary>
    public List<PortList> TmsPorts;

    [HideInInspector] public int nowLayerMask = 6;

    [Header("环境------------------------查询接口")] public ENVQuery.Root root_AllENV = new ENVQuery.Root();
    public List<ENVList> ENVs;

    [Header("告警------------------------查询接口")] public TmsAlarmQuery.Root root_AllAlarm = new TmsAlarmQuery.Root();
    public List<TmsAlarmList> tmsAlarms;

    ///// <summary>
    ///// 搜索框
    ///// </summary>
    //[Header("--------------------------------")]
    //public GameObject search_box;

    [Header("----------弹窗--------------")]
    public List<GameObject> pop_ups;

    /// <summary>
    /// 场景方大状态
    /// </summary>
    [Header("----------场景放大状态--------------")]
    public bool magnifyState = false;

    [Header("----------是否在循环读取信息--------------")]
    public bool isgonging = false;

    public EditorMenu editorMenu;
    [Header("---------- 暂存箱子 --------------")]
    public GameObject stagingPanel;
    public Button stagingPanelClose_bt;

    [Header("-------------- 搜索框------------------")]
    //public GameObject objectToShow;
    public GameObject search_box;
    public GameObject objectToShow_add;

    [Header("-------------- 所有机柜门------------------")]
    public List<RoomDoor> roomDoors;

    private void Awake()
    {

        if (Inst != this && Inst != null)
        {
            Destroy(this.gameObject);
        }
        else
        {
            Inst = this;
            DontDestroyOnLoad(this.gameObject);
        }
        //StartCoroutine(LoadAddress());
    }

    private void Start()
    {
        Debug.Log("版本号 11.0.3");
        roomDoors = CabinetUIManager.Instance.transform.GetChild(0).GetComponentsInChildren<RoomDoor>(true).ToList();

        editorMenu.editorBtn.onClick.AddListener(() =>
        {
            if (Menu.M_数字机房_场景管理 == CabinetUIManager.Instance.current_menu && nowDevice != null)
            {
                if (nowDevice.GetComponent<DeviceQuery>() == null)
                    return;
                //if (nowDevice.GetComponent<DeviceQuery>().deviceList.deviceType == "3")
                //    return;
                if (string.IsNullOrEmpty(nowDeviceID))
                {
                    PatternChoose.Inst.sb_xz_page.SetActive(true);//√
                    //objectToShow_add.gameObject.SetActive(false);
                    var SN1 = objectToShow_add.GetComponent<SearchName1>();
                    SN1.hide_menu();
                    objectToShow_add.SetActive(false);
                }
                else
                {
                    PatternChoose.Inst.sb_bj_page.SetActive(true);//√
                    //objectToShow_add.gameObject.SetActive(false);
                    var SN1 = objectToShow_add.GetComponent<SearchName1>();
                    SN1.hide_menu();
                    objectToShow_add.SetActive(false);
                }
            }
            editorMenu.gameObject.SetActive(false);
            search_box.SetActive(false);
        });
        ///---------------新加------------------------
        editorMenu.deleteBtn.onClick.AddListener(() =>
        {
            DeleteFunction();
            editorMenu.gameObject.SetActive(false);
        });
        PatternChoose.Inst.sb_xz_page.transform.Find("删除").GetComponent<Button>().onClick.AddListener(() =>
        {
            //if (GameManager.Inst.nowDevice.GetComponent<DeviceQuery>().deviceList.deviceType == "3")
            //    return;
            DeleteFunction();
            PatternChoose.Inst.sb_xz_page.gameObject.SetActive(false);
        });

        PatternChoose.Inst.sb_bj_page.transform.Find("底部/删除").GetComponent<Button>().onClick.AddListener(() =>
        {
            //if (GameManager.Inst.nowDevice.GetComponent<DeviceQuery>().deviceList.deviceType == "3")
            //    return;
            DeleteFunction();
            PatternChoose.Inst.sb_bj_page.gameObject.SetActive(false);
        });
        ///---------------新加------------------------

        #region old
        //editorMenu.deleteBtn.onClick.AddListener(() =>
        //{
        //    if (Menu.M_数字孪生_场景管理 == CabinetUIManager.Instance.current_menu && nowDevice != null)
        //    {
        //        if (nowDevice.GetComponent<DeviceQuery>() == null) return;
        //        if (string.IsNullOrEmpty(nowDeviceID))
        //        {
        //            editorMenu.gameObject.SetActive(false);
        //            var nub = nowDevice.GetComponent<DeviceItem>().volume;
        //            var _star = nowDevice.transform.parent.name;
        //            var star = Convert.ToInt32(_star) - 1;
        //            var p = nowDevice.transform.parent.parent;
        //            for (int i = star; i < star + Convert.ToInt32(nub); i++)
        //            {
        //                p.GetChild(i).GetComponent<UPosItem>().isOccupied = false;
        //            }
        //            DestroyImmediate(nowDevice);
        //        }
        //        else
        //        {
        //            var delete = PatternChoose.Inst.transform.Find("设备类").GetComponent<DeleteDevice>();
        //            //DeleteDevice delete = new DeleteDevice();
        //            delete.mybody.ids.Add(nowDeviceID);
        //            StartCoroutine(delete.SaveJsonCoroutine((x) =>
        //            {
        //                editorMenu.gameObject.SetActive(false);
        //                var nub = nowDevice.GetComponent<DragTest1>().volume;
        //                var _star = nowDevice.transform.parent.name;
        //                var star = Convert.ToInt32(_star) - 1;
        //                var p = nowDevice.transform.parent.parent;
        //                for (int i = star; i < star + Convert.ToInt32(nub); i++)
        //                {
        //                    p.GetChild(i).GetComponent<UPosItem>().isOccupied = false;
        //                    p.GetChild(i).GetComponent<UPosItem>().instruct.color = new Color(0, 1, 0, 1);

        //                }
        //                DestroyImmediate(nowDevice);

        //            }));
        //        }
        //    }
        //    editorMenu.gameObject.SetActive(false);
        //});
        //Debug.Log("版本号 1.1.1");
        #endregion

        stagingPanelClose_bt.onClick.AddListener(() =>
        {
            if (ExtendedFlycam.Inst)
            {
                ExtendedFlycam.Inst.reminder((isgo, list, prompt) =>
                {
                    if (!isgo)
                    {
                        if (!string.IsNullOrEmpty(prompt))
                            SecondConfirmPanel.DeleteConform((x) => { }, prompt);
                    }
                });
            }
        });

        editorMenu.checkBtn.onClick.AddListener(() =>
        {
            editorMenu.gameObject.SetActive(false);
            checkDevice_cjgl();
            search_box.SetActive(false);
        });
    }

    /// <summary>
    /// 查看设备
    /// </summary>
    public void checkDevice_cjgl()
    {
        if (Menu.M_数字机房_场景管理 == CabinetUIManager.Instance.current_menu && now_CK_Device != null)
        {
            if (now_CK_Device.GetComponent<DeviceQuery>() == null)
                return;
            PatternChoose.Inst.sb_ck_page.SetActive(true);
            var SN1 = objectToShow_add.GetComponent<SearchName1>();
            SN1.hide_menu();
            objectToShow_add.SetActive(false);
        }
    }

    public void checkDevice()
    {
        if (now_CK_Device.GetComponent<DeviceQuery>() == null)
            return;
        PatternChoose.Inst.sb_ck_page.SetActive(true);
    }

    /// <summary>
    /// 删除设备
    /// </summary>
    public void DeleteFunction()
    {
        SecondConfirmPanel.DeleteConform((isdelete) =>
        {
            if (!isdelete)
                return;
            else
            {
                if (Menu.M_数字机房_场景管理 == CabinetUIManager.Instance.current_menu && nowDevice != null)
                {
                    if (nowDevice.GetComponent<DeviceQuery>() == null)
                    {
                        objectToShow_add.SetActive(true);
                        search_box.SetActive(true);
                        return;
                    }
                    if (string.IsNullOrEmpty(nowDeviceID))
                    {
                        DeviceItem di = nowDevice.GetComponent<DeviceItem>();
                        UPosItem upi = nowDevice.transform.parent.GetComponent<UPosItem>();
                        upi.uPosManager.SetCurrentUPosIsOccupied(di.startIndex, di.volume, false);
                        DestroyImmediate(nowDevice);
                    }
                    else
                    {
                        var delete = PatternChoose.Inst.transform.Find("设备类").GetComponent<DeleteDevice>();
                        //DeleteDevice delete = new DeleteDevice();
                        delete.mybody.ids.Clear();
                        delete.mybody.ids.Add(nowDeviceID);
                        StartCoroutine(delete.SaveJsonCoroutine((x, prompt) =>
                        {
                            if (x)
                            {
                                DeviceItem di = nowDevice.GetComponent<DeviceItem>();
                                //UPosItem upi = nowDevice.transform.parent.GetComponent<UPosItem>();
                                var u = FindParent(nowDevice, IsFindUposItem);
                                if (!u)
                                    return;
                                UPosItem upi = u.GetComponent<UPosItem>();
                                upi.uPosManager.SetCurrentUPosIsOccupied(di.startIndex, di.volume, false);
                                DestroyImmediate(nowDevice);
                            }
                            else
                            {

                            }


                        }));
                    }
                    objectToShow_add.SetActive(true);
                    search_box.SetActive(true);
                }

            }
        }, "是否删除");
    }

    private void OnEnable()
    {
        //StartCoroutine(LoadJSON(Application.streamingAssetsPath + "/设备查询.json"));
        //StartCoroutine(LoadJSON(Application.streamingAssetsPath + "/端口查询.json"));
        //StartCoroutine(LoadJSON(Application.streamingAssetsPath + "/告警查询.json"));
        //StartCoroutine(LoadJSON(Application.streamingAssetsPath + "/环境查询.json"));
        //return;
        #region 正式
        //TransparentGlowManage.Inst.addScript();
        //await init_Device();
        //await init_Port();
        //await init_TmsAlarm();
        //await init_ENV();

        //if (root_AllDevice.data == null) return;

        //#region 加载场景
        //Load_Device();
        //Load_Port();
        //Load_TmsAlarm();
        //Load_ENV();

        //#endregion

        #endregion

    }

    /// <summary>
    /// 加载环境
    /// </summary>
    public void Load_ENV()
    {
        if (root_AllENV == null) return;
        /***********************************************************/
        //环境信息-保存
        for (int i = 0; i < root_AllENV.data.Count; i++)
            ENVs.Add(root_AllENV.data[i]);
        for (int i = 0; i < ENVs.Count; i++)
        {
            bool isFind = false;
            var rackId = ENVs[i].rackId;
            foreach (var item in Cabinets_go)
            {
                var D = item.GetComponent<DeviceQuery>().deviceList;
                if (D.id == rackId)
                {
                    //温度
                    if (ENVs[i].pointType == "1")
                    {
                        item.GetComponent<ENVQuery>().eNVList_W = ENVs[i];
                        isFind = true;
                        break;
                    }
                    //湿度
                    else if (ENVs[i].pointType == "2")
                    {
                        item.GetComponent<ENVQuery>().eNVList_S = ENVs[i];
                        isFind = true;
                        break;
                    }
                    //烟感
                    else if (ENVs[i].pointType == "3")
                    {
                        item.GetComponent<ENVQuery>().eNVList_Y = ENVs[i];
                        isFind = true;
                        break;
                    }
                    //水浸
                    else if (ENVs[i].pointType == "4")
                    {
                        item.GetComponent<ENVQuery>().eNVList_J = ENVs[i];
                        isFind = true;
                        break;
                    }
                }
            }
            if (isFind) continue;
            //var machine_room = GameObject.Find("机房");
            var machine_room = CabinetUIManager.Instance.transform.Find("分离消防柜和墙体/机房");
            if (machine_room && rackId == machine_room.GetComponent<DeviceQuery>().deviceList.id)
            {
                //温度
                if (ENVs[i].pointType == "1")
                {
                    machine_room.GetComponent<ENVQuery>().eNVList_W = ENVs[i];
                    isFind = true;
                }
                //湿度
                else if (ENVs[i].pointType == "2")
                {
                    machine_room.GetComponent<ENVQuery>().eNVList_S = ENVs[i];
                    isFind = true;
                }
                //烟感
                else if (ENVs[i].pointType == "3")
                {
                    machine_room.GetComponent<ENVQuery>().eNVList_Y = ENVs[i];
                    isFind = true;
                }
                //水浸
                else if (ENVs[i].pointType == "4")
                {
                    machine_room.GetComponent<ENVQuery>().eNVList_J = ENVs[i];
                    isFind = true;
                }
            }
            if (isFind) continue;
            //var accumulator_room = GameObject.Find("蓄电池室");
            var accumulator_room = CabinetUIManager.Instance.transform.Find("分离消防柜和墙体/蓄电池室");
            if (accumulator_room && rackId == accumulator_room.GetComponent<DeviceQuery>().deviceList.id)
            {
                //温度
                if (ENVs[i].pointType == "1")
                {
                    accumulator_room.GetComponent<ENVQuery>().eNVList_W = ENVs[i];
                    isFind = true;
                }
                //湿度
                else if (ENVs[i].pointType == "2")
                {
                    accumulator_room.GetComponent<ENVQuery>().eNVList_S = ENVs[i];
                    isFind = true;
                }
                //烟感
                else if (ENVs[i].pointType == "3")
                {
                    accumulator_room.GetComponent<ENVQuery>().eNVList_Y = ENVs[i];
                    isFind = true;
                }
                //水浸
                else if (ENVs[i].pointType == "4")
                {
                    accumulator_room.GetComponent<ENVQuery>().eNVList_J = ENVs[i];
                    isFind = true;
                }
            }
            if (isFind) continue;
        }
        Debug.Log("环境加载完成");
    }

    /// <summary>
    /// 加载告警
    /// </summary>
    public void Load_TmsAlarm()
    {
        if (root_AllAlarm == null) return;
        /***********************************************************/
        //告警信息-保存
        for (int i = 0; i < root_AllAlarm.data.Count; i++)
            tmsAlarms.Add(root_AllAlarm.data[i]);
        for (int i = 0; i < tmsAlarms.Count; i++)
        {
            bool isFind = false;
            var deviceId = tmsAlarms[i].deviceId;
            ///设备id
            foreach (var item in Cabinets_go)
            {
                var D = item.GetComponent<DeviceQuery>().deviceList;
                if (D.id == deviceId)
                {
                    item.GetComponent<TmsAlarmQuery>().tmsAlarmLists.Add(tmsAlarms[i]);
                    isFind = true;
                    break;
                }
            }
            if (isFind) continue;
            foreach (var item in Racks_go)
            {
                var D = item.GetComponent<DeviceQuery>().deviceList;
                if (D.id == deviceId)
                {
                    item.GetComponent<TmsAlarmQuery>().tmsAlarmLists.Add(tmsAlarms[i]);
                    isFind = true;
                    break;
                }
            }
            if (isFind) continue;
            foreach (var item in MachineSlots_go)
            {
                var D = item.GetComponent<DeviceQuery>().deviceList;
                if (D.id == deviceId)
                {
                    item.GetComponent<TmsAlarmQuery>().tmsAlarmLists.Add(tmsAlarms[i]);
                    isFind = true;
                    break;
                }
            }
            if (isFind) continue;
            foreach (var item in TmsCards_go)
            {
                var D = item.GetComponent<DeviceQuery>().deviceList;
                if (D.id == deviceId)
                {
                    item.GetComponent<TmsAlarmQuery>().tmsAlarmLists.Add(tmsAlarms[i]);
                    isFind = true;
                    break;
                }
            }
        }

        Debug.Log("告警加载完成");
    }

    /// <summary>
    /// 加载端口
    /// </summary>
    private void Load_Port()
    {
        if (root_AllPort == null) return;
        /***********************************************************/
        //端口信息-保存
        foreach (var item in root_AllPort.data)
            TmsPorts.Add(item);
        //动态加载设备(端口)
        for (int i = 0; i < TmsCards_go.Count; i++)//遍历板卡
        {
            //板卡下所有设备
            var dk = TmsCards_go[i].transform.GetComponentsInChildren<PortQuery>().ToList();
            if (dk == null) continue;
            for (int j = 0; j < dk.Count; j++)
            {
                TmsPorts_go.Add(dk[j].gameObject);
            }
        }
        for (int i = 0; i < Racks_go.Count; i++)//遍历机框
        {
            //机框下所有设备
            var dk = Racks_go[i].transform.GetComponentsInChildren<PortQuery>().ToList();
            if (dk == null) continue;
            for (int j = 0; j < dk.Count; j++)
            {
                TmsPorts_go.Add(dk[j].gameObject);
            }
        }
        for (int i = 0; i < MachineSlots_go.Count; i++)//遍历机槽
        {
            //机槽下所有设备
            var dk = MachineSlots_go[i].transform.GetComponentsInChildren<PortQuery>().ToList();
            if (dk == null) continue;
            for (int j = 0; j < dk.Count; j++)
            {
                TmsPorts_go.Add(dk[j].gameObject);
            }
        }

        //读取端口配置
        for (int i = 0; i < TmsPorts_go.Count; i++)
        {
            PortQuery P;
            DeviceQuery DP;
            P = TmsPorts_go[i].GetComponent<PortQuery>();
            //DP = TmsPorts_go[i].transform.parent.GetComponent<DeviceQuery>();
            var _DP = FindParent(TmsPorts_go[i], IsFindRacks_goORMachineSlots_goORTmsCards_go);
            if (/*string.IsNullOrEmpty(P.portList.id) ||*/ !_DP)
                continue;
            DP = _DP.GetComponent<DeviceQuery>();
            if (!DP)
                continue;
            foreach (var item in TmsPorts)
            {
                if (item.deviceId == DP.deviceList.id && item.portPosition == P.portList.portPosition)
                {
                    TmsPorts_go[i].GetComponent<PortQuery>().portList = item;
                    TmsPorts_go[i].name = item.id;
                    break;
                }
            }

        }

        Array.ForEach(GameObject.FindObjectsOfType<PortQuery>(), item =>
        {
            if (!item.gameObject.GetComponent<ClickEvent>()) item.gameObject.AddComponent<ClickEvent>();
        });

        Debug.Log("端口加载完成");
    }

    /// <summary>
    /// 加载设备
    /// </summary>
    private void Load_Device()
    {
        Debug.Log("##01");
        if (root_AllDevice == null) return;
        Debug.Log("##02");
        //信息分类-保存
        foreach (var item in root_AllDevice.data)
        {
            //(机柜)
            if (item.type == "1")
                Cabinets.Add(item);
            //(机框)
            if (item.type == "2" && item.deviceType == "1")
                Racks.Add(item);
            //(机槽)
            else if (item.type == "2" && item.deviceType == "2")
                MachineSlots.Add(item);
            //(板卡)
            else if (item.type == "2" && item.deviceType == "3")
                TmsCards.Add(item);
        }
        Debug.Log("##03");
        //读取机柜配置
        #region 单独机柜
        //if (Cabinets_POS != null)
        //{
        //    for (int i = 0; i < Cabinets_POS.Count; i++)
        //    {
        //        for (int j = 0; j < Cabinets.Count; j++)
        //        {
        //            if (Cabinets_POS[i].name == Cabinets[j].devicePosition && Cabinets[j].type == "1")
        //            {
        //                GameObject go;
        //                try
        //                {
        //                    go = Instantiate(Resources.Load<GameObject>("古泉站换流站机房/" + ""));//??
        //                }
        //                catch (Exception e)
        //                {
        //                    Debug.Log("模型生成错误:" + e.Message);
        //                    break;
        //                }
        //                var n = Cabinets_POS[i].name.Split('-');//拆分区域-编号
        //                go.name = Cabinets_POS[i].name;
        //                go.transform.SetParent(Cabinet_quYu[CengJi(n[0])]);
        //                go.transform.position = Cabinets_POS[i].position;
        //                go.transform.rotation = Cabinets_POS[i].rotation;
        //                go.GetComponent<DeviceQuery>().deviceList = root_AllDevice.data[j];
        //                Cabinets_go.Add(go);
        //                break;
        //            }
        //        }
        //    }
        //}
        #endregion

        //读取机柜配置
        for (int i = 0; i < Cabinets_go.Count; i++)
        {
            var n = Cabinets_go[i].GetComponent<DeviceQuery>().deviceList;
            for (int j = 0; j < Cabinets.Count; j++)
            {
                if (n.devicePosition == Cabinets[j].devicePosition)
                {
                    n = Cabinets[j];
                    Cabinets_go[i].GetComponent<DeviceQuery>().deviceList = n;
                    //AssignFields(n, Cabinets[j]);
                    break;
                }
            }
        }
        Debug.Log("##04   Count:" + ENVs.Count);
        //读取机柜环境配置       
        for (int j = 0; j < ENVs.Count;)
        {
            Debug.Log("##04.1   Count:" + ENVs.Count);
            for (int i = 0; i < Cabinets_go.Count; i++)
            {
                Debug.Log("##04.2   i:" + i);
                var n = Cabinets_go[i].GetComponent<DeviceQuery>().deviceList;
                Debug.Log("##04.3   Count:" + ENVs.Count);
                var e = Cabinets_go[i].GetComponent<ENVQuery>();
                Debug.Log("##04.4   Count:" + ENVs.Count);
                //if (ENVs[j].pointDeviceId == n.id)
                if (ENVs[j].rackId == n.id)
                {
                    if (ENVs[j].pointType == "1")
                    {
                        Debug.Log("##04.4.1   Count:" + ENVs.Count);
                        e.eNVList_W = ENVs[j];
                        j++;
                        break;
                    }
                    else if (ENVs[j].pointType == "2")
                    {
                        Debug.Log("##04.4.2  Count:" + ENVs.Count);
                        e.eNVList_S = ENVs[j];
                        j++;
                        break;
                    }
                    else if (ENVs[j].pointType == "3")
                    {
                        Debug.Log("##04.4.3   Count:" + ENVs.Count);
                        e.eNVList_Y = ENVs[j];
                        j++;
                        break;
                    }
                    else if (ENVs[j].pointType == "4")
                    {
                        Debug.Log("##04.4.4   Count:" + ENVs.Count);
                        e.eNVList_S = ENVs[j];
                        j++;
                        break;
                    }
                }
                Debug.Log("##04.5   Count:" + ENVs.Count);
            }
            Debug.Log("j:" + j);
        }
        Debug.Log("##05");

        //动态加载设备(机框)
        for (int i = 0; i < Racks.Count; i++)
        {
            foreach (var item in Cabinets_go)
            {
                if (item.GetComponent<DeviceQuery>().deviceList.id == Racks[i].rackId && !string.IsNullOrEmpty(Racks[i].modelNum))
                {
                    //获取模型编号
                    string modelNum = Racks[i].modelNum;
                    //获取U位
                    var U = Racks[i].devicePosition;
                    GameObject go;
                    //if (nowDevice && Racks_go.Contains(nowDevice))
                    //{

                    //}
                    //else
                    //{

                    //}
                    try
                    {
                        go = Instantiate(Resources.Load<GameObject>("古泉站机房模型90个型号/" + modelNum));
                        //写入机框配置
                        go.GetComponent<DeviceQuery>().deviceList = Racks[i];
                        Racks_go.Add(go);

                        Renderer renderer = go.GetComponentInChildren<Renderer>();
                        if (renderer)
                        {
                            var initrot = go.transform.rotation;
                            go.transform.rotation = Quaternion.identity;

                            var bounds = renderer.bounds;
                            var a = go.AddComponent<BoxCollider>();
                            a.enabled = false;
                            a.isTrigger = false;
                            a.center = bounds.center - go.transform.position;
                            a.size = bounds.size;
                            //a.transform.rotation = Quaternion.identity; //重置其旋转为默认值

                            go.transform.rotation = initrot;
                        }
                        Vector3 center = renderer.bounds.center;
                        go.transform.position = item.transform.Find("U位/" + U).position;
                        var anchorPos = go.transform.Find("锚点").gameObject;
                        var collider = item.transform.Find("U位/" + U).GetComponent<Collider>();
                        //go.transform.position = new Vector3(anchorPos.transform.position.x, anchorPos.transform.position.y + collider.bounds.size.y / 2, anchorPos.transform.position.z);
                        var uPosition = item.transform.Find("U位/" + U).position;
                        var colliderBounds = collider.bounds;
                        float yOffset = colliderBounds.extents.y - colliderBounds.center.y;
                        go.transform.position = new Vector3(uPosition.x, uPosition.y + colliderBounds.extents.y + yOffset, uPosition.z);


                        //go.transform.rotation = item.transform.Find("U位/" + U).rotation;
                        go.name = Racks[i].id;

                        DragController drag = gameObject.GetComponent<DeviceManager>().dragController.GetComponent<DragController>();
                        drag.oriObjectPrefab = go.GetComponent<DragTest1>();
                        drag.uPosManger = item.transform.Find("U位").GetComponent<UPosManger>();
                        drag.CountUPos(drag.oriObjectPrefab, Convert.ToInt32(Racks[i].devicePosition) - 1);


                        go.transform.SetParent(item.transform.Find("U位/" + U));
                        //模型错误微调
                        Model_error(modelNum, go);
                    }
                    catch (Exception e)
                    {
                        Debug.LogError("模型生成错误,机柜:" + item.name + ",模型编号:" + modelNum + ",U位:" + U + "\n" + e.Message + "\n" + e.StackTrace);
                        break;
                    }
                }
            }
        }
        Debug.Log("##06");
        //动态加载设备(机槽)
        for (int i = 0; i < Racks_go.Count; i++)//遍历机框
        {
            //机框下所有设备
            var jc = Racks_go[i].transform.GetComponentsInChildren<DeviceQuery>().ToList();
            for (int j = 0; j < jc.Count; j++)
            {
                //如果是机槽
                if (jc[j].deviceList.deviceType == "2")
                {
                    MachineSlots_go.Add(jc[j].gameObject);
                }
            }
        }
        Debug.Log("##07");
        //读取机槽配置
        for (int i = 0; i < MachineSlots_go.Count; i++)
        {
            DeviceQuery D;
            DeviceQuery DP;
            D = MachineSlots_go[i].transform.GetComponent<DeviceQuery>();//机槽
            //DP = MachineSlots_go[i].transform.parent.GetComponent<DeviceQuery>();//机槽父物体
            var _DP = FindParent(MachineSlots_go[i], IsFindRacks_go);//机槽父物体
            if (!_DP) continue;
            DP = _DP.GetComponent<DeviceQuery>();
            if (!DP) continue;
            foreach (var item in MachineSlots)
            {
                //机槽在机框里
                /*if (item.deviceType == "2")
                {
                    
                }*/
                if (DP.deviceList.deviceType == "1" && item.shelfId == DP.deviceList.id && item.devicePosition == D.deviceList.devicePosition)
                {
                    MachineSlots_go[i].GetComponent<DeviceQuery>().deviceList = item;
                    break;
                }
            }
        }
        Debug.Log("##08");
        //动态加载设备(板卡)
        for (int i = 0; i < MachineSlots_go.Count; i++)//遍历机槽
        {
            //机槽下所有设备
            var bk = MachineSlots_go[i].transform.GetComponentsInChildren<DeviceQuery>().ToList();
            for (int j = 0; j < bk.Count; j++)
            {
                //如果是板卡
                if (bk[j].deviceList.deviceType == "3")
                {
                    TmsCards_go.Add(bk[j].gameObject);
                }
            }
        }
        Debug.Log("##09");
        for (int i = 0; i < Racks_go.Count; i++)//遍历机框
        {
            //机框下所有设备
            var jk = Racks_go[i].GetComponent<DeviceQuery>();
            if (!jk.conf2.isUseUPostItem)
            {
                var bk = Racks_go[i].transform.GetComponentsInChildren<DeviceQuery>().ToList();
                for (int j = 0; j < bk.Count; j++)
                {
                    //如果是板卡
                    if (bk[j].deviceList.deviceType == "3")
                    {
                        TmsCards_go.Add(bk[j].gameObject);
                    }
                }
            }
            else
            {
                
                #region new
                for (int j = 0; j < TmsCards.Count; j++)
                {
                    if (TmsCards[j].id == "1691457954939693292")
                    {
                        Debug.Log("");
                    }
                    if (TmsCards[j].shelfId == jk.deviceList.id)
                    {
                        //获取模型编号
                        string modelNum = TmsCards[j].modelNum;
                        if (string.IsNullOrEmpty(modelNum))
                        {
                            continue;
                        }
                        //获取U位
                        var U = TmsCards[j].devicePosition;
                        GameObject go = null;
                        try
                        {
                            go = Instantiate(Resources.Load<GameObject>("古泉站机房模型90个型号/" + modelNum));
                            //写入板卡配置
                            go.GetComponent<DeviceQuery>().deviceList = TmsCards[j];
                            go.name = TmsCards[j].id;
                            TmsCards_go.Add(go);

                            DragController drag = gameObject.GetComponent<DeviceManager>().dragController.GetComponent<DragController>();
                            drag.oriObjectPrefab = go.GetComponent<DragTest1>();
                            drag.uPosManger = jk.transform.Find("U位").GetComponent<UPosManger>();
                            drag.CountUPos(drag.oriObjectPrefab, Convert.ToInt32(U) - 1);
                            //break;
                            continue;
                        }
                        catch (Exception e)
                        {
                            if (go)
                                DestroyImmediate(go);
                            Debug.LogError("板卡模型生成错误,设备:" + jk.name + ",模型编号:" + modelNum + ",U位:" + U + "\n" + e.Message + "\n" + e.StackTrace);
                            //break;
                            continue;
                        }
                    }
                }
                #endregion
            }
        }
        Debug.Log("##010");
        //读取板卡配置
        for (int i = 0; i < TmsCards_go.Count; i++)
        {
            DeviceQuery DP;
            DeviceQuery D;
            //DP = TmsCards_go[i].transform.parent.GetComponent<DeviceQuery>();//板卡父物体    
            var _DP = FindParent(TmsCards_go[i], IsFindRacks_goORMachineSlots_go);
            D = TmsCards_go[i].transform.GetComponent<DeviceQuery>();//板卡
            if (!_DP) continue;
            DP = _DP.GetComponent<DeviceQuery>();
            foreach (var item in TmsCards)
            {
                /*if (item.deviceType == "3")
                {
                    
                }*/
                if (item.id == "1691457954939693292")
                {
                    Debug.Log("");
                }
                //板卡在机槽里
                if (DP.deviceList.deviceType == "2" && item.slotId == DP.deviceList.id && item.devicePosition == D.deviceList.devicePosition)
                {
                    TmsCards_go[i].GetComponent<DeviceQuery>().deviceList = item;
                    break;
                }
                //板卡在机框里
                else if (DP.deviceList.deviceType == "1" && item.shelfId == DP.deviceList.id && item.devicePosition == D.deviceList.devicePosition)
                {
                    TmsCards_go[i].GetComponent<DeviceQuery>().deviceList = item;
                    break;
                }
            }
        }

        Debug.Log("设备加载完成");
    }

    /// <summary>
    /// 查询所有设备
    /// </summary>
    /// <param name="token"></param>
    /// <returns></returns>
    public IEnumerator init_Device(Action<string> callback, bool isClear = true)
    {
        if (isClear)
        {
            for (int i = Racks_go.Count - 1; i >= 0; i--)
            {
                DestroyImmediate(Racks_go[i]);
            }
            //Debug.Log("@@12-1");
            for (int i = MachineSlots_go.Count - 1; i >= 0; i--)
            {
                DestroyImmediate(MachineSlots_go[i]);
            }
            //Debug.Log("@@12-2");
            for (int i = TmsCards_go.Count - 1; i >= 0; i--)
            {
                DestroyImmediate(TmsCards_go[i]);
            }
            //Debug.Log("@@12-3");
            Cabinets.Clear();
        }
        if (isClear)
            Racks_go.Clear();
        Racks.Clear();

        if (isClear)
            MachineSlots_go.Clear();
        MachineSlots.Clear();

        if (isClear)
            TmsCards_go.Clear();
        TmsCards.Clear();
        //Debug.Log("@@12-4");
        //var jsonResult = await CombineJSON.GetJson_POST(Jk_URL.sb_cx, token);

        //root_AllDevice = JsonConvert.DeserializeObject<DeviceQuery.Root>(jsonResult);

        //StartCoroutine(
        //    CombineJSON.GetJson_POST(Jk_URL.sb_cx, token, (jsonResult) =>
        //    {
        //        root_AllDevice = JsonConvert.DeserializeObject<DeviceQuery.Root>(jsonResult);
        //        Debug.Log("设备查询完成" + "URL:" + Jk_URL.sb_cx + "Token:" + token + "返回内容" + jsonResult);
        //    })
        //);
        yield return StartCoroutine(
            CombineJSON.GetJson_POST(Jk_URL.sb_cx, arguments.token, (jsonResult) =>
            {
                if (string.IsNullOrEmpty(jsonResult))
                {
                    callback.Invoke(null);
                }
                try
                {
                    root_AllDevice = JsonConvert.DeserializeObject<DeviceQuery.Root>(jsonResult);
                    Debug.Log("设备查询完成 :" + root_AllDevice);
                    Debug.Log("设备查询完成" /*+ "URL:" + Jk_URL.sb_cx + "Token:" + arguments.token + "返回内容" + jsonResult*/);
                    callback?.Invoke("1");
                }
                catch (Exception e)
                {
                    Debug.LogWarning("序列化-设备查询错误:" + e.Message);
                    callback.Invoke(null);
                }
            })
        ); ;
    }

    /// <summary>
    /// 查询所有端口
    /// </summary>
    /// <returns></returns>
    public IEnumerator init_Port(Action<string> callback, bool isClear = true)
    {
        for (int i = 0; i < TmsPorts_go.Count; i++)
        {
            DestroyImmediate(TmsPorts_go[i]);
        }

        if (isClear)
            TmsPorts_go.Clear();
        TmsPorts.Clear();

        //var jsonResult1 = await CombineJSON.GetJson_POST(Jk_URL.dk_cx, token);

        //root_AllPort = JsonConvert.DeserializeObject<PortQuery.Root>(jsonResult1);
        //StartCoroutine(
        //CombineJSON.GetJson_POST(Jk_URL.dk_cx, token, (jsonResult1) =>
        //{
        //    root_AllPort = JsonConvert.DeserializeObject<PortQuery.Root>(jsonResult1);
        //    Debug.Log("端口查询完成" + "URL:" + Jk_URL.dk_cx + "Token:" + token + "返回内容" + jsonResult1);
        //})
        //);

        yield return StartCoroutine(
        CombineJSON.GetJson_POST(Jk_URL.dk_cx, arguments.token, (jsonResult1) =>
        {
            if (string.IsNullOrEmpty(jsonResult1))
            {
                callback.Invoke(null);
            }
            try
            {
                root_AllPort = JsonConvert.DeserializeObject<PortQuery.Root>(jsonResult1);
                Debug.Log("端口查询完成" /*+ "URL:" + Jk_URL.dk_cx + "Token:" + arguments.token + "返回内容" + jsonResult1*/);
                callback?.Invoke("1");
            }
            catch (Exception e)
            {
                Debug.LogWarning("序列化-端口查询错误:" + e.Message);
                callback.Invoke(null);
            }

        })
        ); ;
    }

    /// <summary>
    /// 查询所有环境
    /// </summary>
    /// <returns></returns>
    public IEnumerator init_ENV(Action<string> callback)
    {

        ENVs.Clear();

        //var jsonResult2 = await CombineJSON.GetJson_POST(Jk_URL.hj_cx, token);

        //root_AllENV = JsonConvert.DeserializeObject<ENVQuery.Root>(jsonResult2);
        //StartCoroutine(
        //CombineJSON.GetJson_POST(Jk_URL.hj_cx, token, (jsonResult2) =>
        //{
        //    root_AllENV = JsonConvert.DeserializeObject<ENVQuery.Root>(jsonResult2);
        //    Debug.Log("环境查询完成" + "URL:" + Jk_URL.hj_cx + "Token:" + token + "返回内容" + jsonResult2);
        //})
        //);
        yield return StartCoroutine(
        CombineJSON.GetJson_POST(Jk_URL.hj_cx, arguments.token, (jsonResult2) =>
        {
            if (string.IsNullOrEmpty(jsonResult2))
            {
                callback.Invoke(null);
            }
            try
            {
                root_AllENV = JsonConvert.DeserializeObject<ENVQuery.Root>(jsonResult2);

                ENVs.Clear();

                Debug.Log("环境查询完成" /*+ "URL:" + Jk_URL.hj_cx + "Token:" + arguments.token + "返回内容" + jsonResult2*/);
                callback?.Invoke("1");
            }
            catch (Exception e)
            {
                Debug.LogWarning("序列化-环境查询错误:" + e.Message);
            }

        })
        );
    }

    /// <summary>
    /// 查询所有告警
    /// </summary>
    /// <returns></returns>
    public IEnumerator init_TmsAlarm(Action<string> callback)
    {
        Array.ForEach(GameObject.FindObjectsOfType<TmsAlarmQuery>(), itme =>
        {
            itme.tmsAlarmLists.Clear();
        });

        tmsAlarms.Clear();

        //var jsonResult3 = await CombineJSON.GetJson_POST(Jk_URL.gj_cx, token);

        //root_AllAlarm = JsonConvert.DeserializeObject<TmsAlarmQuery.Root>(jsonResult3);
        //StartCoroutine(
        //CombineJSON.GetJson_POST(Jk_URL.gj_cx, token, (jsonResult3) =>
        //{
        //    root_AllAlarm = JsonConvert.DeserializeObject<TmsAlarmQuery.Root>(jsonResult3);
        //    Debug.Log("告警查询完成" + "URL:" + Jk_URL.gj_cx + "Token:" + token + "返回内容" + jsonResult3);
        //})
        //);
        yield return StartCoroutine(
        CombineJSON.GetJson_POST(Jk_URL.gj_cx, arguments.token, (jsonResult3) =>
        {
            if (string.IsNullOrEmpty(jsonResult3))
            {
                callback.Invoke(null);
            }
            else
            {
                try
                {
                    //if (!string.IsNullOrEmpty(jsonResult3))
                    {
                        root_AllAlarm = JsonConvert.DeserializeObject<TmsAlarmQuery.Root>(jsonResult3);

                        if (root_AllAlarm.message == "操作成功")
                        {
                            Array.ForEach(GameObject.FindObjectsOfType<TmsAlarmQuery>(), itme =>
                            {
                                itme.tmsAlarmLists.Clear();
                            });

                            tmsAlarms.Clear();

                            Debug.Log("告警查询完成" /*+ "URL:" + Jk_URL.gj_cx + "Token:" + arguments.token + "返回内容" + jsonResult3*/);
                            callback?.Invoke(jsonResult3);
                        }
                        else
                        {
                            Debug.Log("告警查询失败:" + root_AllAlarm.message);
                            callback?.Invoke(null);
                        }
                    }
                    //else
                    //{
                    //    callback?.Invoke(null);
                    //}
                }
                catch (Exception e)
                {
                    Debug.LogWarning("序列化-告警查询错误:" + e.Message);
                    callback.Invoke(null);
                }
            }

        })
        );
    }

    IEnumerator LoadJSON(string url)
    {
        UnityWebRequest www = UnityWebRequest.Get(url);
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(www.error);
        }
        else
        {
            string jsonData = www.downloadHandler.text;
            // 解析JSON数据
            ParseJSON(jsonData);
        }
    }


    void ParseJSON(string jsonString)
    {
        try
        {
            root_AllDevice = JsonConvert.DeserializeObject<DeviceQuery.Root>(jsonString);
        }
        catch
        {
            try
            {
                root_AllPort = JsonConvert.DeserializeObject<PortQuery.Root>(jsonString);
            }
            catch
            {
                try
                {
                    root_AllAlarm = JsonConvert.DeserializeObject<TmsAlarmQuery.Root>(jsonString);
                }
                catch
                {
                    try
                    {
                        root_AllENV = JsonConvert.DeserializeObject<ENVQuery.Root>(jsonString);
                    }
                    catch
                    {

                    }
                }
            }
        }
    }

    /// <summary>
    /// 获取层级
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    public int CengJi(string s)
    {
        int cj = 0;
        switch (s)
        {
            case "A":
                cj = 0;
                break;
            case "B":
                cj = 1;
                break;
            case "C":
                cj = 2;
                break;
            case "D":
                cj = 3;
                break;
            case "E":
                cj = 4;
                break;
            case "F":
                cj = 5;
                break;
            case "G":
                cj = 6;
                break;
            case "H":
                cj = 7;
                break;
            case "I":
                cj = 8;
                break;
            default:
                break;
        }
        return cj;
    }

    /// <summary>
    /// 根据配置生成线缆
    /// </summary>
    [ContextMenu("根据配置生成线缆")]
    public void FindPortPos()
    {
        var pqs = Array.FindAll(GameObject.FindObjectsOfType<PortQuery>(), itme =>
        {
            PortQuery pq = itme.GetComponent<PortQuery>();
            if (!string.IsNullOrEmpty(pq.portList.id))
                return true;
            else
                return false;
            //return true;
        })/*.Select(item => item.gameObject).ToArray()*/;
        var P_list = FindObjectGroups(pqs.ToList());

        CreateLine createLine = PatternChoose.Inst.huaXian.GetComponent<CreateLine>();

        createLine.list7.Clear();
        foreach (var item in P_list)
        {
            createLine.list7.Add(item[0].transform);
            createLine.list7.Add(item[1].transform);
        }

        createLine.F7();
    }

    public List<List<PortQuery>> FindObjectGroups(List<PortQuery> objects)
    {
        List<List<PortQuery>> objectGroups = new List<List<PortQuery>>();

        for (int i = 0; i < objects.Count; i++)
        {
            PortQuery objectA = objects[i];

            for (int j = i + 1; j < objects.Count; j++)
            {
                PortQuery objectB = objects[j];

                if (objectA.portList.conDevice == objectB.portList.deviceId && objectA.portList.port == objectB.portList.conPort &&
                    objectB.portList.conDevice == objectA.portList.deviceId && objectB.portList.port == objectA.portList.conPort)
                {
                    bool isDuplicate = false;

                    foreach (List<PortQuery> group in objectGroups)
                    {
                        if (group.Contains(objectA) || group.Contains(objectB))
                        {
                            isDuplicate = true;
                            break;
                        }
                    }

                    if (!isDuplicate)
                    {
                        List<PortQuery> newGroup = new List<PortQuery>();
                        newGroup.Add(objectA);
                        newGroup.Add(objectB);
                        objectGroups.Add(newGroup);
                    }
                }
            }
        }

        return objectGroups;
    }


    public void AssignFields<T, U>(T target, U source)
    {
        Type typeTarget = typeof(T);
        Type typeSource = typeof(U);

        PropertyInfo[] propertiesTarget = typeTarget.GetProperties();
        PropertyInfo[] propertiesSource = typeSource.GetProperties();

        foreach (PropertyInfo propertyTarget in propertiesTarget)
        {
            PropertyInfo propertySource = Array.Find(propertiesSource, p => p.Name == propertyTarget.Name);

            if (propertySource != null)
            {
                object propertyValue = propertySource.GetValue(source);
                propertyTarget.SetValue(target, propertyValue);
            }
        }
    }

    /// <summary>
    /// 显示机柜容量
    /// </summary>
    [ContextMenu("显示机柜容量")]
    public void DisplayCapacity(Toggle t)
    {
        GameObject go;
        if (!t.isOn)
        {
            CloseHighlight();
            return;
        }
        //CloseHighlight();
        Color c1 = new Color(1, 109f / 255, 0, 1);//小
        Color c2 = new Color(1, 240f / 255, 0, 1);
        Color c3 = new Color(1, 168f / 255, 0, 1);
        Color c4 = new Color(112f / 255, 240f / 255, 73f / 255, 1);// 大
        for (int i = 0; i < Cabinets_go.Count; i++)
        {
            var D = Cabinets_go[i].GetComponent<DeviceQuery>().deviceList;
            //var H = Cabinets_go[i].GetComponent<HighlightEffect>();
            //try
            //{
            //    go = Cabinets_go[i].transform.Find(Cabinets_go[i].name).gameObject;
            //}
            //catch (Exception)
            //{
            //    go = Cabinets_go[i];
            //}
            //var M = go.GetComponent<Renderer>().materials[0];
            //var M_old = Cabinets_go[i].GetComponent<TransparentGlow>().empty[0];
            //var M_new = new Material(M_old);

            var hight = Cabinets_go[i].transform.Find("高亮").gameObject;

            if (string.IsNullOrEmpty(D.residueNum)) continue;
            else if (Convert.ToSingle(D.residueNum) <= (42 * 0.25f))
            {
                //M_new.SetColor(c1);
                //ChangeMaterialColor(go, 0, c1);
                hight.SetActive(true);
                hight.GetComponent<Renderer>().material = Resources.Load<Material>("Materials/1Tou");
            }
            else if (Convert.ToSingle(D.residueNum) <= (42 * 0.5f))
            {
                // M_new.color = c2;
                //ChangeMaterialColor(go, 0, c2);
                hight.SetActive(true);
                hight.GetComponent<Renderer>().material = Resources.Load<Material>("Materials/2Tou");
            }
            else if (Convert.ToSingle(D.residueNum) <= (42 * 0.75f))
            {
                //M_new.color = c3;
                //ChangeMaterialColor(go, 0, c3);
                hight.SetActive(true);
                hight.GetComponent<Renderer>().material = Resources.Load<Material>("Materials/3Tou");
            }
            else if (Convert.ToSingle(D.residueNum) <= (42))
            {
                //M_new.color = c4;
                //ChangeMaterialColor(go, 0, c4);
                hight.SetActive(true);
                hight.GetComponent<Renderer>().material = Resources.Load<Material>("Materials/4Tou");
            }
        }


    }

    /// <summary>
    /// 显示机柜容量
    /// </summary>
    /// <param name="t"></param>
    public void DisplayCapacity(bool t)
    {
        GameObject go;
        if (!t)
        {
            CloseHighlight();
            return;
        }
        //CloseHighlight();
        Color c1 = new Color(1, 109f / 255, 0, 1);//小
        Color c2 = new Color(1, 240f / 255, 0, 1);
        Color c3 = new Color(1, 168f / 255, 0, 1);
        Color c4 = new Color(112f / 255, 240f / 255, 73f / 255, 1);// 大
        for (int i = 0; i < Cabinets_go.Count; i++)
        {
            var D = Cabinets_go[i].GetComponent<DeviceQuery>().deviceList;
            if (D.rackType == "2")
                continue;
            //var H = Cabinets_go[i].GetComponent<HighlightEffect>();
            try
            {
                go = Cabinets_go[i].transform.Find(Cabinets_go[i].name).gameObject;
            }
            catch (Exception)
            {
                go = Cabinets_go[i];
            }
            //var M = go.GetComponent<Renderer>().materials[0];
            //var M_old = Cabinets_go[i].GetComponent<TransparentGlow>().empty[0];
            //var M_new = new Material(M_old);

            var hight = Cabinets_go[i].transform.Find("高亮").gameObject;

            if (string.IsNullOrEmpty(D.residueNum)) continue;
            else if (Convert.ToSingle(D.residueNum) <= (42 * 0.25f))
            {
                //M_new.SetColor(c1);
                //ChangeMaterialColor(go, 0, c1);
                hight.SetActive(true);
                hight.GetComponent<Renderer>().material = Resources.Load<Material>("Materials/1Tou");
            }
            else if (Convert.ToSingle(D.residueNum) <= (42 * 0.5f))
            {
                // M_new.color = c2;
                //ChangeMaterialColor(go, 0, c2);
                hight.SetActive(true);
                hight.GetComponent<Renderer>().material = Resources.Load<Material>("Materials/2Tou");
            }
            else if (Convert.ToSingle(D.residueNum) <= (42 * 0.75f))
            {
                //M_new.color = c3;
                //ChangeMaterialColor(go, 0, c3);
                hight.SetActive(true);
                hight.GetComponent<Renderer>().material = Resources.Load<Material>("Materials/3Tou");
            }
            else if (Convert.ToSingle(D.residueNum) <= (42))
            {
                //M_new.color = c4;
                //ChangeMaterialColor(go, 0, c4);
                hight.SetActive(true);
                hight.GetComponent<Renderer>().material = Resources.Load<Material>("Materials/4Tou");
            }
        }

    }

    /// <summary>
    /// 关闭高亮
    /// </summary>
    [ContextMenu("关闭高亮")]
    public void CloseHighlight()
    {
        //GameObject go;
        for (int i = 0; i < Cabinets_go.Count; i++)
        {
            //    try
            //    {
            //        go = Cabinets_go[i].transform.Find(Cabinets_go[i].name).gameObject;
            //    }
            //    catch (Exception)
            //    {
            //        go = Cabinets_go[i];
            //    }
            //    ChangeMaterialColor(go, 0, new Color(1, 1, 1, 1));
            var hight = Cabinets_go[i].transform.Find("高亮").gameObject;
            hight.SetActive(false);
        }

    }


    /// <summary>
    /// 显示柜门状态
    /// </summary>
    public void DoorCondition()
    {
        CloseHighlight();
        //Color c = new Color(108f / 255, 221f / 255, 239f / 255, 1);
        for (int i = 0; i < Cabinets_go.Count; i++)
        {
            var D = Cabinets_go[i].GetComponent<DeviceQuery>().deviceList;
            var hight = Cabinets_go[i].transform.Find("高亮").gameObject;
            //var H = Cabinets_go[i].GetComponent<HighlightEffect>();
            //前门
            if (!string.IsNullOrEmpty(D.openFlag))
            {
                if (D.openFlag == "0")
                {
                    //关                   
                    power_close(Cabinets_go[i], "前门");
                }
                else if (D.openFlag == "1")
                {
                    power_open(Cabinets_go[i], "前门");
                    hight.SetActive(true);
                    hight.GetComponent<Renderer>().material = Resources.Load<Material>("Materials/3Tou");
                    continue;
                    //开
                    GameObject go = null;
                    try
                    {
                        go = Cabinets_go[i].transform.Find(Cabinets_go[i].name).gameObject;//有门的
                    }
                    catch (Exception)
                    {
                        go = Cabinets_go[i];//无门的
                    }
                    if (go)
                    {
                        //ChangeMaterialColor(go, 0, c);
                        hight.SetActive(true);
                        hight.GetComponent<Renderer>().material = Resources.Load<Material>("Materials/3Tou");
                        power_open(Cabinets_go[i], "前门");
                    }
                    //var door = Array.Find(Cabinets_go[i].transform.GetComponentsInChildren<Renderer>(), item =>
                    //{
                    //    return item.name.Contains("Object");
                    //});
                    //if (door)
                    //    door.transform.localRotation = Quaternion.Euler(Vector3.forward * -90);
                }
            }
            //后门
            if (!string.IsNullOrEmpty(D.backDoorFlag))
            {
                if (D.backDoorFlag == "0")
                {
                    power_close(Cabinets_go[i], "后门");
                    continue;
                    //模型原因微调
                    if (Cabinets_go[i].name == "R72") return;
                    //关
                    power_close(Cabinets_go[i], "后门");
                }
                else if (D.backDoorFlag == "1")
                {
                    power_open(Cabinets_go[i], "后门");
                    hight.SetActive(true);
                    hight.GetComponent<Renderer>().material = Resources.Load<Material>("Materials/3Tou");
                    continue;
                    //模型原因微调
                    if (Cabinets_go[i].name == "R72") return;
                    //开
                    GameObject go = null;
                    try
                    {
                        go = Cabinets_go[i].transform.Find(Cabinets_go[i].name).gameObject;//有门的
                    }
                    catch (Exception)
                    {
                        go = Cabinets_go[i];//无门的
                    }
                    if (go)
                    {
                        //ChangeMaterialColor(go, 0, c);
                        hight.SetActive(true);
                        hight.GetComponent<Renderer>().material = Resources.Load<Material>("Materials/3Tou");
                        power_open(Cabinets_go[i], "后门");
                    }
                }
            }


            if (D.backDoorFlag == "0" && D.openFlag == "0")
                hight.SetActive(false);
        }
    }

    /// <summary>
    /// 关门
    /// </summary>
    public void power_close()
    {
        #region old
        //for (int i = 0; i < Cabinets_go.Count; i++)
        //{
        //    //var door = Array.FindAll(Cabinets_go[i].transform.GetComponentsInChildren<Renderer>(), item =>
        //    //{
        //    //    return item.name.Contains("Object");
        //    //});

        //    if (/*door.Length == 4 && */Cabinets_go[i].name == "R71")
        //    {
        //        //Cabinets_go[i].transform.GetChild(0).localRotation = Quaternion.Euler(Vector3.zero);
        //        //Cabinets_go[i].transform.GetChild(1).localRotation = Quaternion.Euler(Vector3.zero);

        //        Cabinets_go[i].transform.GetChild(0).DOLocalRotate(Vector3.zero, 2);
        //        Cabinets_go[i].transform.GetChild(1).DOLocalRotate(Vector3.zero, 2);
        //        Cabinets_go[i].transform.GetChild(2).DOLocalRotate(Vector3.zero, 2);
        //        Cabinets_go[i].transform.GetChild(3).DOLocalRotate(Vector3.zero, 2);
        //    }
        //    //模型原因微调
        //    else if (Cabinets_go[i].name == "R72")
        //    {
        //        Cabinets_go[i].transform.GetChild(0).DOLocalRotate(Vector3.zero, 2);
        //        Cabinets_go[i].transform.GetChild(1).DOLocalRotate(Vector3.forward * -180, 2);
        //    }
        //    else /*if (door.Length == 2)*/
        //    {
        //        //door.transform.localRotation = Quaternion.Euler(Vector3.zero);
        //        Cabinets_go[i].transform.GetChild(0).DOLocalRotate(Vector3.zero, 2);
        //        Cabinets_go[i].transform.GetChild(1).DOLocalRotate(Vector3.zero, 2);
        //    }
        //}
        ////CloseHighlight();
        #endregion

        for (int i = 0; i < roomDoors.Count; i++)
        {
            if (roomDoors[i].is_open)
                roomDoors[i].DoorClose(true);
        }
    }

    /// <summary>
    /// 开门
    /// </summary>
    public void power_open()
    {
        #region old
        //for (int i = 0; i < Cabinets_go.Count; i++)
        //{
        //    //var door = Array.FindAll(Cabinets_go[i].transform.GetComponentsInChildren<Renderer>(), item =>
        //    //{
        //    //    return item.name.Contains("Object");
        //    //});

        //    if (/*door.Length == 4 && */Cabinets_go[i].name == "R71")
        //    {
        //        //Cabinets_go[i].transform.GetChild(0).localRotation = Quaternion.Euler(Vector3.forward * -90);
        //        //Cabinets_go[i].transform.GetChild(1).localRotation = Quaternion.Euler(Vector3.forward * 90);

        //        Cabinets_go[i].transform.GetChild(0).DOLocalRotate(Vector3.forward * -90, 2f);
        //        Cabinets_go[i].transform.GetChild(1).DOLocalRotate(Vector3.forward * 90, 2f);
        //    }
        //    //模型原因微调
        //    else if (Cabinets_go[i].name == "R72")
        //    {
        //        Cabinets_go[i].transform.GetChild(0).DOLocalRotate(Vector3.forward * -90, 2f);
        //        Cabinets_go[i].transform.GetChild(1).DOLocalRotate(Vector3.forward * 90, 2f);

        //    }
        //    else /*if (door.Length == 2)*/
        //    {
        //        //door.transform.localRotation = Quaternion.Euler(Vector3.forward * -90);
        //        //door.transform.DOLocalRotate(Vector3.forward * -90, 2f);
        //        Cabinets_go[i].transform.GetChild(0).DOLocalRotate(Vector3.forward * -90, 2f);
        //    }
        //}
        //CloseHighlight();
        #endregion

        for (int i = 0; i < roomDoors.Count; i++)
        {
            if (!roomDoors[i].is_open)
                roomDoors[i].DoorOpen(true);
        }
    }

    /// <summary>
    /// 开门(单个)
    /// </summary>
    /// <param name="cabinet"></param>
    public void power_open(GameObject cabinet, string type)
    {
        #region old
        //if (type == "前门")
        //{
        //    if (/*door.Length == 4 && */cabinet.name == "R71")
        //    {
        //        cabinet.transform.GetChild(0).DOLocalRotate(Vector3.forward * -90, 2f);
        //        cabinet.transform.GetChild(1).DOLocalRotate(Vector3.forward * 90, 2f);
        //    }
        //    else /*if (door.Length == 2)*/
        //        //door.transform.localRotation = Quaternion.Euler(Vector3.forward * -90);
        //        cabinet.transform.GetChild(0).DOLocalRotate(Vector3.forward * -90, 2f);
        //}
        //else if (type == "后门")
        //{
        //    if (/*door.Length == 4 && */cabinet.name == "R71")
        //    {
        //        cabinet.transform.GetChild(2).DOLocalRotate(Vector3.forward * -90, 2f);
        //        cabinet.transform.GetChild(3).DOLocalRotate(Vector3.forward * 90, 2f);
        //    }
        //    //模型原因微调
        //    else if (cabinet.name == "R72")
        //    {
        //        cabinet.transform.GetChild(1).DOLocalRotate(Vector3.forward * 90, 2f);

        //    }
        //    else /*if (door.Length == 2)*/
        //        //door.transform.localRotation = Quaternion.Euler(Vector3.forward * -90);
        //        cabinet.transform.GetChild(1).DOLocalRotate(Vector3.forward * -90, 2f);
        //}
        //else if (type == "全开")
        //{
        //    if (/*door.Length == 4 && */cabinet.name == "R71")
        //    {
        //        cabinet.transform.GetChild(0).DOLocalRotate(Vector3.forward * -90, 2f);
        //        cabinet.transform.GetChild(1).DOLocalRotate(Vector3.forward * 90, 2f);
        //        cabinet.transform.GetChild(2).DOLocalRotate(Vector3.forward * -90, 2f);
        //        cabinet.transform.GetChild(3).DOLocalRotate(Vector3.forward * 90, 2f);
        //    }
        //    //模型原因微调
        //    else if (cabinet.name == "R72")
        //    {
        //        cabinet.transform.GetChild(0).DOLocalRotate(Vector3.forward * -90, 2f);
        //        cabinet.transform.GetChild(1).DOLocalRotate(Vector3.forward * 90, 2f);

        //    }
        //    else /*if (door.Length == 2)*/
        //    {
        //        cabinet.transform.GetChild(0).DOLocalRotate(Vector3.forward * -90, 2f);
        //        cabinet.transform.GetChild(1).DOLocalRotate(Vector3.forward * -90, 2f);
        //    }
        //}
        #endregion
        var doors = cabinet.GetComponentsInChildren<RoomDoor>(true);
        if (doors.Length <= 0) return;
        if (type == "前门")
        {
            if (doors.Length > 2)
            {
                cabinet.transform.GetChild(0).GetComponent<RoomDoor>().DoorOpen(true);
                cabinet.transform.GetChild(1).GetComponent<RoomDoor>().DoorOpen(true);
            }
            else
            {
                cabinet.transform.GetChild(0).GetComponent<RoomDoor>().DoorOpen(true);
            }
        }
        else if (type == "后门")
        {
            if (doors.Length > 2)
            {
                cabinet.transform.GetChild(2).GetComponent<RoomDoor>().DoorOpen(true);
                cabinet.transform.GetChild(3).GetComponent<RoomDoor>().DoorOpen(true);
            }
            else
            {
                cabinet.transform.GetChild(1).GetComponent<RoomDoor>().DoorOpen(true);
            }
        }
        else if (type == "全开")
        {
            for (int i = 0; i < doors.Length; i++)
            {
                doors[i].DoorOpen(true);
            }
        }
    }

    /// <summary>
    /// 关门(单个)
    /// </summary>
    /// <param name="cabinet"></param>
    public void power_close(GameObject cabinet, string type)
    {
        #region old
        ////var door = Array.FindAll(cabinet.GetComponentsInChildren<Renderer>(), item =>
        ////{
        ////    return item.name.Contains("Object");
        ////});
        //if (type == "前门")
        //{
        //    if (/*door.Length == 4 && */cabinet.name == "R71")
        //    {
        //        //cabinet.transform.GetChild(0).localRotation = Quaternion.Euler(Vector3.zero);
        //        //cabinet.transform.GetChild(1).localRotation = Quaternion.Euler(Vector3.zero);

        //        cabinet.transform.GetChild(0).DOLocalRotate(Vector3.zero, 2);
        //        cabinet.transform.GetChild(1).DOLocalRotate(Vector3.zero, 2);
        //    }
        //    else/* (door.Length == 2)*/
        //        //door.transform.localRotation = Quaternion.Euler(Vector3.zero);
        //        cabinet.transform.GetChild(0).DOLocalRotate(Vector3.zero, 2);
        //}
        //else if (type == "后门")
        //{
        //    if (/*door.Length == 4 && */cabinet.name == "R71")
        //    {
        //        cabinet.transform.GetChild(2).DOLocalRotate(Vector3.zero, 2);
        //        cabinet.transform.GetChild(3).DOLocalRotate(Vector3.zero, 2);
        //    }
        //    //模型原因微调
        //    else if (cabinet.name == "R72")
        //    {
        //        cabinet.transform.GetChild(1).DOLocalRotate(Vector3.forward * -180, 2);
        //    }
        //    else /*if (door.Length == 2)*/
        //        cabinet.transform.GetChild(1).DOLocalRotate(Vector3.zero, 2);
        //}
        //else if (type == "全关")
        //{
        //    if (cabinet.name == "R71")
        //    {
        //        cabinet.transform.GetChild(0).DOLocalRotate(Vector3.zero, 2);
        //        cabinet.transform.GetChild(1).DOLocalRotate(Vector3.zero, 2);
        //        cabinet.transform.GetChild(2).DOLocalRotate(Vector3.zero, 2);
        //        cabinet.transform.GetChild(3).DOLocalRotate(Vector3.zero, 2);
        //    }
        //    //模型原因微调
        //    else if (cabinet.name == "R72")
        //    {
        //        cabinet.transform.GetChild(0).DOLocalRotate(Vector3.zero, 2);
        //        cabinet.transform.GetChild(1).DOLocalRotate(Vector3.forward * -180, 2);
        //    }
        //    else
        //    {
        //        cabinet.transform.GetChild(0).DOLocalRotate(Vector3.zero, 2);
        //        cabinet.transform.GetChild(1).DOLocalRotate(Vector3.zero, 2);
        //    }
        //}
        #endregion
        var doors = cabinet.GetComponentsInChildren<RoomDoor>(true);
        if (doors.Length <= 0) return;
        if (type == "前门")
        {
            if (doors.Length > 2)
            {
                cabinet.transform.GetChild(0).GetComponent<RoomDoor>().DoorClose(true);
                cabinet.transform.GetChild(1).GetComponent<RoomDoor>().DoorClose(true);
            }
            else
            {
                cabinet.transform.GetChild(0).GetComponent<RoomDoor>().DoorClose(true);
            }
        }
        else if (type == "后门")
        {
            if (doors.Length > 2)
            {
                cabinet.transform.GetChild(2).GetComponent<RoomDoor>().DoorClose(true);
                cabinet.transform.GetChild(3).GetComponent<RoomDoor>().DoorClose(true);
            }
            else
            {
                cabinet.transform.GetChild(1).GetComponent<RoomDoor>().DoorClose(true);
            }
        }
        else if (type == " 全开")
        {
            for (int i = 0; i < doors.Length; i++)
            {
                doors[i].DoorClose(true);
            }
        }
    }

    /// <summary>
    /// 变色
    /// </summary>
    /// <param name="go"></param>
    /// <param name="materialIndex"></param>
    /// <param name="newColor"></param>
    public void ChangeMaterialColor(GameObject go, int materialIndex, Color newColor)
    {
        MeshRenderer renderer = go.GetComponent<MeshRenderer>();

        // 获取当前材质球数组
        Material[] materials = renderer.materials;

        // 确保 materialIndex 在有效范围内
        if (materialIndex >= 0 && materialIndex < materials.Length)
        {
            // 创建新的材质球数组
            Material[] newMaterials = materials.Clone() as Material[];

            // 更改特定索引位置的材质球颜色
            newMaterials[materialIndex].color = newColor;

            // 将新的材质球数组赋值给 MeshRenderer
            renderer.materials = newMaterials;
        }
    }

    /// <summary>
    /// 变色
    /// </summary>
    /// <param name="go"></param>
    /// <param name="materialIndex"></param>
    /// <param name="newColor"></param>
    public void ChangeMaterialColor(GameObject go, int index)
    {

        var hight = go.transform.Find("高亮").gameObject;

        Material material = null;

        switch (index)
        {
            case 1:
                material = Resources.Load<Material>("Materials/1Tou");
                break;
            case 2:
                material = Resources.Load<Material>("Materials/2Tou");
                break;
            case 3:
                material = Resources.Load<Material>("Materials/3Tou");
                break;
            case 4:
                material = Resources.Load<Material>("Materials/4Tou");
                break;
            default:
                break;
        }
        hight.GetComponent<Renderer>().material = material;
        hight.SetActive(true);

        //Renderer renderer = hight.GetComponent<Renderer>();


        //Material[] sharedMaterials = renderer.sharedMaterials;

        ////for (int i = 0; i < sharedMaterials.Length; i++)
        ////{
        ////    sharedMaterials[i] = newMaterial;
        ////}

        //sharedMaterials[0] = material;

        //renderer.sharedMaterials = sharedMaterials;

    }

    private void OnDisable()
    {
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.End))
        {

            init();
        }
    }

    public void init()
    {
        if (!nowCabine && nowCabine != null && !objectToShow_add)
        {
            var serarch1 = objectToShow_add.GetComponent<SearchName1>();
            var drag = serarch1.dragController;
            drag.uPosManger = nowCabine.transform.Find("U位").GetComponent<UPosManger>();
        }

        Array.ForEach(pop_ups.ToArray(), (itme) =>
        {
            itme.gameObject.SetActive(false);
        });
        StartCoroutine(LoadAddress((ct) =>
        {
            if (ct != null)
            {
                Jk_URL = new webURL(ct);
                StartCoroutine(Initialize((x) =>
                {
                    if (string.IsNullOrEmpty(x))
                    {
                        SecondConfirmPanel.DeleteConform(null, "进入场景失败");
                        Debug.Log("接口获取数据失败(手动-初始化失败)");
                        LoadScene();
                    }
                }));
            }
            else
            {
                Debug.Log("获取地址错误!");
            }
        }));
    }






    /// <summary>
    /// 递增寻找父物体
    /// </summary>
    /// <param name="gameObject"></param>
    /// <param name="condition"></param>
    /// <returns></returns>
    public GameObject FindParent(GameObject gameObject, System.Predicate<GameObject> condition)
    {
        if (gameObject == null)
            return null;
        if (condition(gameObject))
            return gameObject;
        Transform parent = gameObject.transform.parent;
        while (parent != null)
        {
            if (condition(parent.gameObject))
            {
                return parent.gameObject;
            }

            parent = parent.parent;
        }

        return null;
    }

    /// <summary>
    /// 条件--机柜
    /// </summary>
    /// <param name="go"></param>
    /// <returns></returns>
    public bool IsDesiredParent(GameObject go)
    {
        DeviceQuery d = go.GetComponent<DeviceQuery>();
        return (d != null && d.deviceList.type == "1");
    }

    /// <summary>
    /// 条件--UPosManger
    /// </summary>
    /// <param name="go"></param>
    /// <returns></returns>
    public bool IsFindParent_UPosManger(GameObject go)
    {
        UPosManger d = go.GetComponent<UPosManger>();
        return (d != null);
    }

    /// <summary>
    /// 条件-机框
    /// </summary>
    /// <param name="go"></param>
    /// <returns></returns>
    public bool IsFindRacks_go(GameObject go)
    {
        DeviceQuery d = go.GetComponent<DeviceQuery>();
        return (d != null && d.deviceList.type == "2" && d.deviceList.deviceType == "1");
    }

    /// <summary>
    /// 条件--机框或机槽
    /// </summary>
    /// <param name="go"></param>
    /// <returns></returns>
    public bool IsFindRacks_goORMachineSlots_go(GameObject go)
    {
        DeviceQuery d = go.GetComponent<DeviceQuery>();
        return (d != null && d.deviceList.type == "2" && (d.deviceList.deviceType == "1" || d.deviceList.deviceType == "2"));
    }

    /// <summary>
    /// 条件--机框或机槽或板卡
    /// </summary>
    /// <param name="go"></param>
    /// <returns></returns>
    public bool IsFindRacks_goORMachineSlots_goORTmsCards_go(GameObject go)
    {
        DeviceQuery d = go.GetComponent<DeviceQuery>();
        return (d != null && d.deviceList.type == "2" && (d.deviceList.deviceType == "1" || d.deviceList.deviceType == "2" || d.deviceList.deviceType == "3"));
    }

    /// <summary>
    /// 条件--UPosItem
    /// </summary>
    /// <param name="go"></param>
    /// <returns></returns>
    public bool IsFindUposItem(GameObject go)
    {
        UPosItem uPosItem = go.GetComponent<UPosItem>();
        return (uPosItem != null);
    }

    /// <summary>
    /// 条件--LineGroupItem
    /// </summary>
    /// <param name="go"></param>
    /// <returns></returns>
    public bool IsFindLineGroupItem(GameObject go)
    {
        LineGroupItem lineGroupItem = go.GetComponent<LineGroupItem>();
        return (lineGroupItem != null);
    }



    // 读取地址
    public IEnumerator LoadAddress(Action<string> callback)
    {
        #region UnityWebRequest读取
        string filePath = Application.streamingAssetsPath + "/dz.txt";

        UnityWebRequest www = UnityWebRequest.Get(filePath);
        DownloadHandlerBuffer dH = new DownloadHandlerBuffer();
        www.downloadHandler = dH;
        //www.timeout = 15;
        yield return www.SendWebRequest();

        if (www.result == UnityWebRequest.Result.Success)
        {
            // 等待一帧
            yield return null;

            // 检查请求是否已完成
            while (!www.isDone)
            {
                yield return null;
            }
            string fileContent = www.downloadHandler.text;

            if (string.IsNullOrEmpty(fileContent))
            {
                callback(null);
            }
            else
            {
                Debug.Log("获取穿透成功");
                callback(fileContent);
            }
        }
        else
        {
            Debug.LogError("获取穿透失败: " + www.error);
            callback(null);
        }
        #endregion

        //yield return 1;
        //callback("http://192.168.41.106:8081/");

    }

    // 获取接口信息
    public IEnumerator Initialize(Action<string> callback = null, bool isInFo = false)
    {
        portCloseFlashing();
        yield return null;
        //Debug.Log("@@10");
        isLoading = false;
        //Debug.Log("@@11");
        //TransparentGlowManage.Inst.addScript();
        //Debug.Log("@@12");
        /*yield return */

        #region 保留
        //if (isInFo)
        //{
        //    StartCoroutine(init_Device((x) =>
        //    {
        //        if (!string.IsNullOrEmpty(x))
        //        {
        //            StartCoroutine(init_Port((y) =>
        //            {
        //                if (!string.IsNullOrEmpty(y))
        //                {
        //                    //callback?.Invoke("1");
        //                    StartCoroutine(LineQuery.Inst.getJsonCoroutine((z) =>
        //                    {
        //                        if (z != null)
        //                        {
        //                            StartCoroutine(PatternChoose.Inst.xianlan.getByCode((v) =>
        //                            {
        //                                if (!string.IsNullOrEmpty(v))
        //                                {
        //                                    callback?.Invoke("1");
        //                                }
        //                                else
        //                                {
        //                                    Debug.Log("查询线路类型错误 @@");
        //                                    callback.Invoke(null);
        //                                }
        //                            }));
        //                        }
        //                        else
        //                        {
        //                            Debug.Log("查询线缆组错误 @@");
        //                            callback.Invoke(null);
        //                        }
        //                    }));

        //                }
        //                else
        //                {
        //                    Debug.Log("查询端口错误 @@");
        //                    callback.Invoke(null);
        //                }
        //            }, false));
        //        }
        //        else
        //        {
        //            Debug.Log("查询设备错误 @@");
        //            callback.Invoke(null);
        //        }
        //    }, false));
        //}
        //else
        #endregion

        StartCoroutine(init_Device((x) =>
            {
                Debug.Log("@@1");
                if (!string.IsNullOrEmpty(x))
                {
                    Debug.Log("@@2");
                    StartCoroutine(init_Port((y) =>
                    {
                        Debug.Log("@@3");
                        if (!string.IsNullOrEmpty(y))
                        {
                            Debug.Log("@@4");
                            LineGroupManager.Instance.Empty_line_content_left();
                            LineGroupManager.Instance.Empty_line_content_right();
                            int? a = LineGroupManager.Instance.line_group_content.transform.childCount;
                            StartCoroutine(LineQuery.Inst.getJsonCoroutine((u, z) =>
                            {
                                if (u)
                                {
                                    Debug.Log("@@5");
                                    StartCoroutine(PatternChoose.Inst.xianlan.getByCode((v) =>
                                    {
                                        Debug.Log("@@5.1");
                                        if (!string.IsNullOrEmpty(v))
                                        {
                                            LoadScene();
                                            callback?.Invoke("1");
                                        }
                                        else
                                        {
                                            Debug.Log("查询线路类型错误 @@5.1");
                                            callback.Invoke(null);
                                        }
                                    }));
                                }
                                else
                                {
                                    Debug.Log("查询线缆组错误 @@4:" + z);
                                    callback.Invoke(null);
                                }
                            }));
                        }
                        else
                        {
                            Debug.Log("查询端口错误 @@3");
                            callback.Invoke(null);
                        }
                    }));
                }
                else
                {
                    Debug.Log("查询设备错误 @@1");
                    callback.Invoke(null);

                    //callback?.Invoke("1");
                }
            }));

        //Debug.Log("@@13");//???
        //yield return StartCoroutine(init_Port());
        //Debug.Log("@@14");
        //yield return StartCoroutine(init_TmsAlarm());

        //yield return StartCoroutine(init_ENV());

        //yield return StartCoroutine(LineQuery.Inst.getJsonCoroutine());
        //Debug.Log("@@15");
        //LoadScene();
    }

    // 加载场景
    public void LoadScene()
    {
        Debug.Log("@@5.2");
        Array.ForEach(GameManager.Inst.pop_ups.ToArray(), (itme) =>
        {
            itme.gameObject.SetActive(false);
        });
        Debug.Log("@@5.3");
        // 加载场景
        Load_Device();
        Debug.Log("@@5.4");
        Load_Port();
        //Load_TmsAlarm();
        //Load_ENV();
        Debug.Log("@@6");
        TransparentGlowManage.Inst.addScript();
        Debug.Log("@@7");
        LineGroupManager.Instance.addxianlan();
        Debug.Log("@@8");
        for (int i = 0; i < Cabinets_go.Count; i++)
        {
            Cabinets_go[i].GetComponent<TransparentGlow>().OnSceneReloaded();
        }
        Debug.Log("@@9");
        //三维场景加载时显示地图
        Application.ExternalCall("OnSceneLoaded", "三维加载完成");
        Debug.Log("@@10 三维加载完成");
        isLoading = true;

        if (CabinetUIManager.Instance.current_menu == Menu.M_数字机房_线缆连接_配置)
        {
            for (int i = 0; i < TmsPorts_go.Count; i++)
            {
                var g = FindParent(TmsPorts_go[i], IsDesiredParent);
                if (g && g.activeSelf)
                {
                    var p = TmsPorts_go[i].GetComponent<PortQuery>();

                    p.hight.SetActive(true);

                    if (!string.IsNullOrEmpty(p.portList.conDevice))
                        WebInteraction.Inst.changC(p.hight, "1");
                }
            }

            if (transform)
            {

            }
        }
        else if (magnifyState && CabinetUIManager.Instance.current_menu == Menu.M_数字机房_场景管理)
        {
            search_box.SetActive(true);
        }

        //StartCoroutine(CombineJSON.ReadLocalText(Path.Combine(Application.streamingAssetsPath, "localVideoConfiguration.txt"), (_error, _json) =>
        //{
        StartCoroutine(CombineJSON.GetJson_GET(Jk_URL.bdsp, arguments.token, (x) =>
        {
            Debug.Log("订阅本地视频:" + x);
        }));
        //}));
        //if (magnifyState)
        //{
        //    openCap();
        //}
        //Debug.Log("@@16");
    }

    /// <summary>
    ///  模型微调(打开前盖)
    /// </summary>
    /// <param name="isZoomin">是否为放大状态</param>
    public void openCap()
    {
        for (int i = 0; i < GameManager.Inst.Racks_go.Count; i++)
        {
            if (!GameManager.Inst.Racks_go[i].activeSelf)
                continue;
            if (GameManager.Inst.Racks_go[i].GetComponent<DeviceQuery>().deviceList.modelNum == "6" ||
                GameManager.Inst.Racks_go[i].GetComponent<DeviceQuery>().deviceList.modelNum == "7" ||
                GameManager.Inst.Racks_go[i].GetComponent<DeviceQuery>().deviceList.modelNum == "20" ||
                GameManager.Inst.Racks_go[i].GetComponent<DeviceQuery>().deviceList.modelNum == "21" ||
                GameManager.Inst.Racks_go[i].GetComponent<DeviceQuery>().deviceList.modelNum == "91" ||
                GameManager.Inst.Racks_go[i].GetComponent<DeviceQuery>().deviceList.modelNum == "92" ||
                GameManager.Inst.Racks_go[i].GetComponent<DeviceQuery>().deviceList.modelNum == "93")
                //GameManager.Inst.Racks_go[i].transform.Find("前盖").gameObject.SetActive(false);
                GameManager.Inst.Racks_go[i].transform.Find("前盖").GetChild(0).DOLocalRotate(Vector3.zero, 1);
        }
    }


    /// <summary>
    /// 模型错误微调
    /// </summary>
    /// <param name="modelNum"></param>
    /// <param name="go"></param>

    public void Model_error(string modelNum, GameObject go)
    {
        if (modelNum == "14" || modelNum == "15" || modelNum == "83")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.25f, 0, 0), false);
        }
        else if (modelNum == "1")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.25f, -0.0835f, 0), false);
        }
        else if (modelNum == "2")
        {
            MoveParentAndChildren(go.transform, new Vector3(0.056f, -0.0835f, 0), false);
        }
        else if (modelNum == "4")
        {
            //MoveParentAndChildren(go.transform, new Vector3(-0.31f, 0, 0.1575f), false);
            MoveParentAndChildren(go.transform, new Vector3(-0.244f, 0.1575f, 0), false);
        }
        else if (modelNum == "18")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.31f, 0, 0), false);
        }
        else if (modelNum == "19")
        {
            //MoveParentAndChildren(go.transform, new Vector3(-0.27f, 0f, -0), false);
            go.transform.localPosition = Vector3.zero;
            MoveParentAndChildren(go.transform, new Vector3(0, 0.022f, 0), false);
        }
        else if (modelNum == "24" || modelNum == "34")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.4f, 0f, -0), false);
        }
        else if (modelNum == "6" || modelNum == "7" || modelNum == "20" || modelNum == "21" || modelNum == "91" || modelNum == "92" || modelNum == "93")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.163f, 0, 0), false);
        }
        else if (modelNum == "36")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.248f, 0, 0), false);
        }
        else if (modelNum == "37" || modelNum == "41")
        {
            //MoveParentAndChildren(go.transform, new Vector3(0, 0.0685f, 0), false);
            //MoveParentAndChildren(go.transform, new Vector3(0, 0f, -0), false);
        }
        else if (modelNum == "55")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.283f, 0f, 0f), false);
        }
        else if (modelNum == "77")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.208f, 0f, 0f), false);
        }
        else if (modelNum == "81")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.17f, 0f, 0f), false);
        }
        else if (modelNum == "86")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.212f, 0f, 0f), false);
        }
        else if (modelNum == "95" || modelNum == "96" || modelNum == "97")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.09f, 0, 0), false);
        }
        else if (modelNum == "98")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.258f, 0, 0), false);
        }
        else if (modelNum == "99")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.313f, 0, 0), false);
        }
        else if (modelNum == "100" || modelNum == "101")
        {
            MoveParentAndChildren(go.transform, new Vector3(-0.233f, 0, 0), false);
        }
    }

    /// <summary>
    /// 微调模型移动
    /// </summary>
    public void MoveParentAndChildren(Transform parentTransform, Vector3 moveDistance, bool ismove_child = true)
    {
        // 移动父物体
        parentTransform.position += moveDistance;

        if (!ismove_child)
            return;
        // 移动所有子物体
        foreach (Transform childTransform in parentTransform)
        {
            childTransform.position += moveDistance;
        }
    }

    /// <summary>
    /// 滑动UI自适应高度
    /// </summary>
    /// <param name="popup"></param>
    /// <param name="content"></param>
    /// <param name="content_ret"></param>
    /// <param name="content_grid"></param>
    public void AdaptiveHight(GameObject popup, Transform content, RectTransform content_ret, GridLayoutGroup content_grid)
    {
        //var content_ret= content.GetComponent<RectTransform>();
        //var content_grid = content.GetComponent<GridLayoutGroup>();
        if (popup.activeSelf)
        {
            float x = content_ret.sizeDelta.x;
            float y = content_grid.padding.top + content.childCount * content_grid.cellSize.y + (content.childCount - 1) * content_grid.spacing.y;
            content_ret.sizeDelta = new Vector2(x, y);
        }
    }

    /// <summary>
    /// 移除空元素
    /// </summary>
    public void RemoveEmptyElements()
    {
        Array.ForEach(Racks_go.ToArray(), (item) =>
        {
            if (item == null)
                Racks_go.Remove(item);
        });
        Array.ForEach(MachineSlots_go.ToArray(), (item) =>
        {
            if (item == null)
                MachineSlots_go.Remove(item);
        });
        Array.ForEach(TmsCards_go.ToArray(), (item) =>
        {
            if (item == null)
                TmsCards_go.Remove(item);
        });
        Array.ForEach(TmsPorts_go.ToArray(), (item) =>
        {
            if (item == null)
                TmsPorts_go.Remove(item);
        });
    }


    private Coroutine stopCor_1;
    /// <summary>
    /// 开启端口闪烁
    /// </summary>
    /// <param name="port1"></param>
    /// <param name="port2"></param>
    public void portOpenFlashing(GameObject port1, GameObject port2)
    {
        //return;
        stopCor_1 = StartCoroutine(OpenFlashing(port1, port2));
    }

    IEnumerator OpenFlashing(GameObject port1, GameObject port2)
    {
        GameObject H1 = port1.GetComponent<PortQuery>().hight;
        GameObject H2 = port2.GetComponent<PortQuery>().hight;
        H1.SetActive(true);
        H2.SetActive(true);
        //ClickEventLens clickEventLens = new ClickEventLens();
        while (true)
        {
            WebInteraction.Inst.changC(H1, "4");
            WebInteraction.Inst.changC(H2, "4");
            yield return new WaitForSeconds(0.75f);
            WebInteraction.Inst.changC(H1, "1");
            WebInteraction.Inst.changC(H2, "1");
            yield return new WaitForSeconds(0.75f);
        }
    }

    /// <summary>
    /// 关闭端口闪烁
    /// </summary>
    public void portCloseFlashing()
    {
        if (stopCor_1 != null)
            StopCoroutine(stopCor_1);
    }


    /// <summary>
    /// 接口地址
    /// </summary>
    [System.Serializable]
    public class webURL
    {
        /// <summary>
        /// 设备-查询URL
        /// </summary>
        [Header("设备-查询URL")] public string sb_cx;
        /// <summary>
        /// 设备-新增URL
        /// </summary>
        [Header("设备-新增URL")] public string sb_xz;
        /// <summary>
        /// 设备-删除URL
        /// </summary>
        [Header("设备-删除URL")] public string sb_sc;
        /// <summary>
        /// 设备-编辑URL
        /// </summary>
        [Header("设备-编辑URL")] public string sb_bj;
        /// <summary>
        /// 端口-查询URL
        /// </summary>
        [Header("端口-查询URL")] public string dk_cx;
        /// <summary>
        /// 端口-新增URL
        /// </summary>
        [Header("端口-新增URL")] public string dk_xz;
        /// <summary>
        /// 端口-删除URL
        /// </summary>
        [Header("端口-删除URL")] public string dk_sc;
        /// <summary>
        /// 端口-编辑URL
        /// </summary>
        [Header("端口-编辑URL")] public string dk_bj;
        /*----------------------------------------------------------------------------------*/
        /// <summary>
        /// 环境-查询URL
        /// </summary>
        [Header("环境-查询URL")] public string hj_cx;
        /// <summary>
        /// 告警-查询URL
        /// </summary>
        [Header("告警-查询URL")] public string gj_cx;
        /// <summary>
        /// 工作票-查询URL
        /// </summary>
        [Header("工作票-查询URL")] public string gzp_cx;
        /// <summary>
        /// 检修票-查询URL
        /// </summary>
        [Header("检修票-查询URL")] public string jxp_cx;
        /*----------------------------------------------------------------------------------*/
        /// <summary>
        /// 线缆-删除URL
        /// </summary>
        [Header("线缆-删除URL")] public string xl_sc;
        /*----------------------------------------------------------------------------------*/
        /// <summary>
        /// 线缆组-查询URL
        /// </summary>
        [Header("线缆组-查询URL")] public string xlz_cx;
        /// <summary>
        /// 线缆组-新增URL
        /// </summary>
        [Header("线缆组-新增URL")] public string xlz_xz;
        /// <summary>
        /// 线缆组-删除URL
        /// </summary>
        [Header("线缆组-删除URL")] public string xlz_sc;
        /// <summary>
        /// 线缆组-编辑URL
        /// </summary>
        [Header("线缆组-编辑URL")] public string xlz_bj;
        /*----------------------------------------------------------------------------------*/
        /// <summary>
        /// 线路类型-查询URL
        /// </summary>
        [Header("线路类型-查询URL")] public string xllx_cx;
        /*----------------------------------------------------------------------------------*/
        /// <summary>
        /// 菜单权限-查询URL
        /// </summary>
        [Header("菜单权限-查询URL")] public string cdqx_cx;
        /*----------------------------------------------------------------------------------*/
        /// <summary>
        /// 红外监测详情-查询URL
        /// </summary>
        [Header("红外监测详情-查询URL")] public string hwjc_cx;
        /*----------------------------------------------------------------------------------*/
        /// <summary>
        /// 机器人保存指令URL
        /// </summary>
        [Header("机器人保存指令URL")] public string jqr_bczl;
        /*----------------------------------------------------------------------------------*/
        /// <summary>
        /// 机器人保存坐标URL
        /// </summary>
        [Header("机器人保存坐标URL")] public string jqr_bczb;
        /*----------------------------------------------------------------------------------*/
        /// <summary>
        /// 机器人返回筛选-查询URL
        /// </summary>
        [Header("机器人返回筛选-查询URL")] public string jqr_xj_cx;
        /*----------------------------------------------------------------------------------*/
        /// <summary>
        /// 机器人返回图片保存接口
        /// </summary>
        [Header("机器人返回图片保存接口")] public string jqr_bctp;
        /*----------------------------------------------------------------------------------*/
        /// <summary>
        /// 本地视频接口
        /// </summary>
        [Header("本地视频")] public string bdsp;

        public webURL(string ct)
        {
            //string initialCt = ct;
            ct = ct + "machineRoom/";
            //string ct = "http://fpt9gx.natappfree.cc/";
            sb_cx = ct + "device/queryList";
            sb_xz = ct + "device/save";
            sb_sc = ct + "device/delete";
            sb_bj = ct + "device/updateById";

            dk_cx = ct + "port/queryList";
            dk_xz = ct + "port/save";
            dk_sc = ct + "port/delete";
            dk_bj = ct + "port/updateById";

            hj_cx = ct + "tmsPoint/queryList";
            gj_cx = ct + "tmsAlarm/queryList";
            gzp_cx = ct + "tmsWorkTicket/queryList";
            jxp_cx = ct + "tmsOverhaulTicket/queryList";

            xl_sc = ct + "port/clearConPort";

            xlz_cx = ct + "deviceLine/queryList";
            xlz_xz = ct + "deviceLine/save";
            xlz_sc = ct + "deviceLine/delete";
            xlz_bj = ct + "deviceLine/updateById";

            xllx_cx = ct + "sysParam/getByCode?code=line";

            cdqx_cx = ct + "menu/getMenus";

            hwjc_cx = ct + "lora/getLatestAlarms";

            jqr_bczl = ct + "robot/saveInstruct";

            jqr_bczb = ct + "robot/saveCoordinate";

            jqr_xj_cx = ct + "robot/queryInspection";

            jqr_bctp = ct + "robot/saveInspection";

            bdsp = ct + "video/event/subscription";

        }

    }

    /// <summary>
    /// 全局参数
    /// </summary>
    [System.Serializable]
    public class GlobalParameter
    {
        /// <summary>
        /// 登录后返回
        /// </summary>
        public string token;
        /// <summary>
        /// 温度最大阈值
        /// </summary>
        [Tooltip("温度最大阈值")] public string heatThresholdValueMax;
        /// <summary>
        /// 温度最小阈值
        /// </summary>
        [Tooltip("温度最小阈值")] public string heatThresholdValueMin;
        /// <summary>
        /// 湿度最大阈值
        /// </summary>
        [Tooltip("湿度最大阈值")] public string humidityThresholdValueMax;
        /// <summary>
        /// 湿度最小阈值
        /// </summary>
        [Tooltip("湿度最小阈值")] public string humidityThresholdValueMin;
    }



}