using APT.Infrastructure.Core;
using System;
using APT.Infrastructure.Api;
using APT.MS.Domain.Enums;
using APT.BaseData.Domain.IServices.BI;
using APT.MS.Domain.Entities.BI;
using System.Collections.Generic;
using APT.BaseData.Domain.Entities.FM;
using APT.MS.Domain.Entities.BS;
using System.Linq.Expressions;
using System.Linq;
namespace APT.BaseData.Services.Services.BI
{
    public partial class BIHomeService : CommonService, IBIHomeService
    {
        public BIHomeService(IRepository repository) : base(repository)
        {
        }
        /// 
        /// 查询首页的隐患原因
        /// 
        /// 
        /// 查询部门
        /// 
        public IEnumerable GetHomeReasons(Guid? OrgID, List listDep)
        {
            if (listDep == null || listDep.Count < 1)
            {
                return new List();
            }
            int year = DateTime.Now.Year;
            BaseFilter filter = new BaseFilter();
            filter.OrgId = OrgID;
            filter.Order = DbOrder.ASC;
            filter.Sort = "NUM";
            List listDepID = listDep.Select(e => e.ID).ToList();
            var listModelReason = GetEntities(e => !e.IS_DELETED, filter);
            Expression> expression = e => e.YEAR == year && e.TYPE == BSCaculateType.RiskReason;
            if (listDepID.Count > 1)
                expression = expression.And(e => listDepID.Contains(e.DEPARTMENT_ID));
            else
                expression = expression.And(e => e.DEPARTMENT_ID == listDepID[0]);
            BaseFilter filterR = new BaseFilter();
            filterR.OrgId = OrgID;
            //filterR.Order = DbOrder.ASC;
            //filterR.Sort = "NUMD";
            filterR.Orders.Add(new DataOrder() { Field = "NUMD", Order = DbOrder.ASC });
            filterR.Orders.Add(new DataOrder() { Field = "NUMS", Order = DbOrder.ASC });
            IEnumerable listReason = GetOrderEntities(expression, filterR);
            foreach (var item in listReason)
            {
                item.SOURCENAME = listModelReason.First(e => e.ID == item.SOURCEID).NAME;
                item.DEPARTMENTNAME = listDep.First(e => e.ID == item.DEPARTMENT_ID).NAME;
            }
            return listReason;
        }
        /// 
        /// 查询首页的隐患整改情况 月度
        /// 
        /// 
        /// 查询部门
        /// 提前月份
        /// 
        public IEnumerable GetHomeCorrect(Guid? OrgID, List listDep, int? MonthBefo = 5)
        {
            if (listDep == null || listDep.Count < 1)
            {
                return new List();
            }
            DateTime dtMin = DateTime.Now.AddMonths(-1 * MonthBefo.Value);
            List listDepID = listDep.Select(e => e.ID).ToList();
            Expression> expression = e => e.TYPE == BSCaculateType.RiskCorrect;
            if (dtMin.Year == DateTime.Now.Year)
            {
                expression = expression.And(e => e.YEAR == dtMin.Year && e.MONTH >= dtMin.Month);
            }
            else
            {
                expression = expression.And(e => ((e.YEAR == dtMin.Year && e.MONTH >= dtMin.Month) || e.YEAR > dtMin.Year));
            }
            if (listDepID.Count > 1)
                expression = expression.And(e => listDepID.Contains(e.DEPARTMENT_ID));
            else
                expression = expression.And(e => e.DEPARTMENT_ID == listDepID[0]);
            BaseFilter filterR = new BaseFilter();
            filterR.OrgId = OrgID;
            //filterR.Order = DbOrder.ASC;
            //filterR.Sort = "NUMD";
            filterR.Orders.Add(new DataOrder() { Field = "DEPARTMENT_ID", Order = DbOrder.ASC });
            filterR.Orders.Add(new DataOrder() { Field = "SOURCEVAL", Order = DbOrder.ASC });// 直接按枚举值 排序 NUMS 
            filterR.Orders.Add(new DataOrder() { Field = "YEAR", Order = DbOrder.ASC });// 直接按枚举值 排序 NUMS 
            filterR.Orders.Add(new DataOrder() { Field = "MONTH", Order = DbOrder.ASC });// 直接按枚举值 排序 NUMS 
            IEnumerable listReason = GetOrderEntities(expression, filterR);
            foreach (var item in listReason)
            {
                item.SOURCENAME = ((BSCorrectType)item.SOURCEVAL).GetDescription();
                item.DEPARTMENTNAME = listDep.First(e => e.ID == item.DEPARTMENT_ID).NAME;
            }
            return listReason;
        }
        /// 
        /// 查询首页的隐患整改情况 年度 方法使用前提 先执行一下12个月的 整改情况
        /// 
        /// 
        /// 查询部门
        /// 提前月份
        /// 
        public IEnumerable GetHomeCorrectYear(Guid? OrgID, List listDep, int MonthBefo = 0)
        {
            if (listDep == null || listDep.Count < 1)
            {
                return new List();
            }
            int year = DateTime.Now.Year;
            List listDepID = listDep.Select(e => e.ID).ToList();
            Expression> expression = e => e.TYPE == BSCaculateType.RiskCorrect && e.SOURCEVAL != 20;
            if (MonthBefo == 0)
            {
                expression = expression.And(e => e.YEAR == year);
            }
            else
            {
                DateTime dtMin = DateTime.Now.AddMonths(-1 * MonthBefo);
                expression = expression.And(e => ((e.YEAR == dtMin.Year && e.MONTH >= dtMin.Month) || e.YEAR > dtMin.Year));
            }
            if (listDepID.Count > 1)
                expression = expression.And(e => listDepID.Contains(e.DEPARTMENT_ID));
            else
                expression = expression.And(e => e.DEPARTMENT_ID == listDepID[0]);
            BaseFilter filterR = new BaseFilter();
            filterR.OrgId = OrgID;
            //filterR.Order = DbOrder.ASC;
            //filterR.Sort = "NUMD";
            filterR.Orders.Add(new DataOrder() { Field = "DEPARTMENT_ID", Order = DbOrder.ASC });
            filterR.Orders.Add(new DataOrder() { Field = "SOURCEVAL", Order = DbOrder.ASC });// 直接按枚举值 排序 NUMS 
            IEnumerable listReason = GetOrderEntities(expression, filterR);
            foreach (var item in listReason)
            {
                item.SOURCENAME = ((BSCorrectType)item.SOURCEVAL).GetDescription();
                item.DEPARTMENTNAME = listDep.First(e => e.ID == item.DEPARTMENT_ID).NAME;
            }
            return listReason;
        }
        /// 
        /// 安全检查 月度 检查类型 数量
        /// 
        /// 
        /// 查询部门
        /// 提前月份
        /// 
        public IEnumerable GetHomeCheckCountMonth(Guid? OrgID, List listDep, int? MonthBefo = 5)
        {
            if (listDep == null || listDep.Count < 1)
            {
                return new List();
            }
            DateTime dtMin = DateTime.Now.AddMonths(-1 * MonthBefo.Value);
            List listDepID = listDep.Select(e => e.ID).ToList();
            Expression> expression = e => e.TYPE == BSCaculateType.SafeCheck;
            if (dtMin.Year == DateTime.Now.Year)
            {
                expression = expression.And(e => e.YEAR == dtMin.Year && e.MONTH >= dtMin.Month);
            }
            else
            {
                expression = expression.And(e => ((e.YEAR == dtMin.Year && e.MONTH >= dtMin.Month) || e.YEAR > dtMin.Year));
            }
            if (listDepID.Count > 1)
                expression = expression.And(e => listDepID.Contains(e.DEPARTMENT_ID));
            else
                expression = expression.And(e => e.DEPARTMENT_ID == listDepID[0]);
            BaseFilter filterR = new BaseFilter();
            filterR.OrgId = OrgID;
            //filterR.Order = DbOrder.ASC;
            //filterR.Sort = "NUMD";
            filterR.Orders.Add(new DataOrder() { Field = "DEPARTMENT_ID", Order = DbOrder.ASC });
            filterR.Orders.Add(new DataOrder() { Field = "SOURCEID", Order = DbOrder.ASC });// 直接按枚举值 排序 NUMS 
            filterR.Orders.Add(new DataOrder() { Field = "MONTH", Order = DbOrder.ASC });// 直接按枚举值 排序 NUMS 
            IEnumerable listReason = GetOrderEntities(expression, filterR);
            //foreach (var item in listReason)
            //{
            //    //item.SOURCENAME = ((BSCorrectType)item.SOURCEVAL).GetDescription();
            //    item.DEPARTMENTNAME = listDep.First(e => e.ID == item.DEPARTMENT_ID).NAME;
            //}
            return listReason;
        }
    }
}