KukaDataAnalysis.cs 7.65 KB
using DataAcquisitionServer.Common.Communications;
using DataAcquisitionServer.Common.Enums;
using DataAcquisitionServer.Common.Utils;
using DataAcquisitionServer.DataAccess;
using DataAcquisitionServer.Models;
using Microsoft.EntityFrameworkCore;

namespace DataAcquisitionServer.Services.DataAnalysis
{
    public class KukaDataAnalysis(IDbContextFactory<DataContext> dbContextFactory) : IDataAnalysis
    {
        private readonly IDbContextFactory<DataContext> dbContextFactory = dbContextFactory;

        private readonly SystemLog log = SystemLog.Instance;

        public void Analysis(IEnumerable<ICommunication> communications, IEnumerable<Equipment> equipments)
        {
            using var context = dbContextFactory.CreateDbContext();
            try
            {
                var kukaEquipments = equipments.Where(x => x.EquipmentType == EquipmentTypeConst.Kuka && x.EquipmentProperties.Any()).ToList();
                foreach (var item in kukaEquipments)
                {
                    //设备未开机则跳过
                    if (item[KukaProps.BootFlag.ToString()].Value != bool.TrueString)
                    {
                        //结束当前设备所有记录
                        context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == item.Code && !x.IsEnd).ExecuteUpdate(x => x.SetProperty(p => p.IsEnd, true));
                        return;
                    }

                    var propCodes = new List<KukaProps>
                    {
                        KukaProps.BootFlag,//开机标志
                        KukaProps.WorkFlag,//工作标志
                        KukaProps.WeldFlag,//焊接标志
                        KukaProps.WeldCompleteFlag,//焊接完成标志
                        KukaProps.Alarm,//报警
                        KukaProps.Work_Time,//工作时长
                        KukaProps.Work_Mode,//工作模式
                    };

                    //记录设备状态
                    SetEquipmentRecord(context, item, propCodes);

                    var weldSpeedProperty = item[KukaProps.Weld_Speed.ToString()];//焊接送丝速度
                    _ = int.TryParse(weldSpeedProperty.Value, out var weldSpeedValue);
                }

                #region 其他
                //var obj = new KukaVM
                //{
                //    MyProperty = 5
                //};
                //var xz = new XmlSerializer(typeof(KukaVM));
                //string str;
                //using (var sw = new StringWriter())
                //{
                //    var xmlSerializerNamespaces = new XmlSerializerNamespaces();
                //    xmlSerializerNamespaces.Add(string.Empty, string.Empty);
                //    xz.Serialize(sw, obj, xmlSerializerNamespaces);
                //    str = sw.ToString();
                //}
                //using (var ms = new MemoryStream())
                //{
                //    StreamWriter writer = new StreamWriter(ms);
                //    writer.Write(str.Trim());
                //    writer.Flush();
                //    ms.Position = 0;
                //    var reader = new StreamReader(ms);
                //    try
                //    {
                //        var ddd = (KukaVM)xz.Deserialize(reader)!;
                //    }
                //    catch (Exception ex)
                //    {
                //        throw;
                //    }
                //}
                #endregion
            }
            catch (Exception ex)
            {
                log.LogError($"[{nameof(KukaDataAnalysis)}]数据解析出现异常:{ex.Message}");
            }
        }

        /// <summary>
        /// 记录设备状态
        /// </summary>
        /// <param name="context"></param>
        /// <param name="equipment"></param>
        /// <param name="propCodes"></param>
        public void SetEquipmentRecord(DataContext context, Equipment equipment, IEnumerable<KukaProps> propCodes)
        {
            foreach (var propCode in propCodes)
            {
                //每小时存一条记录
                var startTime = DateTime.Today.AddHours(DateTime.Now.Hour);
                var prop = equipment[propCode.ToString()];
                _ = bool.TryParse(prop.Value, out var propValue);
                if (propValue)
                {
                    var oldRecord = context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == equipment.Code && x.EquipmentPropertyCode == propCode.ToString() && !x.IsEnd && x.CreateTime >= startTime).OrderByDescending(x => x.CreateTime).FirstOrDefault();
                    if (oldRecord != null)
                    {
                        context.EquipmentPropertyRecords.Where(x => x.Id == oldRecord.Id).ExecuteUpdate(x => x.SetProperty(p => p.UpdateTime, DateTime.Now));
                    }
                    else
                    {
                        context.EquipmentPropertyRecords.Add(new EquipmentPropertyRecord
                        {
                            EquipmentCode = equipment.Code,
                            EquipmentName = equipment.Name,
                            EquipmentPropertyCode = prop.Code,
                            EquipmentPropertyName = prop.Name,
                            Value = propValue.ToString(),
                            IsEnd = false,
                            CreateTime = DateTime.Now,
                            UpdateTime = DateTime.Now,
                        });
                        context.SaveChanges();
                    }
                }
                //结束
                else
                {
                    context.EquipmentPropertyRecords.Where(x => x.EquipmentPropertyCode == equipment.Code && x.EquipmentPropertyCode == propCode.ToString() && !x.IsEnd).ExecuteUpdate(x => x.SetProperty(p => p.IsEnd, true));
                }

                #region 记录加工工件

                if (prop.Code == KukaProps.Work_Time.ToString())
                {
                    if (propValue)
                    {
                        var workRecord = context.WorkpieceProcessingRecords.Where(x => x.EquipmentCode == equipment.Code && !x.IsEnd && x.CreateTime >= DateTime.Today).OrderByDescending(x => x.CreateTime).FirstOrDefault();
                        if (workRecord != null)
                        {
                            context.WorkpieceProcessingRecords.Where(x => x.Id == workRecord.Id).ExecuteUpdate(x => x.SetProperty(e => e.UpdateTime, DateTime.Now));
                        }
                        else
                        {
                            _ = int.TryParse(equipment[KukaProps.Type.ToString()].Value, out var type);
                            _ = int.TryParse(equipment[KukaProps.Program_No.ToString()].Value, out var program_No);
                            context.WorkpieceProcessingRecords.Add(new WorkpieceProcessingRecord
                            {
                                EquipmentCode = equipment.Code,
                                EquipmentName = equipment.Name,
                                WorkpieceCode = type.ToString(),//待完善
                                IsEnd = false,
                                ProgramNo = program_No,
                                CreateTime = DateTime.Now,
                                UpdateTime = DateTime.Now,
                            });
                        }
                    }
                    else
                    {
                        context.WorkpieceProcessingRecords.Where(x => x.EquipmentCode == equipment.Code && !x.IsEnd).ExecuteUpdate(x => x.SetProperty(p => p.IsEnd, true));
                    }
                }

                #endregion
            }
        }
    }
}