| | |
| | | using System; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Text; |
| | | using HDL_ON.Entity; |
| | |
| | | /// </summary> |
| | | public bool IsSearchLocalGatewaySuccessful = false; |
| | | |
| | | bool _GatewayOnline_Local = false; |
| | | /// <summary> |
| | | /// |
| | | /// 网关在线-局域网 |
| | | /// </summary> |
| | | bool _gatewayOnline = false; |
| | | /// <summary> |
| | | /// 网关是否在线 |
| | | /// </summary> |
| | | public bool GatewayOnline |
| | | public bool GatewayOnline_Local |
| | | { |
| | | get |
| | | { |
| | | return _gatewayOnline; |
| | | return _GatewayOnline_Local; |
| | | } |
| | | set |
| | | { |
| | | if (_gatewayOnline != value) |
| | | if (_GatewayOnline_Local != value) |
| | | { |
| | | _gatewayOnline = value; |
| | | //修改主页连接状态 |
| | | UI.HomePage.LoadEvent_CheckLinkStatus(); |
| | | _GatewayOnline_Local = value; |
| | | if (value) |
| | | { |
| | | MainPage.Log($"网关在线,刷新设备状态"); |
| | | //修改主页连接状态 |
| | | HomePage.LoadEvent_CheckLinkStatus(); |
| | | MainPage.Log($"网关局域网在线,刷新设备状态"); |
| | | new System.Threading.Thread(() => |
| | | { |
| | | System.Threading.Thread.Sleep(1000); |
| | |
| | | }) |
| | | { IsBackground = true, Priority = System.Threading.ThreadPriority.AboveNormal }.Start(); |
| | | } |
| | | else |
| | | { |
| | | //修改主页连接状态 |
| | | HomePage.LoadEvent_CheckLinkStatus(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | bool _GatewayOnline_Cloud = false; |
| | | /// <summary> |
| | | /// 网关在线-云端 |
| | | /// </summary> |
| | | public bool GatewayOnline_Cloud |
| | | { |
| | | get |
| | | { |
| | | return _GatewayOnline_Cloud; |
| | | } |
| | | set |
| | | { |
| | | if (_GatewayOnline_Cloud != value) |
| | | { |
| | | _GatewayOnline_Cloud = value; |
| | | if(GatewayOnline_Local) |
| | | { |
| | | return; |
| | | } |
| | | if (value) |
| | | { |
| | | if (DB_ResidenceData.Instance.HomeGateway == null) |
| | | { |
| | | return; |
| | | } |
| | | if (!DB_ResidenceData.Instance.HomeGateway.gatewayStatus)//远程情况下,网关未链接服务器不能修改主页网关状态 |
| | | { |
| | | new System.Threading.Thread(() => |
| | | { |
| | | System.Threading.Thread.Sleep(3000); |
| | | var pm = new DAL.Server.HttpServerRequest(); |
| | | pm.GetGatewayInfo(); |
| | | }) |
| | | { IsBackground = true }.Start(); |
| | | return; |
| | | } |
| | | //修改主页连接状态 |
| | | HomePage.LoadEvent_CheckLinkStatus(); |
| | | MainPage.Log($"网关云端在线,刷新设备状态"); |
| | | new System.Threading.Thread(() => |
| | | { |
| | | System.Threading.Thread.Sleep(1000); |
| | | FunctionList.List.ReadAllFunctionStatus(); |
| | | }) |
| | | { IsBackground = true, Priority = System.Threading.ThreadPriority.AboveNormal }.Start(); |
| | | } |
| | | else |
| | | { |
| | | //修改主页连接状态 |
| | | HomePage.LoadEvent_CheckLinkStatus(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 网关通讯ID |
| | | /// </summary> |
| | | public string GatewayId = ""; |
| | | |
| | | bool _isRemote = false; |
| | | /// <summary> |
| | | /// 是否为远程连接 |
| | | /// </summary> |
| | | public bool IsRemote |
| | | { |
| | | get |
| | | { |
| | | return _isRemote; |
| | | } |
| | | set |
| | | { |
| | | _isRemote = value; |
| | | //修改主页连接状态 |
| | | HomePage.LoadEvent_CheckLinkStatus(); |
| | | } |
| | | } |
| | | //public bool IsRemote = false; |
| | | /// <summary> |
| | | /// 通讯地址IP |
| | | /// </summary> |
| | |
| | | /// </summary> |
| | | public void SearchLoaclGateway() |
| | | { |
| | | MainPage.Log($"搜索本地网关列表,网关类型:{DB_ResidenceData.Instance.GatewayType}"); |
| | | //2021-01-15 : 住宅没有绑定网关的时候不用搜索,并且不能链接mqtt |
| | | if(DB_ResidenceData.Instance.HomeGateway == null) |
| | | { |
| | | return; |
| | | } |
| | | Ins.GatewayOnline_Local = false; |
| | | var ggg = DB_ResidenceData.Instance.GatewayType == 0 ? "一端口" : "A网关"; |
| | | var ggg1 = MainPage.InternetStatus == 1 ? "4G" : "wifi"; |
| | | MainPage.Log($"搜索网关列表,网关类型:{ggg};网络类型:{ggg1}"); |
| | | if (MainPage.InternetStatus == 0) |
| | | { |
| | | Ins.GatewayOnline = false; |
| | | Ins.GatewayOnline_Cloud = false; |
| | | return; |
| | | } |
| | | else if (MainPage.InternetStatus == 1) |
| | | { |
| | | if (!Ins.IsRemote) |
| | | { |
| | | Ins.IsRemote = true; |
| | | DAL.Mqtt.MqttClient.InitState(); |
| | | } |
| | | DAL.Mqtt.MqttClient.InitState(); |
| | | } |
| | | else if (MainPage.InternetStatus == 2) |
| | | { |
| | |
| | | for (int i = 0; i < 5; i++) |
| | | { |
| | | if (IsSearchLocalGatewaySuccessful) |
| | | { |
| | | Ins.GatewayOnline_Local = true; |
| | | break; |
| | | } |
| | | if (DB_ResidenceData.Instance.GatewayType == 0) |
| | | { |
| | | new Control_Udp().ControlBytesSend(Command.ReadGateway, 255, 255, new byte[] { (byte)new Random().Next(255), (byte)new Random().Next(255) }); |
| | |
| | | System.Threading.Thread.Sleep(500); |
| | | } |
| | | |
| | | if (!IsSearchLocalGatewaySuccessful) |
| | | { |
| | | //本地搜索不到网关 |
| | | if (!Ins.IsRemote) |
| | | { |
| | | //连接mqtt前,先断开--2020-12-21 |
| | | DAL.Mqtt.MqttClient.DisConnectRemote(); |
| | | Ins.IsRemote = true; |
| | | DAL.Mqtt.MqttClient.InitState(); |
| | | } |
| | | } |
| | | DAL.Mqtt.MqttClient.InitState(); |
| | | }) |
| | | { IsBackground = true }.Start(); |
| | | } |
| | |
| | | /// </summary> |
| | | public void ControlScene(Scene scene) |
| | | { |
| | | if (Ins.IsRemote || DB_ResidenceData.Instance.GatewayType == 1) |
| | | if (!Ins.GatewayOnline_Local || DB_ResidenceData.Instance.GatewayType == 1) |
| | | { |
| | | ControlAProtocolScene(scene); |
| | | new System.Threading.Thread(() => |
| | | { |
| | | ControlAProtocolScene(scene); |
| | | }) |
| | | { IsBackground = true }.Start(); |
| | | } |
| | | else |
| | | { |
| | |
| | | /// </summary> |
| | | /// <param name="commandString"></param> |
| | | /// <param name="function"></param> |
| | | /// <param name="useRemote">是否直接使用远程发送</param> |
| | | /// <returns></returns> |
| | | public void SendWriteCommand(Function function, Dictionary<string, string> commandDictionary) |
| | | public void SendWriteCommand(Function function, Dictionary<string, string> commandDictionary, bool useRemote = false) |
| | | { |
| | | function.usageCount++; |
| | | function.controlCounter++; |
| | | function.refreshTime = DateTime.Now; |
| | | |
| | | //如果是控制调光的开时,亮度值不能为0 |
| | |
| | | } |
| | | } |
| | | |
| | | //远程通讯 |
| | | if (Ins.IsRemote) |
| | | MainPage.Log($"发送数据:{Newtonsoft.Json.JsonConvert.SerializeObject(commandDictionary)}"); |
| | | |
| | | ///第三方涂鸦设备统一使用远程控制 |
| | | switch(function.spk) |
| | | { |
| | | case SPK.ElectricTuyaAirCleaner: |
| | | case SPK.ElectricTuyaFan: |
| | | case SPK.ElectricTuyaWaterValve: |
| | | case SPK.ElectricTuyaWeepRobot: |
| | | useRemote = true; |
| | | break; |
| | | } |
| | | |
| | | //远程通讯 --涂鸦设备必须需要远程 |
| | | if (useRemote == true) |
| | | { |
| | | DAL.Server.HttpServerRequest httpServer = new DAL.Server.HttpServerRequest(); |
| | | //ALink控制、Bus控制使用同一个接口控制,由云端负责解析 |
| | |
| | | var actionObjs = new List<ApiAlinkControlActionObj>(); |
| | | actionObjs.Add(apiControlData); |
| | | var pack = httpServer.ControlDevice(actionObjs); |
| | | //MainPage.Log($"{pack.Code}:{pack.Data}"); |
| | | } |
| | | //本地通讯 |
| | | else |
| | | { |
| | | //Bus控制 |
| | | if (DB_ResidenceData.Instance.GatewayType == 0) |
| | | ////远程通讯 |
| | | //if (Ins.GatewayOnline_Local == false && Ins.GatewayOnline_Cloud == true) |
| | | //{ |
| | | // DAL.Server.HttpServerRequest httpServer = new DAL.Server.HttpServerRequest(); |
| | | // //ALink控制、Bus控制使用同一个接口控制,由云端负责解析 |
| | | // var apiControlData = function.GetApiControlData(commandDictionary); |
| | | // var actionObjs = new List<ApiAlinkControlActionObj>(); |
| | | // actionObjs.Add(apiControlData); |
| | | // var pack = httpServer.ControlDevice(actionObjs); |
| | | //} |
| | | //本地通讯 |
| | | if (Ins.GatewayOnline_Local) |
| | | { |
| | | try |
| | | //Bus控制 |
| | | if (DB_ResidenceData.Instance.GatewayType == 0) |
| | | { |
| | | new Control_Udp().WriteBusData(function, commandDictionary); |
| | | try |
| | | { |
| | | new Control_Udp().WriteBusData(function, commandDictionary); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | MainPage.Log($"发送数据异常: {ex.Message}"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | //ALink控制 |
| | | else |
| | | { |
| | | MainPage.Log($"发送数据异常: {ex.Message}"); |
| | | var functionControlDataObj = function.GetGatewayAlinkControlData(commandDictionary); |
| | | var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(functionControlDataObj); |
| | | var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlFunctionTopic, functionControlDataJson); |
| | | new Control_Udp().SendLocalHdlLinkData(sendBytes, functionControlDataObj.id); |
| | | MainPage.Log($"本地通讯 发送HDL-Link数据:{functionControlDataJson}"); |
| | | } |
| | | } |
| | | //ALink控制 |
| | | //远程通讯 |
| | | else |
| | | { |
| | | var functionControlDataObj = function.GetGatewayAlinkControlData(commandDictionary); |
| | | var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(functionControlDataObj); |
| | | var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlFunctionTopic, functionControlDataJson); |
| | | new Control_Udp().SendLocalHdlLinkData(sendBytes, functionControlDataObj.id); |
| | | MainPage.Log($"发送HDL-Link数据:{functionControlDataJson}"); |
| | | DAL.Server.HttpServerRequest httpServer = new DAL.Server.HttpServerRequest(); |
| | | //ALink控制、Bus控制使用同一个接口控制,由云端负责解析 |
| | | var apiControlData = function.GetApiControlData(commandDictionary); |
| | | var actionObjs = new List<ApiAlinkControlActionObj>(); |
| | | actionObjs.Add(apiControlData); |
| | | var pack = httpServer.ControlDevice(actionObjs); |
| | | } |
| | | |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// 全开全关功能 |
| | | /// </summary> |
| | | public void SwtichFunctions(bool open,List<Function> functions) |
| | | { |
| | | var count = 0; |
| | | var logString = open ? "打开\r\n" : "关闭\r\n"; |
| | | List<ApiAlinkControlActionObj> actionObjs = new List<ApiAlinkControlActionObj>(); |
| | | Dictionary<string, string> d = new Dictionary<string, string>(); |
| | | d.Add(FunctionAttributeKey.OnOff, open ? "on" : "off"); |
| | | var pm = new DAL.Server.HttpServerRequest(); |
| | | foreach (var temp in functions) |
| | | { |
| | | logString += temp.spk + ":" + temp.sid + "\r\n"; |
| | | var apiControlData = temp.GetApiControlData(d); |
| | | actionObjs.Add(apiControlData); |
| | | count++; |
| | | if (count > 9) |
| | | { |
| | | var result = pm.ControlDevice(actionObjs); |
| | | actionObjs = new List<ApiAlinkControlActionObj>(); |
| | | count = 0; |
| | | MainPage.Log(logString); |
| | | logString = ""; |
| | | } |
| | | } |
| | | var pack = pm.ControlDevice(actionObjs); |
| | | MainPage.Log(logString); |
| | | } |
| | | |
| | | public void SendApiReadCommand(List<string> functionIds) |
| | | { |
| | | var pm = new DAL.Server.HttpServerRequest(); |
| | | var pack = pm.RefreshDeviceStatus(functionIds); |
| | | } |
| | | /// <summary> |
| | | /// 读取功能详细数据 |
| | | /// </summary> |
| | | /// <param name="functionIds"></param> |
| | | public void ReadFunctionsInfo(List<string> functionIds) |
| | | { |
| | | var pm = new DAL.Server.HttpServerRequest(); |
| | | var pack = pm.GetDeviceInfoList(functionIds); |
| | | if(pack!= null&& pack.Data!=null) |
| | | { |
| | | //待测试2021-03-04 |
| | | var ddd = Newtonsoft.Json.JsonConvert.DeserializeObject<List<AlinkStatusData>>(pack.Data.ToString()); |
| | | if(ddd!= null) |
| | | { |
| | | foreach(var function in ddd) |
| | | { |
| | | var temp = FunctionList.List.GetDeviceFunctionList().Find((obj) => obj.deviceId == function.deviceId); |
| | | if(temp!= null) |
| | | { |
| | | if (SPK.Get3tySpk(SPK.BrandType.Tuya).Contains(temp.spk)) |
| | | { |
| | | Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(temp.sid, function.status); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | public void SendReadCommand(Function function) |
| | | { |
| | | function.refreshTime = DateTime.Now; |
| | | if (Ins.IsRemote) |
| | | if (Ins.GatewayOnline_Local) |
| | | { |
| | | var pm = new DAL.Server.HttpServerRequest(); |
| | | var pack = pm.RefreshDeviceStatus(new List<string>() { function.deviceId }); |
| | | } |
| | | else |
| | | { |
| | | |
| | | if (DB_ResidenceData.Instance.GatewayType == 0) |
| | | { |
| | | try |
| | |
| | | }; |
| | | var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(readDataObj); |
| | | var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ReadStatus, functionControlDataJson); |
| | | MainPage.Log($"发送HDL-Link数据:{functionControlDataJson}"); |
| | | MainPage.Log($"本地通讯 发送HDL-Link数据:{functionControlDataJson}"); |
| | | new Control_Udp().SendLocalHdlLinkData(sendBytes, readDataObj.id); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | var pm = new DAL.Server.HttpServerRequest(); |
| | | var pack = pm.RefreshDeviceStatus(new List<string>() { function.deviceId }); |
| | | } |
| | | } |
| | | ///// <summary> |
| | | ///// 发送A协议读取命令 |
| | | ///// </summary> |
| | | //public void SendReadCommand(List<Dictionary<string, string>> keyValuePairs) |
| | | //{ |
| | | // var readDataObj = new GatewayAlinkReadObj() |
| | | // { |
| | | // id = Ins.msg_id.ToString(), |
| | | // objects = keyValuePairs, |
| | | // time_stamp = Utlis.GetTimestamp() |
| | | // }; |
| | | // var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(readDataObj); |
| | | // var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ReadStatus, functionControlDataJson); |
| | | // Ins.myUdp.SendLocalHdlLinkData(sendBytes); |
| | | //} |
| | | |
| | | /// <summary> |
| | | /// a协议控制场景 |
| | |
| | | /// <param name="scene"></param> |
| | | static void ControlAProtocolScene(Scene scene) |
| | | { |
| | | if (Ins.IsRemote) |
| | | if (!Ins.GatewayOnline_Local)//网关本地不在线 |
| | | { |
| | | var pm = new HDL_ON.DAL.Server.HttpServerRequest(); |
| | | pm.ExecuteScene(scene.userSceneId); |
| | | var pm = new DAL.Server.HttpServerRequest(); |
| | | var result = pm.ExecuteScene(scene.userSceneId); |
| | | } |
| | | else |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | MainPage.Log($"time 1 :{receiveObj.Topic}"); |
| | | MainPage.Log($"局域网信息: {receiveObj.Topic}"); |
| | | |
| | | |
| | | //验证有效数据长度 |
| | |
| | | var device = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceModule>(bodyJObj.objects.ToString()); |
| | | if (device.device_mac == DB_ResidenceData.Instance.residenceGatewayMAC) |
| | | { |
| | | //本地搜索网关成功 |
| | | Control.Ins.IsSearchLocalGatewaySuccessful = true; |
| | | Ins.GatewayOnline = true; |
| | | MainPage.Log("本地搜索网关成功"); |
| | | Ins.IsSearchLocalGatewaySuccessful = true; |
| | | Ins.GatewayOnline_Local = true; |
| | | if (!string.IsNullOrEmpty(device.gatewayId)) |
| | | { |
| | | Ins.GatewayId = device.gatewayId; |
| | |
| | | Ins.GatewayId = device.device_mac; |
| | | } |
| | | reportIp = "239.0.168.188";// device.ip_address; |
| | | Ins.IsRemote = false; |
| | | } |
| | | } |
| | | else if (receiveObj.Topic == CommunicationTopic.ct.ReadStatus + "_reply" || |
| | |
| | | /// A协议数据 |
| | | /// </summary> |
| | | /// <param name="updateBytes"></param> |
| | | public void UpdataFunctionStatus(string revString, byte[] usefulBytes) |
| | | public void UpdataFunctionStatus(string revString, byte[] usefulBytes,bool isCloudData = false) |
| | | { |
| | | MainPage.Log($"A协议更新状态:{revString}"); |
| | | |
| | | if (Ins.GatewayOnline_Local && isCloudData)//本地链接,除了涂鸦设备数据之外的云端数据不处理 |
| | | { |
| | | if (FunctionList.List.GetDeviceFunctionList(SPK.BrandType.Tuya).Count == 0) |
| | | { |
| | | //MainPage.Log($"A协议更新状态:本地链接,除了涂鸦设备数据之外的云端数据不处理..."); |
| | | return; |
| | | } |
| | | } |
| | | var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<AlinkFunctionStatusObj>(revString); |
| | | if (temp != null) |
| | | { |
| | |
| | | { |
| | | try |
| | | { |
| | | //bool hadChange = false;//状态有变化再更新界面 |
| | | var localFunction = allLocalFuntion.Find((obj) => obj.sid == updateTemp.sid); |
| | | if (Ins.GatewayOnline_Local && isCloudData)//本地链接,除了涂鸦设备数据之外的云端数据不处理 |
| | | { |
| | | if(!SPK.Get3tySpk(SPK.BrandType.All3tyBrand).Contains(localFunction.spk)) |
| | | { |
| | | //MainPage.Log($"A协议更新状态:本地链接,除了涂鸦设备数据之外的云端数据不处理........"); |
| | | return; |
| | | } |
| | | } |
| | | //MainPage.Log($"A协议更新状态:{revString}"); |
| | | foreach (var attr in updateTemp.status) |
| | | { |
| | | localFunction.SetAttrState(attr.key,attr.value); |
| | | } |
| | | |
| | | if (localFunction != null) |
| | | { |
| | | //var updateInfoString = $"更新设备:{localFunction.name}"; |
| | | //foreach (var attr in updateTemp.status) |
| | | //{ |
| | | // updateInfoString += $" key:{attr.key};value:{attr.value}"; |
| | | //} |
| | | //MainPage.Log(updateInfoString); |
| | | |
| | | |
| | | //更新界面状态 |
| | | Function localObj = null; |
| | | switch (localFunction.spk) |
| | |
| | | localAttr.curValue = attr.value; |
| | | } |
| | | } |
| | | //rgb.lastState = Language.StringByID(StringId.Brightness) + " : " + rgb.brightness + "%"; |
| | | RelayPage.UpdataState(localSwitch); |
| | | } |
| | | break; |
| | |
| | | } |
| | | } |
| | | ac.lastState = ""; |
| | | switch (ac.trait_mode.curValue.ToString()) |
| | | switch (ac.GetAttrState(FunctionAttributeKey.Mode)) |
| | | { |
| | | case "cool": |
| | | ac.lastState = Language.StringByID(StringId.Cool); |
| | |
| | | ac.lastState = Language.StringByID(StringId.AirSupply); |
| | | break; |
| | | } |
| | | switch (ac.trait_fan.curValue.ToString()) |
| | | switch (ac.GetAttrState(FunctionAttributeKey.FanSpeed)) |
| | | { |
| | | case "high": |
| | | ac.lastState += " " + Language.StringByID(StringId.HighWindSpeed); |
| | |
| | | ac.lastState += " " + Language.StringByID(StringId.Auto); |
| | | break; |
| | | } |
| | | ac.lastState += " " + ac.trait_temp.curValue + ac.tempUnitString; |
| | | ac.lastState += " " + ac.GetAttrState(FunctionAttributeKey.SetTemp) + ac.tempUnitString; |
| | | ACPage.UpdataStates(ac); |
| | | } |
| | | break; |
| | |
| | | } |
| | | break; |
| | | case SPK.ElectricTV: |
| | | break; |
| | | default: |
| | | break;
|
| | | case SPK.ElectricTuyaAirCleaner:
|
| | | case SPK.ElectricTuyaFan:
|
| | | case SPK.ElectricTuyaWeepRobot: |
| | | case SPK.ElectricTuyaWaterValve: |
| | | case SPK.SensorPir: |
| | | case SPK.SensorDoorWindow: |
| | | case SPK.SensorSmoke: |
| | | case SPK.SensorWater: |
| | | case SPK.ClothesHanger: |
| | | case SPK.IrAC: |
| | | //设备状态推送 |
| | | Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid,updateTemp.status); |
| | | break; |
| | | } |
| | | HomePage.UpdataFunctionStates(localObj); |
| | | RoomPage.UpdataStates(localObj); |
| | | FunctionPage.UpdataStates(localObj); |
| | | ClassificationPage.UpdataInfo(localObj); |
| | | if (localObj != null)
|
| | | {
|
| | | HomePage.UpdataFunctionStates(localObj);
|
| | | RoomPage.UpdataStates(localObj);
|
| | | FunctionPage.UpdataStates(localObj);
|
| | | ClassificationPage.UpdataInfo(localObj);
|
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |