EquipmentCommon.cs 15.3 KB
using Google.Protobuf.WellKnownTypes;
using HHECS.Application.Enums;
using HHECS.Application.Service;
using HHECS.BllModel;
using HHECS.Dal.Repository;
using HHECS.DAL.Repository;
using HHECS.Infrastructure.CommonHelper;
using HHECS.Infrastructure.Enums;
using HHECS.Infrastructure.Notice;
using HHECS.Model.Entities;
using HHHECS.Model.Enums;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HHECS.Executor.EquipmentHandler
{
    public class EquipmentCommon
    {
        #region 报警记录

        /// <summary>
        /// 报警记录生成,设备需要关联设备属性,前端调用
        /// </summary>
        public static BllResult EquipmentAlarmGenerate(List<Equipment> equipments)
        {
            EquipmentAlarmRecordRepository equipmentAlarmRepository = new EquipmentAlarmRecordRepository();
            try
            {
                foreach (var item in equipments)
                {
                    var alarms = item.EquipmentProps.Where(t => t.EquipmentTypePropTemplate.PropType == EquipmentPropType.PLCAlarmAddress.ToString() && !string.IsNullOrWhiteSpace(t.Value) && t.Value != t.EquipmentTypePropTemplate.MonitorCompareValue).ToList();
                    if (alarms.Count() > 0)
                    {
                        var alarmRecords = equipmentAlarmRepository.Where(t => t.EquipmentCode == item.Code && t.IsEnd == false).ToList();
                        foreach (var alarm in alarms)
                        {
                            var record = alarmRecords.Find(t => t.EquipmentPropCode == alarm.EquipmentTypePropTemplateCode);
                            if (record == null)
                            {
                                //说明记录中没有,或者超过5秒,则直接新增这个报警;
                                EquipmentAlarmRecord equipmentAlarm = new EquipmentAlarmRecord
                                {
                                    EquipmentCode = item.Code,
                                    EquipmentName = item.Name,
                                    EquipmentPropCode = alarm.EquipmentTypePropTemplateCode,
                                    EquipmentPropName = alarm.EquipmentTypePropTemplate.Name,
                                    Alarm = alarm.EquipmentTypePropTemplate.MonitorFailure,
                                    CreateTime = DateTime.Now,
                                    CreateBy = Accounts.WCS.ToString(),
                                    UpdateTime = DateTime.Now,//确保不为null
                                    UpdateBy = Accounts.WCS.ToString()
                                };
                                equipmentAlarmRepository.Insert(equipmentAlarm);
                            }
                            else
                            {
                                //更新这个报警
                                record.UpdateTime = DateTime.Now;
                                equipmentAlarmRepository.Update(record);
                            }
                        }
                    }
                }
                return BllResultFactory.Success();
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(ex.Message);
            }
        }

        /// <summary>
        /// 用于超时关闭报警
        /// </summary>
        public static BllResult EquipmentAlarmAutoEndAsync()
        {
            EquipmentAlarmRecordRepository equipmentAlarmRepository = new EquipmentAlarmRecordRepository();
            try
            {
                var busworkdilt = new BusWorkOrderDetailRepository();
                var busworkdi = busworkdilt.Where(t => t.BarCode == "154700314-01" && t.OprSequenceName == "切割").OrderByDescending(t=>t.CreateTime).ToList();
                if (busworkdi.Count != 0)
                {
                    busworkdi[0].State = 100;
                    busworkdi[0].UpdateTime = DateTime.Now;
                    busworkdilt.Update(busworkdi);
                }
                //WebApiService.SurpplusRecord("32");
                // WebApiService.SendMeasure("1", "2", "3");
                //BaseLoaderTaskRepository baseLoaderRepository = new BaseLoaderTaskRepository();
                var cutPlandDilt = new CutPlanDetailRepository();
                var cutplandi = cutPlandDilt.Where(t => t.CutState >= (int)CutPlanDetailState.切割开始 && t.CutState <= (int)CutPlanDetailState.切割完成 && t.HeadKeys.ToString() == "A23B86A0-8543-4135-A669-34ECE4D5F529" ).OrderByDescending(t => t.CutLevel).ToList();
                if ((cutplandi[0].flowOrientation1 == "0"|| cutplandi[0].flowOrientation1 == "S") && cutplandi[0].CutState == (int)CutPlanDetailState.切割完成)
                {
                    //cutPlanHeadRepository.UnitOfWork = uw;
                    //cutPlanTask[0].State = (int)CutPlanHeadState.切割完成;
                    //cutPlanHeadRepository.Update(cutPlanTask);
                    //uw.Commit();
                    //WebApiService.SurpplusRecord(cutPlanTask[0].Id.ToString());

                }

                //var baselodertask = baseLoaderRepository.Where(t => t.loaderStatus == (int)BaseLoaderTaskStatus.初始 && t.equipmentCode == "Min_Measure").OrderBy(t => t.createTime).ToList();
                //var result = equipmentAlarmRepository.Where(t => t.IsEnd == false).ToList();
                //foreach (var item in result)
                //{
                //    //这里updated不会为null
                //    if ((DateTime.Now - item.UpdateTime).Value.TotalSeconds >= 5)
                //    {
                //        //默认大于5秒,我们认为已经离线,则直接关闭这个报警记录
                //        item.IsEnd = true;
                //        equipmentAlarmRepository.Update(item);
                //    }
                //}
                return BllResultFactory.Success();
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error($"关闭报警记录时出现异常:{ex.Message}");
            }

        }

        #endregion

        #region 状态记录
        /// <summary>
        /// 状态记录生成,设备需要关联设备属性,前端调用
        /// </summary>
        /// <param name="equipments"></param>
        public static void EquipmentStatusRecordGenerate(List<Equipment> equipments)
        {
            EquipmentStatusRecordRepository equipmentStatusRecordRepository = new EquipmentStatusRecordRepository();
            var temp = equipments.GroupBy(t => t.EquipmentType.Code);
            foreach (var item in temp)
            {
                //状态记录
                if (item.Key == EquipmentTypeConst.CutBevel.ToString() || item.Key == EquipmentTypeConst.Polish.ToString() ||
                    item.Key == EquipmentTypeConst.Weld.ToString() || item.Key == EquipmentTypeConst.Other.ToString())
                {
                    foreach (var srm in item)
                    {
                        //与此设备相关的所有状态记录
                        var records = equipmentStatusRecordRepository.Where(t => t.EquipmentCode == srm.Code && t.IsEnd == false).ToList();

                        //故障
                        if (srm[StationProps.TotalError.ToString()].Value == "True")
                        {
                            RecordEquipmentStatus(srm, records, EquipmentStatusRecordStatus.Error);
                        }
                        else
                        {
                            //空闲等
                            if (srm[StationProps.OperationModel.ToString()].Value == OperationModelFlag.Maintain.GetIndexString())
                            {
                                //维修
                                RecordEquipmentStatus(srm, records, EquipmentStatusRecordStatus.Maintain);
                            }
                            else if (srm[StationProps.OperationModel.ToString()].Value == OperationModelFlag.Manual.GetIndexString() || srm[StationProps.OperationModel.ToString()].Value == OperationModelFlag.StandAlone.GetIndexString() || srm[StationProps.OperationModel.ToString()].Value == OperationModelFlag.Airborne.GetIndexString() || srm[StationProps.Status.ToString()].Value == EquipmentStatus.调式.GetIndexString())
                            {
                                //手动
                                RecordEquipmentStatus(srm, records, EquipmentStatusRecordStatus.Manual);
                            }
                            else if (srm[StationProps.OperationModel.ToString()].Value == OperationModelFlag.Online.GetIndexString() && srm[StationProps.Status.ToString()].Value == EquipmentStatus.运行.GetIndexString())
                            {
                                //运行中
                                RecordEquipmentStatus(srm, records, EquipmentStatusRecordStatus.Running);
                            }
                            else if (srm[StationProps.OperationModel.ToString()].Value == OperationModelFlag.Online.GetIndexString() && srm[StationProps.Status.ToString()].Value == EquipmentStatus.空闲.GetIndexString())
                            {
                                RecordEquipmentStatus(srm, records, EquipmentStatusRecordStatus.Free);
                            }
                            else if (srm[StationProps.OperationModel.ToString()].Value == OperationModelFlag.Online.GetIndexString() && srm[StationProps.Status.ToString()].Value == EquipmentStatus.故障.GetIndexString())
                            {
                                RecordEquipmentStatus(srm, records, EquipmentStatusRecordStatus.Error);
                            }
                            else if (srm[StationProps.Status.ToString()].Value == EquipmentStatus.保养.GetIndexString())
                            {
                                //运行中
                                RecordEquipmentStatus(srm, records, EquipmentStatusRecordStatus.Maintain);
                            }
                        }
                    }
                }



            }
        }

        public static void RecordEquipmentStatus(Equipment srm, List<EquipmentStatusRecord> records, EquipmentStatusRecordStatus equipmentStatusRecordStatus)
        {
            EquipmentStatusRecordRepository equipmentStatusRecordRepository = new EquipmentStatusRecordRepository();
            var record = records.Find(t => t.EquipmentStatus == equipmentStatusRecordStatus.ToString());
            if (record == null)
            {
                //新建
                EquipmentStatusRecord equipmentStatusRecord = new EquipmentStatusRecord();
                equipmentStatusRecord.EquipmentCode = srm.Code;
                equipmentStatusRecord.EquipmentName = srm.Name;
                equipmentStatusRecord.EquipmentStatus = equipmentStatusRecordStatus.ToString();
                equipmentStatusRecord.CreateTime = DateTime.Now;
                equipmentStatusRecord.CreateBy = Accounts.WCS.ToString();
                equipmentStatusRecord.UpdateTime = DateTime.Now;
                equipmentStatusRecord.UpdateBy = Accounts.WCS.ToString();
                equipmentStatusRecordRepository.Insert(equipmentStatusRecord);

            }
            else
            {
                //更新
                record.UpdateTime = DateTime.Now;
                equipmentStatusRecordRepository.Update(record);
            }
        }

        /// <summary>
        /// 用于超时关闭状态记录
        /// </summary>
        public static BllResult EquipmentStatusAutoEnd()
        {
            EquipmentStatusRecordRepository equipmentStatusRecordRepository = new EquipmentStatusRecordRepository();
            try
            {
                var result = equipmentStatusRecordRepository.Where(t => t.IsEnd == false).ToList();
                foreach (var item in result)
                {
                    //这里updated不会为null
                    if ((DateTime.Now - item.UpdateTime).Value.TotalSeconds >= 5)
                    {
                        //默认大于5秒,我们认为已经离线,则直接关闭这个状态记录
                        item.IsEnd = true;
                        equipmentStatusRecordRepository.Update(item);
                    }
                }
                return BllResultFactory.Success();

            }
            catch (Exception ex)
            {
                return BllResultFactory.Error($"关闭状态记录出现异常:{ex.Message}");
            }
        }

        #endregion

        #region 数据采集
        /// <summary>
        /// 采集线体设备数据
        /// </summary>
        public static void DataUpd(List<Equipment> equipments)
        {
            try
            {

                //筛查出本线体设备
                var equipmentList = equipments.Where(t => true).ToList();
                var equipmentKeys = equipmentList.Select(x => x.Id).ToList();

                //筛查出本线体设备需要采集的属性
                var equipmentProps = equipments.SelectMany(t => t.EquipmentProps).Where(a => a.EquipmentTypePropTemplate.PropType == EquipmentPropType.PLCCollectionAddress.ToString()).ToList();

                //没有数据就跳过
                if (equipmentProps.Count <= 0) return;


                ReadequipmentRepository readRepository = new ReadequipmentRepository();
                //var readOtherInformation = new ReadequipmentInformation();
                var readList = new List<ReadequipmentInformation>();
                foreach (var equipmentProp in equipmentProps)
                {
                    if (equipmentProp.Value=="0"||string.IsNullOrEmpty(equipmentProp.Value))
                    {
                        continue;
                    }
                    var readOtherInformation = new ReadequipmentInformation();
                    readOtherInformation.id = Guid.NewGuid().ToString();
                    readOtherInformation.equipmentId = (int)equipmentProp.EquipmentId;
                    readOtherInformation.equipmentTypeTemplateId = (int)equipmentProp.EquipmentTypePropTemplateId;
                    readOtherInformation.equipmentTypeTemplateCode = equipmentProp.EquipmentTypePropTemplateCode;
                    readOtherInformation.informationValue = equipmentProp.Value;
                    readOtherInformation.isSend = 0;
                    readOtherInformation.remark = equipmentProp.Remark;
                    readOtherInformation.createBy = "";
                    readOtherInformation.createTime = DateTime.Now;
                    //readRepository.Insert(readOtherInformation);
                    readList.Add(readOtherInformation);
                }

                //更新到数据库中(设备信息采集)
                readRepository.Insert(readList);



                //大于一天的数据直接删除
                DateTime previousDay = DateTime.Now.AddDays(-1);
                //DateTime previousDay = DateTime.Now.AddDays(-1);
                var expire = readRepository.Where(t => t.createTime < previousDay).ToList();
                if (expire.Any()) readRepository.Delete(expire);

            }
            catch (Exception ex)
            {
                NoticeBus.Notice($"数据采集出现异常:{ex.Message}", Level.Error);
            }
        }
        #endregion
    }
}