xm
2021-12-01 6d73bf6e816570291865674bef8bce8972e4de3f
HDL_ON/UI/UI2/FuntionControlView/Energy/EnergyMainPage.cs
@@ -1,34 +1,122 @@
using System;
using System.Collections.Generic;
using HDL_ON.DAL.Server;
using HDL_ON.DriverLayer;
using HDL_ON.Entity;
using HDL_ON.UI.CSS;
using Shared;
namespace HDL_ON.UI
{
    public class EnergyMainPage : FrameLayout
    {
        FrameLayout bodyView;
        static EnergyMainPage bodyView;
        /// <summary>
        /// 顶部区域
        /// </summary>
        FrameLayout generalTableView;
        /// <summary>
        /// 实时功耗
        /// </summary>
        Button btnRealTimeData;
        /// <summary>
        /// 实时功耗单位
        /// </summary>
        Button btnTotalValueUint;
        /// <summary>
        /// 总功耗
        /// </summary>
        TextButton btnTotalValue;
        /// <summary>
        /// 总功耗-饼图
        /// </summary>
        MyEchartsViewOn myEchartsView_Pie;
        /// <summary>
        /// 历史数据区域
        /// </summary>
        FrameLayout diagramView;
        /// <summary>
        /// 曲线图数据string
        /// </summary>
        EchartsOption_BrokenLine brokenLine;
        /// <summary>
        /// 曲线图下拉按钮
        /// </summary>
        Button btnDrodDown;
        /// <summary>
        /// 插查询的能源列表
        /// </summary>
        List<Function> queryList = new List<Function>();
        /// <summary>
        /// 查询条件
        /// hour、week、month
        /// </summary>
        string curQueryType = "hour";
        /// <summary>
        /// 能源列表区域
        /// </summary>
        FrameLayout energyListView;
        /// <summary>
        /// 历史数据图表
        /// </summary>
        MyEchartsViewOn myEchartsView_Line;
        /// <summary>
        /// 曲线图是否展开
        /// </summary>
        bool isUnfoldOrStow = false;
        List<Function> energyList = new List<Function>();
        List<uint> colorList = new List<uint>(){0xFF80AEFF, 0xFFFFD154, 0xFFFF9D54, 0xFFFE6A6A, 0xFFB183C3, 0xFFADE764,
                                        0xFFD7504B, 0xFFC6E579, 0xFFF4E001, 0xFFF0805A, 0xFF26C0C0};
        List<string> colorList2 = new List<string>() {
                                        "#80AEFF", "#FFD154", "#FF9D54", "#FE6A6A", "#B183C3", "#ADE764",
                                        "#D7504B", "#C6E579", "#F4E001", "#F0805A", "#26C0C0"};
        /// <summary>
        /// 主页
        /// </summary>
        public EnergyMainPage()
        {
            bodyView = this;
            energyList = FunctionList.List.GetEnergyList();
            var breaker = FunctionList.List.Functions.FindAll((obj) => obj.spk == SPK.AirSwitch);
            var energyBreker = breaker.FindAll((obj) => obj.GetAttribute("power") != null);
            energyList.AddRange(energyBreker);
        }
        /// <summary>
        ///
        /// </summary>
        public void LoadPage()
        {
            new TopViewDiv(bodyView, Language.StringByID(StringId.EnergyMonitoring)).LoadTopView();
            bodyView.BackgroundColor = CSS_Color.BackgroundColor;
            var generalTableView = new FrameLayout()
            var contentView = new VerticalScrolViewLayout()
            {
                Y = Application.GetRealHeight(64),
                Height = Application.GetRealHeight(603),
            };
            bodyView.AddChidren(contentView);
            #region 顶部view
            generalTableView = new FrameLayout()
            {
                Gravity = Gravity.CenterHorizontal,
                Y = Application.GetRealHeight(80),
                Y = Application.GetRealWidth(16),
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealWidth(148),
                Height = Application.GetRealWidth(148),//419//148
                Radius = (uint)Application.GetRealWidth(5),
                BackgroundColor = CSS_Color.MainBackgroundColor,
            };
            bodyView.AddChidren(generalTableView);
            contentView.AddChidren(generalTableView);
            TextButton btnTotalValue = new TextButton()
            btnTotalValue = new TextButton()
            {
                X = Application.GetRealWidth(18),
                Y = Application.GetRealWidth(24),
@@ -42,9 +130,7 @@
            };
            generalTableView.AddChidren(btnTotalValue);
            btnTotalValue.Width = btnTotalValue.GetTextWidth();
            var btnTotalValueUint = new Button()
            btnTotalValueUint = new Button()
            {
                X = btnTotalValue.Right,
                Y = Application.GetRealWidth(24),
@@ -58,45 +144,571 @@
            };
            generalTableView.AddChidren(btnTotalValueUint);
            var btnValue = new Button()
            btnRealTimeData = new Button()
            {
                X = Application.GetRealWidth(18),
                Y = btnTotalValue.Bottom,
                Width = Application.GetRealWidth(209),
                Height = Application.GetRealWidth(28),
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextColor = CSS_Color.TextualColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                IsBold = true,
                TextAlignment = TextAlignment.CenterLeft,
                TextID = StringId.RealTimePowerConsumption,
            };
            generalTableView.AddChidren(btnValue);
            generalTableView.AddChidren(btnRealTimeData);
            var echartsView = new FrameLayout()
            {
                Width = Application.GetRealWidth(100),
                Height = Application.GetRealWidth(100),
                Width = Application.GetRealWidth(118),
                Height = Application.GetRealWidth(118),
                X = Application.GetRealWidth(227),
                Y = Application.GetRealWidth(16),
                //Y = Application.GetRealWidth(16),
            };
            generalTableView.AddChidren(echartsView);
            MyEchartsViewOn myEchartsView = new MyEchartsViewOn() {
                Width = Application.GetRealWidth(100),
                Height = Application.GetRealWidth(100),
            myEchartsView_Pie = new MyEchartsViewOn()
            {
                Width = Application.GetRealWidth(118),
                Height = Application.GetRealWidth(118),
            };
            echartsView.AddChidren(myEchartsView_Pie);
            Dictionary<string, string> list = new Dictionary<string, string>();
            foreach(var ene in energyList)
            {
                double tt = 0;
                double.TryParse(ene.GetAttrState(FunctionAttributeKey.TotalElectricity), out tt);
                tt *= 100;//乘以100,小于1无法加载echart
                tt = Math.Round(tt, 2);
                list.Add(ene.name, tt.ToString());
            }
            myEchartsView_Pie.ShowWithOption(new EchartsOption_Pie().InitDateJson(list));
            btnDrodDown = new Button()
            {
                Y = Application.GetRealWidth(118),
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealWidth(30),
                UnSelectedImagePath = "FunctionIcon/Energy/EnergyDrodDownIcon.png",
                SelectedImagePath = "FunctionIcon/Energy/EnergyDrodUpIcon.png",
            };
            initDiagramView();
            generalTableView.AddChidren(btnDrodDown);
            btnDrodDown.MouseUpEventHandler = (sender, e) => {
                isUnfoldOrStow = btnDrodDown.IsSelected = !btnDrodDown.IsSelected;
                showDiagramView();
            };
            echartsView.AddChidren(myEchartsView);
            Dictionary<string, string> list = new Dictionary<string, string>();
            list.Add("电冰箱", "12");
            list.Add("电风扇", "2");
            list.Add("空调", "9");
            list.Add("洗衣机", "3");
            list.Add("电脑", "33");
            var echartsPie = new EchartsOption_Pie();
            var echartRootJson = echartsPie.InitDateJson(list);
            //var echartRootJsonString = Newtonsoft.Json.JsonConvert.SerializeObject(echartRootJson);
            myEchartsView.ShowWithOption(echartRootJson);
            UpdataValue();
            #endregion
            energyListView = new FrameLayout()
            {
                Y = generalTableView.Bottom + Application.GetRealWidth(8),
                Height = Application.GetRealWidth(116 * energyList.Count + 50),
            };
            contentView.AddChidren(energyListView);
            int index = 0;
            foreach (var energy in energyList)
            {
                EnergyRow(energy, energyListView, index);
                index++;
                new System.Threading.Thread(() =>
                {
                    Control.Ins.SendReadCommand(energy);
                })
                { IsBackground = true }.Start();
            }
        }
        /// <summary>
        ///
        /// </summary>
        void showDiagramView()
        {
            if (isUnfoldOrStow)//展开
            {
                generalTableView.Height = Application.GetRealWidth(419);
                btnDrodDown.Y = Application.GetRealWidth(389);
                btnDrodDown.IsSelected = true;
            }
            else
            {
                generalTableView.Height = Application.GetRealWidth(148);
                btnDrodDown.Y = Application.GetRealWidth(118);
                btnDrodDown.IsSelected = false;
            }
            energyListView.Y = generalTableView.Bottom + Application.GetRealWidth(8);
        }
        /// <summary>
        /// 加载曲线图
        /// </summary>
        /// <param name="contentView"></param>
        void initDiagramView()
        {
            brokenLine = new EchartsOption_BrokenLine();
            diagramView = new FrameLayout()
            {
                Y = Application.GetRealWidth(136),
                Gravity = Gravity.CenterHorizontal,
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealWidth(281),
                BackgroundColor = CSS_Color.MainBackgroundColor,
                Radius = (uint)Application.GetRealWidth(12),
                BorderColor = 0x00000000,
                BorderWidth = 0,
            };
            generalTableView.AddChidren(diagramView);
            #region 选择数据日期范围
            var showDataTypeView = new FrameLayout()
            {
                X = Application.GetRealWidth(183),
                Y = Application.GetRealHeight(12),
                Width = Application.GetRealWidth(144),
                Height = Application.GetRealHeight(24),
                BackgroundImagePath = "FunctionIcon/EnvironmentalScience/SensorHistoryBg1.png",
            };
            diagramView.AddChidren(showDataTypeView);
            var btnShowHistroyData_Day = new Button()
            {
                Width = Application.GetRealWidth(48),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.PromptingColor2,
                SelectedTextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                IsSelected = true,
                TextID = StringId.day,
            };
            showDataTypeView.AddChidren(btnShowHistroyData_Day);
            var btnShowHistroyData_Week = new Button()
            {
                X = Application.GetRealWidth(48),
                Width = Application.GetRealWidth(48),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.PromptingColor2,
                SelectedTextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                TextID = StringId.week,
            };
            showDataTypeView.AddChidren(btnShowHistroyData_Week);
            var btnShowHistroyData_Month = new Button()
            {
                X = Application.GetRealWidth(48 * 2),
                Width = Application.GetRealWidth(48),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.PromptingColor2,
                SelectedTextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                Text =  Language.StringByID(StringId.month),//DateTime.Now.Month.ToString() +
            };
            showDataTypeView.AddChidren(btnShowHistroyData_Month);
            btnShowHistroyData_Day.MouseUpEventHandler = (sender, e) =>
            {
                showDataTypeView.BackgroundImagePath = "FunctionIcon/EnvironmentalScience/SensorHistoryBg1.png";
                btnShowHistroyData_Day.IsSelected = true;
                btnShowHistroyData_Month.IsSelected = false;
                btnShowHistroyData_Week.IsSelected = false;
                curQueryType = "hour";
                brokenLine.YvalueText = "";
                foreach (var enery in queryList)
                {
                    LoadMothed_GetHistoryData(enery,false);
                }
            };
            btnShowHistroyData_Week.MouseUpEventHandler = (sender, e) =>
            {
                showDataTypeView.BackgroundImagePath = "FunctionIcon/EnvironmentalScience/SensorHistoryBg2.png";
                btnShowHistroyData_Day.IsSelected = false;
                btnShowHistroyData_Month.IsSelected = false;
                btnShowHistroyData_Week.IsSelected = true;
                curQueryType = "week";
                brokenLine.YvalueText = "";
                foreach (var enery in queryList)
                {
                    LoadMothed_GetHistoryData(enery, false);
                }
            };
            btnShowHistroyData_Month.MouseUpEventHandler = (sender, e) =>
            {
                showDataTypeView.BackgroundImagePath = "FunctionIcon/EnvironmentalScience/SensorHistoryBg3.png";
                btnShowHistroyData_Day.IsSelected = false;
                btnShowHistroyData_Month.IsSelected = true;
                btnShowHistroyData_Week.IsSelected = false;
                curQueryType = "month";
                brokenLine.YvalueText = "";
                foreach (var enery in queryList)
                {
                    LoadMothed_GetHistoryData(enery, false);
                }
            };
            #endregion
            var historyDataView = new FrameLayout()
            {
                Gravity = Gravity.CenterHorizontal,
                Y = Application.GetRealWidth(52),
                Height = Application.GetRealWidth(190),
            };
            diagramView.AddChidren(historyDataView);
            myEchartsView_Line = new MyEchartsViewOn()
            {
                Y = Application.GetRealWidth(10),
                Height = Application.GetRealWidth(180),
            };
            historyDataView.AddChidren(myEchartsView_Line);
        }
        /// <summary>
        /// 读取历史数据
        /// </summary>
        void LoadMothed_GetHistoryData(Function sr,bool isDel)
        {
            if(isDel)//删除数据现实
            {
                brokenLine.YvalueText = "";
                foreach (var ene in queryList)
                {
                    brokenLine.YvalueText += ene.GetAttrState("ydata");
                }
                var opString = brokenLine.InitOption();
                Application.RunOnMainThread(() =>
                {
                    myEchartsView_Line.ShowWithOption(opString);
                });
                return;
            }
            var loadPage = new Loading()
            {
                LodingBackgroundColor = 0x88888888,
            };
            diagramView.AddChidren(loadPage);
            new System.Threading.Thread(() =>
            {
                try
                {
                    Application.RunOnMainThread(() =>
                    {
                        loadPage.Start(Language.StringByID(StringId.PleaseWait));
                    });
                    var sensorType = sr.spk.Split(".")[1];
                    var revertObj = new HttpServerRequest().GetSensorHistory(curQueryType, sr.deviceId, "total_electricity");
                    if (revertObj != null)
                    {
                        if (revertObj.Code == StateCode.SUCCESS)
                        {
                            var revertData = Newtonsoft.Json.JsonConvert.DeserializeObject<List<EnvironmentalSensorHistor>>(revertObj.Data.ToString());
                            List<string> vs = new List<string>();
                            if (brokenLine.YvalueText == "")
                            {
                                foreach (var data in revertData)
                                {
                                    vs.Add(data.fieldName);
                                }
                                brokenLine.InitXdataText(vs);
                            }
                            if (sr.GetAttribute("ydata") == null)
                            {
                                sr.attributes.Add(new FunctionAttributes() { key = "ydata" });
                            }
                            sr.SetAttrState("ydata", brokenLine.InitYdataText(sr.name, revertData, sr.GetAttrState("color")) + ",");
                        }
                    }
                    brokenLine.yTitle = Language.StringByID(StringId.EnergyConsumption) + "(kW)";
                    brokenLine.xTitle = Language.StringByID(StringId.timeMode);
                    if(curQueryType != "hour")
                    {
                        brokenLine.xTitle = Language.StringByID(StringId.Date);
                    }
                    var opString = brokenLine.InitOption();
                    Application.RunOnMainThread(() =>
                    {
                        myEchartsView_Line.ShowWithOption(opString);
                    });
                }
                catch (Exception ex)
                {
                    MainPage.Log($"sensor history error : {ex.Message}");
                }
                finally
                {
                    Application.RunOnMainThread(() =>
                    {
                        loadPage.Hide();
                    });
                }
            })
            { IsBackground = true }.Start();
        }
        /// <summary>
        ///
        /// </summary>
        public void EnergyRow(Function energy, FrameLayout view, int index)
        {
            var btnLine = new Button()
            {
                Y = Application.GetRealWidth(116 * index),
                Height = Application.GetRealWidth(16),
            };
            view.AddChidren(btnLine);
            //定义代表色
            energy.attributes.Add(new FunctionAttributes() { key = "color", state = colorList2[index] });
            var row = new EnergyRow(energy, colorList[index]);
            row.SetHistory_Action = (isAdd) =>
            {
                if (isAdd)
                {
                    if(!isUnfoldOrStow)//如果曲线图没有加载出来,则自动加载出来
                    {
                        isUnfoldOrStow = true;
                        showDiagramView();
                    }
                    queryList.Add(row.function);
                    LoadMothed_GetHistoryData(row.function, false);
                }
                else
                {
                    queryList.Remove(row.function);
                    LoadMothed_GetHistoryData(row.function, true);
                    if (queryList.Count == 0)//如果查询列表为0,自动收起曲线图
                    {
                        isUnfoldOrStow = false;
                        showDiagramView();
                    }
                }
            };
            row.Y = btnLine.Bottom;
            view.AddChidren(row);
            //记录需要更新的更新按钮
            listButton_value.Add(row.btnValue);
        }
        /// <summary>
        /// 记录需要更新的更新按钮
        /// </summary>
        public List<Button> listButton_value = new List<Button>();
        /// <summary>
        /// 更新功能状态
        /// </summary>
        public static void UpdataStatus(Function updataTemp)
        {
            Application.RunOnMainThread(() =>
            {
                try
                {
                    if (bodyView == null)
                        return;
                    foreach (var btn in bodyView.listButton_value)
                    {
                        if (btn.Tag.ToString() == updataTemp.sid)
                        {
                            var newValue = updataTemp.GetAttrState(FunctionAttributeKey.Power);
                            //if (newValue != btn.Text)
                            {
                                btn.Text = Math.Round(double.Parse(newValue), 2).ToString();// +"W";
                                UpdataValue();
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MainPage.Log($"{bodyView.GetType().Name } UpdataStates error : {ex.Message}");
                }
            });
        }
        /// <summary>
        /// 更新数据
        /// </summary>
        static void UpdataValue()
        {
            double totalValue = 0;
            double realtimeValue = 0;
            Dictionary<string, string> list = new Dictionary<string, string>();//饼图数据
            foreach (var ene in bodyView.energyList)
            {
                double power = 0.00;
                double.TryParse(ene.GetAttrState(FunctionAttributeKey.TotalElectricity), out power);
                power = Math.Round(power, 2);
                totalValue += power;
                double realTimePower = 0;
                double.TryParse(ene.GetAttrState(FunctionAttributeKey.Power), out realTimePower);
                realtimeValue += realTimePower;
                realtimeValue = Math.Round(realtimeValue, 2);
                #region 饼图数据
                double tt = 0.00;
                double.TryParse(ene.GetAttrState(FunctionAttributeKey.TotalElectricity), out tt);
                tt = Math.Round(tt, 2);
                tt *= 100;//乘以100,小于1无法加载echart
                list.Add(ene.name, tt.ToString());
                #endregion
            }
            bodyView.btnTotalValue.Text = totalValue.ToString();
            realtimeValue /= 1000;
            bodyView.btnRealTimeData.Text = Language.StringByID(StringId.RealTimePowerConsumption).Replace("{0}", realtimeValue.ToString());
            ///动态获取文本宽度
            bodyView.btnTotalValue.Width = bodyView.btnTotalValue.GetTextWidth() + Application.GetRealWidth(5);
            bodyView.btnTotalValueUint.X = bodyView.btnTotalValue.Right;
            //刷新饼图
            bodyView.myEchartsView_Pie.ShowWithOption(new EchartsOption_Pie().InitDateJson(list));
        }
    }
}
    public class EnergyRow : FrameLayout
    {
        public Button btnValue;
        Button btnShowData;
        public Function function;
        public Action<bool> SetHistory_Action;
        public EnergyRow(Function energy, uint color)
        {
            function = energy;
            Gravity = Gravity.CenterHorizontal;
            Width = Application.GetRealWidth(343);
            Height = Application.GetRealWidth(100);
            Radius = (uint)Application.GetRealWidth(12);
            BackgroundColor = CSS_Color.MainBackgroundColor;
            Tag = energy.sid;
            var btnColorTip = new Button()
            {
                X = Application.GetRealWidth(8),
                Y = Application.GetRealWidth(16),
                Width = Application.GetRealWidth(12),
                Height = Application.GetRealWidth(12),
                BackgroundColor = color
            };
            AddChidren(btnColorTip);
            var btnName = new Button()
            {
                X = Application.GetRealWidth(28),
                Y = Application.GetRealHeight(10),
                Width = Application.GetRealWidth(200),
                Height = Application.GetRealHeight(24),
                Text = energy.name,
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = CSS_FontSize.TextFontSize,
            };
            AddChidren(btnName);
            var btnFromFloor = new Button()
            {
                X = Application.GetRealWidth(28),
                Y = Application.GetRealHeight(10 + 24),
                Width = Application.GetRealWidth(200),
                Height = Application.GetRealHeight(18),
                Text = energy.GetRoomListName(),
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = CSS_Color.PromptingColor1,
                TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
            };
            AddChidren(btnFromFloor);
            btnValue = new Button()
            {
                X = Application.GetRealWidth(28),
                Y = Application.GetRealWidth(57),
                Width = Application.GetRealWidth(226),
                Height = Application.GetRealWidth(43),
                TextAlignment = TextAlignment.CenterLeft,
                TextSize = CSS_FontSize.HeadlineFontSize,
                TextColor = CSS_Color.FirstLevelTitleColor,
                Text = energy.GetAttrState(FunctionAttributeKey.Power),
                Tag = energy.sid,
                IsBold = true,
            };
            AddChidren(btnValue);
            var btnSetting = new Button()
            {
                X = Application.GetRealWidth(291),
                Y = Application.GetRealWidth(6),
                Width = Application.GetMinRealAverage(32),
                Height = Application.GetMinRealAverage(32),
                UnSelectedImagePath = "Public/FuncInfoSetIcon.png",
            };
            AddChidren(btnSetting);
            var btnSeltSensorValue = new Button()
            {
                X = Application.GetRealWidth(16),
                Y = Application.GetRealWidth(47),
                Width = Application.GetRealWidth(200),
                Height = Application.GetRealWidth(43),
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = CSS_Color.FirstLevelTitleColor,
                IsBold = true,
                TextSize = CSS_FontSize.HeadlineFontSize,
            };
            AddChidren(btnSeltSensorValue);
            btnShowData = new Button()
            {
                X = Application.GetRealWidth(291),
                Y = Application.GetRealWidth(62),
                Width = Application.GetMinRealAverage(32),
                Height = Application.GetMinRealAverage(32),
                UnSelectedImagePath = "FunctionIcon/EnvironmentalScience/DiagramIcon.png",
                SelectedImagePath = "FunctionIcon/EnvironmentalScience/DiagramIconOn.png",
                IsSelected = false,
            };
            AddChidren(btnShowData);
            btnSetting.MouseUpEventHandler = (sender, e) =>
            {
                Action backAction = () =>
                {
                    btnName.Text = energy.name;
                    btnFromFloor.Text = energy.GetRoomListName();
                };
                var infoView = new FunctionBaseInfoSetPage(energy, backAction);
                MainPage.BasePageView.AddChidren(infoView);
                infoView.LoadPage();
                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
            };
            btnShowData.MouseUpEventHandler = (sender, e) => {
                btnShowData.IsSelected = !btnShowData.IsSelected;
                SetHistory_Action(btnShowData.IsSelected);
            };
        }
    }
}