MainEventHandlers.cs 10.8 KB
using Hh.Mes.Common.Exel;
using Hh.Mes.Common.log;
using Hh.Mes.POJO.ApiEntity;
using Hh.Mes.POJO.Entity;
using Hh.Mes.POJO.Response;
using Hh.Mes.POJO.WebEntity.equipment;
using HH.Data.Excel.ColumnMapConfig;
using HH.Data.Excel.SqlHelp;
using NPOI.HPSF;
using NPOI.OpenXmlFormats.Dml.Chart;
using NPOI.SS.Formula.Functions;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.DirectoryServices.ActiveDirectory;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static Hh.Mes.Common.Exel.NpoiExcelImportHelper;

namespace HH.Data.Excel
{
    /// <summary>
    /// 事件处理
    /// </summary>
    public partial class MainEventHandlers
    {
        #region 属性
        private MainWindow _main;
        private Dictionary<string, Dictionary<string, SysDtAllCls>> _sysSource { get; set; }

        private List<base_equipment> _base_Equipment { get; set; }
        private List<daq_equipment> _daq_Equipment { get; set; }
        private List<daq_equipment_prop> _equipment_Props { get; set; }

        private readonly DatabaseService _service;

        /// <summary>
        ///  输送线报警Conveyor_Fault_ALRM、输送线系统报警System_Fault_ALRM、wcs站台是否报错WCS_Display、输送线状态地址
        ///  值的顺序禁止修改  除非业务有变动
        /// </summary>
        private readonly string[] excelAllSheets = { "Conveyor_Fault_ALRM", "System_Fault_ALRM", "WCS_Display", "输送线状态地址" };

        /// <summary>
        /// 输送线类型名称 PLC系统报警
        /// </summary>
        public readonly string ccTypeName = "PLC系统报警";
        /// <summary>

        /// <summary>
        /// 输送线类型名称 PLCSystemFault ,PLC系统报警
        /// </summary>
        public readonly string ccTypeCode = "PLCSystemFault";
        /// <summary>
        /// 输送线类型id
        /// </summary>
        public readonly int ccTypeId = 19;
        #endregion


        public MainEventHandlers(MainWindow excelMain)
        {
            _main = excelMain;
            _sysSource = new Dictionary<string, Dictionary<string, SysDtAllCls>>();
            _base_Equipment = new List<base_equipment>();
            _daq_Equipment = new List<daq_equipment>();
            _equipment_Props = new List<daq_equipment_prop>();
            _service = DatabaseService.Instance;
            InitRegisterEvent();
        }

        /// <summary>
        /// 订阅事件
        /// </summary>
        void InitRegisterEvent()
        {
            _main._tabControl1.SelectedIndexChanged += tabControl1_SelectedIndexChanged;
            _main._cb_project.SelectedIndexChanged += cb_project_SelectedIndexChanged;
            _main._cb_factory.SelectedIndexChanged += cb_factory_SelectedIndexChanged;
            _main._btn_read.Click += btn_read_Click;
            _main._btn_read_save.Click += btn_read_save_Click;
            _main._btnDefaule.Click += _btnDefaule_Click;
        }

        /// <summary>
        ///  获取当前选中的 Tab 索引
        /// </summary>
        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            int selectedIndex = _main._tabControl1.SelectedIndex;
            if (selectedIndex == 1)
            {
                _main._btn_read_save.Hide();
                _main._btn_read.Hide();
                _main._btnDefaule.Show();

                _main._appService.InitEqType(_main._ccb_type, _main._panel2, false);
                return;
            }
            _main._btnDefaule.Hide();
            _main._btn_read_save.Show();
            _main._btn_read.Show();
            _main._appService.InitEqType(_main._ccb_type, _main._panel2);
        }

