FrmNode.cs 10.1 KB
using AGVLib;
using Common;
using DeviceLib.BLL;
using DeviceLib.Model.AGV;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using UIControl.Forms;

namespace AGVDispatch
{
    public partial class FrmNode : FrmBase
    {
        public FrmNode()
        {
            InitializeComponent();
            update();
            comboNodestatus.Items.AddRange(Enum.GetNames(typeof(NodeStatus)));
            comboNodestatus.SelectedIndex = 0;
            NodeManager.NodeChanged += NodeManager_NodeChanged;
            timer1.Start();
        }
        ~FrmNode()
        {
            timer1.Stop();
        }
        private void NodeManager_NodeChanged(List<ClientNode> nodes)
        {
            if (dataGridView1.InvokeRequired)
            {
                dataGridView1.Invoke(new Action(() =>
                {
                    update(nodes);
                }));
            }
            else
                update(nodes);
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
            {
                update();
            }
            else
            {
                update(NodeManager.FuzzySearchNodes(textBox1.Text));
            }

        }
        private void DataAdapted()
        {
            dataGridView1.Columns[0].HeaderCell.Value = "编号";
            dataGridView1.Columns[1].HeaderCell.Value = "名称";
            dataGridView1.Columns[2].HeaderCell.Value = "启用";

            dataGridView1.Columns[3].HeaderCell.Value = "屏蔽";

            dataGridView1.Columns[4].HeaderCell.Value = "状态";
            dataGridView1.Columns[5].HeaderCell.Value = "等级";
            dataGridView1.Columns[6].HeaderCell.Value = "在线";

            dataGridView1.Columns[7].HeaderCell.Value = "IP";
            dataGridView1.Columns[8].HeaderCell.Value = "类型";
            dataGridView1.Columns[9].HeaderCell.Value = "料架";
            dataGridView1.Columns[11].HeaderCell.Value = "车间";
            dataGridView1.Columns[13].HeaderCell.Value = "机器人";
            dataGridView1.Columns[11].Visible = false;
            this.dataGridView1.Columns[10].Visible = false;
            dataGridView1.Columns[12].Visible = false;
            dataGridView1.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
            {
                dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            NodeManager.Load();
            update();
        }
        private void update(List<ClientNode> nodes = null)
        {
            if (nodes == null)
                nodes = NodeManager.GetClientNodes();
            dataGridView1.DataSource = nodes;
            DataAdapted();
            dataGridView1.Refresh();
        }
        private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            try
            {
                if (e == null || e.Value == null || !(sender is DataGridView))
                    return;
                DataGridView dgv = sender as DataGridView;
                if (dgv?.Columns[e.ColumnIndex].Name == "status")
                {

                    int value = (int)e.Value;
                    e.Value = ((NodeStatus)value).ToString();
                    e.FormattingApplied = true;

                }
                else if (dgv?.Columns[e.ColumnIndex].Name == "occupiedAgv")
                {
                    int value = (int)e.Value;
                    if (value == 0)
                    {
                        e.Value = "";
                    }
                    else
                    {
                        e.Value = RobotManager.GetRobot(value)?.name ?? value.ToString();
                    }

                    e.FormattingApplied = true;

                }
                else if (dgv?.Columns[e.ColumnIndex].Name == "level")
                {

                    int value = (int)e.Value;
                    e.Value = ((NodeLevel)value).ToString();
                    e.FormattingApplied = true;

                }
                else if (dgv?.Columns[e.ColumnIndex].Name == "opened")
                {
                    bool value = (bool)e.Value;
                    if (value)
                        e.CellStyle.BackColor = Color.White;
                    else
                        e.CellStyle.BackColor = Color.Red;
                }
                else if (dgv?.Columns[e.ColumnIndex].Name == "online")
                {
                    bool value = (bool)e.Value;
                    if (value)
                        e.CellStyle.BackColor = Color.White;
                    else
                        e.CellStyle.BackColor = Color.Red;
                }
                else if (dgv?.Columns[e.ColumnIndex].Name == "shielded")
                {
                    bool value = (bool)e.Value;
                    if (value)
                        e.CellStyle.BackColor = Color.Red;
                    else
                        e.CellStyle.BackColor = Color.White;
                }
                else if (dgv?.Columns[e.ColumnIndex].Name == "type")
                {
                    /// <summary>
                    /// 节点类型
                    /// 0--点位(线体、点位;唯一)
                    /// 1--待机点
                    /// 2--充电
                    /// 3--临时待机点
                    /// 4--任务点
                    /// </summary>
                    int value = (int)e.Value;
                    switch (value)
                    {
                        case 0:
                            e.Value = "点位";
                            break;
                        case 1:
                            e.Value = "待机位";
                            break;
                        case 2:
                            e.Value = "充电位";
                            break;
                        case 3:
                            e.Value = "临时点";
                            break;
                        case 4:
                            e.Value = "任务点";
                            break;
                        default:
                            e.Value = "默认节点";
                            break;
                    }

                    e.FormattingApplied = true;

                }
            }
            catch (Exception ex)
            {
                LogUtil.Error($"节点单元格自定义格式失败", ex);
            }
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            int a = dataGridView1.CurrentRow.Index;
            int b = dataGridView1.CurrentCell.ColumnIndex;
            if (a == -1)
                return;
            if (b != 2)
                return;
            int.TryParse(dataGridView1.Rows[a].Cells[0].Value?.ToString() ?? "", out int nodeId);
            ClientNode node = NodeManager.GetClientNode(nodeId);
            if (node != null)
            {
                DialogResult result = MessageBox.Show($"确定改变节点【{node.name}】的启用?", "提示", MessageBoxButtons.YesNo);
                if (result.Equals(DialogResult.Yes))
                {
                    node.opened = !node.opened;
                    NodeManager.UpdateClientNode(node);
                    LogUtil.Info($"手动设置节点【{node.name}】启用为{node.opened}");
                    update();
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                int a = dataGridView1.CurrentRow.Index;
                if (a == -1)
                    return;
                int.TryParse(dataGridView1.Rows[a].Cells[0].Value?.ToString() ?? "", out int nodeId);
                ClientNode node = NodeManager.GetClientNode(nodeId);
                if (node != null)
                {
                    if (!RobotManager.RobotIsInNode(node.name))
                    {
                        DialogResult result1 = MessageBox.Show($"目前无机器人在节点【{node.name}】处,确定更改其状态?", "提示", MessageBoxButtons.YesNo);
                        if (result1.Equals(DialogResult.No))
                            return;
                    }
                    DialogResult result = MessageBox.Show($"确定改变节点【{node.name}】的状态为【{((NodeStatus)comboNodestatus.SelectedIndex).ToString()}】?", "提示", MessageBoxButtons.YesNo);
                    if (result.Equals(DialogResult.Yes))
                    {
                        node.status = comboNodestatus.SelectedIndex;
                        NodeManager.SendToClient(node);
                        LogUtil.Info($"手动设置节点【{node.name}】的状态为{((NodeStatus)node.status).ToString()}");
                    }
                    update();
                }

            }
            catch (Exception ex)
            {
                LogUtil.Error($"手动设置节点状态失败", ex);
            }
        }

        private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            LogUtil.Error($"表格式异常:{e.RowIndex},{e.ColumnIndex},{e.Exception.Message}");
        }
        object locObj = new object();
        bool OpenBigShelf = AppConfigSetting.GetBoolVal(Setting_Str.OpenBigShelf, false);
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (Monitor.TryEnter(locObj))
            {
                List<ClientNode> nodes = NodeManager.GetClientNodes();
                OrderManager.AutoGenerateOrder(nodes);
                if (OpenBigShelf)
                    OrderManager.GenerateShelfOrder(nodes);
                Monitor.Exit(locObj);
            }
        }
    }
}