package com.hdl.photovoltaic.other; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Build; import android.text.TextUtils; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.hdl.linkpm.sdk.core.exception.HDLException; import com.hdl.photovoltaic.bean.HttpResponsePack; import com.hdl.photovoltaic.config.AppConfigManage; import com.hdl.photovoltaic.config.UserConfigManage; import com.hdl.photovoltaic.internet.HttpClient; import com.hdl.photovoltaic.internet.api.HttpApi; import com.hdl.photovoltaic.listener.BaseSuccessFailureCallBeak; import com.hdl.photovoltaic.listener.CloudCallBeak; import com.hdl.photovoltaic.ui.bean.CloudInverterDeviceBean; import com.hdl.photovoltaic.ui.bean.HouseInfoBean; import com.hdl.photovoltaic.ui.bean.HouseIdBean; import com.hdl.photovoltaic.ui.bean.MessageBean; import com.hdl.sdk.link.common.exception.HDLLinkException; import com.hdl.sdk.link.core.bean.gateway.GatewayBean; import com.hdl.sdk.link.core.callback.GatewayCallBack; import com.hdl.sdk.link.core.config.HDLLinkConfig; import com.hdl.sdk.link.core.utils.mqtt.MqttRecvClient; import com.hdl.sdk.link.gateway.HDLLinkLocalGateway; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * 住宅逻辑 */ public class HdlResidenceLogic { public static final int pageSize = 50; private static volatile HdlResidenceLogic sHdlResidenceLogic; /** * 获取当前对象 * * @return HdlResidenceLogic */ public static synchronized HdlResidenceLogic getInstance() { if (sHdlResidenceLogic == null) { synchronized (HdlResidenceLogic.class) { if (sHdlResidenceLogic == null) { sHdlResidenceLogic = new HdlResidenceLogic(); } } } return sHdlResidenceLogic; } /** * 获取缓存住宅列表 * * @return 住宅列表 */ public List getHouseInfoList() { return houseInfoList; } public void setHouseInfoList(List houseInfoList) { if (houseInfoList == null) { houseInfoList = new ArrayList<>(); } this.houseInfoList = houseInfoList; } /** * 获取缓存住宅ID列表 * * @return 住宅ID列表 */ public List getHouseIdList() { return houseIdList; } public void setHouseIdList(List houseIdList) { if (houseIdList == null) { houseIdList = new ArrayList<>(); } this.houseIdList = houseIdList; } //住宅ID列表 private List houseIdList = new ArrayList<>(); //住宅详情列表 private List houseInfoList = new ArrayList<>(); /** * 获取住宅列表,包括获取住宅id列表,住宅详情列表; * * @param cloudCallBeak - */ public void getHouseList(CloudCallBeak cloudCallBeak) { //获取住宅ID列表 getResidenceIdList("", "", new CloudCallBeak>() { @Override public void onSuccess(List houseListBeanIDList) { if (houseListBeanIDList != null && houseListBeanIDList.size() > 0) { houseIdList.clear(); houseIdList.addAll(houseListBeanIDList); //记录请求条数 AtomicInteger atomicInteger = new AtomicInteger(0); for (int i = 0; i < houseIdList.size(); i++) { HouseIdBean houseIdBean = houseIdList.get(i); //获取住宅详情列表 getResidenceInfo(houseIdBean.getHomeId(), new CloudCallBeak() { @Override public void onSuccess(HouseInfoBean houseInfoBean) { atomicInteger.set(atomicInteger.get() + 1); if (houseInfoBean != null) { houseInfoBean.setPowerStationImage(houseIdBean.getPowerStationImage());//电站图片 houseInfoBean.setInstalledCapacity(houseIdBean.getInstalledCapacity());//装机容量 houseInfoBean.setPower(houseIdBean.getPower());//发电功率 houseInfoBean.setTodayElectricity(houseIdBean.getTodayElectricity());//今天发电量 houseInfoBean.setPowerStationStatus(houseIdBean.getPowerStationStatus());//电站状态(电站状态 1:正常(运行),2:离线,3:连接中,4:故障) //添加到本地缓存 addHouseToLocalMemory(houseInfoBean); } if (atomicInteger.get() == houseIdList.size()) { //最后一条退出 if (cloudCallBeak != null) { cloudCallBeak.onSuccess(true); } } } @Override public void onFailure(HDLException e) { atomicInteger.set(atomicInteger.get() + 1); if (atomicInteger.get() == houseIdList.size()) { //最后一条退出 if (cloudCallBeak != null) { cloudCallBeak.onFailure(e); } } } }); } } else { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(true); } } } @Override public void onFailure(HDLException e) { if (cloudCallBeak != null) { cloudCallBeak.onFailure(e); } } }); } /** * 获取住宅(电站)ID列表 * * @param key 发电功率排序(powerSort); * 今日发电量排序(todayElectricitySort); * 创建时间排序(createTimeSort); * @param keyValue (descending:降序 * ascending:升序), */ public void getResidenceIdList(String key, String keyValue, CloudCallBeak> cloudCallBeak) { String requestUrl = HttpApi.POST_PowerStation_List; JsonObject json = new JsonObject(); if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(keyValue)) { json.addProperty(key, keyValue);//发电功率排序(descending:降序ascending:升序) } // json.addProperty("zoneType", "password");//区域 json.addProperty("pageNo", 1);//页码 json.addProperty("pageSize", pageSize);//页数 List list = new ArrayList<>(); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String jsonStr) { if (TextUtils.isEmpty(jsonStr)) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(list); } } Gson gson = new Gson(); HouseBeanClass houseInfoBeanClass = gson.fromJson(jsonStr, HouseBeanClass.class); list.addAll(houseInfoBeanClass.getList()); //总共有多少页 long totalPage = houseInfoBeanClass.totalPage; if (totalPage < 2) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(list); } return; } //记录请求条数 AtomicInteger atomicInteger = new AtomicInteger(0); //从第二页获取数据 for (int i = 2; i <= totalPage; i++) { json.addProperty("pageNo", i);//更新页码 HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String jsonStr) { atomicInteger.set(atomicInteger.get() + 1); Gson gson = new Gson(); HouseBeanClass houseInfoBeanClass = gson.fromJson(jsonStr, HouseBeanClass.class); list.addAll(houseInfoBeanClass.getList()); if (atomicInteger.get() == totalPage - 1) { //最后一条退出 if (cloudCallBeak != null) { cloudCallBeak.onSuccess(list); } } } @Override public void onFailure(HDLException e) { atomicInteger.set(atomicInteger.get() + 1); if (atomicInteger.get() == totalPage - 1) { //最后一条退出 if (cloudCallBeak != null) { cloudCallBeak.onSuccess(list); } } } }); } } @Override public void onFailure(HDLException exception) { if (cloudCallBeak != null) { cloudCallBeak.onFailure(exception); } } }); } /** * 获取住宅(电站)ID详情 * * @param homeId 住宅id * @param cloudCallBeak 回调 */ public void getResidenceInfo(String homeId, CloudCallBeak cloudCallBeak) { String requestUrl = HttpApi.POST_PowerStation_Info; JsonObject json = new JsonObject(); json.addProperty("homeId", homeId);//电站id //json.addProperty("zoneType", "password");//区域 HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String jsonStr) { if (TextUtils.isEmpty(jsonStr)) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(null); } } Gson gson = new Gson(); HouseInfoBean houseInfoBean = gson.fromJson(jsonStr, HouseInfoBean.class); if (cloudCallBeak != null) { cloudCallBeak.onSuccess(houseInfoBean); } } @Override public void onFailure(HDLException e) { if (cloudCallBeak != null) { cloudCallBeak.onFailure(e); } } }); } /** * 编辑住宅(电站), * * @param houseInfoBean - * @param cloudCallBeak - */ public void editResidence(HouseInfoBean houseInfoBean, CloudCallBeak cloudCallBeak) { String requestUrl = HttpApi.POST_PowerStation_Edit; JsonObject json = new JsonObject(); JsonObject location = new JsonObject(); json.addProperty("homeId", houseInfoBean.getHomeId()); location.addProperty("nationCode", houseInfoBean.getLocation().getNationCode()); location.addProperty("nationName", houseInfoBean.getLocation().getNationName()); location.addProperty("provinceCode", houseInfoBean.getLocation().getProvinceCode()); location.addProperty("provinceName", houseInfoBean.getLocation().getProvinceName()); location.addProperty("cityCode", houseInfoBean.getLocation().getCityCode()); location.addProperty("cityName", houseInfoBean.getLocation().getCityName()); json.add("location", location); json.addProperty("address", houseInfoBean.getAddress()); json.addProperty("latitude", houseInfoBean.getLatitude()); json.addProperty("longitude", houseInfoBean.getLongitude()); json.addProperty("homeName", houseInfoBean.getHomeName()); json.addProperty("timezone", houseInfoBean.getTimezone()); json.addProperty("powerStationType", houseInfoBean.getPowerStationType()); json.addProperty("workMode", houseInfoBean.getWorkMode()); json.addProperty("installedCapacity", houseInfoBean.getInstalledCapacity()); json.addProperty("productionTime", houseInfoBean.getProductionTime()); json.addProperty("monetaryUnit", houseInfoBean.getMonetaryUnit()); json.addProperty("electrovalence", houseInfoBean.getElectrovalence()); json.addProperty("totalCost", houseInfoBean.getTotalCost()); json.addProperty("zoneType", houseInfoBean.getZoneType()); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String str) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(true); } } @Override public void onFailure(HDLException e) { if (cloudCallBeak != null) { cloudCallBeak.onFailure(e); } } }); } /** * 删除住宅(电站) * * @param homeId - * @param cloudCallBeak - */ public void delResidence(String homeId, CloudCallBeak cloudCallBeak) { String requestUrl = HttpApi.POST_PowerStation_Remove; JsonObject json = new JsonObject(); json.addProperty("homeId", homeId);//电站id //json.addProperty("zoneType", "password");//区域 HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String str) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(true); } } @Override public void onFailure(HDLException e) { if (cloudCallBeak != null) { cloudCallBeak.onFailure(e); } } }); } /** * 添加住宅(电站)到云端 * * @param houseInfoBean - * @param cloudCallBeak - */ public void addHouseToCloud(HouseInfoBean houseInfoBean, CloudCallBeak cloudCallBeak) { String requestUrl = HttpApi.POST_PowerStation_Create; JsonObject json = new JsonObject(); JsonObject location = new JsonObject(); json.addProperty("powerStationImage", ""); location.addProperty("nationCode", houseInfoBean.getLocation().getNationCode()); location.addProperty("nationName", houseInfoBean.getLocation().getNationName()); location.addProperty("provinceCode", houseInfoBean.getLocation().getProvinceCode()); location.addProperty("provinceName", houseInfoBean.getLocation().getProvinceName()); location.addProperty("cityCode", houseInfoBean.getLocation().getCityCode()); location.addProperty("cityName", houseInfoBean.getLocation().getCityName()); json.add("location", location); json.addProperty("address", houseInfoBean.getAddress()); json.addProperty("latitude", houseInfoBean.getLatitude()); json.addProperty("longitude", houseInfoBean.getLongitude()); json.addProperty("homeName", houseInfoBean.getHomeName()); json.addProperty("timezone", houseInfoBean.getTimezone()); json.addProperty("powerStationType", houseInfoBean.getPowerStationType()); json.addProperty("workMode", houseInfoBean.getWorkMode()); json.addProperty("installedCapacity", houseInfoBean.getInstalledCapacity()); json.addProperty("productionTime", houseInfoBean.getProductionTime()); json.addProperty("monetaryUnit", houseInfoBean.getMonetaryUnit()); json.addProperty("electrovalence", houseInfoBean.getElectrovalence()); json.addProperty("totalCost", houseInfoBean.getTotalCost()); json.addProperty("zoneType", houseInfoBean.getZoneType()); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String str) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(true); } } @Override public void onFailure(HDLException e) { if (cloudCallBeak != null) { cloudCallBeak.onFailure(e); } } }); } /** * 获取住宅图片 */ public void getResidenceImage(String imageUrl, CloudCallBeak cloudCallBeak) { String requestUrl = imageUrl; JsonObject json = new JsonObject(); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String jsonStr) { if (TextUtils.isEmpty(jsonStr)) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(null); } return; } Bitmap bitmap = BitmapFactory.decodeByteArray(jsonStr.getBytes(), 0, jsonStr.getBytes().length); if (cloudCallBeak != null) { cloudCallBeak.onSuccess(bitmap); } } @Override public void onFailure(HDLException e) { if (cloudCallBeak != null) { cloudCallBeak.onFailure(e); } } }); } /** * 用户自定义配置温度单位 * * @param tempType 温度单位类型 (C :摄氏度, F :华氏度) * @param cloudCallBeak - */ public void setResidenceTemperatureUnit(String tempType, CloudCallBeak cloudCallBeak) { String requestUrl = HttpApi.POST_C_F_CustomConfig; JsonObject json = new JsonObject(); json.addProperty("tempType", tempType); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String str) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(true); } } @Override public void onFailure(HDLException e) { if (cloudCallBeak != null) { cloudCallBeak.onFailure(e); } } }); } /** * 获取用户自定义配置温度单位详情 * * @param cloudCallBeak - */ public void getResidenceTemperatureUnit(CloudCallBeak cloudCallBeak) { String requestUrl = HttpApi.POST_C_F_CustomConfigInfo; JsonObject json = new JsonObject(); // json.addProperty("homeId", homeId); List list = new ArrayList<>(); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String jsonStr) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(jsonStr); } } @Override public void onFailure(HDLException e) { if (cloudCallBeak != null) { cloudCallBeak.onFailure(e); } } }); } /** * 添加【住宅详情】到本地缓存 * * @param houseInfoBean 住宅详情 */ public void addHouseToLocalMemory(HouseInfoBean houseInfoBean) { if (houseInfoBean == null) { return; } int index = isExistHouse(houseInfoBean.getHomeId()); if (index > -1) { houseInfoList.remove(index); houseInfoList.add(index, houseInfoBean); } else { houseInfoList.add(houseInfoBean); } } /** * 查询本地缓存住宅列表是否存在住宅 * * @param homeId 住宅id * @return 列表索引 */ public int isExistHouse(String homeId) { int index = -1; for (int i = 0; i < houseInfoList.size(); i++) { if (houseInfoList.get(i).getHomeId().equals(homeId)) { index = i; break; } } return index; } /** * 获取住宅详情 * * @param homeId 住宅id * @return 住宅找不到返回null */ public HouseInfoBean getHouse(String homeId) { int position = isExistHouse(homeId); if (position > -1) { return houseInfoList.get(position); } return null; } /** * 删除住宅 * * @param homeId 住宅id */ public void delHouse(String homeId) { int position = isExistHouse(homeId); if (position > -1) { houseInfoList.remove(position); } } /** * 获取住宅Id对象 * * @param homeId 住宅id * @return 列表索引 */ public HouseIdBean getHouseId(String homeId) { for (int i = 0; i < houseIdList.size(); i++) { if (houseIdList.get(i).getHomeId().equals(homeId)) { return houseIdList.get(i); } } return null; } /** * 切换住宅 * * @param houseIdBean 住宅Id对象 */ public void switchHouse(HouseIdBean houseIdBean) { String homeId = UserConfigManage.getInstance().getHomeId(); if (houseIdBean.getHomeId().equals(homeId)) { HdlLogLogic.print("点击同一个住宅--->" + homeId); return; } //订阅要全部取消 if (MqttRecvClient.getInstance() != null) { MqttRecvClient.getInstance().removeAllTopic(); } //要清空之前tcp连接缓存 //TODO: 10/10/23 //删除旧的住宅文件夹 2023年11月03日14:28:19暂时去掉 // HdlFileLogic.getInstance().deleteDirectory(HdlFileLogic.getInstance().getCurrentHomeRootPath()); //重新设置住宅id UserConfigManage.getInstance().setHomeId(houseIdBean.getHomeId()); UserConfigManage.getInstance().setHomeName(houseIdBean.getHomeName()); //重新设置本地通讯秘钥 UserConfigManage.getInstance().setLocalSecret(houseIdBean.getLocalSecret()); //配置本地通信的信息 HDLLinkConfig.getInstance().setHomeId(UserConfigManage.getInstance().getHomeId()); HDLLinkConfig.getInstance().setLocalSecret(UserConfigManage.getInstance().getLocalSecret()); //重新创建住宅文件夹 HdlFileLogic.getInstance().createDirectory(); //进去住宅详情搜索一下逆变器列表,目的是建立通讯通道; HdlDeviceLogic.getInstance().searchCurrentHomeGateway(null); } /** * 电站数据(统计) * * @param homeId 住宅id */ public void getResidenceInverterAllInfo(String homeId, CloudCallBeak cloudCallBeak) { String requestUrl = HttpApi.POST_inverter_allInfo; JsonObject json = new JsonObject(); json.addProperty("homeId", homeId); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String jsonStr) { if (cloudCallBeak != null) { // cloudCallBeak.onSuccess(jsonStr); } } @Override public void onFailure(HDLException e) { if (cloudCallBeak != null) { cloudCallBeak.onFailure(e); } } }); } /** * 添加推送Token * * @param cloudCallBeak - */ public void pushAdd(CloudCallBeak cloudCallBeak) { String requestUrl = HttpApi.POST_push_add; JsonObject json = new JsonObject(); json.addProperty("deviceName", Build.MODEL);//设备名称 json.addProperty("deviceType", "Android");//设备类型 json.addProperty("produce", AppConfigManage.isIsOnlineServer());//表示是否是正式服务器 json.addProperty("pushToken", UserConfigManage.getInstance().getRegistrationID());//App的推送Token,在极光为RegId json.addProperty("software", "PHOTOVOLTAIC");//软件来源 HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String jsonStr) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(jsonStr); } } @Override public void onFailure(HDLException e) { if (cloudCallBeak != null) { cloudCallBeak.onFailure(e); } } }); } static class HouseBeanClass { //总条数 private long totalCount; //总页数 private long totalPage; //当前页 private long pageNo; //页数 private long pageSize; //电站列表 private List list; public long getTotalCount() { return totalCount; } public void setTotalCount(long totalCount) { this.totalCount = totalCount; } public long getTotalPage() { return totalPage; } public void setTotalPage(long totalPage) { this.totalPage = totalPage; } public long getPageNo() { return pageNo; } public void setPageNo(long pageNo) { this.pageNo = pageNo; } public long getPageSize() { return pageSize; } public void setPageSize(long pageSize) { this.pageSize = pageSize; } public List getList() { return list == null ? new ArrayList<>() : list; } public void setList(List list) { this.list = list; } } }