wjc
6 天以前 329a536dc7ee9cb7bff1f59af9b54604b998c9ce
app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
@@ -91,24 +91,27 @@
    /**
     * 获取当前住宅的逆变器列表(包括从的逆变器)
     *
     * @param homeId                  电站ID
     * @param cloudInverterDeviceList 元端上的逆变器列表(并网,离网,负载中心)
     * @param homeId 电站ID
     */
    public List<GatewayBean> getCurrentHomeGatewayList(String homeId, List<CloudInverterDeviceBean> cloudInverterDeviceList) {
    public List<GatewayBean> getCurrentHomeGatewayList(String homeId) {
        try {
            List<GatewayBean> newList = new ArrayList<>();
            //云端有设备列表,本地没有,即HDLLinkLocalGateway.getInstance().getGatewayList()没有,里面会调用refreshGatewayCacheData()方法虚拟一个逆变器实体添加本地列表里面;
            List<GatewayBean> list = HDLLinkLocalGateway.getInstance().getGatewayList();
            if (list.size() > 0) {
                for (int i = 0; i < list.size(); i++) {
                    GatewayBean gatewayBean = list.get(i);
                    if (!getGatewaySpk().contains(gatewayBean.getGatewayType())) {
                        continue;
                    }
                    if (TextUtils.isEmpty(gatewayBean.getDevice_mac())
                            || TextUtils.isEmpty(gatewayBean.getSid())
                            || TextUtils.isEmpty(gatewayBean.getOid())) {
                        continue;
                    if (gatewayBean.isActivate()) {
                        //已激活(getGatewayType,getDevice_mac,getSid,getOid)才有值
                        if (!getGatewaySpk().contains(gatewayBean.getGatewayType())) {
                            continue;
                        }
                        if (TextUtils.isEmpty(gatewayBean.getDevice_mac())
                                || TextUtils.isEmpty(gatewayBean.getSid())
                                || TextUtils.isEmpty(gatewayBean.getOid())) {
                            continue;
                        }
                    }
                    //用homeId筛选当前住宅的逆变器列表
                    if (gatewayBean.getHomeId().equals(homeId)) {
@@ -116,13 +119,40 @@
                    }
                }
            }
            //有外网,以云端设备列表为准;云端没有,本地存在,则删除本地;否则,没有外网只有局域网,以本地为主,搜索多少个设备就显示多少个
            return newList;
        } catch (Exception e) {
            return new ArrayList<>();
        }
    }
    /**
     * 获取当前住宅的逆变器列表(包括从的逆变器)
     * 可以设置是否整合本地逆变器列表数据
     *
     * @param homeId                  电站ID
     * @param cloudInverterDeviceList 云端上的逆变器列表(并网,离网,负载中心)
     * @param isIntegrateLocalData    是否强制整合本地逆变器数据(false:不需要(以云端列表为主(逆变器,负载中心)多少个显示多少个),true:需要(有外网,以云端设备列表为准;云端没有,本地存在,则删除本地;否则,没有外网只有局域网,以本地列表为主,搜索多少个设备就显示多少个))
     */
    public List<GatewayBean> IntegrateCloudAndLocalData(String homeId, List<CloudInverterDeviceBean> cloudInverterDeviceList, boolean isIntegrateLocalData) {
        try {
            List<GatewayBean> newList = new ArrayList<>();
            //云端有设备列表,本地没有,即HDLLinkLocalGateway.getInstance().getGatewayList()没有,里面会调用refreshGatewayCacheData()方法虚拟一个逆变器实体添加本地列表里面;
            List<GatewayBean> localList = getCurrentHomeGatewayList(homeId);
            if (localList != null && localList.size() > 0) {
                newList.addAll(localList);
            }
            //有外网,以云端设备列表为准;云端没有,本地存在,则删除本地;否则,没有外网只有局域网,以本地newList列表为主,搜索多少个设备就显示多少个
            if (cloudInverterDeviceList != null && cloudInverterDeviceList.size() > 0) {
                List<GatewayBean> checkNewList = new ArrayList<>();
                for (int i = 0; i < cloudInverterDeviceList.size(); i++) {
                    CloudInverterDeviceBean cloudInverterDevice = cloudInverterDeviceList.get(i);
                    for (GatewayBean gatewayBean : newList) {
                        if (cloudInverterDevice.getOsn().equals(gatewayBean.getDevice_mac())) {
                            //获取更全逆变器详情字段
                            checkNewList.add(gatewayBean);
                            break;
                        }
@@ -131,7 +161,9 @@
                newList.clear();
                newList.addAll(checkNewList);
            }
//            // 模拟设备列表数据
//            //模拟设备列表数据
//            List<GatewayBean> mockData = getGatewayDeviceListMockData(3);
//            if (mockData.size() > 0) {
//                for (GatewayBean mockDatum : mockData) {
@@ -139,12 +171,18 @@
//                }
//            }
            //胡彬要求的 2025年05月19日13:28:47 即使逆变器删除了云端上成功,本地逆变器初始化不成功(断开)依然不显示;
            if (!isIntegrateLocalData) {
                //强制以云端为主,云端有就显示逆变器列表,没有就不显示
                if (cloudInverterDeviceList == null || cloudInverterDeviceList.size() == 0) {
                    newList.clear();
                }
            }
            return newList;
        } catch (Exception e) {
            return new ArrayList<>();
        }
    }
    /**
     * 添加逆变器到缓存列表里面去
@@ -156,7 +194,7 @@
        if (newGatewayBean == null || TextUtils.isEmpty(homeId)) {
            return;
        }
        List<GatewayBean> list = getCurrentHomeGatewayList(homeId, null);
        List<GatewayBean> list = getCurrentHomeGatewayList(homeId);
        if (list == null || list.size() == 0) {
            return;
        }
@@ -185,7 +223,7 @@
        if (TextUtils.isEmpty(mac)) {
            return;
        }
        List<GatewayBean> list = getCurrentHomeGatewayList(homeId, null);
        List<GatewayBean> list = getCurrentHomeGatewayList(homeId);
        if (list == null || list.size() == 0) {
            return;
        }
@@ -212,7 +250,7 @@
        if (TextUtils.isEmpty(deviceId)) {
            return;
        }
        List<GatewayBean> list = getCurrentHomeGatewayList(homeId, null);
        List<GatewayBean> list = HDLLinkLocalGateway.getInstance().getGatewayList();
        if (list == null || list.size() == 0) {
            return;
        }
@@ -224,9 +262,10 @@
                break;
            }
        }
        if (index > 0) {
        if (index > -1) {
            list.remove(index);
        }
    }
    /**
@@ -691,7 +730,7 @@
        }
        String requestUrl = HttpApi.POST_Device_Oid;
        JsonObject json = new JsonObject();
        json.addProperty("operationSource", "PROGRAM_ENERGY");//
        json.addProperty("operationSource", "PROGRAM_ENERGY");//操作来源:固定传:PROGRAM_ENERGY  = 能源,PROGRAM = studio 默认
        json.addProperty("homeId", homeId);
        JsonArray jsonArray = new JsonArray();
        for (int i = 0; i < oidList.size(); i++) {
@@ -751,6 +790,7 @@
        String requestUrl = HttpApi.POST_Device_IncrAdd;
        JsonObject json = new JsonObject();
        json.addProperty("homeId", homeId);
        json.addProperty("operationSource", "PROGRAM_ENERGY");//操作来源:固定传:PROGRAM_ENERGY  = 能源,PROGRAM = studio 默认
        JsonArray jsonArray = new JsonArray();
        for (int i = 0; i < oidList.size(); i++) {
            OidBean oidBean = oidList.get(i);
@@ -1121,6 +1161,33 @@
    }
    /**
     * 删除oid(逆变器,bms,电池包)
     *
     * @param mac          网关mac
     * @param linkCallBack 回调
     */
    public void deleteOid(String mac, JsonArray oidList, LinkCallBack<Boolean> linkCallBack) {
        String requestUrl = TopicApi.DELETE_DEVICE;
        TcpClient.getInstance().sendDataToLinkGateway(mac, requestUrl, oidList, "", new HDLLinkCallBack() {
            @Override
            public void onSuccess(String json) {
                if (linkCallBack != null) {
                    linkCallBack.onSuccess(true);
                }
            }
            @Override
            public void onError(HDLLinkException e) {
                if (linkCallBack != null) {
                    linkCallBack.onError(e);
                }
            }
        });
    }
    /**
     * 获取逆变器列表,整合云端逆变器列表和本地逆变器列表(设备类型有:并网逆变器,离线逆变器,负载中心设备);
     * 注意:有外网,以云端设备列表为准;云端没有,本地存在,则删除本地;否则,没有外网只有局域网,以本地为主,搜索多少个设备就显示多少个
@@ -1129,6 +1196,7 @@
     * @param cloudCallBeak 返回逆变器列表
     */
    public void getCurrentHomeLocalAndCloudGatewayList(String homeId, CloudCallBeak<List<GatewayBean>> cloudCallBeak) {
        HDLLinkLocalGateway.getInstance().getGatewayList().clear();//先清空之前逆变器列表
        searchCurrentHomeGateway(homeId, new GatewayCallBack() {
            @Override
            public void onSuccess(List<GatewayBean> gatewayBeanList) {
@@ -1169,7 +1237,7 @@
                                if (loadCentreDeviceList == null) {
                                    if (cloudCallBeak != null) {
                                        //没有数据,默认返回本地逆变器列表;
                                        cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId, null));
                                        cloudCallBeak.onSuccess(IntegrateCloudAndLocalData(homeId, null, false));
                                    }
                                    return;
                                }
@@ -1181,7 +1249,7 @@
                            public void onFailure(HDLException e) {
                                //向云端获取负载中心设备列表失败后,默认返回本地逆变器列表;
                                if (cloudCallBeak != null) {
                                    cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId, null));
                                    cloudCallBeak.onSuccess(IntegrateCloudAndLocalData(homeId, null, false));
                                }
                            }
                        });
@@ -1192,8 +1260,8 @@
            @Override
            public void onError(HDLLinkException e) {
                //外网进来先【默认】清空本地逆变器列表
                HDLLinkLocalGateway.getInstance().getGatewayList().clear();
//                //外网进来先【默认】清空本地逆变器列表
//                HDLLinkLocalGateway.getInstance().getGatewayList().clear();
                //向云端获取逆变器列表
                getCloudInverterDeviceList(homeId, new CloudCallBeak<List<CloudInverterDeviceBean>>() {
                    @Override
@@ -1260,13 +1328,28 @@
        if (list == null || list.size() == 0) {
            //云端没有绑定逆变器,默认返回本地逆变器列表;
            if (cloudCallBeak != null) {
                cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId, list));
                cloudCallBeak.onSuccess(IntegrateCloudAndLocalData(homeId, list, false));
            }
            return;
        }
        AtomicInteger atomicInteger = new AtomicInteger(0);
        for (int i = 0; i < list.size(); i++) {
            CloudInverterDeviceBean cloudInverterDeviceBean = list.get(i);
            if (cloudInverterDeviceBean == null || !cloudInverterDeviceBean.isActivate()) {
                //未激活设备
                atomicInteger.set(atomicInteger.get() + 1);
                //注意:这个逆变器只能本地控制(因为拿不到mqtt通讯秘钥以及GatewayID,无法远程控制)
                //更新逆变器本地缓存信息
                refreshGatewayCacheData(false, cloudInverterDeviceBean, null, homeId);
                //到最后一条,才处理回调
                if (atomicInteger.get() == list.size()) {
                    if (cloudCallBeak != null) {
                        cloudCallBeak.onSuccess(IntegrateCloudAndLocalData(homeId, list, false));
                    }
                }
                HdlLogLogic.print("设备未激活(mac:" + cloudInverterDeviceBean.getOsn() + "))", true);
                continue;
            }
            //获取远程设备通讯信息(拿到网关ID,mqtt通讯秘钥)
            getDeviceRemoteInfo(homeId, cloudInverterDeviceBean.getSpk(), cloudInverterDeviceBean.getOsn(), new CloudCallBeak<DeviceRemoteInfo>() {
                @Override
@@ -1274,10 +1357,10 @@
                    atomicInteger.set(atomicInteger.get() + 1);
                    //更新逆变器本地缓存信息
                    refreshGatewayCacheData(false, cloudInverterDeviceBean, deviceRemoteInfo, homeId);
                    //到最后一条,才有回调
                    //到最后一条,才处理回调
                    if (atomicInteger.get() == list.size()) {
                        if (cloudCallBeak != null) {
                            cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId, list));
                            cloudCallBeak.onSuccess(IntegrateCloudAndLocalData(homeId, list, false));
                        }
                    }
                }
@@ -1285,13 +1368,16 @@
                @Override
                public void onFailure(HDLException e) {
                    atomicInteger.set(atomicInteger.get() + 1);
                    //当最后一条请求失败了,才有回调
                    //注意:这个逆变器只能本地控制(因为拿不到mqtt通讯秘钥以及GatewayID,无法远程控制)
                    //更新逆变器本地缓存信息
                    refreshGatewayCacheData(false, cloudInverterDeviceBean, null, homeId);
                    //到最后一条,才处理回调
                    if (atomicInteger.get() == list.size()) {
                        if (cloudCallBeak != null) {
                            cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId, list));
                            cloudCallBeak.onSuccess(IntegrateCloudAndLocalData(homeId, list, false));
                        }
                    }
                    HdlLogLogic.print("获取设备远程通讯信息失败---msg---" + e.getMsg() + "(" + e.getCode() + ")");
                    HdlLogLogic.print("获取设备远程通讯信息失败(mac:" + cloudInverterDeviceBean.getOsn() + ")------" + e.getMsg() + "(" + e.getCode() + ")", true);
                }
            });
        }
