TrussInfo.xaml.cs 15 KB
using HHECS.Application.Enums;
using HHECS.BllModel;
using HHECS.Executor.EquipmentHandler.Truss;
using HHECS.Model.Entities;
using HHECS.Model.Enums;
using HHECS.Model.Enums.Truss;
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;
using static Google.Protobuf.Reflection.SourceCodeInfo.Types;

namespace HHECS.WinCommon.Controls
{
    /// <summary>
    /// 标准桁车详情监控
    /// </summary>
    public partial class TrussInfo : UserControl
    {
        public event Func<Model.Entities.Location, Equipment, BllResult> DoubleInEvent;
        public event Func<Equipment, BllResult> EmptyOutEvent;
        public event Func<Equipment, BllResult> ForkErrorEvent;
        public event Func<Equipment, BllResult> OverrideTask; //重新下发任务
        public event Func<Equipment, BllResult> DeleteTask; //删除任务
        public event Func<string, Equipment, BllResult> MoveTruss; //移车任务
        public Equipment Self { get; set; }
        public string ControlName
        {
            get { return (string)GetValue(ControlNameProperty); }
            set { SetValue(ControlNameProperty, value); }
        }

        // Using a DependencyProperty as the backing store for ControlName.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ControlNameProperty =
            DependencyProperty.Register("ControlName", typeof(string), typeof(TrussInfo), new PropertyMetadata(""));


        public TrussInfo(int maxW, int maxH)
        {
            InitializeComponent();
            this.Width = maxH;
            this.Height = maxW;
            lab_Name.SetBinding(TextBlock.TextProperty, new Binding("ControlName") { Source = this });
        }

        public TrussInfo(int maxW)
        {
            InitializeComponent();
            this.Width = maxW;
            //this.Height = maxH;
            lab_Name.SetBinding(TextBlock.TextProperty, new Binding("ControlName") { Source = this });
        }

