namespace FineUIPro.Web
{
    using BLL;
    using Model;
    using System;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Configuration;
    using System.Globalization;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Data;
    using System.Data.SqlClient;

    public class Global : System.Web.HttpApplication
    {
        /// <summary>
        /// 自动启用插件标志文件路径
        /// </summary>
        private static string applicationActiveFlagFilePhysicalPath = String.Empty;

        protected void Application_Start(object sender, EventArgs e)
        {
            Application["OnlineUserCount"] = 0;
            try
            {
                Funs.RootPath = Server.MapPath("~/");
                Funs.ClientId = ConfigurationManager.AppSettings["clientId"];
                Funs.ClientSecret = ConfigurationManager.AppSettings["clientSecret"];
                Funs.Redirect_url = ConfigurationManager.AppSettings["redirect_url"];

                // 日志文件所在目录
                ErrLogInfo.DefaultErrLogFullPath = Server.MapPath("~/ErrLog.txt");
                //Funs.ConnString = ConfigurationManager.AppSettings["ConnectionString"];
                Funs.SystemName = ConfigurationManager.AppSettings["SystemName"];
                Funs.LdapUrl = ConfigurationManager.AppSettings["LdapUrl"];
                Funs.ConnString = ConfigurationManager.ConnectionStrings["EProjectDBConnectionString"].ConnectionString;
            }
            catch (Exception ex)
            {
                ErrLogInfo.WriteLog(ex);
                AppDomain.Unload(AppDomain.CurrentDomain);
            }

            //每年1月份邮件提醒前一年项目状态为MC的项目,同时PM / EM编辑器的Pressure Piping打勾
            if (DateTime.Now.Month == 1 && DateTime.Now.Day == 1)
            {
                System.Timers.Timer aTimer = new System.Timers.Timer();
                //1小时执行一次
                aTimer.Interval = 3600000;
                aTimer.Enabled = true;
                aTimer.Start();
                aTimer.Elapsed += new System.Timers.ElapsedEventHandler(PressurePiping);
            }

            //当Const.Kick - off Meeting不为空时,每月20号发送提醒邮件给CM,当MC不为空时,停止发送提醒邮件。
            if (DateTime.Now.Day == 20)
            {
                System.Timers.Timer aTimer = new System.Timers.Timer();
                //1小时执行一次
                aTimer.Interval = 3600000;
                aTimer.Enabled = true;
                aTimer.Start();
                aTimer.Elapsed += new System.Timers.ElapsedEventHandler(ConstInfoMaintenance);
            }

            //计划:邮件26号自动发送提醒,下月5号冻结
            if (DateTime.Now.Day == 26)
            {
                System.Timers.Timer aTimer = new System.Timers.Timer();
                //1小时执行一次
                aTimer.Interval = 3600000;
                aTimer.Enabled = true;
                aTimer.Start();
                aTimer.Elapsed += new System.Timers.ElapsedEventHandler(PlanProject);
            }

            //实际:邮件21号自动发送提醒,当月25号冻结。
            if (DateTime.Now.Day == 21)
            {
                System.Timers.Timer aTimer = new System.Timers.Timer();
                //1小时执行一次
                aTimer.Interval = 3600000;
                aTimer.Enabled = true;
                aTimer.Start();
                aTimer.Elapsed += new System.Timers.ElapsedEventHandler(ActualProject);
            }
            //项目状态MC之后1个月时(由5个月改为1个月)
            if (DateTime.Now.Hour == 10)
            {
                System.Timers.Timer aTimer = new System.Timers.Timer();
                //1小时执行一次
                aTimer.Interval = 3600000;
                aTimer.Enabled = true;
                aTimer.Start();
                aTimer.Elapsed += new System.Timers.ElapsedEventHandler(MCEmial);
            }
            //填写第二张资源时,第一张资源预留一个月的时候填写人工时
            if (DateTime.Now.Hour == 10)
            {
                System.Timers.Timer aTimer = new System.Timers.Timer();
                //1小时执行一次
                aTimer.Interval = 3600000 ;
                aTimer.Enabled = true;
                aTimer.Start();
                aTimer.Elapsed += new System.Timers.ElapsedEventHandler(UpdateManHourDisabled);                
            }

            // MC证书提醒
            if ((DateTime.Now.Day == 1 || DateTime.Now.Day == 16) && DateTime.Now.Hour == 10)
            {
                System.Timers.Timer aTimer = new System.Timers.Timer();
                //1小时执行一次
                aTimer.Interval = 3600000;
                aTimer.Enabled = true;
                aTimer.Start();
                aTimer.Elapsed += new System.Timers.ElapsedEventHandler(MCSigned_AutoSend);
            }

            // FC证书提醒
            if ((DateTime.Now.Day == 1 || DateTime.Now.Day == 16) && DateTime.Now.Hour == 10)
            {
                System.Timers.Timer aTimer = new System.Timers.Timer();
                //1小时执行一次
                aTimer.Interval = 3600000;
                aTimer.Enabled = true;
                aTimer.Start();
                aTimer.Elapsed += new System.Timers.ElapsedEventHandler(FCSigned_AutoSend);
            }

            // Punch_Check_Send
            if (DateTime.Now.Hour == 10)
            {
                System.Timers.Timer aTimer = new System.Timers.Timer();
                //1小时执行一次
                aTimer.Interval = 60 * 60 * 1000;
                aTimer.Enabled = true;
                aTimer.Start();
                aTimer.Elapsed += new System.Timers.ElapsedEventHandler(Punch_Check_Send);
            }

            // Design Input
            if (DateTime.Now.Hour == 9)
            {
                System.Timers.Timer aTimer = new System.Timers.Timer();
                //2小时执行一次
                aTimer.Interval = 120 * 60 * 1000;
                aTimer.Enabled = true;
                aTimer.Start();
                aTimer.Elapsed += new System.Timers.ElapsedEventHandler(Design_Input_Send);
            }

            // 项目达到条件自动关闭
            if (DateTime.Now.Hour == 16)
            {
                System.Timers.Timer aTimer = new System.Timers.Timer();
                //2小时执行一次
                aTimer.Interval = 120 * 60 * 1000;
                aTimer.Enabled = true;
                aTimer.Start();
                aTimer.Elapsed += new System.Timers.ElapsedEventHandler(Auto_Close);
            }
        }

