MainEventHandlers-DataSave.cs 12.2 KB
using Hh.Mes.Common.Exel;
using Hh.Mes.Pojo.System;
using Hh.Mes.POJO.ApiEntity;
using Hh.Mes.POJO.Entity;
using Hh.Mes.POJO.WebEntity.equipment;
using HH.Data.Excel.ColumnMapConfig;
using HH.Data.Excel.SqlHelp;
using NPOI.HPSF;
using NPOI.SS.Formula.Functions;
using NPOI.Util;
using NPOI.XWPF.UserModel;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using static Hh.Mes.Common.Exel.NpoiExcelImportHelper;

namespace HH.Data.Excel
{
    public partial class MainEventHandlers
    {
        #region 默认设备 堆垛机,RGV,
        public void DefaultSaveData(DataTable equipmentDataTable, string fileName)
        {
            _daq_Equipment.Clear();
            _equipment_Props.Clear();
            _daq_Equipment = ProcessDataDafault(equipmentDataTable, ColumnMapping.ColumnMapIpExcel, fileName).ToList();

            // 预加载关键数据
            var projectInfo = DatabaseService.Instance.GetProjectList().FirstOrDefault(x => x.keys == _main.selectProjectKey);
            if (projectInfo == null) throw new InvalidOperationException($"未找到项目Key: {_main.selectProjectKey}");
            var eqTypeInfo = DatabaseService.Instance.GetEqTypeList();

            for (var i = 0; i < _daq_Equipment.Count; i++)
            {
                var equipmentTypeId = _main.EqTypeDataSource.FirstOrDefault(x => x.Key == _daq_Equipment[i].equipmentTypeId);
                if (equipmentTypeId.Value == null)
                {
                    throw new ArgumentException($"设备类型【类型】的值【{_daq_Equipment[i].equipmentTypeId}】解析失败,不存在于设备类型结合中!");
                }
                var eqTypeCode = eqTypeInfo.First(x => x.Id == equipmentTypeId.Key).Code;
                var eqCode = projectInfo.projectCode + "-" + _daq_Equipment[i].destinationArea.PadLeft(2, '0') + "-" + DateTime.Now.ToString("fff") + "-" + eqTypeCode;

                // 更新 DAQ 设备信息
                _daq_Equipment[i].code = eqCode;
                _daq_Equipment[i].projectCode = projectInfo.projectCode;
                _daq_Equipment[i].factoryCode = _main.selectFactoryCode;
                _daq_Equipment[i].connectName = _daq_Equipment[i].name;
                _daq_Equipment[i].description = _daq_Equipment[i].name;

                _daq_Equipment[i].createdBy = SystemVariable.DefaultCreatedExcel;
                _daq_Equipment[i].created = DateTime.Now;
                //_base_Equipment.Add(CreateBaseEquipment(_daq_Equipment[i], eqCode, eqTypeCode));
                var eq = CreateBaseEquipment(_daq_Equipment[i], eqCode, eqTypeCode);
                var propTemplate = DatabaseService.Instance.GetEqPropTemplateList(_daq_Equipment[i].equipmentTypeId);
                foreach (var item in propTemplate)
                {
                    _equipment_Props.Add(CreatePropTemplate(item));
                }
                var result = DatabaseService.Instance.DefaultSave(eq, _daq_Equipment[i], _equipment_Props);
                var fileNameInfo = $"当前Excel文件名:{fileName},当前第{i + 1}行数据\n";
                if (!result.Item1)
                {
                    Program.SysMsgShow(fileNameInfo + result.Item2);
                }
                else
                {
                    Program.SysMsgShow(fileNameInfo + result.Item2, "");
                }
                _equipment_Props.Clear();
            }

        }

