任务描述


需求描述

需求背景

近期优惠券失败数相比之前出现暴增,业务已协助提case,但时候未得到准确的原因,采集针对提报失败的,去后台分析与研究,发现亚马逊针对新失败的提供了具体原因,现在需要服务根据亚马逊提示失败的进行重试处理



需求内容

1、针对V2队列里文件提交失败(status=2),且【Message】信息是【您的文件存在错误 - 请更新以下文件中的错误字段,然后重新上传】,需要进行解析:【UploadResponse】字段【errorMessage】不为空的,失败原因内容解析对应中文明细如下:原规则可见需求ID  18773、19396

新增:newui-error-pricing-validations:价格错误/不满足


2、重试服务新增规则:针对下载回来的结果失败原因进行重试:

新增:失败原因内容是【newui-error-pricing-validations】,需要进行解析该字段里提供的ASIN,并将这些ASIN从优惠券组里进行移除后,按照重试规则重新提交。


3、针对失败原因是【newui-error-pricing-validations】,需要进行解析:【UploadResponse】字段【errorDetails - reasons - suppressionThresholdName】:会具体说明每个ASIN失败原因。并展示在优惠券执行队列页面的【错误原因】

注意:同一个ASIN会有多个reasons,则需要都展示,并且去重展示



注意,以上针对重试的ASIN,需要新增判断:listingstatus状态,过滤listing状态不在线的,优惠券组是否满足15个ASIN。


上线后,原重试服务,会自动针对近3天失败的任务进行重试,最多重试3次

