using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Quartz;
using System.Data;
//using NFine.Data.Extensions;
using System.Configuration;
using ICSSoft.FromERP;
//using ICSSoft.SendMail;
using System.Data.SqlClient;
using System.Net;
using System.Net.Mail;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;

namespace ICSSoft.FromERP
{
    //邮件
  public   class ICSSendEmail : IJob
    {
        private static object key = new object();
        private static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public void Execute(IJobExecutionContext context)
        {
             try
            {
                lock (key)
                {
                    log.Info("开始……………………………………………………………………");
                    Execute();
                    log.Info("结束……………………………………………………………………");
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.ToString());
            }
        }

        public void Execute()
        {
            string erpName = ICSHelper.GetConfigString()["ERPDB"];
            string conStr = ICSHelper.GetConnectString();
            string Namespace = this.GetType().Namespace;
            //string Class = this.GetType().Name;

            DataTable dt = ICSHelper.GetERPDB(conStr);
            foreach (DataRow dr1 in dt.Rows)
            {
                string WorkPoint = dr1["WorkPointCode"].ToString();
                string Class = this.GetType().Name + WorkPoint;
                erpName = string.Format(erpName, WorkPoint);


                string sql = @"SELECT  a.ASNID, a.STNO,a.VENDORCODE,b.cVenName AS VENDORNAME,a.Auditor,CONVERT(NVARCHAR(50),a.CREATETIME,23) as CREATETIME,
                           a.CREATEUSER,a.ADDITION1,a.ADDITION2,CONVERT(NVARCHAR(50),
                           a.EXPARRIVALDATE,23) as EXPARRIVALDATE,
                           CASE WHEN c.cCode IS NULL THEN a.STSTATUS ELSE '3' END AS STATUS
                           FROM dbo.ICSASN a 
                           LEFT JOIN dbo.ICSVendor b ON a.VENDORCODE=b.cVenCode and a.WOrkPoint=b.WorkPoint
                           LEFT JOIN ICSPOArrive c ON a.STNO = c.STNO
						   where  datediff( dd, EXPARRIVALDATE,getdate())>=3 and a.STSTATUS='2' and c.cCode IS NULL ";
                DataTable dtInInfo = ICSHelper.ExecuteTable(conStr, sql);
                if (dtInInfo.Rows.Count > 0)
                {
                    string MailOpen = ICSHelper.GetConfigString("MailOpen");
                    if (MailOpen == "true")
                    {
                        string SendHost = ICSHelper.GetConfigString("SendHost");
                        string StrSendPort = ICSHelper.GetConfigString("SendPort");
                        int SendPort = 25;
                        if (!string.IsNullOrEmpty(StrSendPort))
                            SendPort = Convert.ToInt32(ICSHelper.GetConfigString("SendPort"));
                        string SendDisplayName = ICSHelper.GetConfigString("SendDisplayName");
                        string SendAddress = ICSHelper.GetConfigString("SendAddress");
                        string SendPassword = ICSHelper.GetConfigString("SendPassword");

                        foreach (DataRow dr in dtInInfo.Rows)
                        {
                            string cVenCode = dr["VENDORCODE"].ToString();
                            string PersonCode = dr["Auditor"].ToString();
                            string sqls = " SELECT F_Email FROM dbo.Sys_SRM_User WHERE F_Account= '" + cVenCode + "' or  F_Account='" + PersonCode + "'";
                            DataTable dts = ICSHelper.ExecuteTable(conStr, sqls);
                            string Email = string.Empty;
                            foreach (DataRow drs in dts.Rows)
                            {
                                Email += drs["F_Email"].ToString() + ",";
                            }
                            string TOAddress = Email.TrimEnd(',');
                            string CCAddress = "";
                            string Subject = "有来自华恒SRM平台送货订单信息";
                            bool isBodyHtml = false;
                            string VenName = dr["VENDORNAME"].ToString();
                            string STNO = dr["STNO"].ToString();
                            string NowDate = DateTime.Now.GetDateTimeFormats('D')[0].ToString();
                            string body = VenName + ":";
                            body += "\r\n";
                            body += "                               您好!有来自华恒SRM送货订单:" + STNO + " ,已超3天未入库,请联系相关人员查询!";
                            body += "\r\n";
                            body += "                                                                                                                                           顺颂商祺!";
                            body += "\r\n";
                            body += "                                                                                                                                           昆山华恒焊接股份有限公司";
                            body += "\r\n";
                            body += "                                                                                                                                           " + NowDate;


                            //string StrConn = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
                            SendEmail(conStr, SendHost, SendPort, SendDisplayName, SendAddress, SendPassword, TOAddress, CCAddress, Subject, isBodyHtml, body);
                            //ICSHelper.ExecuteTable(conStr, null, sql);
                        }
                    }
                }
            }
        }
        public static void SendEmail(string ConnectionString, string SendHost, int SendPort, string SendDisplayName, string SendAddress, string SendPassword, string TOAddress, string CCAddress, string Subject, bool IsBodyHtml, string Body)
        {
            try
            {
                SmtpClient smtpClient = new SmtpClient
                {
                    //EnableSsl = false,
                    UseDefaultCredentials = false,
                    Host = SendHost,
                    Port = SendPort,
                    Credentials = new NetworkCredential(SendAddress, SendPassword)
                };
                MailMessage mailMessage = new MailMessage
                {
                    Subject = Subject,
                    SubjectEncoding = Encoding.GetEncoding("utf-8"),
                    BodyEncoding = Encoding.GetEncoding("utf-8"),
                    From = new MailAddress(SendAddress, SendDisplayName),
                    IsBodyHtml = IsBodyHtml,
                    Body = Body
                };
                string[] array = TOAddress.Split(new char[]
                {
                    ','
                });
                string[] array2 = array;
                for (int i = 0; i < array2.Length; i++)
                {
                    string text = array2[i];
                    if (!string.IsNullOrEmpty(text))
                    {
                        mailMessage.To.Add(text);
                    }
                }
                string[] array3 = CCAddress.Split(new char[]
                {
                    ','
                });
                array2 = array3;
                for (int i = 0; i < array2.Length; i++)
                {
                    string text2 = array2[i];
                    if (!string.IsNullOrEmpty(text2))
                    {
                        mailMessage.CC.Add(text2);
                    }
                }
                ServicePointManager.ServerCertificateValidationCallback = ((object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) => true);
                smtpClient.Send(mailMessage);
                InsertData(ConnectionString, SendHost, SendPort, SendDisplayName, SendAddress, SendPassword, TOAddress, CCAddress, Subject, IsBodyHtml, Body, "1", null);
            }
            catch (Exception ex)
            {
                InsertData(ConnectionString, SendHost, SendPort, SendDisplayName, SendAddress, SendPassword, TOAddress, CCAddress, Subject, IsBodyHtml, Body, "2", ex.Message);
                throw;
            }
        }
        private static void InsertData(string ConnectionString, string SendHost, int SendPort, string SendDisplayName, string SendAddress, string SendPassword, string TOAddress, string CCAddress, string Subject, bool IsBodyHtml, string Body, string Status, string Message)
        {
            try
            {
                try
                {
                    string text = "INSERT INTO ICSSendMail(ID, SendHost, SendPort, SendDisplayName, SendAddress, \r\n                                                        SendPassword, TOAddress, CCAddress, Subject, IsBodyHtml, \r\n                                                        Body, Retry, Status, Message, MUSER, MUSERName, CreatTIME, ModifyTIME)\r\n                                                        VALUES(NEWID(),'{0}','{1}','{2}','{3}',\r\n                                                        '{4}','{5}','{6}','{7}','{8}',\r\n                                                        '{9}','0','{10}','{11}','','',GETDATE(),GETDATE())";
                    text = string.Format(text, new object[]
            {
                SendHost,
                SendPort,
                SendDisplayName,
                SendAddress,
                SendPassword,
                TOAddress,
                CCAddress,
                Subject,
                IsBodyHtml,
                Body.Replace("'", "''"),
                Status,
                Message
            });
                    ExecuteDate(ConnectionString, text);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private static void ExecuteDate(string conStr, string sql)
        {
            try
            {
                using (SqlConnection sqlConnection = new SqlConnection(conStr))
                {
                    sqlConnection.Open();
                    try
                    {
                        using (SqlTransaction sqlTransaction = sqlConnection.BeginTransaction())
                        {
                            using (SqlCommand sqlCommand = new SqlCommand())
                            {
                                sqlCommand.Connection = sqlConnection;
                                sqlCommand.Transaction = sqlTransaction;
                                sqlCommand.CommandText = sql;
                                try
                                {
                                    int num = sqlCommand.ExecuteNonQuery();
                                    sqlTransaction.Commit();
                                }
                                catch (Exception ex)
                                {
                                    sqlTransaction.Rollback();
                                    throw ex;
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        if (sqlConnection.State == ConnectionState.Open)
                        {
                            sqlConnection.Close();
                        }
                        sqlConnection.Dispose();
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
      

    }
}