EquipmentMaintainInfoService.cs 12.2 KB
using HHECS.Dal.Repository;
using HHECS.Model.Dtos;
using HHECS.Model.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using FreeSql;
using HHECS.Model.Enums;
using HHECS.Infrastructure.CommonHelper;
using HHECS.Infrastructure.Json;
using HHECS.WebAPI.Service;
using Newtonsoft.Json;

namespace HHECS.Application.Service
{
    /// <summary>
    /// 设备保养明细 服务
    /// </summary>
    public class EquipmentMaintainInfoService : BaseService
    {
        public string Load(Equipment entity, PageReq pageReq)
        {
            return Execute(() =>
            {
                using var equipmentRepository = new EquipmentRepository();
                using var equipmentDataRecordRepository = new EquipmentDataRecordRepository();
                var temps = equipmentRepository.Where(GetExpression(entity)).ToList(x => new
                {
                    x.Id,
                    x.Name,
                    x.WarehouseCode
                });

                var query = temps.GroupBy(x => new
                {
                    x.Name,
                    x.WarehouseCode
                });

                var equipmentIds = query.OrderBy(x => x.Key.Name).ThenBy(x => x.Key.WarehouseCode).Skip(pageReq.limit * (pageReq.page - 1)).Take(pageReq.limit).Select(x => x.First().Id);

                var equipments = equipmentRepository.Where(t => equipmentIds.Contains(t.Id)).Include(t => t.EquipmentType).Include(t => t.EquipmentMaintainRule).ToList();

                //var result = equipmentRepository.Where(GetExpression(entity)).Include(t => t.EquipmentType).Include(t => t.EquipmentMaintainRule).ToList();

                //var list = result.GroupBy(x => new { x.Name, x.WarehouseCode }).Select(x => x.FirstOrDefault()).OrderBy(x => x.Name);
                //var total = list.Count();
                //var equipmentList = list.Skip(pageReq.limit * (pageReq.page - 1)).Take(pageReq.limit).ToList();

                //设备状态
                var equipmentListCodeList = equipments.Select(t => t.Code).ToList();
                var equipmentDataRecordList = equipmentDataRecordRepository.Where(x => equipmentListCodeList.Contains(x.Code))
                .ToList(x => new EquipmentDataRecord
                {
                    Code = x.Code,
                    Online = x.Online,
                });

                var data = equipments.Select(x => new
                {
                    x.Id,
                    x.Code,
                    x.Name,
                    x.ImageName,
                    x.IP,
                    x.DestinationArea,
                    x.Description,
                    EquipmentTypeName = x.EquipmentType?.Name,
                    EquipmentMaintainRuleName = x.EquipmentMaintainRule?.Name,
                    x.EquipmentMaintainRuleId,
                    x.EquipmentTypeId,
                    x.WarehouseCode,
                    x.ProdTime,
                    Online = equipmentDataRecordList.Where(t => t.Code == x.Code).Select(t => t.Online).FirstOrDefault(),

                    x.Disable,
                    x.Created,
                    x.CreatedBy,
                    x.Updated,
                    x.UpdatedBy
                }).ToList();
                Response.Result = data;
                Response.Count = query.Count();
                return Response.ToJson();
            });
        }

