黄学彪
2020-12-17 9f326f4000847e6167d8166fa2f6a66f53cb3734
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
using System;
using Shared.Common;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Text;
 
namespace Shared.Phone
{
    /// <summary>
    /// 个人中心逻辑类
    /// </summary>
    public class HdlUserCenterLogic
    {
        #region ■ 变量声明___________________________
 
        /// <summary>
        /// 个人中心逻辑类
        /// </summary>
        private static HdlUserCenterLogic m_Current = null;
        /// <summary>
        /// 个人中心逻辑类
        /// </summary>
        public static HdlUserCenterLogic Current
        {
            get
            {
                if (m_Current == null)
                {
                    m_Current = new HdlUserCenterLogic();
                }
                return m_Current;
            }
        }
 
        #endregion
 
        #region ■ 刷新本地缓存_______________________
 
        /// <summary>
        /// 刷新本地所有缓存(目前此方法只提供给恢复备份数据使用)
        /// </summary>
        public void RefreshAllMemory()
        {
            //刷新住宅对象
            RefreshHomeObject();
            //根据模板文件,恢复数据
            HdlTemplateCommonLogic.Current.RecoverDataByTemplateBinFile();
            //强制生成设备和网关文件
            HdlTemplateCommonLogic.Current.CreatDeviceAndGatewayFileFromMemoryByForce();
            //刷新本地网关文件
            HdlGatewayLogic.Current.ReFreshByLocal();
            //刷新本地设备
            HdlDeviceCommonLogic.Current.ReFreshByLocal();
            //需优先于刷新房间,同步云端的网关id,如果本地拥有云端不存在的id,则表示应该被换绑了,直接删除
            HdlGatewayLogic.Current.SynchronizeDbGateway();
            //从本地重新加载全部的房间
            HdlRoomLogic.Current.RefreshAllRoomByLocation();
            //断开远程Mqtt连接,重新连接
            HdlThreadLogic.Current.RunThread(async () =>
            {
                HdlGatewayLogic.Current.ClearAllRealGatewayConection(true);
                await ZigBee.Device.ZbGateway.CloseRemoteConnectionOnForce();
            }, ShowErrorMode.NO);
        }
 
        /// <summary>
        /// 刷新住宅对象
        /// </summary>
        public void RefreshHomeObject()
        {
            var home = HdlResidenceLogic.Current.GetHouseByHouseId(Config.Instance.Home.Id);
 
            //刷新楼层
            Config.Instance.Home.FloorDics = home.FloorDics;
            Config.Instance.Home.CurrentFloorId = string.Empty;
            if (Config.Instance.Home.TemplateMode == -1)
            {
                Config.Instance.Home.TemplateMode = home.TemplateMode;
                if (Config.Instance.Home.TemplateMode == -1)
                {
                    //默认初始值
                    Config.Instance.Home.TemplateMode = 1;
                }
            }
 
            Config.Instance.Home.Save(false);
 
            //主页需要重新刷新
            UserView.UserPage.Instance.RefreshAllForm = true;
        }
 
        #endregion
 
        #region ■ 刷新个人中心的内存及线程___________
 
        /// <summary>
        /// 刷新个人中心的内存及线程(仅限切换住宅时调用)
        /// </summary>
        /// <param name="i_isLogin">是否是登陆操作</param>
        /// <returns></returns>
        public bool InitUserCenterMenmoryAndThread(bool i_isLogin)
        {
            //调用这个方法,都需要重新刷新主页
            UserView.UserPage.Instance.RefreshAllForm = true;
 
            //添加网络状态监听
            HdlWifiLogic.Current.StartListenNetWork();
 
            //如果是虚拟住宅
            if (Config.Instance.Home.IsVirtually == true)
            {
                //初始化虚拟住宅的个人中心的数据(切换住宅使用)
                InitUserCenterMenmoryByVirtualHome();
                return true;
            }
 
            //APP缓存加载开始
            HdlUserCenterResourse.AccountOption.AppCanSignout = false;
 
            //是否有网络,初始值为:有
            int hadNet = 1;
            if (i_isLogin == true)
            {
                //登陆的时候,获取云端住宅列表(0:当前没有网络的情况下加载本地住宅  1:通过联网加载及校验本地住宅)
                hadNet = HdlResidenceLogic.Current.GetHomeListsFromDbOnLogin();
            }
 
            //清空所有成员缓存
            this.ClearAllMemberMemory();
 
            //加载住宅配置信息
            HdlUserCenterResourse.ResidenceOption = HdlUserCenterResourse.ResidenceOption.Load();
 
            //预创建个人中心全部的文件夹
            HdlFileLogic.Current.CreatAllUserCenterDirectory();
 
            //检测当前账号的权限的合法性
            this.CheckNowAuthority();
 
            //如果有网络的话
            if (hadNet == 1)
            {
                //初始化主人的Token(管理员专用,不用管失败还是成功,出问题,底层接口会踢到登陆界面)
                HdlAccountLogic.Current.InitMasterToken();
 
                //重新发送命令去绑定断网情况下备份的网关
                HdlGatewayLogic.Current.ResetComandToBindBackupGateway();
                //读取隐匿配置
                HdlBackupLogic.Current.LoadHideOption();
                //调试:强制开启后台调试App功能
                if (HdlUserCenterResourse.HideOption.StartDebugApp == 1)
                {
                    HdlThreadLogic.Current.RunMain(() =>
                    {
                        var form = new UserCenter.HideOption.HideOptionMainForm();
                        form.AddForm();
                    });
                    ProgressBar.Close(true);
                    return false;
                }
            }
 
            //关闭所有接收
            HdlGatewayReceiveLogic.Current.RemoveAllEvent();
            //刷新安防上报信息
            HdlAlarmsLogic.Current.RefreshAlarmInfo();
 
            //同步数据(二次调用没关系)
            int result = -1;
            if (hadNet == 1)
            {
                result = HdlBackupLogic.Current.SynchronizeDbAutoBackupData();
            }
 
            //初始化本地的网关信息
            HdlGatewayLogic.Current.ReFreshByLocal();
            //初始化本地的设备信息
            HdlDeviceCommonLogic.Current.ReFreshByLocal();
 
            //初始化房间(郭雪城那边不做处理,需要这里特殊执行一步)
            HdlRoomLogic.Current.RefreshAllRoomByLocation();
 
            if (hadNet == 1)
            {
                //同步云端的网关id,如果本地拥有云端不存在的id,则表示应该被换绑了,直接删除
                //HdlGatewayLogic.Current.SynchronizeDbGateway();
            }
 
            //断开远程Mqtt连接,重新连接
            HdlThreadLogic.Current.RunThread(async () =>
            {
                HdlGatewayLogic.Current.ClearAllRealGatewayConection(true);
                await ZigBee.Device.ZbGateway.CloseRemoteConnectionOnForce();
            }, ShowErrorMode.NO);
 
            //刷新APP前一次选择的网关ID(可以反复调用,需要在网关初始化完了之后才能调用)
            HdlGatewayLogic.Current.RefreshAppOldSelectGatewayId();
 
            //0:已经同步过,不需要同步,这个时候需要提示备份
            if (result == 0 && i_isLogin == true)
            {
                //开启自动备份
                HdlBackupLogic.Current.ShowAutoBackupPromptedForm();
            }
            //显示引导界面
            HdlFormLogic.Current.ShowGuideForm(result);
 
            //APP缓存加载完成
            HdlUserCenterResourse.AccountOption.AppCanSignout = true;
 
            if (Shared.Phone.Device.Logic.Send.If_Exist == "1")
            {
                //以本地状态为主打开GPS服务
                Application.StartGPSLocationService();
            }
 
            return true;
        }
 
        /// <summary>
        /// 初始化虚拟住宅的个人中心的数据(切换住宅使用)
        /// </summary>
        private void InitUserCenterMenmoryByVirtualHome()
        {
            //清空所有成员缓存
            ClearAllMemberMemory();
            //预创建个人中心全部的文件夹
            HdlFileLogic.Current.CreatAllUserCenterDirectory();
            //关闭所有接收
            HdlGatewayReceiveLogic.Current.RemoveAllEvent();
            //初始化本地的网关信息
            HdlGatewayLogic.Current.ReFreshByLocal();
            //初始化本地的设备信息
            HdlDeviceCommonLogic.Current.ReFreshByLocal();
            //初始化房间(郭雪城那边不做处理,需要这里特殊执行一步)
            HdlRoomLogic.Current.RefreshAllRoomByLocation();
            //刷新左边刷新房间视图列表
            HdlRoomLogic.Current.RefreshRoomListView();
        }
 
        /// <summary>
        /// 清空所有成员缓存
        /// </summary>
        private void ClearAllMemberMemory()
        {
            //消息记录重新读取及检测
            HdlControlResourse.ReadMessageAgain = true;
            HdlControlResourse.HadNewMessage = false;
            HdlThreadLogic.Current.RunMain(() =>
            {
                for (int i = 0; i < HdlControlResourse.listMessageManaContr.Count; i++)
                {
                    //显示角标特效
                    HdlControlResourse.listMessageManaContr[i].IsSelected = false;
                }
            });
 
            //切换住宅清除之前逻辑缓存数据;
            Common.Logic.LogicList.Clear();
            Common.Logic.LockLogicList.Clear();
            Common.Logic.SoneLogicList.Clear();
        }
 
        /// <summary>
        /// 检测当前账号的权限的合法性
        /// </summary>
        private void CheckNowAuthority()
        {
            var result = HdlAccountLogic.Current.RefreshAccountAuthority();
            if (result == AccountStatu.AuthorityChangd)
            {
                //如果登陆的账号的权限和上一次的不一样,则删除本地这个住宅全部的文件,从头再来
                string dirPath = Config.Instance.FullPath;
                if (System.IO.Directory.Exists(dirPath) == true)
                {
                    //同步数据的判断文件(以防万一删除整个文件夹失败的时候,这个文件被删的话,应该没什么大问题)
                    HdlFileLogic.Current.DeleteFile(HdlFileNameResourse.AutoDownLoadBackupCheckFile);
                    //如果本地已经拥有了这个文件,则说明不是新手机,不再自动还原
                    HdlFileLogic.Current.DeleteDirectory(dirPath);
                    //创建住宅文件夹
                    Global.CreateHomeDirectory(Config.Instance.HomeId);
                    //预创建个人中心全部的文件夹
                    HdlFileLogic.Current.CreatAllUserCenterDirectory();
                }
            }
        }
 
        #endregion
    }
}