public JsonResult UploadNotifyResult() { GFUploadResultCache resultCache = null; var result = Cache.GetCache("GFUploadFailNumber") + string.Empty; if (string.IsNullOrEmpty(result)) { resultCache = new GFUploadResultCache { Result = "Clear" }; return(Json(resultCache, JsonRequestBehavior.AllowGet)); } resultCache = JsonConvert.DeserializeObject <GFUploadResultCache>(result); return(Json(resultCache, JsonRequestBehavior.AllowGet)); }
public JsonResult UploadFilesNotify(GFUploadNotifyRequest request) { AppUtility.Engine.LogWriter.Write($"联贷SFTP上传请求已接受{JsonConvert.SerializeObject(request)}"); var rtn = new rtn_data { code = 1, message = "接收成功" }; GFUploadResultCache uploadState = null; var uploadStateCache = Cache.GetCache("GFUploadFailNumber") + string.Empty; if (!string.IsNullOrEmpty(uploadStateCache)) { uploadState = JsonConvert.DeserializeObject <GFUploadResultCache>(uploadStateCache); if (uploadState.Equals("Ing")) { AppUtility.Engine.LogWriter.Write($"联贷SFTP正在上传中,请耐心等待"); rtn.code = -10002; rtn.message = "联贷SFTP正在上传中,请耐心等待"; return(Json(rtn, JsonRequestBehavior.AllowGet)); } } if (!request.ContractNumbers.Any()) { AppUtility.Engine.LogWriter.Write("联贷平台通知上传文件至SFTP无ContractNumbers-->" + JsonConvert.SerializeObject(request)); rtn.code = -10001; rtn.message = "无ContractNumbers"; return(Json(rtn, JsonRequestBehavior.AllowGet)); } var contractAppRelations = GetApplicationNumbersByContractNumbers(request.ContractNumbers); if (contractAppRelations == null || !contractAppRelations.Any()) { AppUtility.Engine.LogWriter.Write("联贷平台通知上传文件至SFTP,未查询到相关合同信息-->" + JsonConvert.SerializeObject(request)); rtn.code = -10001; rtn.message = "未查询到相关合同信息"; return(Json(rtn, JsonRequestBehavior.AllowGet)); } var exceptContractNumbers = request.ContractNumbers.Except(contractAppRelations.Select(p => p.ContractNumber)).ToList(); if (exceptContractNumbers == null || exceptContractNumbers.Any()) { AppUtility.Engine.LogWriter.Write("联贷平台通知上传文件至SFTP ContractNumbers不存在-->" + JsonConvert.SerializeObject(exceptContractNumbers)); rtn.code = -10001; rtn.message = "ContractNumbers不存在" + JsonConvert.SerializeObject(exceptContractNumbers); return(Json(rtn, JsonRequestBehavior.AllowGet)); } var applicationNumbers = contractAppRelations.Select(p => p.ApplicationNumber).ToList(); var datatable = GetApplicationByAppNumber(applicationNumbers); if (datatable == null) { AppUtility.Engine.LogWriter.Write("联贷平台通知上传文件至SFTP 为查询到零售申请单-->" + JsonConvert.SerializeObject(applicationNumbers)); rtn.code = -10001; rtn.message = "为查询到零售申请单" + JsonConvert.SerializeObject(applicationNumbers); return(Json(rtn, JsonRequestBehavior.AllowGet)); } var relations = new List <AppNumberUnionIdRelation>(); foreach (DataRow row in datatable.Rows) { var relation = new AppNumberUnionIdRelation(); if (!string.IsNullOrEmpty(row["AppUnionId"] + string.Empty)) { relation.UnionId = row["AppUnionId"] + string.Empty; } if (!string.IsNullOrEmpty(row["application_number"] + string.Empty)) { relation.ApplicationNumber = row["application_number"] + string.Empty; var contractAppRelation = contractAppRelations.Where(p => p.ApplicationNumber == relation.ApplicationNumber).FirstOrDefault(); relation.ContractNumber = contractAppRelation.ContractNumber; } if (!string.IsNullOrEmpty(row["objectid"] + string.Empty)) { relation.InstanceId = row["objectid"] + string.Empty; } relations.Add(relation); } //检查对应application_number是否都有 var appNumbers = relations.Select(p => p.ApplicationNumber).ToList(); var exceptNumbers = applicationNumbers.Except(appNumbers); if (exceptNumbers.Any()) { AppUtility.Engine.LogWriter.Write("联贷平台通知上传文件至SFTP AppNumber不存在-->" + JsonConvert.SerializeObject(exceptNumbers)); rtn.code = -10001; rtn.message = "ApplicationNumbers" + JsonConvert.SerializeObject(exceptNumbers) + "不存在"; return(Json(rtn, JsonRequestBehavior.AllowGet)); } #region 过时 //检查每个application_number是否都有unionId //var checkUnionIds = relations.Where(p => string.IsNullOrEmpty(p.UnionId)); //if (checkUnionIds.Any()) //{ // AppUtility.Engine.LogWriter.Write("联贷平台通知上传文件至SFTP App无关联Id-->" + JsonConvert.SerializeObject(checkUnionIds)); // rtn.code = -10001; // rtn.message = "无关联Id" + JsonConvert.SerializeObject(checkUnionIds.Select(p => p.ApplicationNumber)) + "不存在"; // return Json(rtn, JsonRequestBehavior.AllowGet); //} //var appUnionIds = relations.Select(p => p.UnionId).ToList(); //var paras = new { orderIds = appUnionIds }; //AppUtility.Engine.LogWriter.Write("联贷平台通知上传文件至SFTP:查询文件地址参数-->" + JsonConvert.SerializeObject(paras)); //var result = HttpHelper.PostWebRequest(getAppFileUrl, "application/json", JsonConvert.SerializeObject(paras)); //AppUtility.Engine.LogWriter.Write("联贷平台通知上传文件至SFTP:查询文件地址返回-->" + result); //if (string.IsNullOrEmpty(result)) //{ // rtn.code = -10000; // return Json(rtn, JsonRequestBehavior.AllowGet); //} //var jObject = JObject.Parse(result); //if (jObject["code"].ToString() != "10001") //{ // AppUtility.Engine.LogWriter.Write("联贷平台通知上传文件至SFTP:查询文件地址错误-->" + result); // rtn.code = -10000; // return Json(rtn, JsonRequestBehavior.AllowGet); //} //Task.Run(() => //{ // UploadToGFSftp(jObject["data"].ToString(), relations); //}); #endregion Task.Run(() => { UploadToGFSftp(relations, 0); }); //Func<List<string>> func = ()=> UploadToGFSftp(jObject["data"].ToString(), relations); //Task.Run(func) //.ContinueWith(_ => //{ // var failIds = _.Result; // if (failIds.Any()) // { // HttpHelper.PostWebRequest(getAppFileUrl, "application/json", JsonConvert.SerializeObject(_)); // } //}); return(Json(rtn, JsonRequestBehavior.AllowGet)); }
/// <summary> /// 上传至SFTP /// </summary> public List <string> UploadToGFSftp(List <AppNumberUnionIdRelation> relations, int retryCount) { AppUtility.Engine.LogWriter.Write($"联贷SFTP上传文件第{retryCount}次:{JsonConvert.SerializeObject(relations)}"); var resultCache = new GFUploadResultCache { Result = "Ing" }; Cache.SetCache("GFUploadFailNumber", JsonConvert.SerializeObject(resultCache), TimeSpan.FromHours(3)); Stopwatch watch = new Stopwatch(); watch.Start(); var datetime = DateTime.Now.ToString("yyyyMMdd"); var failContractNumbers = new List <string>(); //自旋锁 SpinLock _spinLock = new SpinLock(); TaskFactory factory = new TaskFactory(); List <Task> tasks = new List <Task>(); var taskCount = Convert.ToInt32(gfThreadCount); var pageSize = Convert.ToInt32(gfThreadUploadSize); if (relations.Count() > 1) { pageSize = relations.Count() % taskCount == 0 ? relations.Count() / taskCount : (relations.Count() / taskCount) + 1; } for (var i = 0; i < taskCount; i++) { var pageRelations = relations.Skip(i * pageSize).Take(pageSize).ToList(); if (!pageRelations.Any()) { continue; } var task = factory.StartNew(() => { return(TaskUpload(pageRelations, datetime)); }).ContinueWith(_ => { var failIds = _.Result; if (failIds.Any()) { bool _lock = false; try { //防止多线程问题 _spinLock.Enter(ref _lock); failContractNumbers.AddRange(failIds); } finally { if (_lock) { _spinLock.Exit(); } } } }); tasks.Add(task); } factory.ContinueWhenAll(tasks.ToArray(), (continueTasks) => { if (failContractNumbers.Any()) { resultCache.Result = "Fail"; resultCache.FailContractNumbers = failContractNumbers; AppUtility.Engine.LogWriter.Write($"联贷SFTP上传文件失败:{JsonConvert.SerializeObject(failContractNumbers)}"); retryCount++; if (retryCount < 4) { var retryRelations = relations.Where(p => failContractNumbers.Contains(p.ContractNumber)).ToList(); Task.Run(() => { UploadToGFSftp(retryRelations, retryCount); }); } else { Cache.SetCache("GFUploadFailNumber", JsonConvert.SerializeObject(resultCache), TimeSpan.FromHours(3)); } } else { resultCache.Result = "Success"; Cache.SetCache("GFUploadFailNumber", JsonConvert.SerializeObject(resultCache), TimeSpan.FromHours(3)); } watch.Stop(); AppUtility.Engine.LogWriter.Write($"联贷SFTP上传文件第{retryCount}次用时:{watch.ElapsedMilliseconds}ms"); }); return(failContractNumbers); }