        #region 压力管道注册提醒
        /// <summary>
        /// 每年1月份邮件提醒前一年项目状态为MC的项目,同时PM/EM编辑器的Pressure Piping打勾
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PressurePiping(object sender, System.Timers.ElapsedEventArgs e)
        {
            int m = DateTime.Now.Month;
            int d = DateTime.Now.Day;
            int h = DateTime.Now.Hour;

            if (m == 1 && d == 1 && h == 10)
            {
                int y = Convert.ToInt32(DateTime.Now.ToString("yy")) - 1;
                List<Model.Editor_EProject> eplist = new List<Model.Editor_EProject>();
                eplist = (from x in Funs.DB.Editor_EProject where x.PM_PressurePipingChecked == true && x.ProjectControl_JobStatus == "MC" && x.ProjectControl_JobNo.Substring(0, 2) == y.ToString() select x).ToList();

                if (eplist.Count > 0)
                {
                    for (int i = 0; i < eplist.Count; i++)
                    {
                        if (eplist[i].PM_PressurePipingChecked == true)
                        {
                            PageBase bg = new PageBase();
                            NameValueCollection nameValue = new NameValueCollection();
                            nameValue.Add("projectNo", eplist[i].ProjectControl_JobNo.ToString());
                            nameValue.Add("projectName", eplist[i].ProjectControl_JobTitle.ToString());
                            bg.EmailSendMessage(eplist[i], BLL.Const.PPRRString, nameValue, BLL.Const.CustomString, BLL.Const.NoprojectString);

                            //Pressure Piping的PLAN自动 = 次年3月1日
                            Editor_EProject editor_EProject = BLL.EProjectService.GeteProjectById(eplist[i].EProjectId);
                            if (editor_EProject != null)
                            {
                                editor_EProject = eplist[i];
                                editor_EProject.PM_PP_PressurePiping = Funs.GetNewDateTime(DateTime.Now.Year + "-03-01");
                                BLL.EProjectService.UpdateProject(editor_EProject, "PM");
                            }
                        }
                    }
                }
            }
        }
        #endregion

        #region 施工信息维护提醒
        /// <summary>
        /// 当Const.Kick - off Meeting不为空时,每月20号发送提醒邮件给CM,当MC不为空时,停止发送提醒邮件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ConstInfoMaintenance(object sender, System.Timers.ElapsedEventArgs e)
        {
            int d = DateTime.Now.Day;
            int h = DateTime.Now.Hour;
            if (d == 20 && h == 9)
            {
                List<Model.Editor_EProject> eplist = new List<Model.Editor_EProject>();
                eplist = (from x in Funs.DB.Editor_EProject where x.CM_KickOffMetting.HasValue && !x.CM_MA_MC.HasValue select x).ToList();
                if (eplist.Count > 0)
                {
                    for (int i = 0; i < eplist.Count; i++)
                    {
                        PageBase bg = new PageBase();
                        NameValueCollection nameValue = new NameValueCollection();
                        nameValue.Add("projectNo", eplist[i].ProjectControl_JobNo.ToString());
                        nameValue.Add("projectName", eplist[i].ProjectControl_JobTitle.ToString());
                        bg.EmailSendMessage(eplist[i], BLL.Const.CIMRString, nameValue, BLL.Const.CustomString, BLL.Const.projectString);
                    }
                }
            }
        }
        #endregion

        #region 计划:邮件26号自动发送提醒,下月5号冻结
        /// <summary>
        /// 计划:邮件26号自动发送提醒,下月5号冻结
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PlanProject(object sender, System.Timers.ElapsedEventArgs e)
        {
            int d = DateTime.Now.Day;
            int h = DateTime.Now.Hour;
            if (d == 26 && h == 9)
            {
                PageBase bg = new PageBase();
                bg.EmailSendMessage(null, BLL.Const.SASString, null, BLL.Const.NoCustomString, BLL.Const.NoprojectString);
            }
        }
        #endregion

        #region 实际:邮件21号自动发送提醒,当月25号冻结。
        /// <summary>
        /// 实际:邮件21号自动发送提醒,当月25号冻结。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ActualProject(object sender, System.Timers.ElapsedEventArgs e)
        {
            int d = DateTime.Now.Day;
            int h = DateTime.Now.Hour;
            if (d == 21 && h == 9)
            {
                PageBase bg = new PageBase();
                bg.EmailSendMessage(null, BLL.Const.AASString, null, BLL.Const.NoCustomString, BLL.Const.NoprojectString);
            }
        }
        #endregion