        /// <summary>
        /// 创建并添加 base_equipment 设备
        /// </summary>
        private base_equipment CreateBaseEquipment(daq_equipment item, string eqCode, string eqTypeCode)
        {
            return new base_equipment()
            {
                projectKeys = _main.selectProjectKey,
                factoryCode = _main.selectFactoryCode,
                equipmentCode = eqCode,
                equipmentName = item.name,
                equipmentTypeCode = eqTypeCode,
                ip = item.iP,

                destinationArea = item.destinationArea,
                isEnable = true,
                otherCode = eqCode,

                sequence = 0,
                createBy = SystemVariable.DefaultCreatedExcel,
                createTime = DateTime.Now
            };
        }


        /// <summary>
        /// 创建并添加 base_equipment 设备
        /// </summary>
        private daq_equipment_prop CreatePropTemplate(daq_equipment_type_prop_template item)
        {
            return new daq_equipment_prop()
            {
                //EquipmentId = 0,
                Code = item.Code,
                Name = item.Name,
                Address = item.Address,

                PropType = item.PropType,
                DataType = item.DataType,
                MonitorCompareValue = item.MonitorCompareValue,
                MonitorNormal = item.MonitorNormal,
                MonitorFailure = item.MonitorFailure,

                Remark = item.Name,
                CreatedBy = SystemVariable.DefaultCreatedExcel,
                Created = DateTime.Now
            };
        }
        #endregion

        #region CC
        /// <summary>
        /// 输送线数据处理 并导出excel
        /// </summary>
        public void HandlersCCDataAndExport()
        {
            _daq_Equipment.Clear();
            var tempProp = new List<daq_equipment_prop>();
            // Excel构建数据结构
            var exportData = new List<ExcelExportDocument<daq_equipment, daq_equipment_prop>>();

            // 预加载关键数据
            var projectInfo = DatabaseService.Instance.GetProjectList().First(x => x.keys == _main.selectProjectKey);
            if (projectInfo == null) throw new InvalidOperationException($"未找到项目Key: {_main.selectProjectKey}");

            foreach (var item in _sysSource.Keys)
            {
                var allSheet = _sysSource[item];
                //ip地址文件,创建daq设备
                if (item == _main._sysIpFileName)
                {
                    var dt = allSheet.Values.First().dtData;
                    InitDaqEqCC(dt, projectInfo);
                    continue;
                }
                DataTable dTDisplayCC = null; //CC20WCS_Display
                DataTable dTLineCC = null;    //输送线状态地址
                foreach (var sheet in allSheet)
                {
                    var currentValue = sheet.Key;
                    //输送线报警 Conveyor_Fault_ALRM
                    if (currentValue.IndexOf(excelAllSheets[0]) > -1)
                    {
                        var dataHander = TransformDataTableCC(sheet.Value.dtData, item);
                        var result = ProcessDataDafaultCC(dataHander, ColumnMapping.ColumnMapCC, item).ToList();
                        tempProp.AddRange(result);
                    }
                    //输送线系统报警 System_Fault_ALRM
                    else if (currentValue.IndexOf(excelAllSheets[1]) > -1)
                    {
                        var dataHander = TransformDataTableCC(sheet.Value.dtData, item);
                        var result = ProcessDataDafaultCC(dataHander, ColumnMapping.ColumnMapCC, item).ToList();
                        tempProp.AddRange(result);
                    }
                    //输送线WCS_Display
                    else if (currentValue.IndexOf(excelAllSheets[2]) > -1)
                    {
                        dTDisplayCC = TransformDataTableConvertDisplayCC(sheet.Value.dtData, item);
                    }
                    //输送线状态地址 直接获取原始数据
                    else if (currentValue.IndexOf(excelAllSheets[3]) > -1)
                    {
                        dTLineCC = sheet.Value.dtData;// TransformDataTableCCLine(, item);
                    }
                }
                if (dTDisplayCC == null || dTDisplayCC.Rows.Count == 0)
                {
                    throw new ArgumentException($"Excel附件【{item}】页签【WCS_Display】数据源转换失败结果为空,文件{item}");
                }
                if (dTLineCC == null || dTLineCC.Rows.Count == 0)
                {
                    throw new ArgumentException($"Excel附件【{item}】:页签【输送线状态地址】数据源转换失败结果为空,文件{item}");
                }
                var merDisplayDandLineData = MergeDataDisplayAndLineCC(dTDisplayCC, dTLineCC, item);
                var resultDisplayAndLineCC = ProcessDataDafaultCC(merDisplayDandLineData, ColumnMapping.ColumnMapDisplayAndLineCC, item).ToList();
                tempProp.AddRange(resultDisplayAndLineCC);
                if (_daq_Equipment.Count == 0)
                {
                    throw new ArgumentException($"Excel附件,设备数据结果为空,请确认{_main._sysIpFileName}文件顺序是第一位!");
                }
                var fileNamePrefix = item.Split('.')[0];
                var exportDaxta = new ExcelExportDocument<daq_equipment, daq_equipment_prop>
                {
                    FileName = item,
                    Sheet1 = new ExcelSheet<daq_equipment>
                    {
                        SheetName = "设备列表",
                        Data = _daq_Equipment.Where(x => x.fileName == item),
                    },
                    Sheet2 = new ExcelSheet<daq_equipment_prop>
                    {
                        SheetName = "设备属性",
                        Data = tempProp.Copy()
                    }
                };
                exportData.Add(exportDaxta);
                tempProp.Clear();
            }
            if (exportData == null || exportData.Count == 0)
            {
                throw new ArgumentException($"Excel构建数据结构数据源转换失败结果为空,请联系管理员检查内部逻辑!");
            }
            ExprotExcel(exportData);
        }

