Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        /// <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);
        }