/// <summary> /// 导入外部Josn /// </summary> private static void ImportResume() { var importCount = 0; while (true) { try { var filePaths = Directory.GetFiles(importFilePath); if (filePaths.Length == 0) { Thread.Sleep(10 * 1000); continue; } Console.WriteLine($"{DateTime.Now} > {filePaths.Length} Need Import ! "); foreach (var filePath in filePaths) { try { var jsonObj = JsonConvert.DeserializeObject <dynamic>(File.ReadAllText(filePath)); var resumeData = jsonObj.data == null ? jsonObj : jsonObj.data; var resumeDetail = JsonConvert.DeserializeObject(resumeData.detialJSonStr.ToString()); var resumeId = resumeData.resumeId != null ? (int)resumeData.resumeId : resumeDetail.ResumeId != null ? (int)resumeDetail.ResumeId : 0; var cellphone = resumeData.userDetials.mobilePhone.ToString(); if (string.IsNullOrEmpty(cellphone)) { var path = importFailPath + Path.GetFileName(filePath); if (File.Exists(path)) { File.Delete(path); } File.Move(filePath, path); continue; } var resumeNumber = ((string)resumeData.resumeNo).Substring(0, 10); var userId = (int)resumeData.userDetials.userMasterId; var refreshTime = BaseFanctory.GetTime((string)resumeDetail.DateLastReleased).ToUniversalTime(); using (var db = new MangningXssDBEntities()) { var resume = db.ZhaopinResume.FirstOrDefault(f => f.Id == resumeId); var isNeedUpload = true; var sourceFlag = -1; var isUpload = false; if (resume != null) { sourceFlag = resume.Flag; } if (!(resume?.RefreshTime != null && resume.RefreshTime.Value.Date >= refreshTime.Date) || resume?.Flag < 8) { if (resume != null) { resume.RandomNumber = resumeNumber; resume.RefreshTime = refreshTime; resume.UpdateTime = DateTime.UtcNow; if (string.IsNullOrEmpty(resume.UserExtId)) { resume.UserExtId = resumeDetail.UserMasterExtId?.ToString(); } if (resumeData.Flag != null && (int)resumeData.Flag < 0) { if (resume.Flag >= 8 || mangningOssClient.DoesObjectExist(mangningBucketName, $"Zhaopin/Resume/{resume.Id}") || mangningOssClient.DoesObjectExist(mangningBucketName, $"WatchResume/{resume.Id}")) { isNeedUpload = false; } } resume.Flag = 0xE; } else { resume = new ZhaopinResume { Id = resumeId, RandomNumber = resumeNumber, UserId = userId, RefreshTime = refreshTime, UpdateTime = DateTime.UtcNow, UserExtId = resumeDetail.UserMasterExtId.ToString(), DeliveryNumber = null, Source = "Import", Flag = 0xE }; db.ZhaopinResume.Add(resume); } var user = db.ZhaopinUser.FirstOrDefault(f => f.Id == userId); if (user != null) { if (!user.Source.Contains("MANUAL")) { user.ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(); user.CreateTime = resumeData.Flag != null && (int)resumeData.Flag < 0 ? user.CreateTime : BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(); user.Cellphone = resumeData.userDetials.mobilePhone.ToString(); user.Email = resumeData.userDetials.email.ToString(); user.Name = resumeData.userDetials.userName.ToString(); user.UpdateTime = DateTime.UtcNow; user.Username = resumeData.userDetials.email.ToString(); } } else { user = new ZhaopinUser { Id = userId, Source = "Import", ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(), CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(), Cellphone = resumeData.userDetials.mobilePhone.ToString(), Email = resumeData.userDetials.email.ToString(), Name = resumeData.userDetials.userName.ToString(), UpdateTime = DateTime.UtcNow, Username = resumeData.userDetials.email.ToString() }; db.ZhaopinUser.Add(user); } if (isNeedUpload) { isUpload = true; var resumeContent = JsonConvert.SerializeObject(resumeData); using (var jsonStream = new MemoryStream(GZip.Compress(Encoding.UTF8.GetBytes(resumeContent)))) { mangningOssClient.PutObject(mangningBucketName, $"Zhaopin/Resume/{resume.Id}", jsonStream); } } db.SaveChanges(); } File.Delete(filePath); Console.WriteLine($"{DateTime.Now} > Improt success ! ResumeId = {resumeId}, SourceFlag = {sourceFlag}, IsUpload = {isUpload}, Count = {++importCount}."); } } catch (Exception ex) { var path = importFailPath + Path.GetFileName(filePath); if (File.Exists(path)) { File.Delete(path); } File.Move(filePath, path); Trace.WriteLine($"{DateTime.Now} > Import Error Message = {ex.Message}, Path = {path}."); } } } catch (Exception ex) { Trace.TraceError(ex.ToString()); } } }
/// <summary> /// 上传智联 Josn 格式简历 /// </summary> /// <param name="json"></param> /// <param name="jsonResumeId"></param> /// <returns></returns> public DataResult UploadZhaopinResume(string json, int jsonResumeId) { try { var resumeData = JsonConvert.DeserializeObject <dynamic>(json); var resumeDetail = JsonConvert.DeserializeObject(resumeData.detialJSonStr.ToString()); var refreshTime = BaseFanctory.GetTime((string)resumeDetail.DateLastReleased).ToUniversalTime(); resumeData.detialJSonStr = resumeDetail; var resumeNumber = ((string)resumeData.resumeNo).Substring(0, 10); var userId = (int)resumeData.userDetials.userMasterId; var resumeId = resumeData.resumeId != null ? (int)resumeData.resumeId : resumeDetail.ResumeId != null ? (int)resumeDetail.ResumeId : 0; using (var db = new MangningXssDBEntities()) { var resume = db.ZhaopinResume.FirstOrDefault(f => f.Id == resumeId); if (!(resume?.RefreshTime != null && resume.RefreshTime.Value.Date >= refreshTime.Date)) { if (resume != null) { resume.RandomNumber = resumeNumber; resume.RefreshTime = refreshTime; resume.UpdateTime = DateTime.UtcNow; if (string.IsNullOrEmpty(resume.UserExtId)) { resume.UserExtId = resumeDetail.UserMasterExtId.ToString(); } resume.Source = !resume.Source.Contains("Download") ? resume.Source += ",Download" : resume.Source; resume.Flag = 0xE; } else { resume = new ZhaopinResume { Id = resumeId, RandomNumber = resumeNumber, UserId = userId, RefreshTime = refreshTime, UpdateTime = DateTime.UtcNow, UserExtId = resumeDetail.UserMasterExtId.ToString(), DeliveryNumber = null, Source = "Download", Flag = 0xE }; db.ZhaopinResume.Add(resume); } var user = db.ZhaopinUser.FirstOrDefault(f => f.Id == userId); if (user != null) { if (!user.Source.Contains("MANUAL")) { user.ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(); user.CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(); user.Cellphone = resumeData.userDetials.mobilePhone.ToString(); user.Email = resumeData.userDetials.email.ToString(); user.Name = resumeData.userDetials.userName.ToString(); user.UpdateTime = DateTime.UtcNow; user.Username = resumeData.userDetials.email.ToString(); } } else { user = new ZhaopinUser { Id = userId, Source = "Download", ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(), CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(), Cellphone = resumeData.userDetials.mobilePhone.ToString(), Email = resumeData.userDetials.email.ToString(), Name = resumeData.userDetials.userName.ToString(), UpdateTime = DateTime.UtcNow, Username = resumeData.userDetials.email.ToString() }; db.ZhaopinUser.Add(user); } var resumeContent = JsonConvert.SerializeObject(resumeData); using (var jsonStream = new MemoryStream(GZip.Compress(Encoding.UTF8.GetBytes(resumeContent)))) { mangningOssClient.PutObject(mangningBucketName, $"Zhaopin/Resume/{resumeId}", jsonStream); } var resumePath = $"{uploadFilePath}{resumeId}.json"; File.WriteAllText(resumePath, JsonConvert.SerializeObject(resumeData)); db.SaveChanges(); } } return(new DataResult()); } catch (Exception ex) { LogFactory.Warn($"简历上传异常!异常信息:{ex.Message}, Json:{json}"); return(new DataResult { ErrorMsg = $"Josn 格式异常,resumeNo:{jsonResumeId},{ex.Message}", IsSuccess = false }); } }
/// <summary> /// 處理簡歷列表 /// </summary> /// <param name="resumes"></param> /// <param name="unhandled"></param> /// <param name="staff"></param> /// <param name="isWhile"></param> /// <param name="cookieContainer"></param> private static void HandleResumes(dynamic resumes, int unhandled, ZhaopinStaff staff, ref bool isWhile, CookieContainer cookieContainer) { var stopwatch = new Stopwatch(); foreach (var item in resumes) { #region Handle resume try { stopwatch.Restart(); #region Save resume and Upload var requestResult = RequestFactory.QueryRequest($"http://ihr.zhaopin.com/resumesearch/getresumedetial.do?resumeNo={item.id}_{item.jobNumber}_{item.number}_1_1&resumeSource=3", cookieContainer: cookieContainer); if (!requestResult.IsSuccess) { Trace.TraceWarning(requestResult.ErrorMsg); continue; } var content = JsonConvert.DeserializeObject <dynamic>(requestResult.Data); if ((int)content.code == 6001) // 登录过期 { using (var db = new MangningXssDBEntities()) { var zhaopinStaff = db.ZhaopinStaff.FirstOrDefault(f => f.Id == staff.Id); if (zhaopinStaff != null) { zhaopinStaff.Cookie = null; db.SaveChanges(); dictionary.TryRemove(staff.Id, out companyId); } } Trace.WriteLine($"{DateTime.Now} > Loging Timeout ! Username = {staff.Username}, Message = {content.message}."); isWhile = false; break; } if ((int)content.code != 1) { Trace.WriteLine($"{DateTime.Now} > Get Resume Detail Error ! Username = {staff.Username}, Message = {content.message}."); continue; } var resumeData = content.data; var resumeDetail = JsonConvert.DeserializeObject(resumeData.detialJSonStr.ToString()); var refreshTime = BaseFanctory.GetTime((string)resumeDetail.DateLastReleased).ToUniversalTime(); resumeData.detialJSonStr = resumeDetail; var resumeNumber = ((string)resumeData.resumeNo).Substring(0, 10); var userId = (int)resumeData.userDetials.userMasterId; var resumeId = resumeData.resumeId != null ? (int)resumeData.resumeId : resumeDetail.ResumeId != null ? (int)resumeDetail.ResumeId : 0; var status = "Handle"; using (var db = new MangningXssDBEntities()) { var resume = db.ZhaopinResume.FirstOrDefault(f => f.Id == resumeId); if (!(resume?.RefreshTime != null && resume.RefreshTime.Value.Date >= refreshTime.Date)) { if (resume != null) { resume.RandomNumber = resumeNumber; resume.RefreshTime = refreshTime; resume.UpdateTime = DateTime.UtcNow; if (string.IsNullOrEmpty(resume.UserExtId)) { resume.UserExtId = resumeDetail.UserMasterExtId.ToString(); } resume.Source = !resume.Source.Contains("Deliver") ? resume.Source += ",Deliver" : resume.Source; resume.Flag = 0xE; } else { resume = new ZhaopinResume { Id = resumeId, RandomNumber = resumeNumber, UserId = userId, RefreshTime = refreshTime, UpdateTime = DateTime.UtcNow, UserExtId = resumeDetail.UserMasterExtId.ToString(), DeliveryNumber = null, Source = "Deliver", Flag = 0xE }; db.ZhaopinResume.Add(resume); } var user = db.ZhaopinUser.FirstOrDefault(f => f.Id == userId); if (user != null) { if (!user.Source.Contains("MANUAL")) { user.ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(); user.CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(); user.Cellphone = resumeData.userDetials.mobilePhone.ToString(); user.Email = resumeData.userDetials.email.ToString(); user.Name = resumeData.userDetials.userName.ToString(); user.UpdateTime = DateTime.UtcNow; user.Username = resumeData.userDetials.email.ToString(); } } else { user = new ZhaopinUser { Id = userId, Source = "Deliver", ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(), CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(), Cellphone = resumeData.userDetials.mobilePhone.ToString(), Email = resumeData.userDetials.email.ToString(), Name = resumeData.userDetials.userName.ToString(), UpdateTime = DateTime.UtcNow, Username = resumeData.userDetials.email.ToString() }; db.ZhaopinUser.Add(user); } var resumeContent = JsonConvert.SerializeObject(resumeData); using (var jsonStream = new MemoryStream(GZip.Compress(Encoding.UTF8.GetBytes(resumeContent)))) { mangningOssClient.PutObject(mangningBucketName, $"Zhaopin/Resume/{resumeId}", jsonStream); } var resumePath = $"{uploadFilePath}{resumeId}.json"; File.WriteAllText(resumePath, JsonConvert.SerializeObject(resumeData)); db.SaveChanges(); } else { status = "NoHandle"; } } #endregion Thread.Sleep(3000); #region SignResume var data = HttpUtility.UrlEncode(JsonConvert.SerializeObject(new { signTag = "noSuit", resumeList = new List <dynamic> { new { resumeNo = $"{item.jobNumber}_{item.number}_{item.version}_1", resumenumber = item.number, item.version, lanType = 1, jobname = ((string)resumeData?.jobName)?.Replace("\"", "\\\"").Replace("\\", "\\\\"), jobno = item.jobNumber, resumesource = item.resumeSource, resumeJobId = item.id, resumerName = ((string)item?.userName).Replace("\r", "").Replace("\n", "").Replace("\"", "\\\""), resumejlName = ((string)item?.name).Replace("\r", "").Replace("\n", "").Replace("\"", "\\'").Replace("\\", "\\\\"), resumerId = item.userId } }, mark = "" })); requestResult = RequestFactory.QueryRequest("https://ihr.zhaopin.com/resumemanage/resumesignstate.do", $"data={data}", RequestEnum.POST, cookieContainer); if (!requestResult.IsSuccess) { Trace.TraceWarning(requestResult.ErrorMsg); continue; } content = JsonConvert.DeserializeObject <dynamic>(requestResult.Data); if ((int)content.code == 6001) // 登录过期 { using (var db = new MangningXssDBEntities()) { var zhaopinStaff = db.ZhaopinStaff.FirstOrDefault(f => f.Id == staff.Id); if (zhaopinStaff != null) { zhaopinStaff.Cookie = null; db.SaveChanges(); dictionary.TryRemove(staff.Id, out companyId); } } Trace.WriteLine($"{DateTime.Now} > Loging Timeout ! Username = {staff.Username}, Message = {content.message}."); isWhile = false; break; } if ((int)content.code != 1) { Trace.WriteLine($"{DateTime.Now} > Sign Resume Error ! Username = {staff.Username}, Message = {content.message}, ResumeId = {resumeId}."); continue; } #endregion stopwatch.Stop(); var elapsed = stopwatch.ElapsedMilliseconds; Interlocked.Increment(ref count); Console.WriteLine($"{DateTime.Now} > {count} {status} {staff.Username}:Unhandled = {--unhandled}, RId = {resumeId}, Elapsed = {elapsed} ms."); } catch (Exception ex) { Trace.TraceError(ex.ToString()); } #endregion } }
/// <summary> /// 處理簡歷列表 /// </summary> /// <param name="resumes"></param> /// <param name="unhandled"></param> /// <param name="staff"></param> /// <param name="isWhile"></param> /// <param name="cookieContainer"></param> /// <param name="isNewSystem"></param> private static void HandleResumes(dynamic resumes, ref int unhandled, ZhaopinStaff staff, ref bool isWhile, CookieContainer cookieContainer, bool isNewSystem) { var stopwatch = new Stopwatch(); var time = 0; foreach (var item in resumes) { #region Handle resume try { if (IsDownload((long)item.id, staff.CompanyId)) { if (++time > 30) { break; } continue; } time = 0; stopwatch.Restart(); #region Save resume and Upload var requestResult = RequestFactory.QueryRequest($"http://ihr.zhaopin.com/resumesearch/getresumedetial.do?resumeNo={item.id}_{item.jobNumber}_{item.number}_1_1&resumeSource=3", cookieContainer: cookieContainer); if (!requestResult.IsSuccess) { Trace.TraceWarning(requestResult.ErrorMsg); continue; } var content = JsonConvert.DeserializeObject <dynamic>(requestResult.Data); if ((int)content.code == 6001) // 登录过期 { using (var db = new MangningXssDBEntities()) { var zhaopinStaff = db.ZhaopinStaff.FirstOrDefault(f => f.Id == staff.Id); if (zhaopinStaff != null) { zhaopinStaff.Cookie = null; db.SaveChanges(); dictionary.TryUpdate(staff.Id, true, true); } } Trace.WriteLine($"{DateTime.Now} > Loging Timeout ! Username = {staff.Username}, Message = {content.message}."); isWhile = false; break; } if ((int)content.code != 1) { Trace.WriteLine($"{DateTime.Now} > Get Resume Detail Error ! Username = {staff.Username}, Message = {content.message}."); continue; } var resumeData = content.data; var resumeDetail = JsonConvert.DeserializeObject(resumeData.detialJSonStr.ToString()); var refreshTime = BaseFanctory.GetTime((string)resumeDetail.DateLastReleased).ToUniversalTime(); resumeData.detialJSonStr = resumeDetail; var resumeNumber = ((string)resumeData.resumeNo).Substring(0, 10); var userId = (int)resumeData.userDetials.userMasterId; var resumeId = resumeData.resumeId != null ? (int)resumeData.resumeId : resumeDetail.ResumeId != null ? (int)resumeDetail.ResumeId : 0; var status = "Handle"; using (var db = new MangningXssDBEntities()) { var resume = db.ZhaopinResume.FirstOrDefault(f => f.Id == resumeId); if (!(resume?.RefreshTime != null && resume.RefreshTime.Value.Date >= refreshTime.Date)) { if (resume != null) { resume.RandomNumber = resumeNumber; resume.RefreshTime = refreshTime; resume.UpdateTime = DateTime.UtcNow; if (string.IsNullOrEmpty(resume.UserExtId)) { resume.UserExtId = resumeDetail.UserMasterExtId.ToString(); } resume.Source = !resume.Source.Contains("Deliver") ? resume.Source += ",Deliver" : resume.Source; resume.Flag = 0xE; } else { resume = new ZhaopinResume { Id = resumeId, RandomNumber = resumeNumber, UserId = userId, RefreshTime = refreshTime, UpdateTime = DateTime.UtcNow, UserExtId = resumeDetail.UserMasterExtId.ToString(), DeliveryNumber = null, Source = "Deliver", Flag = 0xE }; db.ZhaopinResume.Add(resume); } var user = db.ZhaopinUser.FirstOrDefault(f => f.Id == userId); if (user != null) { if (!user.Source.Contains("MANUAL")) { user.ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(); user.CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(); user.Cellphone = resumeData.userDetials.mobilePhone.ToString(); user.Email = resumeData.userDetials.email.ToString(); user.Name = resumeData.userDetials.userName.ToString(); user.UpdateTime = DateTime.UtcNow; user.Username = resumeData.userDetials.email.ToString(); } } else { user = new ZhaopinUser { Id = userId, Source = "Deliver", ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(), CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(), Cellphone = resumeData.userDetials.mobilePhone.ToString(), Email = resumeData.userDetials.email.ToString(), Name = resumeData.userDetials.userName.ToString(), UpdateTime = DateTime.UtcNow, Username = resumeData.userDetials.email.ToString() }; db.ZhaopinUser.Add(user); } var resumeContent = JsonConvert.SerializeObject(resumeData); using (var jsonStream = new MemoryStream(GZip.Compress(Encoding.UTF8.GetBytes(resumeContent)))) { mangningOssClient.PutObject(mangningBucketName, $"Zhaopin/Resume/{resumeId}", jsonStream); } var resumePath = $"{uploadFilePath}{resumeId}.json"; File.WriteAllText(resumePath, JsonConvert.SerializeObject(resumeData)); } else { status = "NoHandle"; } db.ZhaopinDeliveryLog.Add(new ZhaopinDeliveryLog { CompanyId = staff.CompanyId, DeliveryId = (long)item.id }); db.ZhaopinDelivery.Add(new ZhaopinDelivery { CompanyId = staff.CompanyId, Id = (long)item.id, CreateTime = DateTime.UtcNow, ResumeId = resumeId, ResumeNumber = resumeData.resumeNo.ToString(), JobNumber = resumeData.jobNo.ToString(), JobName = resumeData.jobName.ToString() }); db.SaveChanges(); } #endregion stopwatch.Stop(); var elapsed = stopwatch.ElapsedMilliseconds; Interlocked.Increment(ref count); var version = isNewSystem ? "NewSystem" : "5.5"; Console.WriteLine($"{DateTime.Now} > {version} {count} {status} {staff.Username}:Unhandled = {--unhandled}, RId = {resumeId}, Elapsed = {elapsed} ms."); Thread.Sleep(interval); } catch (Exception ex) { Trace.TraceError(ex.ToString()); } #endregion } }