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


namespace ICSSoft.FromERP
{
    /// <summary>
    /// 委外领料单
    /// </summary>
    public class ICSOApply : 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()
        {
            try
            {
                string conStr = ICSHelper.GetConnectString();
                string Namespace = this.GetType().Namespace;
                //string Class = this.GetType().Name;

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


                    #region SQL
                    string sql = @"   SELECT 
                                b.cCode AS ApplyCode,
								isnull(a.comcode,'' )as SourceCode,
								isnull(c.iVouchRowNo,'')  as SourceSequence,
								a.cInvCode as InvCode,
                                isnull(a.irowno,'') as Sequence,
								a.iQuantity  as Quantity,
								isnull(a.fOutQuantity,0) as IssueQuantity,
								isnull(a.cWhCode,'') as WHCode,
								'2'  as  Status,
								b.cMaker  as  CreatePerson,
								b.dnmaketime as CreateDateTime,
								isnull(b.id,'') as  ApplyID,
								isnull(a.AutoID,'') as  ApplyDetailID,
								ISNULL(b.dnverifytime,ISNULL(b.dnmodifytime, b.dnmaketime)) AS MTIME,
                                 isnull(a.cItemCode,'') ProjectCode,isnull(a.cbatch,'') cBatch,'' version ,'' brand,
                                (case WHEN e.bFree1=1 THEN a.cFree1 ELSE '' END) as cFree1,
                                (case WHEN e.bFree2=1 THEN a.cFree2 ELSE '' END) as cFree2,
                                (case WHEN e.bFree3=1 THEN a.cFree3 ELSE '' END) as cFree3,
                                (case WHEN e.bFree4=1 THEN a.cFree4 ELSE '' END) as cFree4,
                                (case WHEN e.bFree5=1 THEN a.cFree5 ELSE '' END) as cFree5,
                                (case WHEN e.bFree6=1 THEN a.cFree6 ELSE '' END) as cFree6,
                                (case WHEN e.bFree7=1 THEN a.cFree7 ELSE '' END) as cFree7,
                                (case WHEN e.bFree8=1 THEN a.cFree8 ELSE '' END) as cFree8,
                                (case WHEN e.bFree9=1 THEN a.cFree9 ELSE '' END) as cFree9,
                                (case WHEN e.bFree10=1 THEN a.cFree10 ELSE '' END) as cFree10,CAST('' AS NVARCHAR(500)) as Colspan
                                        ,'{0}' as WorkPoint
                                into #TempPick
                                         FROM {1}.dbo.MaterialAppVouchs a 
                                        INNER JOIN {1}.dbo.MaterialAppVouch b ON a.ID = b.ID
										 LEFT JOIN {1}.dbo.OM_MODetails c ON a.iOMoDID = c.MODetailsID 
                                        LEFT JOIN {1}.dbo.OM_MOMain d ON c.MOID  = d.MOID  
                                        LEFT JOIN {1}.dbo.Inventory e ON a.cInvCode = e.cInvCode
                                        WHERE  ISNULL(b.cHandler,'')<> ''and b.cSource='委外订单'
                                        AND ISNULL(b.dnverifytime,ISNULL(b.dnmodifytime, b.dnmaketime))>=@LastTime
                            update #TempPick set Colspan=isNULL(ProjectCode,'')+'~'+isNULL(cBatch,'')+'~'+isNULL(Version,'')+'~'+isNULL(Brand,'')+'~'+isNULL(cFree1,'')+'~'+isnull(cFree2,'')+'~'+isnull(cFree3,'')+'~'+isnull(cFree4,'')+'~'+isnull(cFree5,'')+'~'+isnull(cFree6,'')+'~'+isnull(cFree7,'')+'~'+isnull(cFree8,'')+'~'+isnull(cFree9,'')+'~'+isnull(cFree10,'')
                                select distinct
                                Colspan,ProjectCode,cFree1,cFree2,cFree3,cFree4,cFree5,cFree6,cFree7,cFree8,cFree9,cFree10,WorkPoint,cBatch,version ,brand
                                INTO #TempExtension
                                from  #TempPick
                                        IF NOT EXISTS(SELECT * FROM #TempPick)
                                        RETURN";
                    sql = ICSHelper.Time(Namespace, Class, WorkPoint, sql, "#TempPick");
                    Dictionary<string, string> value = new Dictionary<string, string>();
                    value.Add("ID", "NEWID()");
                    value.Add("BatchCode", "a.cBatch");
                    value.Add("version", "a.version");
                    value.Add("brand", "a.brand");
                    value.Add("ProjectCode", "a.ProjectCode");
                    value.Add("cFree1", "a.cFree1");
                    value.Add("cFree2", "a.cFree2");
                    value.Add("cFree3", "a.cFree3");
                    value.Add("cFree4", "a.cFree4");
                    value.Add("cFree5", "a.cFree5");
                    value.Add("cFree6", "a.cFree6");
                    value.Add("cFree7", "a.cFree7");
                    value.Add("cFree8", "a.cFree8");
                    value.Add("cFree9", "a.cFree9");
                    value.Add("cFree10", "a.cFree10");
                    value.Add("Colspan", "a.Colspan");
                    value.Add("MTIME", "GETDATE()");
                    value.Add("MUSER", "'" + ConstWorkPoint.Muser + "'");
                    value.Add("MUSERName", "'" + ConstWorkPoint.Musername + "'");
                    value.Add("WorkPoint", "'" + WorkPoint + "'");

                    //插入新增数据->ICSExtension表
                    sql += ICSHelper.InsertSQL("ICSExtension", value)
                    + @"#TempExtension a
                        LEFT JOIN ICSExtension b ON a.ProjectCode+'~'+a.cBatch+'~'+a.Version+'~'+a.Brand+'~'+a.cFree1+'~'+a.cFree2+'~'+a.cFree3+'~'+a.cFree4+'~'+a.cFree5+'~'+a.cFree6+'~'+a.cFree7+'~'+a.cFree8+'~'+a.cFree9+'~'+a.cFree10=b.Colspan  and a.WorkPoint=b.WorkPoint
                        WHERE b.Colspan IS NULL";
                    sql += @"--删除数据
                               -- DELETE ICSOApply WHERE ApplyID NOT IN (SELECT ApplyID FROM {1}.dbo.[MaterialAppVouchs]) AND LEN(ApplyID)>0
SELECT  a.ApplyDetailID INTO #tableICSOApply
FROM ICSOApply a With(NoLock)
LEFT JOIN {1}.dbo.[MaterialAppVouchs] b With(NoLock) ON a.ApplyDetailID=b.AutoID
		WHERE a.WorkPoint='{0}' and b.AutoID IS NULL   AND LEN(a.ApplyDetailID)>0

	DELETE ICSOApply 
	WHERE WorkPoint='{0}' and  ApplyDetailID IN ( SELECT ApplyDetailID from #tableICSOApply)

                                ";
                    Dictionary<string, string> values = new Dictionary<string, string>();
                    values.Add("ApplyCode", "a.ApplyCode");
                    values.Add("Sequence", "a.Sequence");
                    values.Add("SourceCode", "a.SourceCode");
                    values.Add("SourceSequence", "a.SourceSequence");
                    values.Add("InvCode", "a.InvCode");
                    values.Add("Quantity", "a.Quantity");
                    values.Add("Amount", "0");
                    values.Add("WHCode", "a.WHCode");
                    values.Add("Type", "'领料'");
                    values.Add("Status", "a.Status");
                    values.Add("CreatePerson", "a.CreatePerson");
                    values.Add("CreateDateTime", "a.CreateDateTime");
                    values.Add("ApplyID", "a.ApplyID");
                    values.Add("ApplyDetailID", "a.ApplyDetailID");
                    values.Add("ExtensionID", "c.ID");
                    values.Add("MUSER", "'" + ConstWorkPoint.Muser + "'");
                    values.Add("MUSERName", "'" + ConstWorkPoint.Muser + "'");
                    values.Add("MTIME", "a.MTIME");
                    values.Add("WorkPoint", "'" + WorkPoint + "'");

                    //values.Add("VoucherNO", "a.VoucherNO");
                    //values.Add("Reservation", "a.Reservation");
                    //values.Add("ReservationRow", "a.ReservationRow");
                    //更新存在数据
                    sql += ICSHelper.UpdateSQL("b", values)
                        + @" #TempPick a
                            INNER JOIN ICSOApply b ON a.ApplyDetailID=b.ApplyDetailID  and a.WorkPoint=b.WorkPoint
                            inner join ICSExtension c on a.Colspan=c.Colspan   and a.WorkPoint=c.WorkPoint
                            WHERE a.WorkPoint='" + WorkPoint + "' ";

                    values.Add("ID", "NEWID()");
                    values.Add("IssueQuantity", "a.IssueQuantity");
                    //values.Add("HasQuantity", "'0'");
                    //values.Add("Sign", "'1'");
                    //values.Add("Did", "a.Did");
                    //values.Add("WorkPoint", "'" + WorkPoint + "'");
                    //插入新增数据
                    sql += ICSHelper.InsertSQL("ICSOApply", values)
                        + @"  #TempPick a
                            LEFT JOIN ICSOApply b ON a.ApplyDetailID=b.ApplyDetailID  and a.WorkPoint=b.WorkPoint
                            inner join ICSExtension c on a.Colspan=c.Colspan   and a.WorkPoint=c.WorkPoint
                            WHERE b.ID IS NULL and a.WorkPoint='" + WorkPoint + @"' 
                            ";
                    sql += " DROP TABLE #TempPick ";
                    sql += "  DROP TABLE #TempExtension " +
                        " DROP TABLE #tableICSOApply";
                    sql = string.Format(sql, WorkPoint, erpName);
                    ICSHelper.ExecuteDate(conStr, sql);
                    #endregion
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.ToString());
            }
        }
    }
}