        /// <summary>
        /// 项目下拉框选择事件
        /// </summary>
        public void cb_project_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_main._cb_project.SelectedItem == null)
            {
                Program.SysMsgShow("请选择项目列表!");
                return;
            }
            // 将 SelectedItem 转换为 KeyValuePair<Guid, string>
            var selectedItem = (KeyValuePair<Guid, string>)_main._cb_project.SelectedItem;
            _main.selectProjectKey = selectedItem.Key;
            _main._appService.InitFactory(_main._cb_factory, _main.selectProjectKey);
        }


        /// <summary>
        /// 厂房下拉框选择实事件
        /// </summary>
        public void cb_factory_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_main._cb_factory.SelectedItem == null) return;
            var selectedItem = (KeyValuePair<string, string>)_main._cb_factory.SelectedItem;
            _main.selectFactoryCode = selectedItem.Key;
        }

        /// <summary>
        /// 输送线 读取Excel并导出Excel数据
        /// </summary>
        private void btn_read_Click(object? sender, EventArgs e)
        {
            ExceptionsHelp.Instance.ExecuteVoidFunc(() =>
            {
                _main._btn_read.Enabled = false;
                var files = OpenFileDialogExcel(2, "输送线:上传的excel需要包含【IP地址表.xlsx】,且附件至少要2个文件以上!", true, true);
                if (files == null) return;
                _sysSource.Clear();
               var tempFile = OrderWithTargetFileFirst(_main._sysIpFileName,files.FileNames);
                foreach (string file in tempFile)
                {
                    var fileSuffix = Path.GetExtension(file);
                    var fileName = Path.GetFileName(file);
                    using FileStream fileStream = new(file, FileMode.Open, FileAccess.Read);
                    var dic = _.ExcelToDataTable(fileStream, fileSuffix, out var isSuccess, out var resultMsg, 1);
                    if (!isSuccess)
                    {
                        Program.SysMsgShow($"{fileName}文件读取失败:" + resultMsg);
                        return;
                    }
                    _sysSource.Add(fileName, dic);
                }
                var isValid = CheckRequiredFilesCC();
                if (!isValid) return;

                HandlersCCDataAndExport();
            }, actionCatCh: (ex) =>
            {
                Program.SysMsgShow(ex.Message);
            }, actionFinally: () =>
            {
                _main._btn_read.Enabled = true;
            });
        }

        /// <summary>
        /// 输送线 读取并保存Excel数据
        /// </summary>
        private void btn_read_save_Click(object? sender, EventArgs e)
        {
            ExceptionsHelp.Instance.ExecuteVoidFunc(() =>
            {
                _main._btn_read_save.Enabled = false;
                var files = OpenFileDialogExcel(1, $"输送线读取并保存操作:最少需要上传一个的附件,文件名【{_main._sysIpFileName}】!", true, false);
                if (files == null) return;
                _sysSource.Clear();
                foreach (string file in files.FileNames)
                {
                    var fileSuffix = Path.GetExtension(file);
                    var fileName = Path.GetFileName(file);
                    using FileStream fileStream = new(file, FileMode.Open, FileAccess.Read);
                    var dic = _.ExcelToDataTable(fileStream, fileSuffix, out var isSuccess, out var resultMsg, 1);
                    if (!isSuccess || dic == null)
                    {
                        Program.SysMsgShow($"{fileName}文件读取失败:" + resultMsg);
                        return;
                    }
                    _sysSource.Add(fileName, dic);
                    ResponseNew response = _service.JudgeData(dic);
                    string resMsg = $"【{fileName}】{response.message}";
                    if (response.status)
                    {
                        Program.SysMsgShow(resMsg, "");
                    }
                    else
                    {
                        Program.SysMsgShow(resMsg);
                    }
                }
            }, actionCatCh: (ex) =>
            {
                Program.SysMsgShow(ex.Message);
            }, actionFinally: () =>
            {
                _main._btn_read_save.Enabled = true;
            });
        }

        /// <summary>
        /// 默认设备 堆垛机设备 设备属性生成
        /// </summary>
        private void _btnDefaule_Click(object? sender, EventArgs e)
        {
            ExceptionsHelp.Instance.ExecuteVoidFunc(() =>
            {
                _main._btnDefaule.Enabled = false;
                var selectValue = GetCheckedItems(_main._ccb_type, true);
                if (selectValue.Count == 0)
                {
                    Program.SysMsgShow("请选择设备类型!");
                    return;
                }
                var files = OpenFileDialogExcel(1, $"默认设备:上传的默认设备excel且只能上传一个的附件!", false, false);
                if (files == null) return;
                var fileName = Path.GetFileName(files.FileName);
                var fileSuffix = Path.GetExtension(files.FileName);
                using FileStream fileStream = new(files.FileName, FileMode.Open, FileAccess.Read);
                var dic = _.ExcelToDataTable(fileStream, fileSuffix, out var isSuccess, out var resultMsg, 1);
                if (!isSuccess)
                {
                    Program.SysMsgShow($"{fileName}文件读取失败:" + resultMsg);
                    return;
                }
                if (dic.Count != 1)
                {
                    Program.SysMsgShow($"{fileName}的页签数只能是一个,当前页签个数:" + dic.Count);
                    return;
                }
                var eqDt = dic.FirstOrDefault().Value.dtData;
                if (eqDt == null || eqDt.Rows.Count == 0)
                {
                    Program.SysMsgShow($"【{files.FileName}】文件不存数据!");
                    return;
                }
                var columnName = "类型";
                var result = AllValuesExist(eqDt, columnName, selectValue);
                if (result.Item1 == -1)
                {
                    Program.SysMsgShow($"{fileName}文件中不存在列【{columnName}】");
                    return;
                }
                if (result.Item1 == 0)
                {
                    Program.SysMsgShow($"{fileName}文件中列【{columnName}】的值【{result.Item2}】和设备类型复选框选中的值【{result.Item3}】不是全匹配");
                    return;
                }
                DefaultSaveData(eqDt, files.FileName);
            }, actionCatCh: (ex) =>
            {
                Program.SysMsgShow(ex.Message);
            }, actionFinally: () =>
            {
                _main._btnDefaule.Enabled = true;
            });
        }
    }
}