EquipmentStatusRecordService.cs 10.6 KB
using HHECS.Dal.Repository;
using HHECS.Infrastructure.CommonHelper;
using HHECS.Model.Entities;
using HHECS.Model.Enums;
using System;
using System.Linq;
using System.Collections.Generic;
using System.Linq.Expressions;
using HHECS.Model.Dtos;
using HHECS.Infrastructure.Json;

namespace HHECS.Application.Service
{
    public class EquipmentStatusRecordService : BaseService
    {

        public string Load(EquipmentStatusRecord entity, int page, int limit)
        {
            return Execute(() =>
            {
                using var warehouseRepository = new WarehouseRepository();
                using var equipmentDataRecordRepository = new EquipmentDataRecordRepository();
                using var equipmentAlarm = new EquipmentStatusRecordRepository();
                var result = equipmentAlarm.Where(GetExpression(entity));

                var total = result.Count();
                var equipmentStatusList = result.OrderBy(x => x.IsEnd).OrderByDescending(t => t.Created).Page(page, limit).ToList(t => new EquipmentStatusRecordDto());

                var equipmentCodeList = equipmentStatusList.Select(t => t.EquipmentCode).ToList();
                var equipmentList = equipmentDataRecordRepository.Where(x => equipmentCodeList.Contains(x.Code)).ToList();

                var warehouseCodeList = equipmentStatusList.Select(t => t.WarehouseCode).ToList();
                var warehouseList = warehouseRepository.Where(x => warehouseCodeList.Contains(x.Code)).ToList();

                equipmentStatusList.ForEach(t =>
                {
                    t.Duration = string.Format("{0:dd}天 {0:hh}小时 {0:mm}分 {0:ss}秒", t.Time);

                    var online = equipmentList.FirstOrDefault(x => x.Code == t.EquipmentCode);

                    //温度和 震动
                    t.WalkTemperature = online != null ? online.WalkTemperature.ToString() + "℃" : "0℃";
                    t.WalkVibrationVelocity = online != null ? Math.Round(online.WalkVibrationVelocity, 2).ToString() + "(mm/s)" : "0(mm/s)";
                    t.LiftTemperature = online != null ? online.LiftTemperature.ToString() + "℃" : "0℃";
                    t.LiftVibrationVelocity = online != null ? Math.Round(online.LiftVibrationVelocity, 2).ToString() + "(mm/s)" : "0(mm/s)";


                    t.runCurrent = online != null ? Math.Round(online.runCurrent, 2).ToString() + "(A)" : "0(A)";
                    t.liftCurrent = online != null ? Math.Round(online.liftCurrent, 2).ToString() + "(A)" : "0(A)";

                    var warehouse = (t.WarehouseCode == "LM1") ? warehouseList.FirstOrDefault(x => x.Code == "BM2") : warehouseList.FirstOrDefault(x => x.Code == t.WarehouseCode);
                    //var warehouse = warehouseRepository.Where(x => x.Code == t.WarehouseCode).First();
                    t.WarehouseName = warehouse != null ? warehouse.Name : t.WarehouseCode;
                });
                Response.Result = equipmentStatusList;
                Response.Count = total;
                return Response.ToJson();
            });
        }

        public string LoadDesc(EquipmentStatusRecord entity, int page, int limit)
        {
            return Execute(() =>
            {
                using var equipmentStatusRecordRepository = new EquipmentStatusRecordRepository();

                var temps = equipmentStatusRecordRepository.Where(GetExpression(entity)).ToList(x => new EquipmentStatusRecord
                {
                    EquipmentCode = x.EquipmentCode,
                    EquipmentName = x.EquipmentName,
                    EquipmentStatus = x.EquipmentStatus,
                    Created = x.Created,
                    Updated = x.Updated,
                });

                var groupQuery = temps.GroupBy(x => new
                {
                    x.EquipmentCode,
                    x.EquipmentName,
                    x.EquipmentStatus,
                });

                var data = groupQuery.OrderBy(x => x.Key.EquipmentCode).Skip((page - 1) * limit).Take(limit).Select(x => new EquipmentStatusRecordDto
                {
                    EquipmentCode = x.Key.EquipmentCode,
                    EquipmentName = x.Key.EquipmentName,
                    EquipmentStatus = x.Key.EquipmentStatus,
                    Count = x.Count(),
                    Duration = SumTime(x.ToList()),
                    BeginDateTime = entity.Created,
                    EndDateTime = entity.Updated,
                }).ToList();

                Response.Result = data;
                Response.Count = groupQuery.Count();
                return Response.ToJson();
            });
        }


        public string SumTime(List<EquipmentStatusRecord> equipmentStatusRecords)
        {
            TimeSpan? time = new TimeSpan();
            foreach (var t in equipmentStatusRecords)
            {
                time += t.Time;
            }
            return string.Format("{0:dd}天 {0:hh}小时 {0:mm}分 {0:ss}秒", time);
        }