        /// <summary>
        /// 赋值属性
        /// </summary>
        /// <param name="deviceEntity"></param>
        /// <param name="props"></param>
        /// <param name="address"></param>
        public void SetProps(Equipment truss)
        {
            Self = truss;

            #region 固定属性赋值
            var ForkForkHasPallet = truss.EquipmentProps.FirstOrDefault(t => t.EquipmentTypePropTemplateCode == TrussNormalProps.ForkHasPallet.ToString());
            if (ForkForkHasPallet != null)
            {
                lab_ForkForkHasPallet.Foreground = Brushes.Blue;
                switch (ForkForkHasPallet.Value)
                {
                    case "True":
                        lab_ForkForkHasPallet.Text = "有货";
                        break;
                    case "False":
                        lab_ForkForkHasPallet.Text = "无货";
                        break;
                    default:
                        lab_ForkForkHasPallet.Text = "未知";
                        lab_ForkForkHasPallet.Foreground = Brushes.Red;
                        break;
                }
            }

            var ForkTaskExcuteStatus = truss.EquipmentProps.FirstOrDefault(t => t.EquipmentTypePropTemplateCode == TrussNormalProps.ForkTaskExcuteStatus.ToString());
            if (ForkTaskExcuteStatus != null)
            {
                lab_Fork1TaskExcuteStatus.Foreground = Brushes.Blue;
                int.TryParse(ForkTaskExcuteStatus.Value, out int Status);
                TrussTaskExcuteStatus temp = (TrussTaskExcuteStatus)Status;
                switch (temp)
                {
                    case TrussTaskExcuteStatus.Standby:
                    case TrussTaskExcuteStatus.TaskExecuting:
                    case TrussTaskExcuteStatus.TaskCompleted:
                        lab_Fork1TaskExcuteStatus.Text = temp.ToString();
                        break;
                    case TrussTaskExcuteStatus.TaskInterruptError:
                    case TrussTaskExcuteStatus.TaskSendError:
                        lab_Fork1TaskExcuteStatus.Text = temp.ToString();
                        lab_Fork1TaskExcuteStatus.Foreground = Brushes.Red;
                        break;
                    default:
                        lab_Fork1TaskExcuteStatus.Text = "未知";
                        lab_Fork1TaskExcuteStatus.Foreground = Brushes.Red;
                        break;
                }
            }

            var operationModel = truss.EquipmentProps.FirstOrDefault(t => t.EquipmentTypePropTemplateCode == TrussNormalProps.OperationModel.ToString());
            if (operationModel != null)
            {
                lab_OperationModel.Foreground = Brushes.Blue;
                int.TryParse(operationModel.Value, out int operationValue);
                OperationModelFlag temp = (OperationModelFlag)operationValue;
                switch (temp)
                {
                    case OperationModelFlag.Maintain:
                    case OperationModelFlag.Manual:
                    case OperationModelFlag.Airborne:
                    case OperationModelFlag.StandAlone:
                    case OperationModelFlag.Online:
                        lab_OperationModel.Text = temp.ToString();
                        break;
                    default:
                        lab_OperationModel.Text = "未知";
                        lab_OperationModel.Foreground = Brushes.Red;
                        break;
                }
            }

            var maxColumn = truss.EquipmentProps.FirstOrDefault(t => t.EquipmentTypePropTemplateCode == TrussNormalProps.ManageBigDistance.ToString());
            if (maxColumn != null)
            {
                lab_MaxColumn.Text = maxColumn.Value;
            }

            var minColumn = truss.EquipmentProps.FirstOrDefault(t => t.EquipmentTypePropTemplateCode == TrussNormalProps.ManageSmallDistance.ToString());
            if (minColumn != null)
            {
                lab_MinColumn.Text = minColumn.Value;
            }

            var Fork1TaskType = truss.EquipmentProps.FirstOrDefault(t => t.EquipmentTypePropTemplateCode == TrussNormalProps.ForkTaskType.ToString());
            if (Fork1TaskType != null)
            {
                lab_Fork1TaskType.Foreground = Brushes.Blue;
                int.TryParse(Fork1TaskType.Value, out int taskTypeValue);
                TrussForTaskFlag temp = (TrussForTaskFlag)taskTypeValue;
                switch (temp)
                {
                    case TrussForTaskFlag.无任务:
                    case TrussForTaskFlag.绗车取货:
                    case TrussForTaskFlag.绗车放货:
                    case TrussForTaskFlag.移车任务:
                        lab_Fork1TaskType.Text = temp.ToString();
                        break;
                    default:
                        lab_Fork1TaskType.Text = "未知";
                        lab_Fork1TaskType.Foreground = Brushes.Red;
                        break;
                }
            }

            var ForkTaskCode = truss.EquipmentProps.FirstOrDefault(t => t.EquipmentTypePropTemplateCode == TrussNormalProps.ForkTaskCode.ToString());
            if (ForkTaskCode != null)
            {
                lab_ForkTaskCode.Text = ForkTaskCode.Value;
            }

            lab_rowIndex1.Text = truss.RowIndex1.ToString();
            lab_rowIndex2.Text = truss.RowIndex2.ToString();

            var CurrentTongs = truss.EquipmentProps.FirstOrDefault(t => t.EquipmentTypePropTemplateCode == TrussNormalProps.CurrentTongs.ToString());
            if (CurrentTongs != null)
            {
                lab_CurrentStation.Text = CurrentTongs.Value;
            }

            var horizontalDistance = truss.EquipmentProps.FirstOrDefault(t => t.EquipmentTypePropTemplateCode == TrussNormalProps.HorizontalDistance.ToString());
            if (horizontalDistance != null)
            {
                lab_HorizontalDistance.Text = horizontalDistance.Value;
            }

            var verticalDistance = truss.EquipmentProps.FirstOrDefault(t => t.EquipmentTypePropTemplateCode == TrussNormalProps.VerticalDistance.ToString());
            if (verticalDistance != null)
            {
                lab_VerticalDistance.Text = verticalDistance.Value;
            }

            var ForkDistance = truss.EquipmentProps.FirstOrDefault(t => t.EquipmentTypePropTemplateCode == TrussNormalProps.ForkDistance.ToString());
            if (ForkDistance != null)
            {
                lab_ForkDistance.Text = ForkDistance.Value;
            }


            #endregion

            //监控属性赋值
            //var tempProps = truss.EquipmentProps.FindAll(t => t.EquipmentTypePropTemplate.IsSelected == true);
            //foreach (var item in tempProps)
            //{
            //    if (item.Value != item.EquipmentTypePropTemplate.MonitorCompareValue)
            //    {
            //        AddAlarm("报警:" + item.EquipmentTypePropTemplate.Name + " 信息:" + item.EquipmentTypePropTemplate.MonitorFailure, 2);
            //    }
            //    else
            //    {
            //        RemoveAlarm("报警:" + item.EquipmentTypePropTemplate.Name + " 信息:" + item.EquipmentTypePropTemplate.MonitorFailure);
            //    }
            //}

            var tempProps = truss.EquipmentProps.FindAll(t => t.EquipmentTypePropTemplate.PropType == EquipmentPropType.PLCAlarmAddress.ToString());
            foreach (var item in tempProps)
            {
                if (item.Value != item.EquipmentTypePropTemplate.MonitorCompareValue)
                {
                    AddAlarm("报警:" + item.EquipmentTypePropTemplate.Name + " 信息:" + item.EquipmentTypePropTemplate.MonitorFailure, 2);
                }
                else
                {
                    RemoveAlarm("报警:" + item.EquipmentTypePropTemplate.Name + " 信息:" + item.EquipmentTypePropTemplate.MonitorFailure);
                }
            }
        }

