/// <summary>
 /// 第三方电商获取订单项物流轨迹信息
 /// </summary>
 /// <param name="orderItemId"></param>
 /// <returns></returns>
 public static ThirdOrderPackageExpress GetExpressInfo(Guid orderItemId)
 {
     if (orderItemId == Guid.Empty)
     {
         return(null);
     }
     try
     {
         var expressSku = ThirdECOrderPackageSku.ObjectSet().Where(p => p.OrderItemId == orderItemId).FirstOrDefault();
         if (expressSku == null)
         {
             return(null);
         }
         var express = new ThirdOrderPackageExpress {
             ExpressCompany = expressSku.ExpressCompany, ExpressNo = expressSku.ExpressNo, ExpressTraceList = new List <ThirdExpressTrace>()
         };
         ThirdECExpressTrace.ObjectSet().Where(p => p.OrderId == expressSku.OrderId && p.PackageId == expressSku.PackageId &&
                                               p.ExpressCompany == expressSku.ExpressCompany && p.ExpressNo == expressSku.ExpressNo).ToList().ForEach(p =>
         {
             express.ExpressTraceList.Add(new ThirdExpressTrace
             {
                 Desc = p.Desc,
                 Time = p.Time.ToString("yyyy-MM-dd HH:mm:ss")
             });
         });
         return(express);
     }
     catch (Exception ex)
     {
         LogHelper.Error(string.Format("ThirdECommerceOrderHelper.GetExpressInfo第三方电商获取订单项物流轨迹信息异常,入参:orderItemId={0}", orderItemId), ex);
     }
     return(null);
 }
 /// <summary>
 /// 第三方电商获取订单包裹商品物流信息
 /// </summary>
 /// <param name="orderId"></param>
 /// <returns></returns>
 public static List <ThirdECOrderPackageSkuDTO> GetThirdECOrderPackageSkuList(Guid orderId)
 {
     if (orderId == Guid.Empty)
     {
         return(new List <ThirdECOrderPackageSkuDTO>());
     }
     try
     {
         return(ThirdECOrderPackageSku.ObjectSet()
                .Where(p => p.OrderId == orderId)
                .ToList()
                .Select(p => p.ToEntityData())
                .ToList());
     }
     catch (Exception ex)
     {
         LogHelper.Error(string.Format("ThirdECommerceOrderHelper.GetThirdECOrderPackageSkuList第三方电商获取订单包裹商品物流信息异常,入参:orderId={0}", orderId), ex);
     }
     return(new List <ThirdECOrderPackageSkuDTO>());
 }
        /// <summary>
        /// 第三方电商发起售后服务申请
        /// </summary>
        /// <returns></returns>
        public static ResultDTO CreateService(CommodityOrder order, OrderItem orderItem, OrderRefundAfterSales refund)
        {
            string param = string.Format("orderId={0}&refundId={1}", order.Id, refund.Id);

            LogHelper.Debug(string.Format("ThirdECommerceServiceHelper.CreateService第三方电商发起售后服务申请,入参:{0}", param));
            var result = new ResultDTO {
                Message = "操作失败,请稍后重试", ResultCode = -1
            };

            try
            {
                #region 判断是否第三方电商订单及获取订单信息
                var orderSku = ThirdECOrderPackageSku.ObjectSet().FirstOrDefault(o => o.OrderId == order.Id && o.OrderItemId == orderItem.Id);
                if (orderSku == null)
                {
                    return(result);
                }
                var thirdECommerce = ThirdECommerceHelper.GetThirdECommerce(order.AppId);
                if (thirdECommerce == null || string.IsNullOrEmpty(thirdECommerce.OpenApiKey) ||
                    string.IsNullOrEmpty(thirdECommerce.OpenApiCallerId) ||
                    string.IsNullOrEmpty(thirdECommerce.ServiceCreateUrl))
                {
                    return(result);
                }
                if (ThirdECService.ObjectSet().Any(p => p.OrderRefundAfterSalesId == refund.Id))
                {
                    return(result);
                }
                #endregion
                #region 调用第三方发起售后服务申请接口
                var jsonStr  = string.Empty;
                var response = ThirdECommerceSV.CreateService(new ThirdApiInfo
                {
                    Apikey   = thirdECommerce.OpenApiKey,
                    CallerId = thirdECommerce.OpenApiCallerId,
                    ApiUrl   = thirdECommerce.ServiceCreateUrl
                }, new ThirdServiceCreate
                {
                    ServiceId     = refund.Id.ToString().ToLower(),
                    OrderId       = order.Id.ToString().ToLower(),
                    CustomerName  = order.ReceiptUserName,
                    CustomerPhone = order.ReceiptPhone,
                    SkuId         = orderSku.SkuId,
                    Number        = orderItem.Number,
                    RefundReason  = refund.RefundReason,
                    RefundDesc    = refund.RefundDesc,
                    RefundImgs    = refund.OrderRefundImgs
                }, ref jsonStr);
                #endregion
                var isSuccess = response.Successed && response.Result != null;
                #region 保存ThirdECService
                if (isSuccess)
                {
                    var stateName = string.Empty;
                    var stateDesc = string.Empty;
                    if (response.Result.ServiceStatus == 0)
                    {
                        stateName = "不支持售后";
                        result    = new ResultDTO {
                            Message = response.Result.RejectReason, ResultCode = 1
                        };
                    }
                    else if (response.Result.ServiceStatus == 1)
                    {
                        stateName = "待审核";
                        result    = new ResultDTO {
                            isSuccess = true, Message = "请等待审核", ResultCode = 2
                        };
                    }
                    stateDesc = response.Result.RejectReason;
                    var service = new ThirdECService
                    {
                        Id                      = Guid.NewGuid(),
                        OrderId                 = orderSku.OrderId,
                        OrderCode               = orderSku.OrderCode,
                        OrderItemId             = orderSku.OrderItemId,
                        OrderRefundAfterSalesId = refund.Id,
                        SubId                   = order.SubId,
                        SkuId                   = orderSku.SkuId,
                        Number                  = orderItem.Number,
                        StateName               = stateName,
                        StateDesc               = stateDesc,
                        EntityState             = EntityState.Added
                    };
                    ContextFactory.CurrentThreadContext.SaveObject(service);
                }
                else
                {
                    ContextFactory.ReleaseContextSession();
                }
                #endregion
                #region 保存ThirdECServiceJournal
                var journal = new ThirdECServiceJournal
                {
                    Id                      = Guid.NewGuid(),
                    OrderId                 = orderSku.OrderId,
                    OrderCode               = orderSku.OrderCode,
                    OrderItemId             = orderSku.OrderItemId,
                    OrderRefundAfterSalesId = refund.Id,
                    Name                    = "发起售后服务申请",
                    Details                 = response.Msg,
                    Json                    = jsonStr,
                    EntityState             = EntityState.Added
                };
                ContextFactory.CurrentThreadContext.SaveObject(journal);
                #endregion
                if (!isSuccess) //失败则只保存日志
                {
                    int count = ContextFactory.CurrentThreadContext.SaveChanges();
                    if (count == 0)
                    {
                        LogHelper.Error(string.Format("ThirdECommerceServiceHelper.CreateService第三方电商发起售后服务申请数据保存失败,入参:{0}", param));
                    }
                }
                return(result);
            }
            catch (Exception ex)
            {
                LogHelper.Error(string.Format("ThirdECommerceServiceHelper.CreateService第三方电商发起售后服务申请异常,入参:{0}", param), ex);
                return(result);
            }
        }
        /// <summary>
        /// 第三方电商商品发货信息回调
        /// </summary>
        /// <param name="result"></param>
        public static ThirdResponse DeliverOrderCallback(string packageJsonStr)
        {
            LogHelper.Debug("ThirdECommerceOrderHelper.DeliverOrderCallback第三方电商商品发货信息回调,Input:" + packageJsonStr);
            if (string.IsNullOrEmpty(packageJsonStr))
            {
                return new ThirdResponse {
                           Code = 10300, Msg = "缺少参数orderPackage"
                }
            }
            ;
            try
            {
                var packageResult = JsonConvert.DeserializeObject <ThirdOrderPackage>(packageJsonStr);

                if (packageResult == null)
                {
                    return new ThirdResponse {
                               Code = 10301, Msg = "非法参数orderPackage"
                    }
                }
                ;
                Guid orderId;
                Guid.TryParse(packageResult.OrderId, out orderId);
                DateTime expCreateTime;
                DateTime.TryParse(packageResult.ExpCreateTime, out expCreateTime);
                if (orderId == Guid.Empty)
                {
                    return new ThirdResponse {
                               Code = 10302, Msg = "非法参数OrderId"
                    }
                }
                ;
                if (string.IsNullOrEmpty(packageResult.ExpressCompany))
                {
                    return new ThirdResponse {
                               Code = 10303, Msg = "非法参数ExpressCompany"
                    }
                }
                ;
                if (string.IsNullOrEmpty(packageResult.ExpressNo))
                {
                    return new ThirdResponse {
                               Code = 10304, Msg = "非法参数ExpressNo"
                    }
                }
                ;
                if (packageResult.SkuIdList == null || packageResult.SkuIdList.Count == 0)
                {
                    return new ThirdResponse {
                               Code = 10305, Msg = "非法参数SkuIdList"
                    }
                }
                ;
                if (expCreateTime == DateTime.MinValue)
                {
                    return new ThirdResponse {
                               Code = 10306, Msg = "非法参数ExpCreateTime"
                    }
                }
                ;
                #region 判断是否第三方电商订单及获取订单信息
                var order = ThirdECOrder.ObjectSet().FirstOrDefault(o => o.OrderId == orderId);
                if (order == null)
                {
                    return new ThirdResponse {
                               Code = 10307, Msg = "未找到此订单"
                    }
                }
                ;
                var orderItemList = OrderItem.ObjectSet()
                                    .Where(p => p.CommodityOrderId == orderId)
                                    .Select(p => new
                {
                    SkuId       = p.JDCode,
                    OrderItemId = p.Id,
                    p.CommodityId,
                    CommodityStockId = p.CommodityStockId ?? Guid.Empty,
                }).ToList();
                if (orderItemList.Count == 0)
                {
                    return new ThirdResponse {
                               Code = 10308, Msg = "未找到订单sku"
                    }
                }
                ;
                #endregion
                #region ThirdECOrderPackage和ThirdECOrderPackageSku
                var package = ThirdECOrderPackage.ObjectSet().FirstOrDefault(p => p.OrderId == orderId &&
                                                                             p.ExpressCompany == packageResult.ExpressCompany && p.ExpressNo == packageResult.ExpressNo);
                if (package == null)
                {
                    package = new ThirdECOrderPackage
                    {
                        Id             = Guid.NewGuid(),
                        OrderId        = order.OrderId,
                        OrderCode      = order.OrderCode,
                        ExpressCompany = packageResult.ExpressCompany,
                        ExpressNo      = packageResult.ExpressNo,
                        ExpCreateTime  = DateTime.Parse(packageResult.ExpCreateTime),
                        EntityState    = EntityState.Added
                    };

                    ContextFactory.CurrentThreadContext.SaveObject(package);
                    packageResult.SkuIdList.ForEach(skuId =>
                    {
                        var orderItem = orderItemList.FirstOrDefault(p => p.SkuId == skuId);
                        if (orderItem == null)
                        {
                            return;
                        }
                        var packageSku = new ThirdECOrderPackageSku
                        {
                            Id               = Guid.NewGuid(),
                            OrderId          = order.OrderId,
                            OrderCode        = order.OrderCode,
                            OrderItemId      = orderItem.OrderItemId,
                            CommodityId      = orderItem.CommodityId,
                            CommodityStockId = orderItem.CommodityStockId,
                            PackageId        = package.Id,
                            SkuId            = skuId,
                            ExpressCompany   = packageResult.ExpressCompany,
                            ExpressNo        = packageResult.ExpressNo,
                            EntityState      = EntityState.Added
                        };
                        ContextFactory.CurrentThreadContext.SaveObject(packageSku);
                    });
                }
                #endregion
                #region ThirdECOrderJournal
                var packageJournal = new ThirdECOrderJournal
                {
                    Id          = Guid.NewGuid(),
                    OrderId     = order.OrderId,
                    OrderCode   = order.OrderCode,
                    Name        = "订单商品发货",
                    Details     = packageResult.ExpressCompany + "|" + packageResult.ExpressNo,
                    Json        = packageJsonStr,
                    EntityState = EntityState.Added
                };
                ContextFactory.CurrentThreadContext.SaveObject(packageJournal);
                #endregion
                int count = ContextFactory.CurrentThreadContext.SaveChanges();
                if (count > 0)
                {
                    #region 订单所有商品发货后更新订单状态到已发货
                    if (ThirdECOrderPackageSku.ObjectSet().Count(p => p.OrderId == orderId) >= orderItemList.Select(x => x.SkuId).Distinct().Count())
                    {
                        var commodityOrder = new CommodityOrderDTO();
                        commodityOrder.Id            = orderId;
                        commodityOrder.State         = 2;
                        commodityOrder.ShipmentsTime = DateTime.Now;
                        var facade = new CommodityOrderFacade();
                        facade.ContextDTO = AuthorizeHelper.CoinInitAuthorizeInfo();
                        facade.UpdateCommodityOrder(commodityOrder);
                    }
                    #endregion
                }
                else
                {
                    LogHelper.Error(string.Format("ThirdECommerceOrderHelper.DeliverOrderCallback第三方电商商品发货信息回调失败,入参:{0}", packageJsonStr));
                    return(new ThirdResponse {
                        Code = 10309, Msg = "内部异常"
                    });
                }
            }
            catch (JsonReaderException ex)
            {
                LogHelper.Error("ThirdECommerceOrderHelper.DeliverOrderCallback第三方电商商品发货信息回调反序列化异常,Input:" + packageJsonStr, ex);
                return(new ThirdResponse <ThirdOrderCancelResult> {
                    Msg = "反序列化异常"
                });
            }
            catch (Exception ex)
            {
                LogHelper.Error(string.Format("ThirdECommerceOrderHelper.DeliverOrderCallback第三方电商商品发货信息回调异常,入参:{0}", packageJsonStr), ex);
                return(new ThirdResponse {
                    Code = 10310, Msg = "内部异常"
                });
            }
            return(new ThirdResponse {
                Code = 200, Msg = "ok"
            });
        }