EquipmentVisualService.cs 4.94 KB
using Hh.Mes.POJO.Entity;
using Hh.Mes.POJO.EnumEntitys;
using Hh.Mes.POJO.Response;
using Hh.Mes.POJO.ViewModel.Equipment;
using Hh.Mes.Service.Repository;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Hh.Mes.Service.WebService.Equipment
{
    /// <summary>
    /// 设备可视化参数
    /// </summary>
    public class EquipmentVisualService : RepositorySqlSugar<base_equipment>
    {
        /// <summary>
        /// 设备文件、设备报警记录
        /// </summary>
        public Response GetEquipmentFileList(base_equipment model)
        {
            var result = new Response();
            var stringBuilder = new StringBuilder();

            stringBuilder.AppendLine($@" select * from sys_File
                                         where targetId=@targetId and targetTableName='base_equipment'
                                         union all
                                         select * from sys_File
                                         where targetId=@targetId2 and targetTableName='base_equipment_type';

                                        select * from daq_equipment_alarm_record t1  with (nolock)
                                        where t1.IsHandled =0 and t1.EquipmentCode=@EquipmentCode
                                        order by  t1.CreateTime desc");

            var dt = Context.Ado.GetDataSetAll(stringBuilder.ToString(), new List<SugarParameter>(){
                      new SugarParameter("@targetId", model.equipmentCode),
                      new SugarParameter("@targetId2", model.equipmentTypeCode),
                      new SugarParameter("@EquipmentCode", model.equipmentCode),
            });

            var records = Context.Queryable<daq_equipment_status_record_history>().Where(x => x.equipmentCode == model.equipmentCode && x.updateTime >= DateTime.Today).Select(x => new
            {
                x.id,
                x.status,
                x.createTime,
                x.updateTime,
            }).ToList();

            var currentMonthStartTime = DateTime.Today.AddDays(1 - DateTime.Today.Day);

            var alarmTimeTicks = records.Where(x => x.status == EquipmentStatus.Error.ToString()).Sum(x => ConvertToTicks(x.createTime, x.updateTime, DateTime.Today));
            var freeTimeTicks = records.Where(x => x.status == EquipmentStatus.Free.ToString()).Sum(x => ConvertToTicks(x.createTime, x.updateTime, DateTime.Today));
            var runTimeTicks = records.Where(x => x.status == EquipmentStatus.Running.ToString()).Sum(x => ConvertToTicks(x.createTime, x.updateTime, DateTime.Today));
            var currentTotalTicks = (DateTime.Now - DateTime.Today).Ticks;

            var offlineTimeTicks = currentTotalTicks - (alarmTimeTicks + freeTimeTicks + runTimeTicks);
            if (offlineTimeTicks < 0)
            {
                offlineTimeTicks = 0;
            }
            var equipmentHealth = new EquipmentHealthVM
            {
                EquipmentStatus = new EquipmentStatusDto
                {
                    TodayPowerTime = TimeSpan.FromTicks(records.Sum(x => ConvertToTicks(x.createTime, x.updateTime, DateTime.Today))),
                    CurrentMonthPowerTime = TimeSpan.FromTicks(Context.Queryable<daq_equipment_status_record_history>().Where(x => x.createTime >= currentMonthStartTime).Select(x => new { x.updateTime, x.createTime }).ToList().Sum(x => (x.updateTime - x.createTime).Ticks)),
                    AlarmTime = TimeSpan.FromTicks(alarmTimeTicks),
                    FreeTime = TimeSpan.FromTicks(freeTimeTicks),
                    OfflineTime = TimeSpan.FromTicks(offlineTimeTicks),
                    RunTime = TimeSpan.FromTicks(runTimeTicks),
                    AlarmProportion = Math.Round(alarmTimeTicks * 100d / currentTotalTicks, 1),
                    FreeProportion = Math.Round(freeTimeTicks * 100d / currentTotalTicks, 1),
                    RunProportion = Math.Round(runTimeTicks * 100d / currentTotalTicks, 1),
                    OfflineProportion = Math.Round(offlineTimeTicks * 100d / currentTotalTicks, 1),
                }
            };
            result.Result = new
            {
                equipmentHealth,
                fileList = dt.Tables[0],
                alarmList = dt.Tables[1],
            };
            result.Count = 1;
            return result;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <param name="comparisonValue">比较值</param>
        /// <returns></returns>
        private long ConvertToTicks(DateTime startTime, DateTime endTime, DateTime comparisonValue)
        {
            //var startTime = startTime;
            var tmep = startTime;
            if (startTime < comparisonValue)
            {
                tmep = comparisonValue;
            }
            return (endTime - tmep).Ticks;
        }
    }
}