        private void RemoveAlarm(string v)
        {
            for (int i = list_Alarm.Items.Count - 1; i >= 0; i--)
            {
                var a = (TextBlock)list_Alarm.Items[i];
                if (a.Text.Contains(v))
                {
                    list_Alarm.Items.Remove(list_Alarm.Items[i]);
                }
            }
        }

        /// <summary>
        /// 添加报警
        /// </summary>
        /// <param name="log"></param>
        /// <param name="level">1显示绿色,2显示红色</param>
        public void AddAlarm(string log, int level)
        {
            //先找存不存在
            foreach (var item in list_Alarm.Items)
            {
                var a = (TextBlock)item;
                if (a.Text.Contains(log))
                {
                    //存在就不再次添加
                    return;
                }
            }
            TextBlock textBlock = new TextBlock
            {
                Text = DateTime.Now.ToLongTimeString() + ":" + log
            };
            switch (level)
            {
                case 1:
                    textBlock.Background = Brushes.Green;
                    break;
                case 2:
                    textBlock.Background = Brushes.Red;
                    break;
            }
            textBlock.MaxWidth = this.Width;
            textBlock.TextWrapping = TextWrapping.Wrap;
            this.list_Alarm.Items.Add(textBlock);
            this.list_Alarm.SelectedIndex = this.list_Alarm.Items.Count - 1;
            this.list_Alarm.ScrollIntoView(this.list_Alarm.SelectedItem);
        }


        /// <summary>
        /// 重新写入任务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Override_Click(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("是否要进行任务重新下发处理?", "注意", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
            {
                if (Self != null)
                {
                    var temp = OverrideTask?.Invoke(Self);
                    if (temp == null)
                    {
                        MessageBox.Show("未处理重写事件");
                    }
                    else if (temp.Success)
                    {
                        MessageBox.Show("重新下发成功");
                    }
                    else
                    {
                        MessageBox.Show($"重新下发失败:{temp.Msg}");
                    }
                }
            }
        }

        /// <summary>
        /// hack:删除任务(只在调试中使用)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Delete_Click(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("是否要进行任务删除处理?", "注意", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
            {
                if (Self != null)
                {
                    var temp = DeleteTask?.Invoke(Self);
                    if (temp == null)
                    {
                        MessageBox.Show("未处理任务删除事件");
                    }
                    if (temp.Success)
                    {
                        MessageBox.Show("任务删除处理成功");
                    }
                    else
                    {
                        MessageBox.Show($"任务删除失败:{temp.Msg}");
                    }
                }
            }
        }

        /// <summary>
        /// 移车任务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Move_Click(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("是否要进行移车任务处理?", "注意", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
            {
                if (Self != null)
                {
                    WinMoveTruss winMove = new WinMoveTruss(Self);
                    if (winMove.ShowDialog() == true)
                    {
                        string stationId = winMove.stationId;
                        BllResult temp = MoveTruss?.Invoke(stationId, Self);
                        if (temp == null)
                        {
                            MessageBox.Show("未处理移车任务事件", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
                        }
                        if (temp.Success)
                        {
                            MessageBox.Show("移车任务处理成功", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
                        }
                        else
                        {
                            MessageBox.Show($"移车任务处理失败:{temp.Msg}", "提示", MessageBoxButton.OK, MessageBoxImage.Error);
                        }
                    }
                }
            }
        }
    }
}