        #region 项目状态MC之后3个月时发邮件,4个月人工时填写关闭
        /// <summary>
        /// 项目状态MC之后1个月时(由5个月改为1个月)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MCEmial(object sender, System.Timers.ElapsedEventArgs e)
        {
            var eplist = (from x in Funs.DB.Editor_EProject
                          where x.CM_MA_MC.Value.AddMonths(3).Year == DateTime.Now.Year 
                                && x.CM_MA_MC.Value.AddMonths(3).Month == DateTime.Now.Month 
                                && x.CM_MA_MC.Value.AddMonths(3).Day == DateTime.Now.Day
                          select x).ToList();
            if (eplist.Count > 0)
            {
                for (int i = 0; i < eplist.Count; i++)
                {
                    PageBase bg = new PageBase();
                    NameValueCollection nameValue = new NameValueCollection();
                    nameValue.Add("projectName", eplist[i].ProjectControl_JobTitle.ToString().Trim());
                    nameValue.Add("projectNo", eplist[i].ProjectControl_JobNo.ToString().Trim());
                    nameValue.Add("CM_MA_MC", Convert.ToDateTime(eplist[i].CM_MA_MC).AddMonths(4).ToString("yyyy-MM-dd"));
                    nameValue.Add("BUCode", eplist[i].ProjectControl_BUCode);
                    bg.EmailSendMessage(eplist[i], BLL.Const.FIRILHString, nameValue, BLL.Const.CustomString, BLL.Const.projectString2);
                }
            }
            //项目的人员的人工时自动关闭(MC时间 + 4个月-- >> 项目成员的人工时disable置为1)(由原来的6个月改为4个月)
            var eplist1 = (from x in Funs.DB.Editor_EProject
                           where x.CM_MA_MC.Value.AddMonths(4).Year == DateTime.Now.Year
                                && x.CM_MA_MC.Value.AddMonths(4).Month == DateTime.Now.Month
                                && x.CM_MA_MC.Value.AddMonths(4).Day == DateTime.Now.Day
                           select x).ToList();
            if (eplist1.Count > 0)
            {
                for (int i = 0; i < eplist1.Count; i++)
                {
                    List<Model.ManHours_Plan> manHours_Plans = (from x in Funs.DB.ManHours_Plan where x.EProjectId == eplist1[i].EProjectId select x).ToList();
                    if (manHours_Plans.Count > 0)
                    {
                        for (int a = 0; a < manHours_Plans.Count; a++)
                        {
                            var manHours_Plan = Funs.DB.ManHours_Plan.FirstOrDefault(x => x.ManHoursPlanId == manHours_Plans[i].ManHoursPlanId);
                            if (manHours_Plan != null)
                            {
                                manHours_Plan.AccountDisabled = 1;
                                Funs.DB.SubmitChanges();
                            }
                        }
                    }
                }
            }
        }
        #endregion

        #region 1、填写第二张资源时,第一张资源预留一个月的时候填写人工时 2、Cancelled或Hold也预留一个月
        /// <summary>
        /// 填写第二张资源时,第一张资源预留一个月的时候填写人工时
        /// MOC和Projects项目
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void UpdateManHourDisabled(object sender, System.Timers.ElapsedEventArgs e)
        {
            var eprojects = (from x in Funs.DB.Resource_Plan select x).GroupBy(x => x.EProjectId).ToList();
            if (eprojects != null)
            {
                foreach (var epr in eprojects)
                {
                    var planLists = (from x in Funs.DB.Resource_Plan
                                     join y in Funs.DB.Editor_EProject on x.EProjectId equals y.EProjectId
                                     where x.EProjectId == epr.Key && (y.ProjectControl_JobType == "Projects" || y.ProjectControl_JobType == "MOC")
                                     orderby x.CreateDate ascending
                                     select new { x.ResourcePlanId, y.PM_MA_ProjectApproval }).ToList();
                    if (planLists.Count() == 2)
                    {
                        if (planLists[0].PM_MA_ProjectApproval.HasValue && planLists[0].PM_MA_ProjectApproval.Value.AddMonths(1) <= DateTime.Now)
                        {
                            var manHours_Plan = Funs.DB.ManHours_Plan.FirstOrDefault(x => x.ResourcePlanId == planLists[0].ResourcePlanId);
                            if (manHours_Plan != null)
                            {
                                manHours_Plan.AccountDisabled = 1;
                                Funs.DB.SubmitChanges();
                            }
                        }
                    }
                }
            }

            var epList=from x in Funs.DB.Editor_EProject 
                   where (x.ProjectControl_PC_CancelDate.HasValue && x.ProjectControl_PC_CancelDate.Value.AddMonths(1) <= DateTime.Now && x.ProjectControl_PC_CancelDate.Value.AddMonths(2) >= DateTime.Now)
                          || (x.Job_Hold.HasValue && x.Job_Hold.Value.AddMonths(1)<= DateTime.Now && x.Job_Hold.Value.AddMonths(2) >= DateTime.Now)
                   select x;
            foreach (var ep in epList)
            {
                var manHours_Plan = Funs.DB.ManHours_Plan.FirstOrDefault(x => x.EProjectId == ep.EProjectId);
                if (manHours_Plan != null)
                {
                    manHours_Plan.AccountDisabled = 1;
                    Funs.DB.SubmitChanges();
                }
            }
        }
        #endregion

