using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace BLL
{
    /// <summary>
    /// 设计变更管理
    /// </summary>
    public static class DesignChangeOrderService
    {
        public static Model.SGGLDB db = Funs.DB;

        /// <summary>
        /// 记录数
        /// </summary>
        private static int count
        {
            get;
            set;
        }

        /// <summary>
        /// 获取分页列表
        /// </summary>
        /// <param name="projectId">项目id</param>
        /// <param name="cNProfessionalId">专业id</param>
        /// <param name="startDate">下发开始时间</param>
        /// <param name="endDate">下发结束时间</param>
        /// <param name="startRowIndex"></param>
        /// <param name="maximumRows"></param>
        /// <returns></returns>
        public static IEnumerable GetListData(string projectId, string cNProfessionalId, string contents, string startDate, string endDate, int startRowIndex, int maximumRows)
        {
            IQueryable<Model.Comprehensive_DesignChangeOrder> q = from x in db.Comprehensive_DesignChangeOrder
                                                                  where x.ProjectId == projectId
                                                                  orderby x.ChangeOrderCode descending
                                                                  select x;
            if (cNProfessionalId != "0")
            {
                q = q.Where(e => e.CNProfessionalId == cNProfessionalId);
            }
            if (!string.IsNullOrEmpty(contents))
            {
                q = q.Where(e => e.Contents.Contains(contents));
            }
            //if (handleState != "0")
            //{
            //    if (handleState == "1")
            //    {
            //        q = q.Where(e => e.HandleState == "1" || e.HandleState == "2");
            //    }

            //    if (handleState == "3")
            //    {
            //        q = q.Where(e => e.HandleState == handleState);
            //    }
            //}
            if (!string.IsNullOrEmpty(startDate) && !string.IsNullOrEmpty(endDate))
            {
                q = q.Where(e => e.IssuedDate >= Funs.GetNewDateTime(startDate) && e.IssuedDate <= Funs.GetNewDateTime(endDate));
            }
            count = q.Count();
            if (count == 0)
            {
                return new object[] { "" };
            }
            return from x in q.Skip(startRowIndex).Take(maximumRows)
                   select new
                   {
                       x.DesignChangeOrderId,
                       x.ProjectId,
                       ProfessionalName = (from y in db.Base_CNProfessional where y.CNProfessionalId == x.CNProfessionalId select y.ProfessionalName).FirstOrDefault(),
                       UnitWorkName = x.UnitWorkId != null ? BLL.UnitWorkService.GetUnitWorkName(x.UnitWorkId) : null,
                       x.ChangeOrderCode,
                       x.ChangeReason,
                       x.Contents,
                       x.IssuedDate,
                       x.ApprovalDate,
                       UnitName = x.UnitId != null ? BLL.UnitService.getUnitNamesUnitIds(x.UnitId) : null,
                       x.HandleState,
                       x.AttachUrl,
                       x.CompleteDate,
                       x.ImplementationFrontState
                   };
        }
        public static IEnumerable GetListDataForDataType(string installtionId,string projectId, string cNProfessionalId, string contents, string startDate, string endDate, int startRowIndex, int maximumRows)
        {
            IQueryable<Model.Comprehensive_DesignChangeOrder> q = from x in db.Comprehensive_DesignChangeOrder
                                                                  where x.ProjectId == projectId
                                                                  orderby x.ChangeOrderCode descending
                                                                  select x;
            if (cNProfessionalId != "0")
            {
                q = q.Where(e => e.CNProfessionalId == cNProfessionalId);
            }
            if (!string.IsNullOrEmpty(contents))
            {
                q = q.Where(e => e.Contents.Contains(contents));
            }
            if (!string.IsNullOrEmpty(installtionId))
            {
                q = q.Where(e => e.UnitWorkId.Contains(installtionId));
            }
            //if (handleState != "0")
            //{
            //    if (handleState == "1")
            //    {
            //        q = q.Where(e => e.HandleState == "1" || e.HandleState == "2");
            //    }

            //    if (handleState == "3")
            //    {
            //        q = q.Where(e => e.HandleState == handleState);
            //    }
            //}
            if (!string.IsNullOrEmpty(startDate) && !string.IsNullOrEmpty(endDate))
            {
                q = q.Where(e => e.IssuedDate >= Funs.GetNewDateTime(startDate) && e.IssuedDate <= Funs.GetNewDateTime(endDate));
            }
            count = q.Count();
            if (count == 0)
            {
                return new object[] { "" };
            }
            return from x in q.Skip(startRowIndex).Take(maximumRows)
                   select new
                   {
                       x.DesignChangeOrderId,
                       x.ProjectId,
                       ProfessionalName = (from y in db.Base_CNProfessional where y.CNProfessionalId == x.CNProfessionalId select y.ProfessionalName).FirstOrDefault(),
                       UnitWorkName = x.UnitWorkId != null ? BLL.UnitWorkService.GetUnitWorkName(x.UnitWorkId) : null,
                       x.ChangeOrderCode,
                       x.ChangeReason,
                       x.Contents,
                       x.IssuedDate,
                       x.ApprovalDate,
                       UnitName = x.UnitId != null ? BLL.UnitService.getUnitNamesUnitIds(x.UnitId) : null,
                       x.HandleState,
                       x.AttachUrl,
                       x.CompleteDate,
                       x.ImplementationFrontState
                   };
        }

        /// <summary>
        /// 获取分页列表数
        /// </summary>
        /// <param name="projectId"></param>
        /// <param name="cNProfessionalId"></param>
        /// <param name="startDate"></param>
        /// <param name="endDate"></param>
        /// <returns></returns>
        public static int GetListCount(string projectId, string cNProfessionalId, string contents, string startDate, string endDate)
        {
            return count;
        }
        public static int GetListCountForDataType(string installtionId, string projectId, string cNProfessionalId, string contents, string startDate, string endDate)
        {
            return count;
        }

        /// <summary>
        /// 根据主键获取设计变更管理
        /// </summary>
        /// <param name="designChangeOrderId"></param>
        /// <returns></returns>
        public static Model.Comprehensive_DesignChangeOrder GetDesignChangeOrderById(string designChangeOrderId)
        {
            return Funs.DB.Comprehensive_DesignChangeOrder.FirstOrDefault(e => e.DesignChangeOrderId == designChangeOrderId);
        }

        /// <summary>
        /// 添加设计变更单管理
        /// </summary>
        /// <param name="desginChangeOrder"></param>
        public static void AddDesignChangeOrder(Model.Comprehensive_DesignChangeOrder desginChangeOrder)
        {
            Model.SGGLDB db = Funs.DB;
            Model.Comprehensive_DesignChangeOrder newDesignChangeOrder = new Model.Comprehensive_DesignChangeOrder();
            newDesignChangeOrder.DesignChangeOrderId = desginChangeOrder.DesignChangeOrderId;
            newDesignChangeOrder.ProjectId = desginChangeOrder.ProjectId;
            newDesignChangeOrder.CNProfessionalId = desginChangeOrder.CNProfessionalId;
            newDesignChangeOrder.UnitWorkId = desginChangeOrder.UnitWorkId;
            newDesignChangeOrder.ChangeOrderCode = desginChangeOrder.ChangeOrderCode;
            newDesignChangeOrder.ChangeReason = desginChangeOrder.ChangeReason;
            newDesignChangeOrder.Contents = desginChangeOrder.Contents;
            newDesignChangeOrder.IssuedDate = desginChangeOrder.IssuedDate;
            newDesignChangeOrder.ApprovalDate = desginChangeOrder.ApprovalDate;
            newDesignChangeOrder.UnitId = desginChangeOrder.UnitId;
            newDesignChangeOrder.HandleState = desginChangeOrder.HandleState;
            newDesignChangeOrder.AttachUrl = desginChangeOrder.AttachUrl;
            newDesignChangeOrder.ImplementationFrontState = desginChangeOrder.ImplementationFrontState;
            newDesignChangeOrder.CompileMan = desginChangeOrder.CompileMan;
            newDesignChangeOrder.CompileDate = desginChangeOrder.CompileDate;
            newDesignChangeOrder.CompleteDate = desginChangeOrder.CompleteDate;
            newDesignChangeOrder.Status = desginChangeOrder.Status;
            db.Comprehensive_DesignChangeOrder.InsertOnSubmit(newDesignChangeOrder);
            db.SubmitChanges();
        }

        /// <summary>
        /// 修改设计变更单管理
        /// </summary>
        /// <param name="designChangeOrder"></param>
        public static void UpdateDesignChangeOrder(Model.Comprehensive_DesignChangeOrder desginChangeOrder)
        {
            Model.SGGLDB db = Funs.DB;
            Model.Comprehensive_DesignChangeOrder newDesignChangeOrder = db.Comprehensive_DesignChangeOrder.FirstOrDefault(e => e.DesignChangeOrderId == desginChangeOrder.DesignChangeOrderId);
            if (newDesignChangeOrder != null)
            {
                newDesignChangeOrder.ProjectId = desginChangeOrder.ProjectId;
                newDesignChangeOrder.CNProfessionalId = desginChangeOrder.CNProfessionalId;
                newDesignChangeOrder.UnitWorkId = desginChangeOrder.UnitWorkId;
                newDesignChangeOrder.ChangeOrderCode = desginChangeOrder.ChangeOrderCode;
                newDesignChangeOrder.ChangeReason = desginChangeOrder.ChangeReason;
                newDesignChangeOrder.Contents = desginChangeOrder.Contents;
                newDesignChangeOrder.IssuedDate = desginChangeOrder.IssuedDate;
                newDesignChangeOrder.ApprovalDate = desginChangeOrder.ApprovalDate;
                newDesignChangeOrder.UnitId = desginChangeOrder.UnitId;
                newDesignChangeOrder.HandleState = desginChangeOrder.HandleState;
                newDesignChangeOrder.AttachUrl = desginChangeOrder.AttachUrl;
                newDesignChangeOrder.ImplementationFrontState = desginChangeOrder.ImplementationFrontState;
                newDesignChangeOrder.CompleteDate = desginChangeOrder.CompleteDate;
                newDesignChangeOrder.Status = desginChangeOrder.Status;
                db.SubmitChanges();
            }
        }

        /// <summary>
        /// 根据主键删除设计变更单管理
        /// </summary>
        /// <param name="desginChangeOrderId"></param>
        public static void DeleteDesginChangeOrder(string desginChangeOrderId)
        {
            Model.SGGLDB db = Funs.DB;
            Model.Comprehensive_DesignChangeOrder designChangeOrder = db.Comprehensive_DesignChangeOrder.FirstOrDefault(e => e.DesignChangeOrderId == desginChangeOrderId);
            if (designChangeOrder != null)
            {
                if (!string.IsNullOrEmpty(designChangeOrder.AttachUrl))
                {
                    BLL.UploadAttachmentService.DeleteFile(Funs.RootPath, designChangeOrder.AttachUrl);//删除附件
                }
                db.Comprehensive_DesignChangeOrder.DeleteOnSubmit(designChangeOrder);
                db.SubmitChanges();
            }
        }

        /// <summary>
        /// 根据装置判断是否存在设计变更单管理
        /// </summary>
        /// <param name="UnitWorkId">装置Id</param>
        /// <returns></returns>
        public static bool IsExitDesignChangeOrderByUnitWorkId(string UnitWorkId)
        {
            return (from x in Funs.DB.Comprehensive_DesignChangeOrder
                    where x.UnitWorkId == UnitWorkId
                    select x).Count() > 0;
        }

        /// <summary>
        /// 根据专业获取对应时间内的设计变更单集合
        /// </summary>
        /// <param name="projectId"></param>
        /// <param name="cNProfessionalId"></param>
        /// <param name="startDate"></param>
        /// <param name="SoptDate"></param>
        /// <param name="isOnceQualified"></param>
        /// <returns></returns>
        public static List<Model.Comprehensive_DesignChangeOrder> GetDesignChangeOrderListByCNProfessionalIdAndDate(string projectId, string cNProfessionalId, DateTime startDate, DateTime SoptDate)
        {
            List<Model.Comprehensive_DesignChangeOrder> DesignChangeOrderList = (from x in Funs.DB.Comprehensive_DesignChangeOrder where x.ProjectId == projectId select x).ToList();
            if (!string.IsNullOrEmpty(cNProfessionalId) && cNProfessionalId != "0")
            {
                DesignChangeOrderList = (from x in DesignChangeOrderList where x.CNProfessionalId == cNProfessionalId select x).ToList();
            }
            if (startDate != null && SoptDate != null)
            {
                DesignChangeOrderList = (from x in DesignChangeOrderList where x.IssuedDate >= startDate && x.IssuedDate <= SoptDate select x).ToList();
            }

            return DesignChangeOrderList;
        }
        public static List<Model.Comprehensive_DesignChangeOrder> GetDesignChangeOrderListByUnitIdAndDate(string projectId, string unitId, DateTime startDate, DateTime SoptDate)
        {
            List<Model.Comprehensive_DesignChangeOrder> DesignChangeOrderList = (from x in Funs.DB.Comprehensive_DesignChangeOrder where x.ProjectId == projectId select x).ToList();
            if (!string.IsNullOrEmpty(unitId) && unitId != "0")
            {
                DesignChangeOrderList = (from x in DesignChangeOrderList where x.UnitId == unitId select x).ToList();
            }
            if (startDate != null && SoptDate != null)
            {
                DesignChangeOrderList = (from x in DesignChangeOrderList where x.IssuedDate >= startDate && x.IssuedDate <= SoptDate select x).ToList();
            }

            return DesignChangeOrderList;
        }
    }
}