@@ -1752,7 +1838,8 @@
        gatewayBean.setOgMaster(cloudInverterDeviceBean.isOgMaster());
        //逆变器
        gatewayBean.setMaster(GatewayMasterType.MasterTrue);//默认都是主逆变器(以后支持从逆变器要更改)
        gatewayBean.setSystemStatusDesc(cloudInverterDeviceBean.getSystemStatusDesc());//设备状态
        gatewayBean.setSystemStatusDesc(cloudInverterDeviceBean.getSystemStatusDesc());//设备状态(逆变器设备)
        gatewayBean.setWorkStatusDesc(cloudInverterDeviceBean.getWorkStatusDesc());//工作状态(负载中心设备)
        gatewayBean.setHwVersion(cloudInverterDeviceBean.getHwVersion());//软件版本号
        gatewayBean.setCategorySecondName(cloudInverterDeviceBean.getCategorySecondName());//设备类型(产品二级分类名称
        gatewayBean.setDeviceType(cloudInverterDeviceBean.getDeviceType());//设备类型(INV:逆变器;BMS:BMS控制盒;BATTERY:电池单元)
@@ -1765,6 +1852,9 @@
            gatewayBean.setDevice_model(cloudInverterDeviceBean.getOmodel());//设备型号
        }
        gatewayBean.setSpk(cloudInverterDeviceBean.getSpk());//设备spk
        gatewayBean.setActivate(cloudInverterDeviceBean.isActivate());//是否激活设备(true:激活;false:未激活)
        gatewayBean.setPopUpgrade(cloudInverterDeviceBean.isPopUpgrade());//改设备是否有弹窗升级
        gatewayBean.setSubPopUpgrade(cloudInverterDeviceBean.isSubPopUpgrade());//下挂设备是否有弹窗升级
    }