コード例 #1
0
        public SchemeViewModel()
        {
            #region 初始化方案

            using (var db = new HomeAutomationEntities())
            {
                Schemes = db.t_Scheme.ToList();
            }
            if (Schemes.Count > 0)
            {
                Scheme     = Schemes[0];
                SchemeName = Schemes[0].SchemeName;
            }

            #endregion

            #region 初始化详细方案//test

            RefreshDetailScheme();

            #endregion

            #region 初始化电器

            using (var db = new HomeAutomationEntities())
            {
                HomeAppliances = db.t_HomeAppliances.ToList();
            }

            #endregion

            #region 新建方案

            CreateSchemeCommand = new RelayCommand(() =>
            {
                if (SchemeState)
                {
                    UMessageBox.Show($"请先停止方案!", false);
                    return;
                }
                if (SchemeNameEidtState)
                {
                    return;
                }
                using (var db = new HomeAutomationEntities())
                {
                    var count = db.t_Scheme.ToList().Count;
                    db.t_Scheme.Add(new t_Scheme()
                    {
                        SchemeName = $"方案{++count}"
                    });
                    db.SaveChanges();
                    Schemes       = db.t_Scheme.ToList();
                    Scheme        = Schemes.Find(x => x.SchemeName == $"方案{count}");
                    DetailSchemes = new ObservableCollection <DetailSchemeModel>();
                }
            });

            #endregion

            #region  除方案

            DeleteSchemeCommand = new RelayCommand(() =>
            {
                if (SchemeState)
                {
                    UMessageBox.Show($"请先停止方案!", false);
                    return;
                }
                if (SchemeNameEidtState)
                {
                    return;
                }
                var result = UMessageBox.Show("确定删除当前方案吗?");
                if (result == false)
                {
                    return;
                }
                using (var db = new HomeAutomationEntities())
                {
                    if (Scheme == null)
                    {
                        return;
                    }
                    var scheme = db.t_Scheme.FirstOrDefault(x => x.Id == Scheme.Id);
                    if (scheme != null)
                    {
                        db.t_Scheme.Remove(scheme);
                    }
                    var detailScheme = db.t_DetailScheme.Where(x => x.SchemeId == Scheme.Id);
                    db.t_DetailScheme.RemoveRange(detailScheme);
                    db.SaveChanges();
                    Schemes = db.t_Scheme.ToList();
                    if (Schemes.Count <= 0)
                    {
                        return;
                    }
                    Scheme     = Schemes[0];
                    SchemeName = Schemes[0].SchemeName;
                }
            });


            #endregion

            #region 刷新方案列表命令

            HomeApplianceScheme = new RelayCommand(() =>
            {
                if (SchemeNameEidtState)
                {
                    return;
                }
                RefreshDetailScheme();
            });

            #endregion

            #region 方案定时开关 (开关定时任务)

            StartSchemeCommand = new RelayCommand((() =>
            {
                if (!UMessageBox.Result)
                {
                    return;
                }
                //是否选择方案,执行方案是否为空
                if (Scheme == null)
                {
                    UMessageBox.Show($"当前没有选中方案!", false);
                    return;
                }
                //是否正在编辑方案
                if (SchemeNameEidtState)
                {
                    return;
                }
                //定时方案停止
                if (SchemeState)
                {
                    //
                    //等待提示框

                    //强制关闭所有电器
                    //var driver =new Rs485Driver();
                    //try
                    //{
                    //    driver.Connect(new NetArg("192.168.0.233", 10001));
                    //}
                    //catch (Exception e)
                    //{
                    //    MessageBox.Show($"连接不上设备", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
                    //    return;
                    //}
                    //var state=  driver.Read32RelayOutputState();
                    //foreach (var value in state)
                    //{
                    //    if (value.Value==true)
                    //    {
                    //        ControllerHomeAutomation(value.Key, false);
                    //    }
                    //}

                    foreach (var value in DetailSchemes)
                    {
                        value.RunSchemeState = false;
                        value.SchemevisibiState = "Hidden";
                        value.Cancel.Cancel();
                    }
                    SchemeState = false;
                    SchemeList = true;
                }
                //定时方案启动
                else
                {
                    SchemeState = true;
                    SchemeList = false;
                    foreach (var value in DetailSchemes)
                    {
                        value.Cancel = new CancellationTokenSource();
                        value.Task = new Task(() =>
                        {
                            //等待开始
                            var waitTime = 0;
                            while (waitTime < value.DtailScheme.WaitTime)
                            {
                                try
                                {
                                    value.Cancel.Token.ThrowIfCancellationRequested();
                                }
                                catch (Exception e)
                                {
                                    value.RunSchemeState = false;
                                    value.SchemevisibiState = "Hidden";
                                    return;
                                }
                                waitTime++;
                                Thread.Sleep(1000);
                            }

                            value.RunSchemeState = true;
                            value.SchemevisibiState = "Visible";
                            //启动电器
                            //try
                            //{
                            //
                            //    AsyncControllerHomeAutomation(value.DtailScheme.HomeAppliancesId, true);
                            //}
                            //catch (Exception e)
                            //{
                            //    MessageBox.Show($"连接不上设备", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
                            //    value.RunSchemeState = false;
                            //    value.SchemevisibiState = "Hidden";
                            //    return;
                            //}
                            //执行时长
                            var runTime = 0;

                            //等待结束
                            while (runTime < value.DtailScheme.RunTime)
                            {
                                var timeSpan = new TimeSpan(0, 0, value.DtailScheme.RunTime - runTime - 1);
                                value.SchemeTime = timeSpan.Hours.ToString() + " h " + timeSpan.Minutes + " m " +
                                                   timeSpan.Seconds + " s";
                                try
                                {
                                    value.Cancel.Token.ThrowIfCancellationRequested();
                                }
                                catch (Exception e)
                                {
                                    value.RunSchemeState = false;
                                    value.SchemevisibiState = "Hidden";
                                    return;
                                }
                                runTime++;
                                Thread.Sleep(1000);
                            }
                            //关闭电器
                            //try
                            //{

                            //    AsyncControllerHomeAutomation(value.DtailScheme.HomeAppliancesId, false);
                            //}
                            //catch (Exception e)
                            //{
                            //    MessageBox.Show($"连接不上设备", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
                            //}
                            value.RunSchemeState = false;
                        }, value.Cancel.Token);
                        value.Task.Start();
                    }
                }
            }));

            #endregion

            #region 添加 定时命令

            AddSchemeCommand = new RelayCommand(() =>
            {
                if (DetailSchemes.FirstOrDefault(x => x.DtailScheme.HomeAppliancesName == "选择电器") != null)
                {
                    //提示选择电器
                    UMessageBox.Show($"请选择电器!", false);
                    return;
                }
                using (var db = new HomeAutomationEntities())
                {
                    //遍历详细方案
                    for (var i = 0; i < DetailSchemes.Count; i++)
                    {
                        if (DetailSchemes[i].DtailScheme.WaitTime < 0 || DetailSchemes[i].DtailScheme.RunTime <= 0)
                        {
                            UMessageBox.Show($"{DetailSchemes[i].DtailScheme.HomeAppliancesName} 时间运行太短!", false);
                            return;
                        }
                        //id= 100表示没有选中
                        if (DetailSchemes[i] == null || DetailSchemes[i].DtailScheme.HomeAppliancesId == 100)
                        {
                            continue;
                        }
                        //判断时间重复
                        for (var j = 0; j < i; j++)
                        {
                            //根据电器名称相同,断定同一电器
                            if (DetailSchemes[i].DtailScheme.HomeAppliancesName !=
                                DetailSchemes[j].DtailScheme.HomeAppliancesName)
                            {
                            }
                            //判断同一电器启动,一分钟间隔以上
                            else if (DetailSchemes[i].DtailScheme.WaitTime >
                                     (DetailSchemes[j].DtailScheme.RunTime +
                                      DetailSchemes[j].DtailScheme.WaitTime) + 60 ||
                                     DetailSchemes[i].DtailScheme.RunTime + DetailSchemes[i].DtailScheme.WaitTime + 60 <
                                     DetailSchemes[j].DtailScheme.WaitTime)
                            {
                            }
                            else
                            {
                                UMessageBox.Show($"{DetailSchemes[i].DtailScheme.HomeAppliancesName} 运行时间冲突或者间隔太近!", false);
                                return;
                            }
                        }
                        var detail        = DetailSchemes[i];
                        var homeAppliance =
                            db.t_HomeAppliances.FirstOrDefault(
                                x => x.Name == detail.DtailScheme.HomeAppliancesName);
                        if (homeAppliance != null)
                        {
                            db.t_DetailScheme.AddOrUpdate(new t_DetailScheme()
                            {
                                Id = DetailSchemes[i].DtailScheme.DetailSchemeId,
                                HomeAppliancesId = homeAppliance.Id,
                                RunTime          = DetailSchemes[i].DtailScheme.RunTime,
                                WaitTime         = DetailSchemes[i].DtailScheme.WaitTime,
                                SchemeId         = DetailSchemes[i].DtailScheme.SchemeId
                            });
                        }
                    }
                    db.SaveChanges();
                    Schemes = db.t_Scheme.ToList();
                    Scheme  = Schemes.FirstOrDefault(x => x.Id == SchemmeId);
                }
                RefreshDetailScheme();
                DetailSchemes.Add(new DetailSchemeModel()
                {
                    DtailScheme = new v_DtailScheme()
                    {
                        RunTime            = 0,
                        WaitTime           = 0,
                        SchemeId           = Scheme.Id,
                        HomeAppliancesName = "选择电器"
                    }
                });
            });

            #endregion

            #region 更新选中定时

            UpdataSchemeCommand = new RelayCommand <long>((detailSchemeId) =>
            {
                var detailscheme = DetailSchemes.FirstOrDefault(x => x.DtailScheme.DetailSchemeId == detailSchemeId);
                //id 100表示没有选中
                if (detailscheme == null || detailSchemeId == 100)
                {
                    return;
                }
                //判断时间重复

                using (var db = new HomeAutomationEntities())
                {
                    var homeAppliance =
                        db.t_HomeAppliances.FirstOrDefault(x => x.Name == detailscheme.DtailScheme.HomeAppliancesName);
                    var detailScheme =
                        db.t_DetailScheme.FirstOrDefault(x => x.Id == detailscheme.DtailScheme.DetailSchemeId);
                    if (detailScheme == null || homeAppliance == null)
                    {
                        return;
                    }
                    detailScheme.HomeAppliancesId = homeAppliance.Id;
                    detailScheme.RunTime          = detailscheme.DtailScheme.RunTime;
                    detailScheme.WaitTime         = detailscheme.DtailScheme.WaitTime;

                    db.SaveChanges();
                }
                RefreshDetailScheme();
            });

            #endregion

            #region  除选中定时命令

            DeleletChooseDetailScheme = new RelayCommand <long>(((detailSchemeId) =>
            {
                using (var db = new HomeAutomationEntities())
                {
                    //删除定时
                    var descheme = db.t_DetailScheme.FirstOrDefault(x => x.Id == detailSchemeId);
                    if (descheme != null)
                    {
                        db.t_DetailScheme.Remove(descheme);
                    }
                    db.SaveChanges();
                }
                DetailSchemes.Remove(DetailSchemes.FirstOrDefault(x => x.DtailScheme.DetailSchemeId == detailSchemeId));
            }));

            #endregion

            #region 编辑选中方案

            UpdataChooseDatailScheme = new RelayCommand((() =>
            {
                if (SchemeState)
                {
                    UMessageBox.Show($"请先停止方案!", false);
                    return;
                }
                if (SchemeName == null)
                {
                    return;
                }

                if (SchemeEidtState)
                {
                    SchemmeId = Scheme.Id;
                    SchemeEidtState = false;
                    ButtonNameSave = "完成";
                    SchemeAddState = "Visible";
                    SchemeNameEidtState = true;
                }
                else
                {
                    for (var i = DetailSchemes.Count() - 1; i >= 0; i--)
                    {
                        if (DetailSchemes[i].DtailScheme.HomeAppliancesName == "选择电器")
                        {
                            DetailSchemes.Remove(DetailSchemes[i]);
                        }
                    }
                    using (var db = new HomeAutomationEntities())
                    {
                        //更新方案名称
                        var scheme = db.t_Scheme.FirstOrDefault(x => x.Id == SchemmeId);
                        if (scheme != null)
                        {
                            scheme.SchemeName = SchemeName;
                        }



                        //遍历详细方案
                        for (var i = 0; i < DetailSchemes.Count; i++)
                        {
                            if (DetailSchemes[i].DtailScheme.WaitTime <= 0 || DetailSchemes[i].DtailScheme.RunTime <= 0)
                            {
                                UMessageBox.Show($"{DetailSchemes[i].DtailScheme.HomeAppliancesName} 时间运行太短!", false);
                                return;
                            }
                            //id= 100表示没有选中
                            if (DetailSchemes[i] == null || DetailSchemes[i].DtailScheme.HomeAppliancesId == 100)
                            {
                                continue;
                            }
                            //判断时间重复
                            for (var j = 0; j < i; j++)
                            {
                                //根据电器名称相同,断定同一电器
                                if (DetailSchemes[i].DtailScheme.HomeAppliancesName !=
                                    DetailSchemes[j].DtailScheme.HomeAppliancesName)
                                {
                                }
                                //判断同一电器启动,一分钟间隔以上
                                else if (DetailSchemes[i].DtailScheme.WaitTime >
                                         (DetailSchemes[j].DtailScheme.RunTime +
                                          DetailSchemes[j].DtailScheme.WaitTime) + 60 ||
                                         DetailSchemes[i].DtailScheme.RunTime + DetailSchemes[i].DtailScheme.WaitTime +
                                         60 <
                                         DetailSchemes[j].DtailScheme.WaitTime)
                                {
                                }
                                else
                                {
                                    UMessageBox.Show($"{DetailSchemes[i].DtailScheme.HomeAppliancesName} 时间冲突!", false);
                                    return;
                                }
                            }
                            var detail = DetailSchemes[i];
                            var homeAppliance =
                                db.t_HomeAppliances.FirstOrDefault(
                                    x => x.Name == detail.DtailScheme.HomeAppliancesName);
                            if (homeAppliance != null)
                            {
                                db.t_DetailScheme.AddOrUpdate(new t_DetailScheme()
                                {
                                    Id = DetailSchemes[i].DtailScheme.DetailSchemeId,
                                    HomeAppliancesId = homeAppliance.Id,
                                    RunTime = DetailSchemes[i].DtailScheme.RunTime,
                                    WaitTime = DetailSchemes[i].DtailScheme.WaitTime,
                                    SchemeId = DetailSchemes[i].DtailScheme.SchemeId
                                });
                            }
                        }
                        db.SaveChanges();
                        Schemes = db.t_Scheme.ToList();
                        Scheme = Schemes.FirstOrDefault(x => x.Id == SchemmeId);
                    }

                    RefreshDetailScheme();
                    SchemeEidtState = true;
                    ButtonNameSave = "方案编辑";
                    SchemeAddState = "Hidden";
                    SchemeNameEidtState = false;
                }
            }));

            #endregion

            #region 编辑运行时间

            InstallRunTimeCommand = new RelayCommand <long>(detailSchemeId =>
            {
                if (SchemeEidtState)
                {
                    return;
                }
                var detailScheme =
                    DetailSchemes.FirstOrDefault(x => x.DtailScheme.DetailSchemeId == detailSchemeId);
                if (detailScheme == null)
                {
                    return;
                }
                var result      = UTimePiker.ChooseEquals(detailScheme.DtailScheme.RunTime);
                var dtailScheme = new v_DtailScheme()
                {
                    DetailSchemeId     = detailSchemeId,
                    HomeAppliancesId   = detailScheme.DtailScheme.HomeAppliancesId,
                    HomeAppliancesName = detailScheme.DtailScheme.HomeAppliancesName,
                    RunTime            = result,
                    SchemeId           = detailScheme.DtailScheme.SchemeId,
                    SchemeName         = detailScheme.DtailScheme.SchemeName,
                    WaitTime           = detailScheme.DtailScheme.WaitTime
                };
                detailScheme.DtailScheme = dtailScheme;
            });

            #endregion
            #region 编辑等待时间

            InstallWaitTimeCommand = new RelayCommand <long>(detailSchemeId =>
            {
                if (SchemeEidtState)
                {
                    return;
                }
                var detailScheme =
                    DetailSchemes.FirstOrDefault(x => x.DtailScheme.DetailSchemeId == detailSchemeId);
                if (detailScheme == null)
                {
                    return;
                }
                var result      = UTimePiker.ChooseEquals(detailScheme.DtailScheme.WaitTime);
                var dtailScheme = new v_DtailScheme()
                {
                    DetailSchemeId     = detailSchemeId,
                    HomeAppliancesId   = detailScheme.DtailScheme.HomeAppliancesId,
                    HomeAppliancesName = detailScheme.DtailScheme.HomeAppliancesName,
                    RunTime            = detailScheme.DtailScheme.RunTime,
                    SchemeId           = detailScheme.DtailScheme.SchemeId,
                    SchemeName         = detailScheme.DtailScheme.SchemeName,
                    WaitTime           = result
                };
                detailScheme.DtailScheme = dtailScheme;
            });

            #endregion
        }