        private Expression<Func<EquipmentStatusRecord, bool>> GetExpression(EquipmentStatusRecord entity)
        {
            Expression<Func<EquipmentStatusRecord, bool>> filter = t => true;
            //if (!string.IsNullOrWhiteSpace(entity.WarehouseCode))
            //{
            //    if (entity.WarehouseCode == "BM2")
            //    {
            //        filter = filter.And(x => x.WarehouseCode.Equals("BM2") || x.WarehouseCode.Equals("LM1"));
            //    }
            //    else
            //    {
            //        filter = filter.And(x => x.WarehouseCode.Equals(entity.WarehouseCode));
            //    }
            //}
            if (!string.IsNullOrWhiteSpace(entity.EquipmentCode))
            {
                filter = filter.And(x => x.EquipmentCode.Equals(entity.EquipmentCode));
            }
            if (!string.IsNullOrWhiteSpace(entity.EquipmentName))
            {
                filter = filter.And(x => x.EquipmentName.Contains(entity.EquipmentName));
            }
            if (!string.IsNullOrWhiteSpace(entity.WarehouseCodeExt))
            {
                filter = filter.And(x => entity.WarehouseCodeExt.IndexOf(x.EquipmentCode) >= 0);
            }
            filter = filter.And(x => !x.EquipmentStatus.Equals("OutLine"));
            if (!string.IsNullOrWhiteSpace(entity.EquipmentStatus))
            {
                filter = filter.And(x => x.EquipmentStatus.Equals(entity.EquipmentStatus));
            }
            if (entity.Created != null && entity.Updated != null)
            {
                //结束时间在转换过程中精度不一致,这里需要增加1秒
                filter = filter.And(t => t.Created >= entity.Created && t.Updated < entity.Updated.Value.AddSeconds(1));
            }
            if (entity.Created != null && entity.Updated == null)
            {
                filter = filter.And(t => t.Created >= entity.Created);
            }
            if (entity.Updated != null && entity.Created == null)
            {
                //结束时间在转换过程中精度不一致,这里需要增加1秒
                filter = filter.And(t => t.Updated < entity.Updated.Value.AddSeconds(1));
            }
            return filter;
        }

        public Dictionary<string, string> GetEquipmentStatusType()
        {
            var result = new Dictionary<string, string>
            {
                { "全部", "" }
            };
            foreach (var item in EnumHelper.EnumListDicString<EquipmentStatusRecordStatus>())
            {
                result.Add(item.Key, item.Value.ToString());
            }
            return result;
        }

        public string Export(EquipmentStatusRecord entity)
        {
            return Execute(() =>
            {
                using var equipmentStatusRecordRepository = new EquipmentStatusRecordRepository();
                var result = equipmentStatusRecordRepository.Where(GetExpression(entity)).OrderByDescending(a => a.Created).ToList(t => new EquipmentStatusRecordDto());

                result.ForEach(t =>
                {
                    t.Duration = string.Format("{0:dd}天 {0:hh}小时 {0:mm}分 {0:ss}秒", t.Time);
                });
                Response.Result = result;
                Response.Count = result.Count;
                return Response.ToJson(); 
            });
        }

        public string ExportDesc(EquipmentStatusRecord entity)
        {
            return Execute(() =>
            {
                using var equipmentStatusRecordRepository = new EquipmentStatusRecordRepository();
                var result = equipmentStatusRecordRepository.Where(GetExpression(entity)).OrderByDescending(a => a.Created).ToList(x => new EquipmentStatusRecord
                {
                    EquipmentCode = x.EquipmentCode,
                    EquipmentName = x.EquipmentName,
                    EquipmentStatus = x.EquipmentStatus,
                    Created = x.Created,
                    Updated = x.Updated,
                });
                var data = result.GroupBy(a => new { a.EquipmentCode, a.EquipmentName, a.EquipmentStatus }).Select(x => new EquipmentStatusRecordDto
                {
                    EquipmentCode = x.Key.EquipmentCode,
                    EquipmentName = x.Key.EquipmentName,
                    EquipmentStatus = x.Key.EquipmentStatus,
                    Count = x.Count(),
                    Duration = SumTime(x.ToList()),
                    BeginDateTime = entity.Created,
                    EndDateTime = entity.Updated
                }).ToList();

                Response.Result = data;
                Response.Count = data.Count;
                return Response.ToJson();
            });
        }

        /// <summary>
        /// 获取设备状态
        /// </summary>
        /// <param name="equipmentCode">设备编码</param>
        /// <returns></returns>
        public EquipmentStatusRecord GetEquipmentStatusByCode(string equipmentCode)
        {
            using var statusRecordRepository = new EquipmentStatusRecordRepository();
            return statusRecordRepository.Where(x => x.EquipmentCode.Equals(equipmentCode)).OrderBy(t => t.IsEnd).OrderByDescending(x => x.Created).First();
        }

        /// <summary>
        /// 获取设备状态
        /// </summary>
        /// <param name="equipmentCode">设备编码</param>
        /// <returns></returns>
        public List<EquipmentStatusRecord> GetEquipmentHistoryStatusByCode(string equipmentCode)
        {
            using EquipmentStatusRecordRepository statusRecordRepository = new EquipmentStatusRecordRepository();
            return statusRecordRepository.Where(x => x.EquipmentCode.Equals(equipmentCode)).ToList();
        }
    }
}