EquipmentOverviewController.cs 10.9 KB
using FreeSql;
using HHECS.Application.Service;
using HHECS.Dal;
using HHECS.Dal.Repository;
using HHECS.Executor.EquipmentHandler.SRMV4;
using HHECS.Model.Entities;
using HHECS.Model.Enums;
using HHECS.Web.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using NPOI.POIFS.FileSystem;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Web;
using static NPOI.HSSF.Util.HSSFColor;

namespace HHECS.Web.Areas.Dashboard.Controllers
{
    /// <summary>
    /// 设备运行监控页(总览)
    /// </summary>
    [Area("Dashboard")]
    public class EquipmentOverviewController : BaseController
    {
        private readonly EquipmentService _equipmentService;
        private readonly WarehouseService _warehouseService;
        private readonly EquipmentStatusRecordService _statusRecordService;

        public EquipmentOverviewController(EquipmentService equipmentService, EquipmentStatusRecordService statusRecordService, WarehouseService warehouseService)
        {
            _equipmentService = equipmentService;
            _statusRecordService = statusRecordService;
            _warehouseService = warehouseService;
        }

        [ServiceFilter(typeof(OperLogFilter))]
        public IActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public string Load(PageReq pageRequest, Warehouse entity)
        {
            //return _equipmentService.LoadEquipmentAndStatus(entity, pageRequest.page, pageRequest.limit);
            return _warehouseService.LoadEquipmentCount(entity, pageRequest, _equipmentService);
        }

        /// <summary>
        /// 详情页
        /// </summary>
        /// <param name="code">仓库编码</param>
        /// <param name="name">仓库名称</param>
        /// <returns></returns>
        public IActionResult Detail(string code, string name)
        {
            //var equipment = _equipmentService.GetEquipment(x => x.WarehouseCode.Equals(code)).Data;
            //if (equipment == null)
            //{
            //    return Redirect("/Error");
            //}
            ViewBag.WarehouseCode = HttpUtility.UrlEncode(code);
            ViewBag.WarehouseName = name;

            return View();
        }