验收标准
暂无
历史记录  
  1. 2025-03-11 10:51:13, 由 罗友军 创建。
  2. 2025-03-11 10:52:58, 由 罗友军 编辑。
    修改了 开发组,旧值为 "11",新值为 "13"。
  3. 2025-03-11 15:26:31, 由 钟国泽 完成。
    修改了 总计消耗,旧值为 "0",新值为 "16"。
    修改了 指派给 ,旧值为 "zhongguoze",新值为 "luoyoujun"。
    修改了 实际完成,旧值为 "",新值为 "2025-03-11 15:23:55"。
    修改了 任务状态,旧值为 "wait",新值为 "done"。
    修改了 实际开始,旧值为 "0000-00-00 00:00:00",新值为 "2025-03-11 15:26:31"。
    修改了 预计剩余,旧值为 "20",新值为 "0"。
    修改了 由谁完成,旧值为 "",新值为 "zhongguoze"。
    失败的优惠券数据,剔除无效asin后重试成功

    剔除的asin和失败的详情


    业务代码:

                    case var msg when msg.Contains("newui-error-pricing-validations", StringComparison.OrdinalIgnoreCase) && couponRootNew.coupons.First().errorDetails.Count() > 0:
                        //将不符合的asin回写状态为失败和记录具体原因
                        List<errorDetailsItems> errorDetails = couponRootNew.coupons.First().errorDetails;
                        UpdateCouponDetailByReasons(1, currentCouponDetail, uploadErrorAsin: errorDetails);

                        //剔除无效asin获取能上传的asin集合
                        List<string> allAsin = couponUploadData.coupons.FirstOrDefault().asins.ToList(); ;
                        List<string> errorAsin = errorDetails.Select(o => o.asin).ToList();
                        allAsin = allAsin.Except(errorAsin).ToList();

                        //过滤其他因素剩余能上传的asin数
                        var currentCouponDetailInfo = currentCouponDetail.Where(x => x.CouponUploadTaskV2ID == couponUploadTaskV2.TaskId).ToList();
                        var couponExecute = await GetUploadAsinList(allAsin, currentCouponDetailInfo, couponUploadData, orderSourceId, siteCode);
                        if (couponExecute.Count() <= 0)
                        {
                            break;
                        }
                        couponUploadData.coupons.FirstOrDefault().asins = couponExecute;

                        //重新修改优惠券状态
                        await RetryUploadTaskV2StatusAsync(couponUploadData, couponUploadTaskV2, siteCode);
                        break;

     /// <summary>
     /// 根据asin数量回写指定的状态,dataType【1:json自带错误原因,2:手动指定错误原因】
     /// </summary>
     /// <param name="couponDetails"></param>
     /// <param name="uploadAsinResult"></param>
     private void UpdateCouponDetailByReasons(int dataType, List<AutoCouponDetail> couponDetails, List<errorDetailsItems> uploadErrorAsin = null, List<string> updateAsin = null, string errorMessage = "")
     {
         var needUpdateModels = new List<AutoCouponDetail>();
         foreach (var message in couponDetails)
         {
             if (dataType == 1)
             {
                 var result = uploadErrorAsin.FirstOrDefault(x => x.asin == message.ASIN.AsString);
                 if (result == null)
                 {
                     continue;
                 }
                 errorMessage = String.Join(';', result.reasons.Select(o => o.suppressionThresholdName).Distinct().ToList());
             }
             else if (dataType == 2)
             {
                 var result = updateAsin.FirstOrDefault(x => x == message.ASIN.AsString);
                 if (result == null)
                 {
                     continue;
                 }
             }
             message.FailureReason = errorMessage;
             message.UploadStatus = (int)EnumCouponUploadStatus.上传失败;
             message.UpdateTime = DateTime.Now;
             needUpdateModels.Add(message);
         }



         if (needUpdateModels.Any())
         {
             _autoCouponDetailMgoRepository.Save(needUpdateModels,
                 new List<string>()
                 {
                     nameof(AutoCouponDetail.FailureReason),
                     nameof(AutoCouponDetail.UpdateTime),
                     nameof(AutoCouponDetail.UploadStatus)
                 }, false);
         }

         _markListingStrategyService.SaveCouponResult(couponDetails, true).GetAwaiter().GetResult();
     }

            /// <summary>
            /// 根据asin列表排除不符合上传的asin【更改优惠券状态前过滤条件】
            /// </summary>
            /// <param name="asins"></param>
            /// <param name="currentCouponDetail"></param>
            /// <param name="orderSourceId"></param>
            /// <param name="siteCode"></param>
            /// <returns></returns>
            private async Task<List<string>> GetUploadAsinList(List<string> asins, List<AutoCouponDetail> currentCouponDetail, CouponUploadData couponUploadData, int orderSourceId, string siteCode)
            {
                //**********************************【优惠券组ASIN不足15个】 这个必须放在最后*********************************************************
                List<string> validateType = new List<string>() { "优惠券不在线", "优惠券时间修改", "优惠券组ASIN不足15个" };
                
                foreach (var item in validateType)
                {
                    switch (item)
                    {
                        case "优惠券不在线":
                            var currentOrderSourceList = currentCouponDetail.Select(x => x.OrderSourceSKU.Value).ToList();
                            var markListingList = await _markListingNMgoRepository.GetMarkListingsAsync(orderSourceId, currentOrderSourceList, siteCode);
                            asins = await GetRetryValidAsinListAsync(asins, currentCouponDetail, markListingList, orderSourceId, siteCode);
                            break;

                        case "优惠券组ASIN不足15个":
                            if (asins.Count() < 15)
                            {
                                UpdateCouponDetailByReasons(2, currentCouponDetail, updateAsin: asins, errorMessage: "优惠券组ASIN不足15个");
                                asins = new List<string>();
                                break;
                            }
                            break;
                        case "优惠券时间修改":
                            AnalysisCouponUploadData(couponUploadData, asins, siteCode);
                            break;
                        default:
                            break;
                    }
                }


                return asins;
            }

  4. 2025-03-12 10:48:44, 由 梁秀丽 编辑。
    修改了 最初预计,旧值为 "20",新值为 "11"。
  5. 2025-05-17 14:13:03, 由 李亚婷 关闭。
    修改了 任务状态,旧值为 "done",新值为 "closed"。
    修改了 指派给 ,旧值为 "luoyoujun",新值为 "closed"。
    修改了 由谁关闭,旧值为 "",新值为 "liyating"。
    修改了 关闭时间,旧值为 "0000-00-00 00:00:00",新值为 "2025-05-17 14:13:03"。
    修改了 关闭原因,旧值为 "",新值为 "done"。
所属迭代 智能中心-智能运营迭代
所属模块 智能中心-需求池  战略独立项目   智能运营
相关需求 智能运营:优惠券兼容新失败类型
指派给 Closed 于 2025-05-17 14:13:03
任务类型 后端
任务标签 初始
开发组
任务状态 已关闭
进度 100%
优先级 P3
关键词
抄送给
由谁创建 罗友军 于 2025-03-11 10:51:13
由谁完成 钟国泽 于 2025-03-11 15:23:55
由谁取消 暂无
由谁关闭 李亚婷 于 2025-05-17 14:13:03
关闭原因 已完成
最后编辑 李亚婷 于 2025-05-17 14:13:03
团队 最初预计 总计消耗 预计剩余
工时信息
最初预计 11工时
总计消耗 16工时
预计剩余 0工时
预计开始 2025-03-11
实际开始 2025-03-11
截止日期 2025-03-14