        private Expression<Func<Equipment, bool>> GetExpression(Equipment entity)
        {
            Expression<Func<Equipment, bool>> filter = t => true;
            if (!string.IsNullOrWhiteSpace(entity.Code))
            {
                filter = filter.And(x => x.Code.Contains(entity.Code));
            }
            if (!string.IsNullOrWhiteSpace(entity.Name))
            {
                filter = filter.And(x => x.Name.Contains(entity.Name));
            }
            if (entity.EquipmentTypeId != 0)
            {
                filter = filter.And(x => x.EquipmentTypeId.Equals(entity.EquipmentTypeId));
            }
            if (!string.IsNullOrWhiteSpace(entity.IP))
            {
                filter = filter.And(t => t.IP.Contains(entity.IP));
            }

            //库别
            List<AreaClass> areaList = new List<AreaClass>();
            List<string> equipmentCodeList = new List<string>();
            if (!string.IsNullOrEmpty(entity.WarehouseCodeExt))
            {
                areaList = JsonConvert.DeserializeObject<List<AreaClass>>(entity.WarehouseCodeExt);
            }

            for (var index = 0; index < areaList.Count; index++)
            {
                var codeArr = areaList[index].value.Split(',', StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < codeArr.Length; i++)
                {
                    equipmentCodeList.Add(codeArr[i]);
                }
            }
            if (equipmentCodeList.Count > 0)
            {
                filter = filter.And(t => equipmentCodeList.Contains(t.Code));
            }


            //if (!string.IsNullOrEmpty(entity.EquipmentMaintainRule.Name))
            //{
            //    filter = filter.And(x => x.EquipmentMaintainRule.Name.Contains(entity.EquipmentMaintainRule.Name));
            //}

            //不显示链条机2、滚筒输送机4、液压升降台5、过渡滚筒机8、称重滚筒输送机(双层)9
            //filter = filter.And(x => x.EquipmentTypeId != 2 && x.EquipmentTypeId != 4 && x.EquipmentTypeId != 5 && x.EquipmentTypeId != 8 && x.EquipmentTypeId != 9);

            return filter;
        }

        public string LoadDesc(EquipmentMaintainRecord entity, int pageIndex, int pageSize)
        {
            return Execute(() =>
            {
                using var equipmentMaintainRecordRepository = new EquipmentMaintainRecordRepository();
                var result = equipmentMaintainRecordRepository.Where(GetExpression(entity)).ToList(t => new EquipmentMaintainRecord
                {
                    Id = t.Id,
                    EquipmentCode = t.EquipmentCode,
                    PartCode = t.PartCode,
                    MaintainTime = t.MaintainTime,
                });

                var query = result.GroupBy(x => new
                {
                    x.EquipmentCode,
                    x.PartCode
                });

                var equipmentMaintainRecordIds = query.Skip((pageIndex - 1) * pageSize).Take(pageSize).Select(x => x.OrderBy(x => x.MaintainTime).First().Id).ToList();

                var data = equipmentMaintainRecordRepository.Where(x => equipmentMaintainRecordIds.Contains(x.Id)).ToList(x => new EquipmentMaintainRecordDto());

                data.ForEach(t =>
                {
                    t.Days = t.MaintainTime != null ? (t.MaintainTime - DateTime.Now).Value.Days : 0;
                    if (t.Days < 0)
                    {
                        t.Status = (int)EquipmentMaintainStatus.MaintainDelay;
                    }
                    t.IndicatorTypeName = EnumHelper.GetDescription<IndicatorTypeEnums>(t.IndicatorType.ToString());
                    t.StatusDes = EnumHelper.GetDescription<EquipmentMaintainStatus>(t.Status.ToString());
                });

                //if (entity.Status == (int)EquipmentMaintainStatus.MaintainDelay)
                //{
                //    list = list.Where(t => t.Status == (int)EquipmentMaintainStatus.MaintainDelay).ToList();
                //}
                //list = list.GroupBy(x => new { x.EquipmentName, x.PartName }).Select(x => x.FirstOrDefault()).ToList();
                Response.Result = data;
                Response.Count = query.Count();
                return Response.ToJson();

            });

            #region (废弃)只显示了设备保养规则
            //return Execute(() =>
            //{
            //    var list = new EquipmentMaintainRuleDetailRepository().Where(GetExpression(entity)).Include(t => t.EquipmentTypePart).Page(pageIndex, pageSize).ToList();


            //    var dylist = list.Select(t => new
            //    {
            //        t.MaintenanceContent,
            //        t.Created,
            //        t.CreatedBy,
            //        t.UpdatedBy,
            //        t.Updated,
            //        t.Indicator,
            //        t.IndicatorType,
            //        IndicatorTypeName = EnumHelper.GetDescription<IndicatorTypeEnums>(t.IndicatorType.ToString()),
            //        t.Price,
            //        t.EquipmentTypePart?.PartName,
            //        t.EquipmentTypePart?.PartCode,
            //        t.Warning,
            //        t.Id,
            //        t.EquipmentTypePartId,
            //        t.EquipmentMaintainRuleId,
            //        t.EquipmentMaintainRuleCode,
            //    }).ToList();
            //    Response.Result = dylist;
            //    Response.Count = count;
            //    return Response.ToJson();

            //});
            #endregion
        }

