EquipmentCommon.cs 16.2 KB
using HHECS.Application.Enums;
using HHECS.BllModel;
using HHECS.Dal.Repository;
using HHECS.Executor.EquipmentHandler.SRMV4;
using HHECS.Executor.EquipmentHandler.Station;
using HHECS.Infrastructure.CommonHelper;
using HHECS.Model.Entities;
using HHECS.Model.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HHECS.Executor
{
    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.PLCMonitorAddress.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,
                                    Created = DateTime.Now,
                                    CreatedBy = Accounts.WCS.ToString(),
                                    Updated = DateTime.Now,//确保不为null
                                    UpdatedBy = Accounts.WCS.ToString()
                                };
                                equipmentAlarmRepository.Insert(equipmentAlarm);
                            }
                            else
                            {
                                //更新这个报警
                                record.Updated = DateTime.Now;
                                equipmentAlarmRepository.Update(record);
                            }
                        }
                    }
                }
                return BllResultFactory.Success();
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(ex.Message);
            }
        }

        /// <summary>
        /// 用于超时关闭报警
        /// </summary>
        public static BllResult EquipmentAlarmAutoEndAsync(List<Equipment> equipments)
        {
            EquipmentAlarmRecordRepository equipmentAlarmRepository = new EquipmentAlarmRecordRepository();
            try
            {
                var codes = equipments.Select(t => t.Code).ToList();
                var result = equipmentAlarmRepository.Where(t => codes.Contains(t.EquipmentCode) && t.IsEnd == false).ToList();
                foreach (var item in result)
                {
                    if (item.Updated == null)
                    {
                        continue;
                    }
                    //这里updated不会为null
                    if ((DateTime.Now - item.Updated).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)
            {
                SRMStatusRecord(equipmentStatusRecordRepository, item);
                RGVStatusRecord(equipmentStatusRecordRepository, item);
                HoistStatusRecord(equipmentStatusRecordRepository, item);
            }
        }

        /// <summary>
        /// 提升机
        /// </summary>
        /// <param name="equipmentStatusRecordRepository"></param>
        /// <param name="item"></param>
        private static void HoistStatusRecord(EquipmentStatusRecordRepository equipmentStatusRecordRepository, IGrouping<string, Equipment> item)
        {
            if (item.Key == EquipmentTypeConst.HoistStation.ToString())
            {
                foreach (var hoist in item)
                {
                    //与此设备相关的所有状态记录
                    var records = equipmentStatusRecordRepository.Where(t => t.EquipmentCode == hoist.Code && t.IsEnd == false).ToList();
                    //故障
                    if (hoist[HoistProps.OperatingMode.ToString()].Value == EquipmentStatusRecordStatus.Error.GetIndexString())
                    {
                        RecordEquipmentStatus(hoist, records, EquipmentStatusRecordStatus.Error);
                    }
                    else
                    {
                        if (hoist[HoistProps.OperatingMode.ToString()].Value == EquipmentStatusRecordStatus.Maintain.GetIndexString())
                        {
                            //维修
                            RecordEquipmentStatus(hoist, records, EquipmentStatusRecordStatus.Maintain);
                        }
                        else if (hoist[HoistProps.OperatingMode.ToString()].Value == EquipmentStatusRecordStatus.Manual.GetIndexString())
                        {
                            //手动
                            RecordEquipmentStatus(hoist, records, EquipmentStatusRecordStatus.Manual);
                        }
                        else if (hoist[HoistProps.OperatingMode.ToString()].Value == EquipmentStatusRecordStatus.Running.GetIndexString())
                        {
                            //运行中
                            RecordEquipmentStatus(hoist, records, EquipmentStatusRecordStatus.Running);
                        }
                        else if (hoist[HoistProps.OperatingMode.ToString()].Value == EquipmentStatusRecordStatus.Free.GetIndexString())
                        {
                            RecordEquipmentStatus(hoist, records, EquipmentStatusRecordStatus.Free);
                        }
                        else
                        {
                            //以上没有进入、那么则是空闲状态
                            RecordEquipmentStatus(hoist, records, EquipmentStatusRecordStatus.Free);
                        }
                    }
                }
            }
        }

        private static void RGVStatusRecord(EquipmentStatusRecordRepository equipmentStatusRecordRepository, IGrouping<string, Equipment> item)
        {
            if (item.Key == EquipmentTypeConst.RGVStation.ToString())
            {
                foreach (var rgv in item)
                {
                    //与此设备相关的所有状态记录
                    var records = equipmentStatusRecordRepository.Where(t => t.EquipmentCode == rgv.Code && t.IsEnd == false).ToList();
                    //故障
                    if (rgv[RGVProps.Fault.ToString()].Value == "True")
                    {
                        RecordEquipmentStatus(rgv, records, EquipmentStatusRecordStatus.Error);
                    }
                    else
                    {
                        if (rgv[RGVProps.Maintain.ToString()].Value == "True")
                        {
                            //维修
                            RecordEquipmentStatus(rgv, records, EquipmentStatusRecordStatus.Maintain);
                        }
                        else if (rgv[RGVProps.Manual.ToString()].Value == "True" || rgv[RGVProps.Airborne.ToString()].Value == "True")
                        {
                            //手动
                            RecordEquipmentStatus(rgv, records, EquipmentStatusRecordStatus.Manual);
                        }
                        else if (rgv[RGVProps.Running.ToString()].Value == "True")
                        {
                            //运行中
                            RecordEquipmentStatus(rgv, records, EquipmentStatusRecordStatus.Running);
                        }
                        else if (rgv[RGVProps.Stop.ToString()].Value == "True" || rgv[RGVProps.AutoMode.ToString()].Value == "True")
                        {
                            RecordEquipmentStatus(rgv, records, EquipmentStatusRecordStatus.Free);
                        }
                        else
                        {
                            //以上没有进入、那么则是空闲状态
                            RecordEquipmentStatus(rgv, records, EquipmentStatusRecordStatus.Free);
                        }

                        //else if (rgv[SRMProps.OperationModel.ToString()].Value == SRMOperationModel.Online.GetIndexString() && (rgv[SRMProps.Fork1TaskExcuteStatus.ToString()].Value == SRMTaskExcuteStatus.TaskInterruptError.GetIndexString() || rgv[SRMProps.Fork1TaskExcuteStatus.ToString()].Value == SRMTaskExcuteStatus.TaskSendError.GetIndexString()))
                        //{
                        //    RecordEquipmentStatus(rgv, records, EquipmentStatusRecordStatus.TaskExcuteError);
                        //}
                    }
                }
            }
        }

        private static void SRMStatusRecord(EquipmentStatusRecordRepository equipmentStatusRecordRepository, IGrouping<string, Equipment> item)
        {
            //堆垛机状态记录
            if (item.Key == EquipmentTypeConst.DoubleForkSRM.ToString() || item.Key == EquipmentTypeConst.SingleForkSRM.ToString() || item.Key == EquipmentTypeConst.SingleForkSSRM.ToString())
            {
                foreach (var srm in item)
                {
                    //与此设备相关的所有状态记录
                    var records = equipmentStatusRecordRepository.Where(t => t.EquipmentCode == srm.Code && t.IsEnd == false).ToList();
                    //故障
                    if (srm[SRMProps.TotalError.ToString()].Value == "True")
                    {
                        RecordEquipmentStatus(srm, records, EquipmentStatusRecordStatus.Error);
                    }
                    else
                    {
                        //空闲等
                        if (srm[SRMProps.OperationModel.ToString()].Value == SRMOperationModel.Maintain.GetIndexString())
                        {
                            //维修
                            RecordEquipmentStatus(srm, records, EquipmentStatusRecordStatus.Maintain);
                        }
                        else if (srm[SRMProps.OperationModel.ToString()].Value == SRMOperationModel.Manual.GetIndexString() || srm[SRMProps.OperationModel.ToString()].Value == SRMOperationModel.StandAlone.GetIndexString() || srm[SRMProps.OperationModel.ToString()].Value == SRMOperationModel.Airborne.GetIndexString())
                        {
                            //手动
                            RecordEquipmentStatus(srm, records, EquipmentStatusRecordStatus.Manual);
                        }
                        else if (srm[SRMProps.OperationModel.ToString()].Value == SRMOperationModel.Online.GetIndexString() && srm[SRMProps.Fork1TaskExcuteStatus.ToString()].Value == SRMTaskExcuteStatus.TaskExecuting.GetIndexString())
                        {
                            //运行中
                            RecordEquipmentStatus(srm, records, EquipmentStatusRecordStatus.Running);
                        }
                        else if (srm[SRMProps.OperationModel.ToString()].Value == SRMOperationModel.Online.GetIndexString() && srm[SRMProps.Fork1TaskExcuteStatus.ToString()].Value == SRMTaskExcuteStatus.Standby.GetIndexString())
                        {
                            RecordEquipmentStatus(srm, records, EquipmentStatusRecordStatus.Free);
                        }
                        else if (srm[SRMProps.OperationModel.ToString()].Value == SRMOperationModel.Online.GetIndexString() && (srm[SRMProps.Fork1TaskExcuteStatus.ToString()].Value == SRMTaskExcuteStatus.TaskInterruptError.GetIndexString() || srm[SRMProps.Fork1TaskExcuteStatus.ToString()].Value == SRMTaskExcuteStatus.TaskSendError.GetIndexString()))
                        {
                            RecordEquipmentStatus(srm, records, EquipmentStatusRecordStatus.TaskExcuteError);
                        }
                    }
                }
            }
        }

        public static void RecordEquipmentStatus(Equipment equipment, 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 = equipment.Code;
                equipmentStatusRecord.EquipmentName = equipment.Name;
                equipmentStatusRecord.EquipmentStatus = equipmentStatusRecordStatus.ToString();
                equipmentStatusRecord.Updated = DateTime.Now;
                equipmentStatusRecord.UpdatedBy = Accounts.WCS.ToString();
                equipmentStatusRecord.Created = DateTime.Now;
                equipmentStatusRecord.CreatedBy = Accounts.WCS.ToString();
                equipmentStatusRecordRepository.Insert(equipmentStatusRecord);

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

        /// <summary>
        /// 用于超时关闭状态记录
        /// </summary>
        public static BllResult EquipmentStatusAutoEnd(List<Equipment> equipments)
        {
            EquipmentStatusRecordRepository equipmentStatusRecordRepository = new EquipmentStatusRecordRepository();
            try
            {
                var codes = equipments.Select(t => t.Code).ToList();
                var result = equipmentStatusRecordRepository.Where(t => codes.Contains(t.EquipmentCode) && t.IsEnd == false).ToList();
                foreach (var item in result)
                {
                    //这里updated不会为null
                    if ((DateTime.Now - item.Updated).Value.TotalSeconds >= 5)
                    {
                        //默认大于5秒,我们认为已经离线,则直接关闭这个状态记录
                        item.IsEnd = true;
                        equipmentStatusRecordRepository.Update(item);
                    }
                }
                return BllResultFactory.Success();
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error($"关闭状态记录出现异常:{ex.Message}");
            }
        }

        #endregion
    }
}