        #region MC证书提醒
        private void MCSigned_AutoSend(object sender, System.Timers.ElapsedEventArgs e)
        {
            string strSql = @"SELECT pro.EProjectId,pro.ProjectControl_JobNo,pro.ProjectControl_JobTitle,pro.ProjectControl_ConstManagerId
                                FROM dbo.Editor_EProject pro
                               WHERE pro.CM_MA_MC IS NOT NULL AND  DATEDIFF(DAY,pro.CM_MA_MC,GETDATE())>30
                                     AND (pro.ProjectControl_JobType='Projects' OR pro.ProjectControl_JobType='Small Invest')
	                                 AND pro.ProjectControl_JobStatus='MC' 
                                     AND (SELECT COUNT(*) FROM dbo.Editor_TDC tdc 
                                           WHERE tdc.EProjectId=pro.EProjectId AND tdc.[Type]='D11_MC' AND tdc.ReceiveHC IS NOT NULL)=0";
            DataTable dt = BLL.SQLHelper.GetDataTableRunText(strSql, null);
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Model.Editor_EProject ep = new Editor_EProject();
                    ep.EProjectId = dt.Rows[i]["EProjectId"].ToString();
                    ep.ProjectControl_JobNo = dt.Rows[i]["ProjectControl_JobNo"].ToString();
                    if (dt.Rows[i]["ProjectControl_ConstManagerId"] != null)
                    {
                        ep.ProjectControl_ConstManagerId = dt.Rows[i]["ProjectControl_ConstManagerId"].ToString();
                    }
                    else
                    {
                        ep.ProjectControl_ConstManagerId = string.Empty;
                    }
                    PageBase bg = new PageBase();
                    NameValueCollection nameValue = new NameValueCollection();
                    nameValue.Add("projectNo", dt.Rows[i]["ProjectControl_JobNo"].ToString());
                    nameValue.Add("projectName", dt.Rows[i]["ProjectControl_JobTitle"].ToString());
                    bg.EmailSendMessage(ep, BLL.Const.MCSigned, nameValue, BLL.Const.CustomString, BLL.Const.projectString4);
                }
            }
        }
        #endregion

        #region FC证书提醒
        private void FCSigned_AutoSend(object sender, System.Timers.ElapsedEventArgs e)
        {
            string strSql = @"SELECT pro.EProjectId,pro.ProjectControl_JobNo,pro.ProjectControl_JobTitle,pro.ProjectControl_ProjectManagerId
                               FROM dbo.Editor_EProject pro
                               WHERE pro.CM_MA_MC IS NOT NULL AND  DATEDIFF(DAY,pro.CM_MA_MC,GETDATE())>83
                                     AND pro.ProjectControl_JobType='Projects' AND pro.ProjectControl_OrginalBudget>1000000
	                                 AND pro.ProjectControl_JobStatus='MC'
                                     AND (SELECT COUNT(*) FROM dbo.Editor_TDC tdc 
                                           WHERE tdc.EProjectId=pro.EProjectId AND tdc.[Type]='D30_FC' AND tdc.ReceiveHC IS NOT NULL)=0";
            DataTable dt = BLL.SQLHelper.GetDataTableRunText(strSql, null);
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Model.Editor_EProject ep = new Editor_EProject();
                    ep.EProjectId = dt.Rows[i]["EProjectId"].ToString();
                    ep.ProjectControl_JobNo = dt.Rows[i]["ProjectControl_JobNo"].ToString();
                    if (dt.Rows[i]["ProjectControl_ProjectManagerId"] != null)
                    {
                        ep.ProjectControl_ConstManagerId = dt.Rows[i]["ProjectControl_ProjectManagerId"].ToString();
                    }
                    else
                    {
                        ep.ProjectControl_ConstManagerId = string.Empty;
                    }
                    PageBase bg = new PageBase();
                    NameValueCollection nameValue = new NameValueCollection();
                    nameValue.Add("projectNo", dt.Rows[i]["ProjectControl_JobNo"].ToString());
                    nameValue.Add("projectName", dt.Rows[i]["ProjectControl_JobTitle"].ToString());
                    bg.EmailSendMessage(ep, BLL.Const.FCSigned, nameValue, BLL.Const.CustomString, BLL.Const.projectString4);
                }
            }
        }
        #endregion

        #region Punch_Check_Send
        private void Punch_Check_Send(object sender, System.Timers.ElapsedEventArgs e)
        {
            PageBase bg = new PageBase();

            // 发送给CTECheckerName
            var punchCTEList = from x in Funs.DB.Editor_Punch
                               join y in Funs.DB.Editor_EProject on x.EProjectId equals y.EProjectId
                               where !x.CTECheckDate.HasValue && x.PlanedFinishDate.HasValue
                                     && (x.CTECheckerId != null && x.CTECheckerId != "")
                                     && (DateTime.Now.AddDays(7).Date == x.PlanedFinishDate.Value.Date
                                     || DateTime.Now.AddDays(3).Date == x.PlanedFinishDate.Value.Date)
                               select new
                               {
                                   y.ProjectControl_JobNo,
                                   y.ProjectControl_JobTitle,
                                   x.CTECheckerId,
                                   x.CTECheckerName,
                                   x.TagNo,
                                   x.Description
                               };
            if (punchCTEList.Count() > 0)
            {
                foreach (var p in punchCTEList)
                {
                    NameValueCollection nameValue = new NameValueCollection();
                    nameValue.Add("projectNo", p.ProjectControl_JobNo.ToString().Trim());
                    nameValue.Add("projectName", p.ProjectControl_JobTitle.ToString().Trim());
                    nameValue.Add("CheckName", p.CTECheckerName.Trim());
                    nameValue.Add("TagNo", p.TagNo.Trim());
                    nameValue.Add("Description", p.Description.Trim());
                    Model.Sys_User sys_User = new Model.Sys_User();
                    sys_User = BLL.Sys_UserService.GetUsersByUserId(p.CTECheckerId);
                    List<Model.Sys_User> list = new List<Model.Sys_User>();
                    list.Add(sys_User);
                    bg.EmailSendMessage(BLL.Const.CCOCString, nameValue, BLL.Const.CustomString, list, "CTE Check");
                }
            }

            // 发送给OwnerCheckerName 去掉
            //var punchOwnerList = from x in Funs.DB.Editor_Punch
            //                     join y in Funs.DB.Editor_EProject on x.EProjectId equals y.EProjectId
            //                     where !x.OwnerCheckDate.HasValue && x.CTECheckDate.HasValue
            //                           && (x.OwnerCheckerId != null && x.OwnerCheckerId != "")
            //                           && x.CTECheckDate.Value.AddDays(7).Date == DateTime.Now.Date
            //                     select new
            //                     {
            //                         y.ProjectControl_JobNo,
            //                         y.ProjectControl_JobTitle,
            //                         x.OwnerCheckerId,
            //                         x.OwnerCheckerName,
            //                         x.TagNo,
            //                         x.Description
            //                     };
            //if (punchOwnerList.Count() > 0)
            //{
            //    foreach (var p in punchOwnerList)
            //    {
            //        NameValueCollection nameValue = new NameValueCollection();
            //        nameValue.Add("projectNo", p.ProjectControl_JobNo.ToString().Trim());
            //        nameValue.Add("projectName", p.ProjectControl_JobTitle.ToString().Trim());
            //        nameValue.Add("CheckName", p.OwnerCheckerName.Trim());
            //        nameValue.Add("TagNo", p.TagNo.Trim());
            //        nameValue.Add("Description", p.Description.Trim());
            //        Model.Sys_User sys_User = new Model.Sys_User();
            //        sys_User = BLL.Sys_UserService.GetUsersByUserId(p.OwnerCheckerId);
            //        List<Model.Sys_User> list = new List<Model.Sys_User>();
            //        list.Add(sys_User);
            //        bg.EmailSendMessage(BLL.Const.CCOCString, nameValue, BLL.Const.CustomString, list, "CTE Check");
            //    }
            //}
        }
        #endregion

        #region 设计输入二次邮件提醒
        private void Design_Input_Send(object sender, System.Timers.ElapsedEventArgs e)
        {
            PageBase bg = new PageBase();

            // 1、	系统在项目计划(改为实际)批准当天自动给项目经理发送提醒邮件,提醒项目经理完成设计输入策划工作,并只适用于CTE设计的项目。
            var eprojectList = from x in BLL.Funs.DB.Editor_EProject
                               where x.PM_General_CDI== "CTE" && x.PM_MA_ProjectApproval.HasValue &&
                                 x.PM_MA_ProjectApproval.Value.Date == DateTime.Now.Date && x.DesignInputMailIsSend == null
                           select x;
            if (eprojectList.Count() > 0)
            {
                foreach (var eproject in eprojectList)
                {
                    BLL.DesignInputService.DesignInputMailSend(eproject.EProjectId, true);
                    NameValueCollection nameValue = new NameValueCollection();
                    nameValue.Add("projectNo", eproject.ProjectControl_JobNo);
                    nameValue.Add("IssuedDiscOrNo", eproject.ProjectControl_JobNo + "-" + eproject.ProjectControl_JobTitle);
                    nameValue.Add("Person_Ch", "");
                    nameValue.Add("Person_En", "");
                    if (!string.IsNullOrEmpty(eproject.ProjectControl_ProjectManagerId))
                    {
                        Model.Sys_User sys_User = new Model.Sys_User();
                        sys_User = BLL.Sys_UserService.GetUsersByUserId(eproject.ProjectControl_ProjectManagerId);
                        nameValue.Add("UserName", sys_User.UserName);
                        List<Model.Sys_User> list = new List<Model.Sys_User>();

                        list.Add(sys_User);
                        bg.EmailSendMessage(BLL.Const.DesignInputString, nameValue, BLL.Const.CustomString, list, "");
                    }
                }
            }

            string strSql = @"SELECT p.ProjectControl_JobNo,p.ProjectControl_JobTitle,u.UserName,u.ChineseName,
                                     d.DesignInputId,d.DesignInputNo,d.DesignInputChName,d.DesignInputEnName,d.IssuedMan
                                FROM dbo.Design_Input d
								LEFT JOIN dbo.Editor_EProject p ON p.EProjectId = d.EProjectId
								LEFT JOIN dbo.Sys_User u ON u.UserId =p.ProjectControl_ProjectManagerId
                               WHERE (SELECT COUNT(*) FROM dbo.Design_Notice n WHERE d.DesignInputId=n.DesignInputId)=0
                                      AND DATEADD(dd,5,d.PlanStartDate)<GETDATE() 
									  AND d.MailIsWarn IS NULL
									  AND d.IssuedMan IS NOT NULL AND d.PlanStartDate IS NOT NULL AND d.PlanEndDate IS NOT NULL
								ORDER BY d.EProjectId";
            // 查找未完成的设计输入
            DataTable dt = SQLHelper.GetDataTableRunText(strSql, null);
            for (int i = 0; i < dt.Rows.Count; i++)
            {
               
                NameValueCollection nameValue = new NameValueCollection();
                nameValue.Add("projectNo", dt.Rows[i]["ProjectControl_JobNo"].ToString());
                nameValue.Add("IssuedDiscOrNo", dt.Rows[i]["ProjectControl_JobNo"].ToString() + "-" + dt.Rows[i]["ProjectControl_JobTitle"].ToString() + "," + dt.Rows[i]["DesignInputChName"].ToString() + " " + dt.Rows[i]["DesignInputEnName"].ToString() + " " + dt.Rows[i]["DesignInputNo"].ToString());
                nameValue.Add("Person_Ch", dt.Rows[i]["ChineseName"].ToString());
                nameValue.Add("Person_En", dt.Rows[i]["UserName"].ToString());

                if (dt.Rows[i]["IssuedMan"].ToString() != "")
                {
                    // 更新已提醒
                    BLL.DesignInputService.DesignInputEmailIsWarn(dt.Rows[i]["DesignInputId"].ToString(), true);

                    Model.Sys_User sys_User = new Model.Sys_User();
                    sys_User = BLL.Sys_UserService.GetUsersByUserId(dt.Rows[i]["IssuedMan"].ToString());
                    nameValue.Add("UserName", sys_User.UserName);
                    List<Model.Sys_User> list = new List<Model.Sys_User>();

                    list.Add(sys_User);
                    bg.EmailSendMessage(BLL.Const.DesignInputString, nameValue, BLL.Const.CustomString, list, "");
                }
            }

            // 待办人二次邮件提醒
            string noticeSql = @"SELECT p.ProjectControl_JobNo,p.ProjectControl_JobTitle, input.DesignInputNo,input.DesignInputChName,
                                        input.DesignInputEnName,n.MutualIssuedNo,flow.DesignNoticeId,flow.NoticeFlowId,flow.SubmitMan
                                   FROM dbo.Design_NoticeFlow flow
                                   LEFT JOIN dbo.Design_Notice n ON n.DesignNoticeId = flow.DesignNoticeId
                                   LEFT JOIN dbo.Design_Input input ON input.DesignInputId = n.DesignInputId
								   LEFT JOIN dbo.Editor_EProject p ON p.EProjectId = input.EProjectId
                                   WHERE flow.HandleState='待办理' AND flow.MailIsWarn IS NULL
                                         AND DATEADD(dd,-5,input.PlanEndDate)<GETDATE()
                                   ORDER BY input.EProjectId";

            DataTable dt2 = SQLHelper.GetDataTableRunText(noticeSql, null);
            for (int i = 0; i < dt2.Rows.Count; i++)
            {
                string person_Ch = string.Empty;
                string person_En = string.Empty;
                string designNoticeId = dt.Rows[i]["DesignNoticeId"].ToString();
                var noticeFlow = from x in BLL.Funs.DB.Design_NoticeFlow where x.DesignNoticeId == designNoticeId && x.SubmitDate.HasValue orderby x.SubmitDate descending select x;
                if (noticeFlow.Count() > 0)
                {
                    var user = from x in BLL.Funs.DB.Sys_User where x.UserId == noticeFlow.First().SubmitMan select x;
                    if (user.Count() > 0)
                    {
                        person_Ch = user.First().ChineseName;
                        person_En = user.First().UserName;
                    }
                }
                NameValueCollection nameValue = new NameValueCollection();
                nameValue.Add("projectNo", dt.Rows[i]["ProjectControl_JobNo"].ToString());
                nameValue.Add("IssuedDiscOrNo", dt.Rows[i]["ProjectControl_JobNo"].ToString() + "-" + dt.Rows[i]["ProjectControl_JobTitle"].ToString() + "," + dt.Rows[i]["DesignInputChName"].ToString() + " " + dt.Rows[i]["DesignInputEnName"].ToString() + " " + dt.Rows[i]["DesignInputNo"].ToString()+" "+ dt.Rows[i]["MutualIssuedNo"].ToString());
                nameValue.Add("Person_Ch", person_Ch);
                nameValue.Add("Person_En", person_En);

                if (dt2.Rows[i]["SubmitMan"].ToString() != "")
                {
                    // 更新已提醒
                    BLL.DesignInputService.NoticeEmailIsWarn(dt2.Rows[i]["NoticeFlowId"].ToString(), true);

                    Model.Sys_User sys_User = new Model.Sys_User();
                    sys_User = BLL.Sys_UserService.GetUsersByUserId(dt2.Rows[i]["SubmitMan"].ToString());
                    nameValue.Add("UserName", sys_User.UserName);
                    List<Model.Sys_User> list = new List<Model.Sys_User>();

                    list.Add(sys_User);
                    bg.EmailSendMessage(BLL.Const.DesignInputString, nameValue, BLL.Const.CustomString, list, "");
                }
            }

        }
        #endregion

        #region 项目达到条件自动关闭
        private void Auto_Close(object sender, System.Timers.ElapsedEventArgs e)
        {
            var projectList = (from x in Funs.DB.Editor_EProject select x).ToList();
            foreach (var eproject in projectList)
            {
                if ((eproject.Permit_PS_SafetyFinalAcc.HasValue && eproject.Permit_PA_SafetyFinalACC.HasValue
                                && eproject.Permit_PS_FFFinalAcc.HasValue && eproject.Permit_PA_FFFinalACC.HasValue
                                && eproject.Permit_PS_EnvFinalAcc.HasValue && eproject.Permit_PA_EnvFinalACC.HasValue)
                                || (eproject.Permit_PS_SafetyFinalAcc.HasValue && eproject.Permit_PA_SafetyFinalACC.HasValue
                                && !eproject.Permit_PS_FFFinalAcc.HasValue && !eproject.Permit_PA_FFFinalACC.HasValue
                                && !eproject.Permit_PS_EnvFinalAcc.HasValue && !eproject.Permit_PA_EnvFinalACC.HasValue)
                                || (eproject.Permit_PS_SafetyFinalAcc.HasValue && eproject.Permit_PA_SafetyFinalACC.HasValue
                                && eproject.Permit_PS_FFFinalAcc.HasValue && eproject.Permit_PA_FFFinalACC.HasValue
                                && !eproject.Permit_PS_EnvFinalAcc.HasValue && !eproject.Permit_PA_EnvFinalACC.HasValue)
                                || (eproject.Permit_PS_SafetyFinalAcc.HasValue && eproject.Permit_PA_SafetyFinalACC.HasValue
                                && !eproject.Permit_PS_FFFinalAcc.HasValue && !eproject.Permit_PA_FFFinalACC.HasValue
                                && eproject.Permit_PS_EnvFinalAcc.HasValue && eproject.Permit_PA_EnvFinalACC.HasValue)
                                || (!eproject.Permit_PS_SafetyFinalAcc.HasValue && !eproject.Permit_PA_SafetyFinalACC.HasValue
                                && eproject.Permit_PS_FFFinalAcc.HasValue && eproject.Permit_PA_FFFinalACC.HasValue
                                && eproject.Permit_PS_EnvFinalAcc.HasValue && eproject.Permit_PA_EnvFinalACC.HasValue)
                                || (!eproject.Permit_PS_SafetyFinalAcc.HasValue && !eproject.Permit_PA_SafetyFinalACC.HasValue
                                && !eproject.Permit_PS_FFFinalAcc.HasValue && !eproject.Permit_PA_FFFinalACC.HasValue
                                && eproject.Permit_PS_EnvFinalAcc.HasValue && eproject.Permit_PA_EnvFinalACC.HasValue)
                                || (!eproject.Permit_PS_SafetyFinalAcc.HasValue && !eproject.Permit_PA_SafetyFinalACC.HasValue
                                && !eproject.Permit_PS_FFFinalAcc.HasValue && !eproject.Permit_PA_FFFinalACC.HasValue
                                && !eproject.Permit_PS_EnvFinalAcc.HasValue && !eproject.Permit_PA_EnvFinalACC.HasValue))
                {
                    #region MOC项目
                    //MOC项目:最晚的①竣工图接收日期②商务关闭日期③主控文档更新日期④剩余材料登记
                    if (eproject.ProjectControl_JobType == "MOC")
                    {
                        List<DateTime> closeDateLists = new List<DateTime>();
                        var built = BLL.TDCService.GetTDCByEprojectId(eproject.EProjectId, "D02_AS-BUILT");//竣工图接收日期
                        if (built != null)
                        {
                            if (built.ReceiveHC.HasValue)
                            {
                                closeDateLists.Add(Convert.ToDateTime(built.ReceiveHC));
                            }
                        }
                        var md = BLL.TDCService.GetTDCByEprojectId(eproject.EProjectId, "D03_MD");//主控文档更新日期
                        if (md != null)
                        {
                            if (md.ReceivePDF.HasValue)
                            {
                                closeDateLists.Add(Convert.ToDateTime(md.ReceivePDF));
                            }
                        }
                        if (eproject.ProjectControl_BC_CloseDate.HasValue)
                        {
                            closeDateLists.Add(Convert.ToDateTime(eproject.ProjectControl_BC_CloseDate));//商务关闭日期
                        }
                        if (eproject.CM_Date_of_Registration.HasValue)
                        {
                            closeDateLists.Add(Convert.ToDateTime(eproject.CM_Date_of_Registration));//剩余材料登记
                        }
                        closeDateLists.Sort();

                        if (closeDateLists.Count == 4)
                        {
                            eproject.ProjectControl_ClosedDate = closeDateLists[3];
                            eproject.ProjectControl_JobStatus = "Closed";
                        }
                    }
                    #endregion

                    #region 类型为项目和小型投资
                    //类型为项目和小型投资:最晚的①竣工图接收日期②商务关闭日期③主控文档更新日期④C类尾项消项日期⑤机械竣工签署日期⑥剩余材料登记⑦计划具备开车条件日期⑧大于100万需要FC签署日期
                    else if (eproject.ProjectControl_JobType == "Small Invest" || eproject.ProjectControl_JobType == "Projects")
                    {
                        List<DateTime> closeDateLists = new List<DateTime>();
                        var built = BLL.TDCService.GetTDCByEprojectId(eproject.EProjectId, "D02_AS-BUILT");
                        if (built != null)
                        {
                            if (built.ReceiveHC.HasValue)
                            {
                                closeDateLists.Add(Convert.ToDateTime(built.ReceiveHC));//竣工图接收日期
                            }
                        }
                        if (eproject.ProjectControl_BC_CloseDate.HasValue)
                        {
                            closeDateLists.Add(Convert.ToDateTime(eproject.ProjectControl_BC_CloseDate));//商务关闭日期
                        }
                        var md = BLL.TDCService.GetTDCByEprojectId(eproject.EProjectId, "D03_MD");
                        if (md != null)
                        {
                            if (md.ReceivePDF.HasValue)
                            {
                                closeDateLists.Add(Convert.ToDateTime(md.ReceivePDF));//主控文档更新日期
                            }
                        }
                        if (eproject.CM_Punch_CKilledDate.HasValue)
                        {
                            closeDateLists.Add(Convert.ToDateTime(eproject.CM_Punch_CKilledDate));//C类尾项消项日期
                        }
                        var mc = BLL.TDCService.GetTDCByEprojectId(eproject.EProjectId, "D11_MC");
                        if (mc != null)
                        {
                            if (mc.ReceiveHC.HasValue)
                            {
                                closeDateLists.Add(Convert.ToDateTime(mc.ReceiveHC));//机械竣工签署日期
                            }
                        }
                        if (eproject.CM_Date_of_Registration.HasValue)
                        {
                            closeDateLists.Add(Convert.ToDateTime(eproject.CM_Date_of_Registration));//剩余材料登记
                        }
                        var rfsu = BLL.TDCService.GetTDCByEprojectId(eproject.EProjectId, "D12_RFSU");
                        if (rfsu != null)
                        {
                            if (rfsu.ReceiveHC.HasValue)
                            {
                                closeDateLists.Add(Convert.ToDateTime(mc.ReceiveHC));//计划具备开车条件日期
                            }
                        }
                        // 大于1000000需要FC签署日期
                        if (eproject.ProjectControl_OrginalBudget != null && eproject.ProjectControl_OrginalBudget > 1000000)
                        {
                            var fc = BLL.TDCService.GetTDCByEprojectId(eproject.EProjectId, "D30_FC");
                            if (fc != null)
                            {
                                if (fc.ReceiveHC.HasValue)
                                {
                                    closeDateLists.Add(Convert.ToDateTime(fc.ReceiveHC));//FC签署日期
                                }
                            }
                            closeDateLists.Sort();
                            if (closeDateLists.Count == 8)
                            {
                                eproject.ProjectControl_ClosedDate = closeDateLists[7];
                                eproject.ProjectControl_JobStatus = "Closed";
                            }
                        }
                        else
                        {
                            closeDateLists.Sort();
                            if (closeDateLists.Count == 7)
                            {
                                eproject.ProjectControl_ClosedDate = closeDateLists[6];
                                eproject.ProjectControl_JobStatus = "Closed";
                            }
                        }
                    }
                    #endregion
                    
                    #region 其他类项目
                    //其他类项目:最晚的①竣工图接收日期②商务关闭日期③主控文档更新日期
                    else if (eproject.ProjectControl_JobType == "Other")
                    {
                        List<DateTime> closeDateLists = new List<DateTime>();
                        var built = BLL.TDCService.GetTDCByEprojectId(eproject.EProjectId, "D02_AS-BUILT");
                        if (built != null)
                        {
                            if (built.ReceiveHC.HasValue)
                            {
                                closeDateLists.Add(Convert.ToDateTime(built.ReceiveHC));//竣工图接收日期
                            }
                        }
                        if (eproject.ProjectControl_BC_CloseDate.HasValue)
                        {
                            closeDateLists.Add(Convert.ToDateTime(eproject.ProjectControl_BC_CloseDate));//商务关闭日期
                        }
                        var md = BLL.TDCService.GetTDCByEprojectId(eproject.EProjectId, "D03_MD");
                        if (md != null)
                        {
                            if (md.ReceivePDF.HasValue)
                            {
                                closeDateLists.Add(Convert.ToDateTime(md.ReceivePDF));//主控文档更新日期
                            }
                        }
                        closeDateLists.Sort();
                        if (closeDateLists.Count == 3)
                        {
                            eproject.ProjectControl_ClosedDate = closeDateLists[2];
                            eproject.ProjectControl_JobStatus = "Closed";
                        }
                    }
                    #endregion
                }
            }

        }
        #endregion

        protected void Session_Start(object sender, EventArgs e)
        {
            Session.Timeout = 720;
            // 这种统计在线人数的做法会有一定的误差
            Application.Lock();
            Application["OnlineUserCount"] = (int)Application["OnlineUserCount"] + 1;
            Application.UnLock();

            // https访问secure设置为true
            if (Request.IsSecureConnection)
            {
                Response.Cookies["ASP.NET_SessionId"].Secure = true;
            }
        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {
            StringBuilder errLog = null;
            Exception ex = null;
            try
            {
                // 获取错误类
                ex = Server.GetLastError().InnerException;
                if (ex == null)
                {
                    ex = Server.GetLastError().GetBaseException();
                }

                errLog = new StringBuilder();
                errLog.Append(String.Format(CultureInfo.InvariantCulture, "出错文件:{0}\r\n", Request.Url.AbsoluteUri));
                if (Request.UserHostAddress != null)
                {
                    errLog.Append(String.Format(CultureInfo.InvariantCulture, "IP地址:{0}\r\n", Request.UserHostAddress));
                }

                if (Session != null && Session["CurrUser"] != null)
                {
                    errLog.Append(String.Format(CultureInfo.InvariantCulture, "操作人员:{0}\r\n", BLL.Sys_UserService.GetUsersByUserId(((Model.Sys_User)Session["CurrUser"]).UserId).UserName));
                }
                else
                {
                    PageBase.ZXRefresh(Request.ApplicationPath + "/LogOff.aspx");
                }

                if (ex is HttpRequestValidationException)
                {
                    PageBase.ZXRefresh(Request.ApplicationPath + "/Wrong.aspx?Message=0");
                }
                else if (ex is FriendlyException)
                {
                    PageBase.ZXRefresh(Request.ApplicationPath + "/Wrong.aspx?MessageText=" + ex.Message);
                }
            }
            catch
            {
                try
                {
                    PageBase.ZXRefresh(Request.ApplicationPath + "/OperationError.aspx");
                }
                catch
                {
                }
            }
            finally
            {
                ErrLogInfo.WriteLog(ex, errLog == null ? null : errLog.ToString());
                Server.ClearError();

                PageBase.ZXRefresh(Request.ApplicationPath + "/OperationError.aspx");
            }
        }

        protected void Session_End(object sender, EventArgs e)
        {

        }

        protected void Application_End(object sender, EventArgs e)
        {

        }
    }
}