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));
}
}
}