using System; using System.Collections.Generic; using HDL_ON.DAL.Server; using Shared; namespace HDL_ON.Entity { /// /// 读取服务器空间信息返回到数据包 /// public class SpatialApiPack { public List list = new List(); public string totalCount = "0"; public string totalPage = "0"; public string pageNo = "0"; public string pageSize = "0"; } /// /// 空间信息基础类 /// 包含楼层/房间 /// public class SpatialInfo { static SpatialInfo _currentSpatial; public static SpatialInfo CurrentSpatial { get { if (_currentSpatial == null) { _currentSpatial = new SpatialInfo(); } return _currentSpatial; } } public SpatialInfo() { } public SpatialInfo(string spatialType) { roomType = "FLOOR"; parentId = DB_ResidenceData.residenceData.CurReginID; } public string roomId = ""; public string roomName = ""; //public string roomImage = ""; public string roomImage = "Classification/Room/Roombg.png"; public string roomType = ""; public string parentId = ""; public string uid = Guid.NewGuid().ToString(); public string createTime = ""; public string modifyTime = ""; ///// ///// 删除标记 20201208:可欣:APP的在线和离线问题,刚刚确定了,离线无法编辑,只能控制 ///// 需要删除数据时,标记为:true ///// 由云端删除成功之后,返回数据再清除本地数据 ///// //public bool DeleteSign = false; protected ResponsePackNew SaveSpatialInfo() { var pm = new HttpServerRequest(); var revPack = new ResponsePackNew(); if (string.IsNullOrEmpty(createTime) && string.IsNullOrEmpty(modifyTime)) { revPack = pm.AddRoom(new List() { this }); } else if (string.IsNullOrEmpty(createTime) && !string.IsNullOrEmpty(modifyTime)) { revPack = pm.DeleteRoom(new List() { roomId }); } else if (!string.IsNullOrEmpty(createTime) && !string.IsNullOrEmpty(modifyTime)) { revPack = pm.UpdateRoom(new List() { this }); } return revPack; } /// /// 下载云端房间数据 /// public void DownloadRoomList() { new System.Threading.Thread(() => { var pm = new HttpServerRequest(); var pack = pm.GetRoomList(); if (pack.Code == StateCode.SUCCESS) { var revData = Newtonsoft.Json.JsonConvert.DeserializeObject(pack.Data.ToString()); if (revData != null) { CurrentSpatial.UpdateSpatialList(revData.list, OptionType.Cover); } } else { MainPage.Log($"读取房间数据失败:\r\nCode:{pack.Code}; msg:{pack.message}"); } }) { IsBackground = true }.Start(); } /// /// 更新空间信息 /// /// 空间信息 /// 操作类型:ADD/UPDATE/DELETE public void UpdateSpatialList(List spatials,OptionType optionType) { var roomUpdateList = spatials.FindAll((obj) => obj.roomType == "ROOM"); var floorUpdateList = spatials.FindAll((obj) => obj.roomType == "FLOOR"); //处理房间列表 if (roomUpdateList != null && roomUpdateList.Count > 0) { if (optionType == OptionType.Update) { foreach (var updateTemp in roomUpdateList) { var localRoom = CurrentSpatial.RoomList.Find((obj) => obj.roomId == updateTemp.roomId); if (localRoom != null) { if (localRoom.modifyTime != updateTemp.modifyTime) { localRoom.roomName = updateTemp.roomName; localRoom.roomImage = updateTemp.roomImage; localRoom.parentId = updateTemp.parentId; localRoom.createTime = updateTemp.createTime; localRoom.modifyTime = updateTemp.modifyTime; localRoom.SaveRoomData(false); } }else { updateTemp.SaveRoomData(false); } } } else if (optionType == OptionType.Cover) { CurrentSpatial.DeleteAllRoom(); foreach(var newRoom in roomUpdateList) { newRoom.SaveRoomData(false); RoomList.Add(Newtonsoft.Json.JsonConvert.DeserializeObject( Newtonsoft.Json.JsonConvert.SerializeObject(newRoom))); } } } //楼层房间列表 if (floorUpdateList != null && floorUpdateList.Count > 0) { if (optionType == OptionType.Update) { foreach(var updateTemp in floorUpdateList) { var localFloor = FloorList.Find((obj) => obj.roomId == updateTemp.roomId); if (localFloor == null) { FloorList.Add(updateTemp); } else { localFloor = updateTemp; } } } if(optionType == OptionType.Cover) { FloorList.Clear(); foreach (var updateTemp in floorUpdateList) { FloorList.Add(updateTemp); } } var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(FloorList)); FileUtils.WriteFileByBytes(dataSavePath, ssd); } } #region 楼层列表 /// /// 楼层列表 /// List floors; /// /// 楼层列表 /// public List FloorList { get { if (floors == null) { try { var floorsDataBytes = FileUtils.ReadFile("FloorsData"); if (floorsDataBytes != null) { var floorsDataString = System.Text.Encoding.UTF8.GetString(floorsDataBytes); MainPage.Log(floorsDataString); floors = Newtonsoft.Json.JsonConvert.DeserializeObject>(floorsDataString); if (floors == null) { floors = new List(); } } } catch (Exception ex) { MainPage.Log($"楼层数据初始化失败:{ex.Message}"); } } return floors; } } /// /// 数据保存路径 /// string dataSavePath { get { if(roomType == "ROOM") { return "RoomPath_" + uid; } if(roomType == "FLOOR") { return "FloorsData"; } else { return "SpatialInfo_"+uid; } } } /// /// 增加楼层 /// /// public void AddFloor(SpatialInfo floor) { if (floor.SaveFloorData() == StateCode.SUCCESS) { FloorList.Add(floor); } } /// /// 更新楼层信息 /// /// public void UpdateFloor() { SaveFloorData(); } /// /// 删除楼层 /// /// public void DelFloor(SpatialInfo floor) { if (floor == null) return; var pm = new HttpServerRequest(); var code = pm.DeleteRoom(new List() { floor.roomId }).Code; if (code == StateCode.SUCCESS) { var tRoom = FloorList.Find((obj) => obj.uid == floor.uid); if (tRoom != null) { FloorList.Remove(floor); } var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(FloorList)); FileUtils.WriteFileByBytes(dataSavePath, ssd); MainPage.Log($"Save floor Data"); } else { Utlis.ShowTip(Language.StringByID(StringId.DeleteFloorFail) + "Code:" + code); } } /// /// 保存楼层数据 /// string SaveFloorData() { var pack = SaveSpatialInfo(); if (pack.Code == StateCode.SUCCESS) { var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(FloorList)); FileUtils.WriteFileByBytes(dataSavePath, ssd); MainPage.Log($"Save floor Data"); } else { Utlis.ShowTip(Language.StringByID(StringId.EditRoomInfoFail) + "Code:" + pack.Code); } return pack.Code; } #endregion #region 房间列表 /// /// 房间列表 /// List rooms; /// /// 房间列表 /// public List RoomList { get { if (rooms == null) { try { rooms = new List { }; var filePathList = FileUtils.ReadFiles(); foreach (var filePath in filePathList) { if (filePath.StartsWith("RoomData_")) { var roomDataBytes = FileUtils.ReadFile(filePath); var roomDataString = System.Text.Encoding.UTF8.GetString(roomDataBytes); var room = Newtonsoft.Json.JsonConvert.DeserializeObject(roomDataString); if (room != null) { rooms.Add(room); } } } } catch (Exception ex) { MainPage.Log($"功能数据初始化失败:{ex.Message}"); } } return rooms; } } /// /// 增加房间 /// /// public void AddRoom(Room room) { if (room.SaveRoomData() == StateCode.SUCCESS) { RoomList.Add(room); } } /// /// 删除房间 /// /// public void DelRoom(Room room) { new System.Threading.Thread(() => { var pm = new HttpServerRequest(); var pack = pm.DeleteRoom(new List() { room.roomId }); if (pack.Code == StateCode.SUCCESS) { var tRoom = RoomList.Find((obj) => obj.uid == room.uid); if (tRoom != null) { RoomList.Remove(room); } FileUtils.DeleteFile(room.dataSavePath); } }) { IsBackground = true }.Start(); } /// /// 删除所有房间 /// public void DeleteAllRoom() { foreach(var localRoom in RoomList) { FileUtils.DeleteFile(localRoom.dataSavePath); } RoomList.Clear(); } /// /// 初始化每个房间的功能数据 /// public void InitRoomFunction() { new System.Threading.Thread(() => { try { //初始化住宅所有房间功能数据 foreach (var r in RoomList) { r.GetRoomFunctions(true); r.GetRoomScenes(true); } } catch (Exception ex) { MainPage.Log($"Init room function error : {ex.Message}"); } }) { IsBackground = true }.Start(); } /// /// 保存房间数据 /// public string SaveRoomData(bool upServer = true) { var packCode = StateCode.SUCCESS; bool needSave = true; if (upServer) { packCode = SaveSpatialInfo().Code; } if (needSave) { var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this)); FileUtils.WriteFileByBytes(dataSavePath, ssd); MainPage.Log($"Save Room Data {roomName} : {uid}"); } return packCode; } #endregion } [Serializable] public class Room : SpatialInfo { public Room() { roomType = "ROOM"; roomName = "Room"; } //public string backgroundImage = "Classification/Room/Roombg.png"; public string backgroundImage { get { if (string.IsNullOrEmpty(roomImage)) { return "Classification/Room/Roombg.png"; } else { return roomImage; } } set { roomImage = value; } } /// /// 楼层 /// [Newtonsoft.Json.JsonIgnore] public string floorName { get { if (FloorList.Count > 0) { var f = FloorList.Find((obj) => obj.uid == parentId); if (f != null) { return f.roomName + " "; } } return ""; } } /// /// 房间功能列表 /// List functions = new List(); /// /// 获取房间功能列表 /// public List GetRoomFunctions(bool needRefresh) { if (needRefresh) { functions = new List(); } if (functions.Count == 0) { foreach (var f in DB_ResidenceData.functionList.GetAllFunction()) { if (f.roomIds.Contains(uid) && uid != null) { functions.Add(f); } } } return functions; } /// /// 增加房间功能 /// 操作的是缓存数据,不用保存 /// public void AddRoomFunction(Function function) { functions.Add(function); } /// /// 删除房间功能 /// 操作的是缓存数据,不用保存 /// public void RemoveRoomFunction(Function function) { functions.Remove(functions.Find((obj) => obj.sid == function.sid)); } /// /// 房间场景列表 /// List scenes = new List(); /// /// 获取场景列表 /// /// public List GetRoomScenes(bool needRefresh) { if (needRefresh) { scenes = new List(); } if (scenes.Count == 0) { foreach (var s in DB_ResidenceData.functionList.scenes) { if (s.roomIds.Contains(uid) && uid != null) { scenes.Add(s); } } } return scenes; } /// /// 增加房间场景 /// 操作的是缓存数据,不用保存 /// /// public void AddRoomScene(Scene scene) { scenes.Add(scene); } /// /// 移除房间场景 /// 操作的是缓存数据,不用保存 /// /// public void RemoveRoomScene(Scene scene) { scenes.Remove(scenes.Find((obj) => obj.sid == scene.sid)); } } }