        /// <summary>
        /// 获取设备信息
        /// </summary>
        /// <param name="code">仓库编码</param>
        /// <returns></returns>
        public IActionResult GetResult(string code)
        {
            try
            {
                var tempCode = code.Split("_");
                var eqName = "";
                if (tempCode.Length > 1)
                {
                    eqName = HttpUtility.UrlDecode(tempCode[tempCode.Length - 1]);
                    code = tempCode[0];
                }
                var equipments = _equipmentService.GetEquipments(x => x.WarehouseCode.Equals(code)).Data;
                if (!string.IsNullOrEmpty(eqName))
                {
                    equipments = equipments.Where(x => x.Name.Contains(eqName)).ToList();
                }
                else
                {
                    equipments = equipments.Where(x => !x.Name.Contains("AGV")).ToList();
                }
                //不显示链条机2、滚筒输送机4、液压升降台5、过渡滚筒机8、称重滚筒输送机(双层)9
                equipments = equipments.Where(x => x.EquipmentTypeId != 2 && x.EquipmentTypeId != 4 && x.EquipmentTypeId != 5 && x.EquipmentTypeId != 8 && x.EquipmentTypeId != 9).ToList();

                if (equipments == null || equipments.Count == 0)
                {
                    return NotFound();
                }
                var equipmentCodeList = equipments.Select(t => t.Code).ToList();
                List<MonitorViewModel> results = new List<MonitorViewModel>();
                var month = DateTime.Now;
                //月初
                // var monthStatr = month.AddDays(1 - month.Day);
                //当天
                var monthStart = DateTime.Parse(month.ToString("yyyy-MM-dd 00:00:00"));
                var monthStart8 = DateTime.Parse(month.ToString("2023-08-01 00:00:00"));
                //var monthStatr =DateTime.Parse( "2023-08-08 12:00:00");
                //月末
                var monthEnd = month.AddDays(1 - month.Day).Date.AddMonths(1).AddSeconds(-1);
                var agvFlag = false;

                //设备报警记录
                //using EquipmentAlarmRecordRepository alarmRecordRepository = new EquipmentAlarmRecordRepository();
                //var alarmRecordDataAll = alarmRecordRepository.Where(x => equipmentCodeList.Contains(x.EquipmentCode)).ToList();

                //字典
                using DictDetailRepository dictDetailRepository = new DictDetailRepository();
                var dictList = dictDetailRepository.Where(x => x.DictId == 39).ToList();


                //维护记录 通过设备绑定的保养规则生成保养记录
                using EquipmentMaintainRecordRepository maintainRecordRepository = new EquipmentMaintainRecordRepository();
                var maintainRecordList = maintainRecordRepository.Where(x => equipmentCodeList.Contains(x.EquipmentCode)).ToList();

                //设备运行记录
                using EquipmentDataRecordRepository equipmentDataRecordRepository = new EquipmentDataRecordRepository();
                var equipmentDataRecordList = equipmentDataRecordRepository.Where(x => equipmentCodeList.Contains(x.Code)).ToList();

                //设备状态记录
                using EquipmentStatusRecordRepository statusRecordRepository = new EquipmentStatusRecordRepository();
                var equipmentStatusList = statusRecordRepository.Where(x => equipmentCodeList.Contains(x.EquipmentCode) && x.Created >= monthStart && x.Updated <= monthEnd).ToList();

                //.OrderBy(t => t.IsEnd).ThenByDescending(t => t.Created).FirstOrDefault();

                foreach (var equipment in equipments)
                {
                    //通过视图查设备未处理的报警
                    var alarmRecord = DALHelper.GetFreeSql().Ado.ExecuteDataTable($"select*from equipmentNotFinishedAlarm where EquipmentCode='{equipment.Code}'");
                    //var alarmRecord = alarmRecordDataAll.Where(x => x.ishandled == false && x.EquipmentCode == equipment.Code && x.Created >= monthStart8 && (Convert.ToDateTime(x.Updated) - Convert.ToDateTime(x.Created)).TotalMinutes > 1).GroupBy(x => new { x.EquipmentCode, x.Alarm }).ToList();
                    //逾期未处理数
                    var alarmRecordDataNow = alarmRecord.Rows.Count;

                    var equipmentStatusRecord = equipmentStatusList.Where(x => x.EquipmentCode == equipment.Code).OrderBy(t => t.IsEnd).ThenByDescending(t => t.Created).FirstOrDefault();
                    var allStatus = equipmentStatusList.Where(x => x.EquipmentCode == equipment.Code);
                    var maintainRecord = maintainRecordList.Where(x => x.EquipmentCode.Equals(equipment.Code)).OrderBy(x => x.Status).First();
                    _ = Enum.TryParse(equipmentStatusRecord?.EquipmentStatus, out EquipmentStatusRecordStatus equipmentStatus);

                    var online = equipmentDataRecordList.FirstOrDefault(x => x.Code == equipment.Code);
                    var onlineFlag = online != null ? online.Online : false;
                    //超过5分钟就算离线
                    if (online==null||(DateTime.Now - online.Updated) >= TimeSpan.FromMinutes(5)) {
                        onlineFlag = false;
                    }
                    agvFlag = equipment.Name.IndexOf("AGV") > -1;
                    int agvRunTotal = 0;
                    if (agvFlag)
                    {
                        string sql = $@"  select rowCounts= count(id) 
                                          from huahengecs5_binchengtaiguang.dbo.agvtask 
                                          where AGVCode='{equipment.Code}' and Created>='{monthStart}' and Updated <= '{monthEnd}'  --and IsDeleted=0";
                        var dt = DALHelper.GetFreeSql().Ado.ExecuteDataTable(sql);
                        agvRunTotal = dt != null ? int.Parse(dt.Rows[0]["rowCounts"].ToString()) : 0;
                    }


                    var result = new MonitorViewModel
                    {
                        Equipment = equipment,

                        EquipmentStatus = equipmentStatusRecord == null ? -1 : Convert.ToInt32(equipmentStatus),
                        MaintainStatus = (maintainRecord != null) ? (EquipmentMaintainStatus)maintainRecord.Status : EquipmentMaintainStatus.MaintainDelay,
                        RunTotal = agvFlag ? agvRunTotal : allStatus.Count(x => x.EquipmentStatus == EquipmentStatusRecordStatus.Running.ToString()),


                        //FreeTotal = allStatus.Count(x => x.EquipmentStatus == EquipmentStatusRecordStatus.Free.ToString()),
                        //测试数据
                        Online = onlineFlag,
                        WalkTemperature = online != null ? online.WalkTemperature : 0,//new Random().Next(1, 70),
                        WalkVibrationVelocity = online != null ? Math.Round(online.WalkVibrationVelocity, 2) : 0,//Math.Round(new Random().Next(0, 10) + new Random().NextDouble(), 2),
                        LiftTemperature = online != null ? online.LiftTemperature : 0,//new Random().Next(1, 70),
                        LiftVibrationVelocity = online != null ? Math.Round(online.LiftVibrationVelocity, 2) : 0,//Math.Round(new Random().Next(0, 10) + new Random().NextDouble(), 2),

                        ConfigPars = dictList
                    };
                    //故障信息
                    List<string> msgList= new List<string>();
                    foreach(DataRow item in alarmRecord.Rows)
                    {
                        msgList.Add(item["Alarm"].ToString());
                    }
                    result.AlarmMsg = msgList;
                    //当日未处理故障数
                    result.ErrorTotal = int.Parse(alarmRecordDataNow.ToString());

                    result.runCurrent = "0(A)";
                    result.liftCurrent = "0(A)";
                    if (equipment.EquipmentTypeId == 1)
                    {
                        result.runCurrent = online != null ? Math.Round(online.runCurrent, 2).ToString() + "(A)" : "0(A)";
                        result.liftCurrent = online != null ? Math.Round(online.liftCurrent, 2).ToString() + "(A)" : "0(A)";
                    }
                    results.Add(result);
                }
                return Ok(results);
            }
            catch (Exception ex)
            {
                return Ok(new
                {
                    code = 200,
                    count = 0,
                    data = string.Empty,
                    msg = ex.Message
                });
            }
        }
    }
}