        /// <summary>
        /// CC 创建daq设备,同时创建base_eq
        /// </summary>
        private void InitDaqEqCC(DataTable dt, base_project projectInfo)
        {
            _daq_Equipment = ProcessDataDafault(dt, ColumnMapping.ColumnMapIpExcelCC, _main._sysIpFileName).ToList();
            var uniqueCodeList = GenerateUniqueCode(_daq_Equipment.Count);
            for (var i = 0; i < _daq_Equipment.Count; i++)
            {
                var eqCode = projectInfo.projectCode + "-" + _daq_Equipment[i].destinationArea.PadLeft(2, '0') + "-" + uniqueCodeList[i] + "-" + ccTypeCode;

                // 更新 DAQ 设备信息
                _daq_Equipment[i].code = eqCode;
                _daq_Equipment[i].projectCode = projectInfo.projectCode;
                _daq_Equipment[i].factoryCode = _main.selectFactoryCode;
                _daq_Equipment[i].connectName = _daq_Equipment[i].name;
                _daq_Equipment[i].description = _daq_Equipment[i].name;

                _daq_Equipment[i].createdBy = SystemVariable.DefaultCreatedExcel;
                _daq_Equipment[i].created = DateTime.Now;

                //var eq = CreateBaseEquipment(_daq_Equipment[i], eqCode, ccTypeCode);
                // _base_Equipment.Add(eq);
            }

        }


        private void ExprotExcel(List<ExcelExportDocument<daq_equipment, daq_equipment_prop>> exportData)
        {

            try
            {
                string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                string selectProjectValue = _main._cb_project.Text;
                foreach (var item in exportData)
                {
                    string fileNamePrefix = item.FileName.Split('.')[0];
                    string fileName = $"{selectProjectValue}-{fileNamePrefix}-{DateTime.Now:yyyyMMdd-HHmmss}.xlsx";
                    string fullPath = Path.Combine(desktopPath, fileName);
                    // 执行导出
                    _.ExportToList(fullPath,
                        new List<IEnumerable> { item.Sheet1.Data, item.Sheet2.Data },
                        new List<string> { item.Sheet1.SheetName, item.Sheet2.SheetName });
                    MessageBox.Show($"文件{fileName},导出成功,路径默认在桌面上");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"导出失败:{ex.Message}");
            }
        }
        #endregion
    }
}