using log4net; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Quartz; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.IO; using System.Linq; using System.Text; using HtmlAgilityPack; using HcUtility.Core; using HcUtility.Comm; using System.Data.Entity; using System.Text.RegularExpressions; namespace Job_JieFeng_FTP { public class Job_JFFTP : IJob { private ILog log = LogManager.GetLogger(typeof(Job_JFFTP)); private string connStr { get; set; } private string FTPADDRESS { get; set; } private string FTPPATH { get; set; } private string FTPUSERNAME { get; set; } private string FTPPWD { get; set; } private string carrierStr { get; set; } private List carrierList { get; set; } private 运输条款表 运输条款 { get; set; } //错误文件记录 //List ERRORFILEList = new List(); /// /// 当前正在处理的xml文件在ftp端的文件名 /// private string currXMLFile { get; set; } private string ErrorFilePackName { get { return "ERROR"; } } private string ErrorFileHead { get { return "ERROR_"; } } public void Execute(IJobExecutionContext context) { log.Debug($"Execute开始"); connStr = context.JobDetail.JobDataMap.GetString("ConnectString"); FTPADDRESS = context.JobDetail.JobDataMap.GetString("FTPADDRESS"); FTPPATH = context.JobDetail.JobDataMap.GetString("FTPPATH"); FTPUSERNAME = context.JobDetail.JobDataMap.GetString("FTPUSERNAME"); FTPPWD = context.JobDetail.JobDataMap.GetString("FTPPWD"); carrierStr = context.JobDetail.JobDataMap.GetString("CARRIER"); //1:获得FTP的文件列表 //var ftp = new FtpWeb("ddlucky.vicp.net:3721", "", "dsuser", "dsuser"); var ftpmsg = ""; var ftp = new FtpWeb(FTPADDRESS, FTPPATH, FTPUSERNAME, FTPPWD); try { //log.Debug($"读取任务信息完成"); while (carrierStr.Substring(carrierStr.Length - 1, 1) == ";") { carrierStr = carrierStr.Substring(0, carrierStr.Length - 1); } carrierList = new List(); var carrierarray = Regex.Split(carrierStr, ";;"); foreach (string carrierstr in carrierarray) { var temparray = Regex.Split(carrierstr, ";"); CARRIER carrier = new CARRIER(temparray[0], temparray[1]); carrierList.Add(carrier); } //log.Debug($"船公司读取完成"); var PaymentTermStr = context.JobDetail.JobDataMap.GetString("PaymentTerm"); 运输条款 = new 运输条款表(PaymentTermStr); //if (!ftp.DirectoryExist(ErrorFilePackName)) //{ // log.Debug($"在FTP中建立错误文件文件夹:{ErrorFilePackName}"); // ftp.MakeDir(ErrorFilePackName); //} //获得FTP的文件列表 var filearray = ftp.GetFileList("",out ftpmsg); log.Debug($"FTP连接:{FTPADDRESS},{FTPPATH},{FTPUSERNAME},{FTPPWD},ftpmsg={ftpmsg}"); if (filearray == null || filearray.Count() == 0) { log.Debug($"没有可读取的文件,进程结束"); moveErrorFileOut(ftp); return; } log.Debug($"发现文件数:{filearray.Count()}"); //如果文件列表没有文件 结束 //if ( filearray.Count() == 0 ) return; var filepath = AppDomain.CurrentDomain.BaseDirectory + @"\XMLFILE\" + DateTime.Now.ToString("yyyy-MM-dd") + @"\"; if (Directory.Exists(filepath) == false) { Directory.CreateDirectory(filepath); log.Debug($"服务器本地建立文件夹:{filepath}"); } //var pkgslist = DBWork.GetPKGSList(connStr); //2:遍历文件列表 将文件解析成数据对象 var clcount = 0; foreach (var filename in filearray) { try { ftp = new FtpWeb(FTPADDRESS, FTPPATH, FTPUSERNAME, FTPPWD); //只处理末尾是.xml的文件 不分大小写; var filenamelast = filename.Substring(filename.Length - 4, 4).ToUpper(); if (filenamelast != ".XML") continue; if (filename.Contains(ErrorFileHead)) continue; clcount++; //2.1:保存数据对象 记录结果 if (Directory.Exists(filepath + filename) == false) { log.Debug($"保存文件:{filename}"); ftp.Download(filepath, filename); currXMLFile = filename; } var xmlstr = ftp.getFileStr(filename); //XMLParser xmlParser = new XMLParser(); //XMLNode xn = xmlParser.Parse(xmlstr); log.Debug($"开始解析文档{clcount.ToString()}:{filename}"); var xmlroot = XmlReader.GetXmlDocByXmlContent(xmlstr); log.Debug($"已解析至xml对象,开始整理数据"); var _r = 0;//影响行数 var msgout = ""; var pkgslist = DBWork.GetPKGSList(connStr); var ctncodelist= DBWork.GetCtnCodeList(connStr); var head = new FTP_SeaeOrderMC(xmlroot, carrierList, 运输条款, pkgslist, ctncodelist, out msgout); if (msgout != "over") { log.Debug($"提取数据错误:{msgout}"); movetoerror(ftp); //GC.Collect(); } else { log.Debug($"解析完成,保存数据:{filename}"); var sqlstr = DBWork.getSaveSql(connStr, head); log.Debug($"Save语句:{sqlstr}"); _r = DBWork.Save(connStr, head); log.Debug($"保存完成"); ////2.2 将保存正确的文件删除。 if (_r > 0) { log.Debug($"开始删除:{filename}"); ftp.Delete(filename); log.Debug($"结束删除"); } if (head.BLTYPE != "Booking") { var htmlFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "JFMailTemplate.html"); var content = File.ReadAllText(htmlFile); content = content.Replace("$SHIPPER$", head.SHIPPER.Replace("\r\n", "
")); content = content.Replace("$CONSIGNEE$", head.CONSIGNEE.Replace("\r\n", "
")); content = content.Replace("$NOTIFYPARTY$", head.NOTIFYPARTY.Replace("\r\n", "
")); content = content.Replace("$CUSTNO$", head.CUSTNO); content = content.Replace("$MBLNO$", head.MBLNO); content = content.Replace("$ETD$", head.ETD); content = content.Replace("$SERVICE$", head.SERVICE); content = content.Replace("$BLFRT$", head.BLFRT); content = content.Replace("$PREPARDAT$", head.PREPARDAT); content = content.Replace("$PAYABLEAT$", head.PAYABLEAT); content = content.Replace("$VESSEL$", head.VESSEL); content = content.Replace("$VOYNO$", head.VOYNO); content = content.Replace("$PORTLOAD$", head.PORTLOAD); content = content.Replace("$NOBILL$", head.NOBILL); content = content.Replace("$ISSUEPLACE$", head.ISSUEPLACE); content = content.Replace("$PORTDISCHARGE$", head.PORTDISCHARGE); content = content.Replace("$PLACEDELIVERY$", head.PLACEDELIVERY); content = content.Replace("$MARKS$", head.MARKS.Replace("\r\n", "
")); content = content.Replace("$PKGS$", head.PKGS); content = content.Replace("$KINDPKGS$", head.KINDPKGS); content = content.Replace("$DESCRIPTION$", head.DESCRIPTION.Replace("\r\n", "
")); content = content.Replace("$KGS$", head.KGS); content = content.Replace("$CBM$", head.CBM); content = content.Replace("$CARRIER$", head.CARRIER); content = content.Replace("$CUSTATTN$", head.CUSTATTN); content = content.Replace("$CUSTTEL$", head.CUSTTEL); content = content.Replace("$DCLASS$", head.DCLASS); content = content.Replace("$DUNNO$", head.DUNNO); content = content.Replace("$SERVICECONTRACTNO$", head.SERVICECONTRACTNO); content = content.Replace("$ISSUETYPE$", head.ISSUETYPE); content = content.Replace("$TEMPMIN$", head.TEMPMIN); content = content.Replace("$TEMPMAX$", head.TEMPMAX); content = content.Replace("$REMARK$", head.REMARK.Replace("\r\n", "
")); HtmlDocument htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(content); var nodeTbList = htmlDoc.GetElementbyId("tbCtnDataList"); nodeTbList.RemoveAllChildren(); foreach (var itemsctn in head.CtnList) { var tr = htmlDoc.CreateElement("tr"); nodeTbList.AppendChild(tr); var CNTRNO = htmlDoc.CreateElement("td"); tr.AppendChild(CNTRNO); CNTRNO.SetAttributeValue("style", "padding:10px;border-left:1px solid #333;border-bottom:1px solid #333;text-align:center;font-size:14px;"); CNTRNO.InnerHtml = $"{itemsctn.CNTRNO}"; var SEALNO = htmlDoc.CreateElement("td"); tr.AppendChild(SEALNO); SEALNO.SetAttributeValue("style", "padding:10px;border-bottom:1px solid #333;text-align:center;font-size:14px;"); SEALNO.InnerHtml = $"{itemsctn.SEALNO}"; var CTNALL = htmlDoc.CreateElement("td"); tr.AppendChild(CTNALL); CTNALL.SetAttributeValue("style", "padding:10px;border-bottom:1px solid #333;text-align:center;font-size:14px;"); CTNALL.InnerHtml = $"{itemsctn.CTNALL}"; var PKGS = htmlDoc.CreateElement("td"); tr.AppendChild(PKGS); PKGS.SetAttributeValue("style", "padding:10px;border-bottom:1px solid #333;text-align:center;font-size:14px;"); PKGS.InnerHtml = $"{itemsctn.PKGS}{itemsctn.KINDPKGS}"; var KGS = htmlDoc.CreateElement("td"); tr.AppendChild(KGS); KGS.SetAttributeValue("style", "padding:10px;border-bottom:1px solid #333;text-align:center;font-size:14px;"); KGS.InnerHtml = $"{itemsctn.KGS}"; var CBM = htmlDoc.CreateElement("td"); tr.AppendChild(CBM); CBM.SetAttributeValue("style", "padding:10px;border-bottom:1px solid #333;text-align:center;font-size:14px;"); CBM.InnerHtml = $"{itemsctn.CBM}"; var HSCODE = htmlDoc.CreateElement("td"); tr.AppendChild(HSCODE); HSCODE.SetAttributeValue("style", "padding:10px;border-bottom:1px solid #333;text-align:center;font-size:14px;"); HSCODE.InnerHtml = $"{itemsctn.HSCODE}"; var GOODSNAME = htmlDoc.CreateElement("td"); tr.AppendChild(GOODSNAME); GOODSNAME.SetAttributeValue("style", "padding:10px;border-bottom:1px solid #333;border-right:1px solid #333;text-align:center;font-size:14px;"); GOODSNAME.InnerHtml = $"{itemsctn.GOODSNAME.Replace("\r\n", "
")}"; } StringWriter writer = new StringWriter(); htmlDoc.Save(writer); string str = writer.ToString(); var stmpid = DBWork.GetMailStmp(connStr); var maillist = DBWork.Get任务相关人员邮箱(connStr,head); DBWork.SaveMail(connStr, maillist,"辛克截单:"+head.MBLNO+" "+head.CUSTNO, str, stmpid); } //} //GC.Collect(); } } catch (Exception ex) { log.Debug($"错误foreach:{ex.Message}"); //GC.Collect(); //将该文件写入error文件夹 并删除原文件 movetoerror(ftp); //GC.Collect(); //log.Error(ex.StackTrace); } } moveErrorFileOut(ftp); } catch (Exception ex) { log.Debug($"错误:{ex.Message}"); //GC.Collect(); //将该文件写入error文件夹 并删除原文件 //movetoerror(ftp); //GC.Collect(); //log.Error(ex.StackTrace); } moveErrorFileOut(ftp); } private void DoSendMessage(string mblno) { } private void movetoerror(FtpWeb ftp) { try { //ftp.MoveFile(currXMLFile, ErrorFilePackName + "/" + currXMLFile); //log.Debug($"文件移动:" + ErrorFilePackName + "/" + currXMLFile + " 完成"); ftp.ReName(currXMLFile, ErrorFileHead + currXMLFile); log.Debug($"文件重命名:" + ErrorFileHead + currXMLFile + " 完成"); } catch (Exception ex3) { log.Debug($"文件移动错误_movetoerror:" + ex3.Message); } } private void moveErrorFileOut(FtpWeb ftp) { log.Debug($"错误文件移动回根目录:开始"); try { var ftpmsg = ""; //var ftp = new FtpWeb(FTPADDRESS, FTPPATH, FTPUSERNAME, FTPPWD); //ftp.GotoDirectory("ERROR", false); //var errorfilearray = ftp.GetFileList("", out ftpmsg); //log.Debug($"错误文件数量:{errorfilearray.Length.ToString()}"); //if(errorfilearray.Length>0) // log.Debug($"错误文件1:{errorfilearray[0].ToString()}"); //if (errorfilearray!=null && errorfilearray.Length>0) // foreach (var errorFile in errorfilearray) // { // log.Debug($"错误文件{errorFile}移动:开始 "); // ftp.MoveFile( errorFile,"../"+errorFile); // log.Debug($"错误文件{errorFile}移动:完成"); // } //ftp = new FtpWeb(FTPADDRESS, FTPPATH, FTPUSERNAME, FTPPWD); //20200825 改为将ERROR五个字母放置在文件名前面 //var ftp = new FtpWeb(FTPADDRESS, FTPPATH, FTPUSERNAME, FTPPWD); var errorfilearray = ftp.GetFileList("", out ftpmsg); if (errorfilearray != null) { foreach (var efn in errorfilearray) { if(efn.Contains(ErrorFileHead)) ftp.ReName(efn, efn.Replace(ErrorFileHead, "")); } } } catch (Exception ex3) { log.Debug($"文件移动错误_moveErrorFileOut:" + ex3.Message); } } } }