EquipmentVisualService.cs 9.06 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.Data;
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;
        }

        public Response GetEquipmentMaintainList(base_equipment model)
        {
            var result = new Response();
            var stringBuilder = new StringBuilder();
            //设备保养概述总表关联部件基础信息表
            stringBuilder.AppendLine(@"SELECT
                                            t.EquipmentCode AS equipmentCode,
                                            t.EquipmentName AS equipmentName,
                                            p.partCode,
                                            p.partName,
                                            rd.indicator,
                                            rd.indicatorType,
                                            rd.price,
                                            t.MaintainNumber AS maintainNumber, --总保养
                                            t.ToBeMaintainedNumber AS toBeMaintainNumber --待保养次数
                                        FROM dbo.bus_equipment_maintain_record_top t
                                        LEFT JOIN  dbo.base_equipment_part p ON t.EquipmentTypeCode=p.equipmentTypeCode
                                        LEFT JOIN  dbo.bus_equipment_maintain_rule_detail  rd ON rd.equipmentPartCode=p.partCode
                                        WHERE t.EquipmentCode=@equipmentCode;");
            var dt = base.Context.Ado.GetDataTable(stringBuilder.ToString(), new List<SugarParameter>(){
                      new SugarParameter("@equipmentCode", model.equipmentCode),
            });
            result.Result = dt;
            return result;
        }

        /// <summary>
        /// 获取设备部件保养记录
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public Response GetEquipmentMaintainRecordList(string eqCode, string partCode)
        {
            var result = new Response();
            var stringBuilder = new StringBuilder();
            stringBuilder.AppendLine(@"SELECT
                                            h.EquipmentCode,
                                            h.EquipmentTypeCode,
                                            h.PartCode,
                                            h.PartName,
                                            h.LastMaintainTime,
                                            h.NextMaintainTime,
                                            d.MaintainTime,
                                            d.Maintainer,
                                            d.MaintainContent,
                                            d.MaintainPrice,
                                            d.PushStatus,
                                            d.Attachment,
                                            d.Remark
                                        FROM dbo.bus_equipment_maintain_record_head h LEFT
                                        JOIN dbo.bus_equipment_maintain_record_detail d
                                        ON h.Keys=d.HeadKeys
                                        WHERE h.EquipmentCode=@equipmentCode  AND h.Status=@status");
            if (!string.IsNullOrEmpty(partCode))
            {
                //非空 附加部件条件
                stringBuilder.AppendLine(" AND h.PartCode=@partCode");
            }

            //已保养
            var dt = base.Context.Ado.GetDataTable(stringBuilder.ToString(), new List<SugarParameter>(){
                      new SugarParameter("@equipmentCode", eqCode),
                      new SugarParameter("@partCode", partCode),
                      new SugarParameter("@status", MaintainStatus.Maintained),
            });

            //待保养
            var dt_tobe = base.Context.Ado.GetDataTable(stringBuilder.ToString(), new List<SugarParameter>(){
                      new SugarParameter("@equipmentCode", eqCode),
                      new SugarParameter("@partCode", partCode),
                      new SugarParameter("@status", MaintainStatus.ToBeMaintain),
            });
            result.Result = new
            {
                maintainList = dt,
                tobemaintainList = dt_tobe
            };
            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 tmep = startTime;
            if (startTime < comparisonValue)
            {
                tmep = comparisonValue;
            }
            return (endTime - tmep).Ticks;
        }
    }
}