        public Expression<Func<EquipmentMaintainRecord, bool>> GetExpression(EquipmentMaintainRecord entity)
        {
            Expression<Func<EquipmentMaintainRecord, bool>> filter = t => true;
            filter = filter.And(t => t.Status != (int)EquipmentMaintainStatus.Maintained);

            if (!string.IsNullOrWhiteSpace(entity.EquipmentName))
            {
                filter = filter.And(t => t.EquipmentName == entity.EquipmentName);
            }
            List<AreaClass> areaList = new List<AreaClass>();
            List<string> equipmentCodeList = new List<string>();
            if (!string.IsNullOrEmpty(entity.WarehouseCodeExt))
            {
                areaList = JsonConvert.DeserializeObject<List<AreaClass>>(entity.WarehouseCodeExt);
            }

            for (var index = 0; index < areaList.Count; index++)
            {
                var codeArr = areaList[index].value.Split(',', StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < codeArr.Length; i++)
                {
                    equipmentCodeList.Add(codeArr[i]);
                }
            }
            if (equipmentCodeList.Count > 0)
            {
                filter = filter.And(t => equipmentCodeList.Contains(t.EquipmentCode));
            }
            if (entity.Status != 0)
            {
                if (entity.Status == (int)EquipmentMaintainStatus.MaintainDelay)
                {
                    filter = filter.And(t => t.MaintainTime < DateTime.Now.Date);
                }
                else filter = filter.And(t => t.MaintainTime >= DateTime.Now.Date);
            }
            if (!string.IsNullOrWhiteSpace(entity.Maintainer))
            {
                filter = filter.And(t => t.Maintainer.Contains(entity.Maintainer));
            }
            if (entity.Created != null && entity.Updated != null)
            {
                filter = filter.And(x => x.MaintainTime >= entity.Created && x.MaintainTime <= entity.Updated);
            }
            if (entity.Created != null && entity.Updated == null)
            {
                filter = filter.And(x => x.MaintainTime >= entity.Created);
            }
            if (entity.Updated != null && entity.Created == null)
            {
                filter = filter.And(x => x.MaintainTime <= entity.Updated);
            }
            return filter;
        }

        public Expression<Func<EquipmentMaintainRuleDetail, bool>> GetExpression(EquipmentMaintainRuleDetail entity)
        {
            Expression<Func<EquipmentMaintainRuleDetail, bool>> filter = t => true;
            if (entity.EquipmentMaintainRuleId != 0)
            {
                filter = filter.And(t => t.EquipmentMaintainRuleId == entity.EquipmentMaintainRuleId);
            }
            if (entity.EquipmentTypePartId != 0)
            {
                filter = filter.And(t => t.EquipmentTypePartId == entity.EquipmentTypePartId);
            }
            if (entity.Indicator != 0 && entity.Indicator != null)
            {
                filter = filter.And(t => t.Indicator == entity.Indicator);
            }
            if (entity.IndicatorType != 0 && entity.IndicatorType != null)
            {
                filter = filter.And(t => t.IndicatorType == entity.IndicatorType);
            }
            return filter;
        }

    }
}