步步为盈
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1356 lines
70 KiB

using BBWY.Common.Extensions;
using BBWY.Common.Models;
using BBWY.Server.Model;
using BBWY.Server.Model.Dto;
using Jd.ACES;
using Jd.Api;
using Jd.Api.Request;
using Jd.Api.Response;
using Microsoft.Extensions.Caching.Memory;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace BBWY.Server.Business
{
public class JDBusiness : PlatformSDKBusiness
{
public override Enums.Platform Platform => Enums.Platform.;
private readonly string searchFields = "orderId,venderId,orderType,payType,orderTotalPrice,orderSellerPrice,orderPayment,freightPrice,orderState,orderStateRemark,orderRemark,orderStartTime,orderEndTime,modified,consigneeInfo,itemInfoList,couponDetailList,taxFee,venderRemark,pin,waybill,storeOrder,storeId,sellerDiscount";
private readonly IDictionary<string, string> flagDictionary = new Dictionary<string, string>()
{
{ "Gray","0" },
{ "Red","1"},
{ "Yellow","2"},
{ "Green","3"},
{ "Blue","4"},
{ "Purple","5"}
};
public JDBusiness(IMemoryCache memoryCache, NLogManager nLogManager) : base(memoryCache, nLogManager) { }
private IJdClient GetJdClient(string appKey, string appSecret)
{
if (!memoryCache.TryGetValue(appKey, out IJdClient jdClient))
{
jdClient = new DefaultJdClient("https://api.jd.com/routerjson", appKey, appSecret);
memoryCache.Set(appKey, jdClient, expirationTimeSpan);
}
return jdClient;
}
public override VenderResponse GetVenderInfo(PlatformRequest platformRequest)
{
var jdClient = GetJdClient(platformRequest.AppKey, platformRequest.AppSecret);
var shopJDResponse = jdClient.Execute(new VenderShopQueryRequest(), platformRequest.AppToken, DateTime.Now.ToLocalTime());
if (shopJDResponse.IsError)
throw new BusinessException(string.IsNullOrEmpty(shopJDResponse.ErrorMsg) ? shopJDResponse.ErrMsg : shopJDResponse.ErrorMsg);
var venderJDResponse = jdClient.Execute(new SellerVenderInfoGetRequest(), platformRequest.AppToken, DateTime.Now.ToLocalTime());
if (venderJDResponse.IsError)
throw new BusinessException(string.IsNullOrEmpty(venderJDResponse.ErrorMsg) ? venderJDResponse.ErrMsg : venderJDResponse.ErrorMsg);
nLogManager.Default().Info($"shopJDResponse\r\n{shopJDResponse.Body}\r\n shopJDResponse Json is null {shopJDResponse.Json == null}");
nLogManager.Default().Info($"venderJDResponse\r\n{venderJDResponse.Body}\r\n venderJDResponse Json is null {venderJDResponse.Json == null}");
var v = new VenderResponse();
v.VenderId = venderJDResponse.Json["jingdong_seller_vender_info_get_responce"]["vender_info_result"].Value<string>("vender_id");
v.ShopId = venderJDResponse.Json["jingdong_seller_vender_info_get_responce"]["vender_info_result"].Value<string>("shop_id");
v.ShopName = venderJDResponse.Json["jingdong_seller_vender_info_get_responce"]["vender_info_result"].Value<string>("shop_name");
v.ColType = venderJDResponse.Json["jingdong_seller_vender_info_get_responce"]["vender_info_result"].Value<string>("col_type"); //0 SOP 1 FBP 100 FCS
v.Logo = shopJDResponse.Json["jingdong_vender_shop_query_responce"]["shop_jos_result"].Value<string>("logo_url");
v.MainCategoryId = shopJDResponse.Json["jingdong_vender_shop_query_responce"]["shop_jos_result"].Value<string>("category_main");
v.MainCategoryName = shopJDResponse.Json["jingdong_vender_shop_query_responce"]["shop_jos_result"].Value<string>("category_main_name");
return v;
}
public override ProductListResponse GetProductList(SearchProductRequest searchProductRequest)
{
if (searchProductRequest.PageSize == 0)
searchProductRequest.PageSize = 5;
var jdClient = GetJdClient(searchProductRequest.AppKey, searchProductRequest.AppSecret);
var req_productList = new WareReadSearchWare4ValidRequest()
{
orderField = "modified",
orderType = "desc",
pageSize = searchProductRequest.PageSize,
pageNo = searchProductRequest.PageIndex,
field = "created,logo,brandName"
};
if (!string.IsNullOrEmpty(searchProductRequest.Spu))
req_productList.wareId = searchProductRequest.Spu;
if (!string.IsNullOrEmpty(searchProductRequest.ProductItem))
req_productList.itemNum = searchProductRequest.ProductItem;
if (!string.IsNullOrEmpty(searchProductRequest.ProductName))
{
req_productList.searchField = "title";
req_productList.searchKey = searchProductRequest.ProductName;
}
var rep_productList = jdClient.Execute(req_productList, searchProductRequest.AppToken, DateTime.Now.ToLocalTime());
if (rep_productList.IsError)
throw new BusinessException(string.IsNullOrEmpty(rep_productList.ErrorMsg) ? rep_productList.ErrMsg : rep_productList.ErrorMsg);
return new ProductListResponse()
{
Count = rep_productList.page.totalItem,
Items = ((JArray)rep_productList.Json["jingdong_ware_read_searchWare4Valid_responce"]["page"]["data"]).Select(p => new ProductResponse()
{
Id = p.Value<string>("wareId"),
Title = p.Value<string>("title"),
ProductItemNum = p.Value<string>("itemNum"),
State = p.Value<int>("wareStatus"),
CreateTime = p.Value<long>("created").StampToDateTime(),
Logo = $"https://img13.360buyimg.com/n9/s100x100_{p.Value<string>("logo")}",
BrandName = p.Value<string>("brandName")
}).ToList()
};
}
public override IList<ProductSkuResponse> GetProductSkuList(SearchProductSkuRequest searchProductSkuRequest)
{
var jdClient = GetJdClient(searchProductSkuRequest.AppKey, searchProductSkuRequest.AppSecret);
var req_skuList = new SkuReadSearchSkuListRequest()
{
pageSize = 50,//50
field = "logo,saleAttrs,status,created,barCode,categoryId,multiCateProps"
};
var skuList = new List<ProductSkuResponse>();
IList<string> skuIdList = null;
var pageIndex = 1;
var pageSize = 20;
var totalPageSize = 1;
if (!string.IsNullOrEmpty(searchProductSkuRequest.Spu))
totalPageSize = 1;
else if (!string.IsNullOrEmpty(searchProductSkuRequest.Sku))
{
skuIdList = searchProductSkuRequest.Sku.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
totalPageSize = (skuIdList.Count() - 1) / pageSize + 1;
}
while (true)
{
if (!string.IsNullOrEmpty(searchProductSkuRequest.Spu))
req_skuList.wareId = searchProductSkuRequest.Spu;
else if (!string.IsNullOrEmpty(searchProductSkuRequest.Sku))
req_skuList.skuId = string.Join(",", skuIdList.Skip((pageIndex - 1) * pageSize).Take(pageSize));
var rep_skuList = jdClient.Execute(req_skuList, searchProductSkuRequest.AppToken, DateTime.Now.ToLocalTime());
if (rep_skuList.IsError)
throw new BusinessException(string.IsNullOrEmpty(rep_skuList.ErrorMsg) ? rep_skuList.ErrMsg : rep_skuList.ErrorMsg);
var currentList = ((JArray)rep_skuList.Json["jingdong_sku_read_searchSkuList_responce"]["page"]["data"]).Select(s => new ProductSkuResponse()
{
Id = s.Value<string>("skuId"),
ProductId = s.Value<string>("wareId"),
Price = s.Value<decimal>("jdPrice"),
Title = s["saleAttrs"] != null ? string.Join("-", s["saleAttrs"].Select(a => a["attrValueAlias"][0].ToString())) : string.Empty,
Logo = $"https://img13.360buyimg.com/n9/s80x80_{s.Value<string>("logo")}",
State = s.Value<int>("status"),
CreateTime = s.Value<long>("created").StampToDateTime(),
Source = searchProductSkuRequest.IsContainSource ? s : null
}).ToList();
if (currentList != null && currentList.Count() > 0)
skuList.AddRange(currentList);
if (pageIndex >= totalPageSize)
break;
pageIndex++;
}
if (searchProductSkuRequest.IsCheckSkuCount &&
!string.IsNullOrEmpty(searchProductSkuRequest.Sku) &&
skuIdList.Count() != skuList.Count())
{
var targetSkuIdList = skuList.Select(s => s.Id);
var exceptSkuIdList = skuIdList.Except(targetSkuIdList);
throw new BusinessException($"{searchProductSkuRequest.CheckStep}-sku条件数量和查询结果数量不一致\r\n{string.Join(",", exceptSkuIdList)}");
}
return skuList;
}
public override IList<SimpleProductSkuResponse> GetSimpleProductSkuList(SearchProductSkuRequest searchProductSkuRequest)
{
var jdClient = GetJdClient(searchProductSkuRequest.AppKey, searchProductSkuRequest.AppSecret);
var req_skuList = new SkuReadSearchSkuListRequest()
{
pageSize = 50,//50
field = "logo"
};
if (!string.IsNullOrEmpty(searchProductSkuRequest.Spu))
req_skuList.wareId = searchProductSkuRequest.Spu;
else if (!string.IsNullOrEmpty(searchProductSkuRequest.Sku))
req_skuList.skuId = searchProductSkuRequest.Sku;
var rep_skuList = jdClient.Execute(req_skuList, searchProductSkuRequest.AppToken, DateTime.Now.ToLocalTime());
if (rep_skuList.IsError)
throw new BusinessException(rep_skuList.ErrorMsg);
return ((JArray)rep_skuList.Json["jingdong_sku_read_searchSkuList_responce"]["page"]["data"]).Select(s => new SimpleProductSkuResponse()
{
Id = s.Value<string>("skuId"),
Logo = $"https://img13.360buyimg.com/n9/s80x80_{s.Value<string>("logo")}"
}).ToList();
}
public override IList<JToken> GetOrderList(SearchPlatformOrderRequest searchOrderRequest)
{
if (searchOrderRequest.StartDate == null || searchOrderRequest.EndDate == null)
throw new BusinessException("缺少开始/结束日期");
if ((searchOrderRequest.EndDate.Value - searchOrderRequest.StartDate.Value).TotalDays > 30)
throw new BusinessException("开始/结束相差不能超过30天");
var jdClient = GetJdClient(searchOrderRequest.AppKey, searchOrderRequest.AppSecret);
//int orderCount = 0;
List<JToken> orderJtokens = new List<JToken>();
if (string.IsNullOrEmpty(searchOrderRequest.OrderId))
{
if (searchOrderRequest.JDColType == "1")
{
var fbpReq = new PopOrderFbpSearchRequest();
if (searchOrderRequest.StartDate != null)
fbpReq.startDate = searchOrderRequest.StartDate.Value.ToString("yyyy-MM-dd HH:mm:ss");
if (searchOrderRequest.EndDate != null)
fbpReq.endDate = searchOrderRequest.EndDate.Value.Date.ToString("yyyy-MM-dd HH:mm:ss");
if (string.IsNullOrEmpty(searchOrderRequest.OrderState))
{
fbpReq.orderState = "DengDaiDaYin,DengDaiChuKu,DengDaiDaBao,DengDaiFaHuo,ZiTiTuZhong,ShangMenTiHuo,ZiTiTuiHuo,DengDaiQueRenShouHuo,PeiSongTuiHuo,HuoDaoFuKuanQueRen,WanCheng,DengDaiFenQiFuKuan,ServiceFinished,SuoDing,DengDaiTuiKuan,DengDaiKeHuHuiFu,TRADE_CANCELED,LOCKED";
}
else
{
fbpReq.orderState = searchOrderRequest.OrderState; //待转换
}
fbpReq.page = searchOrderRequest.PageIndex.ToString();
fbpReq.pageSize = searchOrderRequest.PageSize.ToString();
fbpReq.colType = "1";
fbpReq.optionalFields = searchFields;
fbpReq.sortType = "1";
if (searchOrderRequest.SortTimeType != null)
fbpReq.dateType = ((int)searchOrderRequest.SortTimeType).ToString();
var fbpResponse = jdClient.Execute(fbpReq, searchOrderRequest.AppToken, DateTime.Now.ToLocalTime());
if (searchOrderRequest.SaveResponseLog)
nLogManager.Default().Info($"fbpResponse\r\n{JsonConvert.SerializeObject(fbpResponse)}");
if (fbpResponse.IsError)
throw new BusinessException($"获取FBP订单失败 {(string.IsNullOrEmpty(fbpResponse.ErrorMsg) ? fbpResponse.ErrMsg : fbpResponse.ErrorMsg)}");
if (fbpResponse.Json == null)
fbpResponse.Json = JObject.Parse(fbpResponse.Body);
//orderCount = fbpResponse.Json["jingdong_pop_order_fbp_search_responce"]["searchfbporderinfo_result"].Value<int>("orderTotal");
orderJtokens.AddRange((JArray)fbpResponse.Json["jingdong_pop_order_fbp_search_responce"]["searchfbporderinfo_result"]["orderInfoList"]);
}
else if (searchOrderRequest.JDColType == "0")
{
var pageIndex = 1;
var pageSize = 100;
var sopReq = new PopOrderEnSearchRequest();
if (searchOrderRequest.StartDate != null)
sopReq.startDate = searchOrderRequest.StartDate.Value.ToString("yyyy-MM-dd HH:mm:ss");
if (searchOrderRequest.EndDate != null)
sopReq.endDate = searchOrderRequest.EndDate.Value.ToString("yyyy-MM-dd HH:mm:ss");
if (string.IsNullOrEmpty(searchOrderRequest.OrderState))
{
//WAIT_SELLER_STOCK_OUT,WAIT_GOODS_RECEIVE_CONFIRM,WAIT_SELLER_DELIVER,PAUSE,FINISHED_L,TRADE_CANCELED,LOCKED
sopReq.orderState = "WAIT_SELLER_STOCK_OUT,WAIT_GOODS_RECEIVE_CONFIRM,PAUSE,FINISHED_L,TRADE_CANCELED,LOCKED,NOT_PAY";
}
else
{
sopReq.orderState = searchOrderRequest.OrderState; //待转换
}
sopReq.optionalFields = searchFields;
//sopReq.page = searchOrderRequest.PageIndex.ToString();
sopReq.pageSize = pageSize.ToString();
sopReq.sortType = "1";
if (searchOrderRequest.SortTimeType != null)
sopReq.dateType = ((int)searchOrderRequest.SortTimeType).ToString();
while (true)
{
sopReq.page = pageIndex.ToString();
var sopResponse = jdClient.Execute(sopReq, searchOrderRequest.AppToken, DateTime.Now.ToLocalTime());
if (searchOrderRequest.SaveResponseLog)
nLogManager.Default().Info($"sopRequest\r\n{JsonConvert.SerializeObject(searchOrderRequest)} \r\nsopResponse\r\n{JsonConvert.SerializeObject(sopResponse)}");
if (sopResponse.IsError)
throw new BusinessException($"获取SOP订单失败 {(string.IsNullOrEmpty(sopResponse.ErrorMsg) ? sopResponse.ErrMsg : sopResponse.ErrorMsg)}");
if (sopResponse.Json == null)
sopResponse.Json = JObject.Parse(sopResponse.Body);
//orderCount = sopResponse.Json["jingdong_pop_order_enSearch_responce"]["searchorderinfo_result"].Value<int>("orderTotal");
var orderJarray = (JArray)sopResponse.Json["jingdong_pop_order_enSearch_responce"]["searchorderinfo_result"]["orderInfoList"];
orderJtokens.AddRange(orderJarray);
if (orderJarray.Count() < pageSize)
break;
pageIndex++;
}
}
}
else
{
var req = new PopOrderEnGetRequest();
req.optionalFields = searchFields;
req.orderId = searchOrderRequest.OrderId;
var jdResponse = jdClient.Execute(req, searchOrderRequest.AppToken, DateTime.Now.ToLocalTime());
if (jdResponse.IsError)
throw new BusinessException(jdResponse.ErrorMsg);
if (searchOrderRequest.SaveResponseLog)
nLogManager.Default().Info($"jdResponse\r\n{JsonConvert.SerializeObject(jdResponse)}");
if (jdResponse.IsError)
throw new BusinessException($"获取单订单失败 {(string.IsNullOrEmpty(jdResponse.ErrorMsg) ? jdResponse.ErrMsg : jdResponse.ErrorMsg)}");
if (jdResponse.Json == null)
jdResponse.Json = JObject.Parse(jdResponse.Body);
var orderInfo = jdResponse.Json["jingdong_pop_order_enGet_responce"]["orderDetailInfo"]["orderInfo"];
if (orderInfo != null)
{
//orderCount = 1;
orderJtokens.Add(orderInfo);
}
}
return orderJtokens;
}
public override ConsigneeSimpleResponse DecryptConsignee(DecryptConsigneeRequest decryptConsigneeRequest)
{
var jdClient = GetJdClient(decryptConsigneeRequest.AppKey, decryptConsigneeRequest.AppSecret);
var req = new PopOrderEnGetRequest();
req.optionalFields = searchFields;
req.orderId = decryptConsigneeRequest.OrderId;
var jdResponse = jdClient.Execute(req, decryptConsigneeRequest.AppToken, DateTime.Now.ToLocalTime());
if (jdResponse.IsError)
throw new BusinessException($"解密异常 {decryptConsigneeRequest.OrderId} {(string.IsNullOrEmpty(jdResponse.ErrorMsg) ? jdResponse.ErrMsg : jdResponse.ErrorMsg)}");
if (jdResponse.Json == null)
jdResponse.Json = JObject.Parse(jdResponse.Body);
var orderInfo = jdResponse.Json["jingdong_pop_order_enGet_responce"]["orderDetailInfo"]["orderInfo"];
if (orderInfo == null)
throw new BusinessException($"解密异常 {decryptConsigneeRequest.OrderId}不存在");
var tdeClient = new TDEClient("https://api.jd.com/routerjson", decryptConsigneeRequest.AppKey, decryptConsigneeRequest.AppSecret, decryptConsigneeRequest.AppToken);
var decryptContactName = tdeClient.DecryptString(orderInfo["consigneeInfo"].Value<string>("fullname"));
var decryptAddress = tdeClient.DecryptString(orderInfo["consigneeInfo"].Value<string>("fullAddress"));
/*
PopOrderGetmobilelistRequest decryptMobileReq = new PopOrderGetmobilelistRequest();
decryptMobileReq.appName = "订单管家";
decryptMobileReq.orderId = decryptConsigneeRequest.OrderId;
var decryptMobileResponse = jdClient.Execute(decryptMobileReq, decryptConsigneeRequest.AppToken, DateTime.Now.ToLocalTime());
if (decryptMobileResponse.IsError)
throw new BusinessException(string.IsNullOrEmpty(decryptMobileResponse.ErrorMsg) ? decryptMobileResponse.ErrMsg : decryptMobileResponse.ErrorMsg);
if (decryptConsigneeRequest.SaveResponseLog)
logger.Info(decryptMobileResponse.Body);
if (decryptMobileResponse.Json == null)
decryptMobileResponse.Json = JObject.Parse(decryptMobileResponse.Body);
if (decryptMobileResponse.Json["jingdong_pop_order_getmobilelist_responce"]["result"]["data"] == null)
throw new BusinessException(decryptMobileResponse.Json["jingdong_pop_order_getmobilelist_responce"]["result"]["message"].ToString());
var decryptMobile = decryptMobileResponse.Json["jingdong_pop_order_getmobilelist_responce"]["result"]["data"][decryptConsigneeRequest.OrderId].Value<string>("consMobilePhone");
var decryptTelePhone = decryptMobileResponse.Json["jingdong_pop_order_getmobilelist_responce"]["result"]["data"][decryptConsigneeRequest.OrderId].Value<string>("customerPhone");
*/
return new ConsigneeSimpleResponse()
{
Address = decryptAddress,
ContactName = decryptContactName,
//Mobile = decryptMobile,
//TelePhone = decryptTelePhone
};
}
public override void EditVenderRemark(EditVenderRemarkRequest editVenderRemarkRequest)
{
var jdClient = GetJdClient(editVenderRemarkRequest.AppKey, editVenderRemarkRequest.AppSecret);
PopOrderModifyVenderRemarkRequest req = new PopOrderModifyVenderRemarkRequest
{
orderId = long.Parse(editVenderRemarkRequest.OrderId),
flag = flagDictionary.ContainsKey(editVenderRemarkRequest.Flag) ? flagDictionary[editVenderRemarkRequest.Flag] : editVenderRemarkRequest.Flag,
remark = editVenderRemarkRequest.VenderRemark
};
var response = jdClient.Execute(req, editVenderRemarkRequest.AppToken, DateTime.Now.ToLocalTime());
if (response.IsError)
throw new BusinessException($"修改商家备注失败 {(string.IsNullOrEmpty(response.ErrorMsg) ? response.ErrMsg : response.ErrorMsg)}");
}
public override IList<LogisticsResponse> GetLogisticsList(PlatformRequest platformRequest)
{
var jdClient = GetJdClient(platformRequest.AppKey, platformRequest.AppSecret);
var response = jdClient.Execute(new FceAlphaGetVenderCarrierRequest(), platformRequest.AppToken, DateTime.Now.ToLocalTime());
if (response.IsError)
throw new BusinessException($"{response.RealErrorMsg}");
if (response.Json == null)
response.Json = JObject.Parse(response.Body);
if (platformRequest.SaveResponseLog)
nLogManager.Default().Info(response.Body);
var jarray = (JArray)(response.Json["jingdong_fce_alpha_getVenderCarrier_responce"]["StandardGenericResponse"]["result"]["carrierList"]);
return jarray.Select(j => new LogisticsResponse()
{
Id = j.Value<string>("id"),
Name = j.Value<string>("name").Trim(),
}).ToList();
}
public override void OutStock(OutStockRequest outStockRequest)
{
var jdClient = GetJdClient(outStockRequest.AppKey, outStockRequest.AppSecret);
PopOrderShipmentRequest req = new PopOrderShipmentRequest
{
orderId = outStockRequest.OrderId,
logiCoprId = outStockRequest.LogisticsId,
logiNo = outStockRequest.WayBillNo
};
var response = jdClient.Execute(req, outStockRequest.AppToken, DateTime.Now.ToLocalTime());
if (outStockRequest.SaveResponseLog)
nLogManager.Default().Info($"出库发货 Request:{JsonConvert.SerializeObject(outStockRequest)} Response:{JsonConvert.SerializeObject(response)}");
if (response.IsError)
throw new BusinessException($"{response.RealErrorMsg}");
if (response.Json == null)
response.Json = JObject.Parse(response.Body);
if (!response.Json["jingdong_pop_order_shipment_responce"]["sopjosshipment_result"].Value<bool>("success"))
{
throw new BusinessException($"{response.Json["jingdong_pop_order_shipment_responce"]["sopjosshipment_result"].Value<string>("chineseErrCode")}");
}
}
public override JArray GetRefundList(SearchRefundPlatformOrderRequest searchRefundPlatformOrderRequest)
{
var jdClient = GetJdClient(searchRefundPlatformOrderRequest.AppKey, searchRefundPlatformOrderRequest.AppSecret);
AscServiceAndRefundViewRequest req = new AscServiceAndRefundViewRequest();
//req.orderId = ;
//req.applyTimeBegin = ;
//req.applyTimeEnd = ;
if (!string.IsNullOrEmpty(searchRefundPlatformOrderRequest.OrderId))
req.orderId = long.Parse(searchRefundPlatformOrderRequest.OrderId);
req.approveTimeBegin = searchRefundPlatformOrderRequest.StartDate;
req.approveTimeEnd = searchRefundPlatformOrderRequest.EndDate;
req.pageNumber = searchRefundPlatformOrderRequest.PageIndex.ToString();
req.pageSize = searchRefundPlatformOrderRequest.PageSize.ToString();
var response = jdClient.Execute(req, searchRefundPlatformOrderRequest.AppToken, DateTime.Now.ToLocalTime());
if (searchRefundPlatformOrderRequest.SaveResponseLog)
nLogManager.Default().Info($"获取退款订单 Request:{JsonConvert.SerializeObject(searchRefundPlatformOrderRequest)} Response:{JsonConvert.SerializeObject(response)}");
if (response.IsError)
throw new BusinessException($"获取退款订单失败 {(string.IsNullOrEmpty(response.ErrorMsg) ? response.ErrMsg : response.ErrorMsg)}");
if (response.Json == null)
response.Json = JsonConvert.DeserializeObject<JObject>(response.Body);
//return base.GetRefundList(searchRefundPlatformOrderRequest);
return (JArray)response.Json["jingdong_asc_serviceAndRefund_view_responce"]["pageResult"]["data"];
}
public override JArray GetAfterOrderList(SyncAfterOrderRequest syncAfterOrderRequest)
{
var jdClient = GetJdClient(syncAfterOrderRequest.AppKey, syncAfterOrderRequest.AppSecret);
var req = new AscQueryListRequest();
req.buId = syncAfterOrderRequest.VenderId;
req.operatePin = "开发测试";
req.operateNick = "开发测试";
req.finishTimeBegin = syncAfterOrderRequest.StartDate;
req.finishTimeEnd = syncAfterOrderRequest.EndDate;
req.pageNumber = syncAfterOrderRequest.PageIndex.ToString();
req.pageSize = syncAfterOrderRequest.PageSize.ToString();
if (!string.IsNullOrEmpty(syncAfterOrderRequest.OrderId))
req.orderId = long.Parse(syncAfterOrderRequest.OrderId);
AscQueryListResponse response = jdClient.Execute(req, syncAfterOrderRequest.AppToken, DateTime.Now.ToLocalTime());
if (response.IsError)
throw new BusinessException($"获取售后订单失败 {(string.IsNullOrEmpty(response.ErrorMsg) ? response.ErrMsg : response.ErrorMsg)}");
if (response.Json == null)
response.Json = JsonConvert.DeserializeObject<JObject>(response.Body);
return (JArray)response.Json["jingdong_asc_query_list_responce"]["pageResult"]["data"];
}
public override JToken GetNoPayOrder(SearchPlatformOrderRequest searchOrderRequest)
{
var jdClient = GetJdClient(searchOrderRequest.AppKey, searchOrderRequest.AppSecret);
PopOrderNotPayOrderByIdRequest req = new PopOrderNotPayOrderByIdRequest();
req.orderId = searchOrderRequest.OrderId;
PopOrderNotPayOrderByIdResponse response = jdClient.Execute(req, searchOrderRequest.AppToken, DateTime.Now.ToLocalTime());
nLogManager.Default().Info(response);
if (response.IsError)
throw new BusinessException($"获取未付款订单失败,{(string.IsNullOrEmpty(response.ErrorMsg) ? response.ErrMsg : response.ErrorMsg)}");
if (response.Json == null)
response.Json = JsonConvert.DeserializeObject<JObject>(response.Body);
if (response.Json["jingdong_pop_order_notPayOrderById_responce"] == null)
throw new BusinessException($"未查询到未付款订单");
return response.Json;
}
public override JArray GetJDShopSopularizeRecordList(SyncShopPopularizeRequest syncShopPopularizeRequest)
{
var jdClient = GetJdClient(syncShopPopularizeRequest.AppKey, syncShopPopularizeRequest.AppSecret);
var req = new DspPlatformFinanceOpenapiQuerycostdetailsRequest();
req.beginDate = syncShopPopularizeRequest.StartDate.ToString("yyyy-MM-dd");
req.endDate = syncShopPopularizeRequest.EndDate.ToString("yyyy-MM-dd");
req.pageNo = syncShopPopularizeRequest.PageIndex == 0 ? 1 : syncShopPopularizeRequest.PageIndex;
req.pageSize = 100;
req.moneyType = 1;
var response = jdClient.Execute(req, syncShopPopularizeRequest.AppToken, DateTime.Now.ToLocalTime());
if (response.IsError)
throw new BusinessException($"获取JD推广费用失败,{(string.IsNullOrEmpty(response.ErrorMsg) ? response.ErrMsg : response.ErrorMsg)}");
if (response.Json == null)
response.Json = JsonConvert.DeserializeObject<JObject>(response.Body);
return (JArray)response.Json["jingdong_dsp_platform_finance_openapi_querycostdetails_responce"]["returnType"]["data"]["page"]["data"];
}
public override JArray GetJDSopularizeReportFormBySkuLevel(SyncJDPopularizeReportFormRequest request)
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
var req = new AdsIbgUniversalJosServiceSkuQueryRequest();
req.businessType = request.Business.ToString();
req.isDaily = "true";
req.clickOrOrderDay = "0";
req.pageSize = "100";
req.page = request.PageIndex.ToString();
req.clickOrOrderCaliber = "1";
req.startDay = request.StartDate.ToString("yyyy-MM-dd");
req.endDay = request.EndDate.ToString("yyyy-MM-dd");
req.giftFlag = "0";
req.orderStatusCategory = "1";
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"获取JD推广报表-Sku维度出错,{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
if (res.Json == null)
res.Json = JsonConvert.DeserializeObject<JObject>(res.Body);
return (JArray)res.Json["jingdong_ads_ibg_UniversalJosService_sku_query_responce"]["returnType"]["data"]["datas"];
}
public override JArray GetJDSopularizeReportFormByAdLevel(SyncJDPopularizeReportFormRequest request)
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
var req = new AdsIbgUniversalJosServiceAdQueryRequest();
req.businessType = request.Business.ToString();
req.isDaily = "true";
req.clickOrOrderDay = "0";
req.pageSize = "100";
req.page = request.PageIndex.ToString();
req.clickOrOrderCaliber = "1";
req.startDay = request.StartDate.ToString("yyyy-MM-dd");
req.endDay = request.EndDate.ToString("yyyy-MM-dd");
req.giftFlag = "0";
req.orderStatusCategory = "1";
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"获取JD推广报表-创意维度出错,{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
if (res.Json == null)
res.Json = JsonConvert.DeserializeObject<JObject>(res.Body);
return (JArray)res.Json["jingdong_ads_ibg_UniversalJosService_ad_query_responce"]["returnType"]["data"]["datas"];
}
public override JArray GetJDSopularizeReportFormByCampaignLevel(SyncJDPopularizeReportFormRequest request)
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
var req = new AdsIbgUniversalJosServiceCampaignQueryRequest();
req.startDay = request.StartDate.ToString("yyyy-MM-dd");
req.endDay = request.EndDate.ToString("yyyy-MM-dd");
req.businessType = request.Business.ToString();
req.clickOrOrderDay = "0";
req.clickOrOrderCaliber = "1";
req.giftFlag = "0";
req.isDaily = "true";
req.pageSize = "100";
req.page = request.PageIndex.ToString();
req.orderStatusCategory = "1";
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"获取JD推广报表-计划维度出错,{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
if (res.Json == null)
res.Json = JsonConvert.DeserializeObject<JObject>(res.Body);
return (JArray)res.Json["jingdong_ads_ibg_UniversalJosService_campaign_query_responce"]["returnType"]["data"]["datas"];
}
public override JArray GetJDSopularizeReportFormByAdGroupLevel(SyncJDPopularizeReportFormRequest request)
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
var req = new AdsIbgUniversalJosServiceGroupQueryRequest();
req.startDay = request.StartDate.ToString("yyyy-MM-dd");
req.endDay = request.EndDate.ToString("yyyy-MM-dd");
req.businessType = request.Business.ToString();
req.clickOrOrderDay = "0";
req.giftFlag = "0";
req.clickOrOrderCaliber = "1";
req.pageSize = "100";
req.isDaily = "true";
req.page = request.PageIndex.ToString();
req.orderStatusCategory = "1";
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"获取JD推广报表-单元维度出错,{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
if (res.Json == null)
res.Json = JsonConvert.DeserializeObject<JObject>(res.Body);
return (JArray)res.Json["jingdong_ads_ibg_UniversalJosService_group_query_responce"]["returnType"]["data"]["datas"];
}
public override JArray GetJDSopularizeReportFormByOrderLevel(SyncJDPopularizeReportFormRequest request)
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
var req = new AdsIbgUniversalJosServiceOrderQueryRequest();
req.businessType = request.Business.ToString();
req.clickOrOrderDay = "15";
req.pageSize = "100";
req.clickOrOrderCaliber = "1";
req.orderStartDay = request.StartDate.ToString("yyyy-MM-dd");
req.orderEndDay = request.EndDate.ToString("yyyy-MM-dd");
req.clickStartDay = request.StartDate.ToString("yyyy-MM-dd");
req.clickEndDay = request.EndDate.ToString("yyyy-MM-dd");
req.giftFlag = "0";
//req.orderStatus = "4";
req.page = request.PageIndex.ToString();
//if (request.Business == 134217728)
req.myself = "1,3";
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"获取JD推广报表-订单维度出错,{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
if (res.Json == null)
res.Json = JsonConvert.DeserializeObject<JObject>(res.Body);
return (JArray)res.Json["jingdong_ads_ibg_UniversalJosService_order_query_responce"]["returnType"]["data"]["datas"];
}
public override JArray GetStoreHouseList(PlatformRequest request)
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
var req = new StoreFindPartitionWhByIdAndStatusRequest();
req.status = "2";
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"获取仓库出错 {(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
if (res.Json == null)
res.Json = JsonConvert.DeserializeObject<JObject>(res.Body);
return (JArray)res.Json["jingdong_store_findPartitionWhByIdAndStatus_responce"]["find_Partition_Warehouse_Result"]["result"];
}
public override JArray GetStockNumBySku(SearchProductSkuRequest request)
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
var req = new StockReadFindSkuStockRequest();
req.skuId = long.Parse(request.Sku); // 10036238533172; //京仓sku
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"获取sku库存出错 {(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
if (res.Json == null)
res.Json = JsonConvert.DeserializeObject<JObject>(res.Body);
return (JArray)res.Json["jingdong_stock_read_findSkuStock_responce"]["skuStocks"];
}
public override void DeleteSku(DeleteSkuRequest request)
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
var req = new SkuWriteDeleteSkuRequest();
req.skuId = long.Parse(request.Sku);
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
}
public override void DeleteSkuList(DeleteSkuListRequest request)
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
foreach (var sku in request.SkuList)
{
var req = new SkuWriteDeleteSkuRequest();
req.skuId = long.Parse(sku);
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
}
}
private void RollBackWhenStartPromotionError(string appKey,
string appSecret,
string appToken,
IList<string> deleteSkuList,
string mainProductSpu,
string fullTitle,
string brandName,
bool haveGiftTemplateSku)
{
var jdClient = GetJdClient(appKey, appSecret);
if (haveGiftTemplateSku)
DeleteSkuList(new DeleteSkuListRequest()
{
AppKey = appKey,
AppSecret = appSecret,
AppToken = appToken,
Platform = Enums.Platform.,
SkuList = deleteSkuList
});
#region 设置完整标题
{
var req = new WareWriteUpdateWareTitleRequest();
req.wareId = long.Parse(mainProductSpu);
if (!fullTitle.StartsWith(brandName))
req.title = $"{brandName}{fullTitle}";
else
req.title = fullTitle;
var response = jdClient.Execute(req, appToken, DateTime.Now.ToLocalTime());
if (response.IsError)
throw new BusinessException($"设置完整标题出错-{(string.IsNullOrEmpty(response.ErrorMsg) ? response.ErrMsg : response.ErrorMsg)}");
}
#endregion
}
/// <summary>
/// 添加JD促销活动sku
/// </summary>
/// <param name="jdClient"></param>
/// <param name="token"></param>
/// <param name="promotionId"></param>
/// <param name="skuList"></param>
/// <param name="isGift"></param>
/// <param name="taskCount"></param>
/// <exception cref="BusinessException"></exception>
private void AddJDPromotionSku(IJdClient jdClient, string token, long promotionId, IList<ProductSkuResponse> skuList, bool isGift, int taskCount)
{
var req = new SellerPromotionSkuAddRequest();
req.promoId = promotionId;
var pageIndex = 1;
var pageSize = 100;
var totalPage = (skuList.Count() - 1) / pageSize + 1;
while (pageIndex <= totalPage)
{
req.skuIds = string.Empty;
req.jdPrices = string.Empty;
req.bindType = string.Empty;
req.num = string.Empty;
req.promoPrices = string.Empty;
var currentPageList = skuList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
foreach (var sku in currentPageList)
{
req.skuIds = $"{req.skuIds}{sku.Id},";
req.jdPrices = $"{req.jdPrices}{sku.Price},";
req.bindType = $"{req.bindType}{(isGift ? 2 : 1)},";
req.num = $"{req.num}{(isGift ? 1 : taskCount)},";
req.promoPrices = $"{req.promoPrices}{(isGift ? 0 : sku.Price)},";
}
req.skuIds = req.skuIds.Substring(0, req.skuIds.Length - 1);
req.jdPrices = req.jdPrices.Substring(0, req.jdPrices.Length - 1);
req.bindType = req.bindType.Substring(0, req.bindType.Length - 1);
req.num = req.num.Substring(0, req.num.Length - 1);
req.promoPrices = req.promoPrices.Substring(0, req.promoPrices.Length - 1);
var res = jdClient.Execute(req, token, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"添加活动sku失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
pageIndex++;
}
}
public override StartPromotionTaskResponse StartJDPromotionTask(StartPromotionTaskRequest2 request)
{
var stepText = string.Empty;
//stepText.AppendLine($"任务Id {request.Id} 店铺Id {request.ShopId}");
try
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
long wareId = long.Parse(request.MainProductSpu);
List<string> giftSkuIdList = new List<string>();
long promotionId = 0;
var brandName = string.Empty;
var haveGiftTemplateSku = request.GiftTemplateSkuList != null && request.GiftTemplateSkuList.Count() > 0;
#region 前置检查各项sku
var searchProductSkuRequest = new SearchProductSkuRequest()
{
AppKey = request.AppKey,
AppSecret = request.AppSecret,
AppToken = request.AppToken,
Platform = Enums.Platform.,
IsCheckSkuCount = true
};
IList<ProductSkuResponse> motherTemplateSkuList = null;
IList<ProductSkuResponse> customerMotherSkuList = null;
IList<ProductSkuResponse> mainProductSkuList = null;
IList<ProductSkuResponse> giftSkuList = null;
#region 查询奶妈模板SKU
if (!string.IsNullOrEmpty(request.MotherTemplateSku))
{
stepText = "查询奶妈模板SKU";
searchProductSkuRequest.Sku = request.MotherTemplateSku;
searchProductSkuRequest.CheckStep = "奶妈模板";
motherTemplateSkuList = GetProductSkuList(searchProductSkuRequest);
}
#endregion
#region 查询自定义奶妈SKU
if (!string.IsNullOrEmpty(request.CustomMotherSku))
{
stepText = "查询自定义奶妈SKU";
searchProductSkuRequest.Sku = request.CustomMotherSku;
searchProductSkuRequest.CheckStep = "自定义奶妈";
customerMotherSkuList = GetProductSkuList(searchProductSkuRequest);
}
#endregion
#region 查询主商品sku
if (!string.IsNullOrEmpty(request.MainProductSku))
{
stepText = "查询主商品SKU";
searchProductSkuRequest.Sku = request.MainProductSku;
searchProductSkuRequest.CheckStep = "主商品";
mainProductSkuList = GetProductSkuList(searchProductSkuRequest);
if (mainProductSkuList != null && mainProductSkuList.Any(s => s.ProductId != request.MainProductSpu))
throw new BusinessException("主商品SKU归属有误");
}
#endregion
#region 查询主商品赠品sku
if (!string.IsNullOrEmpty(request.MainProductGiftSku))
{
stepText = "查询主商品赠品SKU";
searchProductSkuRequest.Sku = request.MainProductGiftSku;
searchProductSkuRequest.CheckStep = "主商品赠品";
giftSkuList = GetProductSkuList(searchProductSkuRequest);
giftSkuIdList = giftSkuList.Select(gs => gs.Id).ToList();
if (giftSkuList != null && giftSkuList.Any(s => s.ProductId != request.MainProductSpu))
throw new BusinessException("主商品赠品SKU归属有误");
//stepText = "添加赠品SKU";
//AddJDPromotionSku(jdClient, request.AppToken, promotionId, skuList, true);
}
#endregion
#endregion
#region 获取主商品品牌
{
stepText = "获取主商品品牌";
var req = new WareReadFindWareByIdRequest();
req.wareId = wareId;
req.field = "barCode,categoryId,brandName";
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"获取主商品品牌失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
if (res.Json == null)
res.Json = JObject.Parse(res.Body);
brandName = res.Json["jingdong_ware_read_findWareById_responce"]["ware"].Value<string>("brandName");
}
#endregion
#region 设置精简标题
{
stepText = "设置精简标题";
var req = new WareWriteUpdateWareTitleRequest();
req.wareId = wareId;
//req.title = request.SimpleTitle;
if (string.IsNullOrEmpty(request.SimpleTitle) || !request.SimpleTitle.StartsWith(brandName))
req.title = $"{brandName}{request.SimpleTitle}";
else
req.title = request.SimpleTitle;
var response = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (response.IsError)
throw new BusinessException($"设置精简标题出错-{(string.IsNullOrEmpty(response.ErrorMsg) ? response.ErrMsg : response.ErrorMsg)}");
}
#endregion
if (haveGiftTemplateSku)
{
#region 上架赠品
//string barCode = string.Empty, categoryId = string.Empty;
//IList<JToken> multiCateProps = null;
//#region 获取主商品sku信息 barCode,categoryId,multiCateProps
//{
// stepText = "获取主商品sku信息";
// var mainSkuList = GetProductSkuList(new SearchProductSkuRequest()
// {
// AppKey = request.AppKey,
// AppSecret = request.AppSecret,
// AppToken = request.AppToken,
// IsContainSource = true,
// Platform = request.Platform,
// Spu = request.MainProductSpu
// });
// if (mainSkuList.Count() == 0)
// throw new BusinessException($"获取主商品sku信息-未查询到sku信息");
// barCode = mainSkuList[0].Source.Value<string>("barCode");
// categoryId = mainSkuList[0].Source.Value<string>("categoryId");
// multiCateProps = mainSkuList[0].Source["multiCateProps"] != null ? mainSkuList[0].Source["multiCateProps"].ToList() : null;
//}
//#endregion
#region 获取销售属性
stepText = "获取销售属性";
IList<JToken> colorSaleAttrs = null;
{
var req = new CategoryReadFindAttrsByCategoryIdUnlimitCateRequest();
req.cid = long.Parse(request.MainProductCategoryId);
req.attributeType = 4;
req.field = "attrValueList,attrGroup";
var response = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (response.Json == null)
response.Json = JObject.Parse(response.Body);
var colorProperty = response.Json["jingdong_category_read_findAttrsByCategoryIdUnlimitCate_responce"]["findattrsbycategoryidunlimitcate_result"].FirstOrDefault(j => j.Value<string>("name") == "颜色");
if (colorProperty == null)
throw new BusinessException("获取销售属性-缺少颜色属性");
colorSaleAttrs = colorProperty["attrValueList"].ToList();
}
#endregion
#region 组装上架/改名/设置细节图参数
stepText = "组装上架/改名/设置细节图参数";
var takeColorIndex = colorSaleAttrs.Count() - 1;
var skusParamList = new List<SkuWriteUpdateSkusItem>();
var updateSkuTitleParamList = new List<WareWriteUpdateWareSaleAttrvalueAliasRequestItem>();
var imageWriteUpdateRequestList = new List<ImageWriteUpdateRequest>();
for (var i = 0; i < request.GiftTemplateSkuList.Count(); i++)
{
var giftSku = request.GiftTemplateSkuList[i];
var colorProperty = colorSaleAttrs[takeColorIndex];
var p = new SkuWriteUpdateSkusItem()
{
type = "com.jd.pop.ware.ic.api.domain.Sku",
wareId = wareId,
//skuId = long.Parse(sku.Id),
jdPrice = giftSku.Price ?? 0,
stockNum = 9999,
barCode = request.MainProductBarCode,
saleAttrs = new List<SkuWriteUpdateSkusItemSaleAttrs>()
{
new SkuWriteUpdateSkusItemSaleAttrs()
{
type = "com.jd.pop.ware.ic.api.domain.Prop",
attrId = colorProperty.Value<string>("attId"),
attrValues = new List<string>() { colorProperty.Value<string>("id") },
index = takeColorIndex
}
}
};
p.multiCateProps = new List<SkuWriteUpdateSkusItemSaleAttrs>();
if (request.MainProductMultiCateProps != null && request.MainProductMultiCateProps.Count() > 0)
{
foreach (var multiCateProp in request.MainProductMultiCateProps)
{
var m = new SkuWriteUpdateSkusItemSaleAttrs();
m.type = "com.jd.pop.ware.ic.api.domain.Prop";
m.attrId = multiCateProp.Value<string>("attrId");
m.attrValues = multiCateProp.Value<JArray>("attrValues").Select(x => x.ToString()).ToList();
p.multiCateProps.Add(m);
}
}
//修改标题参数
updateSkuTitleParamList.Add(new WareWriteUpdateWareSaleAttrvalueAliasRequestItem()
{
attrId = p.saleAttrs[0].attrId,
attrValues = p.saleAttrs[0].attrValues,
attrValueAlias = new List<string>() { giftSku.Title }
});
//修改商品细节图参数
var imgUrlBuilder = new StringBuilder();
var imgIndexBuilder = new StringBuilder();
imgUrlBuilder.Append($"{giftSku.Logo.Substring(giftSku.Logo.IndexOf("jfs"))},");
imgIndexBuilder.Append("1,");
imageWriteUpdateRequestList.Add(new ImageWriteUpdateRequest()
{
wareId = wareId,
colorId = colorProperty.Value<string>("id"),
imgUrl = imgUrlBuilder.ToString().Trim(','),
imgIndex = imgIndexBuilder.ToString().Trim(',')
});
takeColorIndex--;
skusParamList.Add(p);
}
#endregion
#region 上架sku
{
stepText = "上架sku";
var req = new SkuWriteUpdateSkusRequest();
req.wareId = wareId;
req.skus = skusParamList;
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.Json == null)
res.Json = JObject.Parse(res.Body);
if (res.IsError)
{
RollBackWhenStartPromotionError(request.AppKey, request.AppSecret, request.AppToken, null, request.MainProductSpu, request.FullTitle, brandName, false);
if (res.Body.Contains("en_desc"))
throw new BusinessException($"上架sku失败-{res.Json["error_response"].Value<string>("en_desc")}");
else
throw new BusinessException($"上架sku失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
/*{"error_response":{"code":"501","en_desc":"com.jd.bk.saf.exception.SafJosException:京东价超出该类目允许范围:12.15-39437元!#821c1c3b382f476abeb21f1f515274c7(Solution reference: https://jos.jd.com/commondoc?listId=171)","zh_desc":"调用参数错误(解决方案参考: https://jos.jd.com/commondoc?listId=171)"}}*/
}
var newSkuList = res.Json["jingdong_sku_write_updateSkus_responce"]["skuList"].ToList().Select(x => x.Value<string>("skuId")).ToList();
giftSkuIdList.AddRange(newSkuList);
}
#endregion
#region sku改名
{
stepText = "sku改名";
var req = new WareWriteUpdateWareSaleAttrvalueAliasRequest()
{
wareId = wareId,
props = updateSkuTitleParamList
};
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.Json == null)
res.Json = JObject.Parse(res.Body);
if (res.IsError)
throw new BusinessException($"sku改名失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
}
#endregion
#region sku修改细节图
stepText = "sku修改细节图";
foreach (var imageWriteUpdateRequest in imageWriteUpdateRequestList)
{
var res = jdClient.Execute(imageWriteUpdateRequest, request.AppToken, DateTime.Now.ToLocalTime());
}
#endregion
#region 设置sku全国仓库存
{
if (request.MainProductSkuInStore)
{
stepText = "设置sku全国仓库存";
try
{
foreach (var giftSkuId in giftSkuIdList)
{
var req = new StockWriteUpdateSkuStockRequest();
req.skuId = long.Parse(giftSkuId);
req.stockNum = 9999;
req.storeId = 0;
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"设置全国仓库存失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
}
}
catch (Exception ex)
{
RollBackWhenStartPromotionError(request.AppKey, request.AppSecret, request.AppToken, giftSkuIdList, request.MainProductSpu, request.FullTitle, brandName, true);
throw ex;
}
}
}
#endregion
#endregion
#region 查询上架的赠品
stepText = "查询上架的赠品SKU";
searchProductSkuRequest.Sku = string.Join(",", giftSkuIdList);
searchProductSkuRequest.CheckStep = "上架的赠品";
giftSkuList = GetProductSkuList(searchProductSkuRequest);
#endregion
}
#region 创建活动
var deleteGiftSkuRequest = new DeleteSkuListRequest()
{
AppKey = request.AppKey,
AppSecret = request.AppSecret,
AppToken = request.AppToken,
Platform = request.Platform,
SkuList = giftSkuIdList
};
{
stepText = "创建活动";
var req = new SellerPromotionAddRequest();
req.name = request.ActivityName;
req.type = 4; //赠品促销
req.beginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
req.endTime = DateTime.Now.AddDays(180).ToString("yyyy-MM-dd HH:mm:ss");
req.per_min_num = 1;
//req.bound = 123;
//req.member = 123;
//req.slogan = "abc";
//req.comment = "abc";
//req.favorMode = 123;
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.Json == null)
res.Json = JObject.Parse(res.Body);
if (res.IsError)
{
RollBackWhenStartPromotionError(request.AppKey, request.AppSecret, request.AppToken, giftSkuIdList, request.MainProductSpu, request.FullTitle, brandName, haveGiftTemplateSku);
throw new BusinessException($"创建活动失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
}
promotionId = res.Json["jingdong_seller_promotion_add_responce"].Value<long>("promo_id");
}
#endregion
#region 添加活动sku
{
if (motherTemplateSkuList != null && motherTemplateSkuList.Count() > 0)
{
stepText = "添加奶妈模板SKU";
AddJDPromotionSku(jdClient, request.AppToken, promotionId, motherTemplateSkuList, false, request.TaskCount);
}
if (customerMotherSkuList != null && customerMotherSkuList.Count() > 0)
{
stepText = "添加自定义奶妈SKU";
AddJDPromotionSku(jdClient, request.AppToken, promotionId, customerMotherSkuList, false, request.TaskCount);
}
if (mainProductSkuList != null && mainProductSkuList.Count() > 0)
{
stepText = "添加主商品SKU";
AddJDPromotionSku(jdClient, request.AppToken, promotionId, mainProductSkuList, false, request.TaskCount);
}
if (giftSkuList != null && giftSkuList.Count() > 0)
{
stepText = "添加赠品SKU";
AddJDPromotionSku(jdClient, request.AppToken, promotionId, giftSkuList, true, request.TaskCount);
}
}
#endregion
#region 提交活动
{
stepText = "提交活动";
Thread.Sleep(3000);
var req = new SellerPromotionCommitRequest();
req.promoId = promotionId;
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
{
RollBackWhenStartPromotionError(request.AppKey, request.AppSecret, request.AppToken, giftSkuIdList, request.MainProductSpu, request.FullTitle, brandName, haveGiftTemplateSku);
throw new BusinessException($"创建活动失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
}
}
#endregion
//Task.Factory.StartNew(() => StartJDPromotionTaskDelay(deleteGiftSkuRequest, request, brandName, promotionId), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.JDPromotionDelayTaskScheduler);
return new StartPromotionTaskResponse()
{
BrandName = brandName,
JDPromotionId = promotionId,
DeleteGiftSkuList = giftSkuIdList
};
}
catch (Exception ex)
{
nLogManager.Default().Error(ex, $"任务Id {request.Id} 店铺Id {request.ShopId} 执行步骤 {stepText}");
throw ex;
}
}
public override void StartJDPromotionDelayTask(StartPromotionTaskDelayRequest request)
{
Thread.Sleep(30 * 1000);
try
{
CheckJDPromotionTask(request.JDPromotionId, request.AppKey, request.AppSecret, request.AppToken);
}
catch (Exception ex)
{
RollBackWhenStartPromotionError(request.AppKey, request.AppSecret, request.AppToken, request.DeleteGiftSkuList, request.MainProductSpu, request.FullTitle, request.BrandName, request.HaveGiftTemplate);
throw;
}
Thread.Sleep(30 * 1000);
#region 检查奶妈sku是否完全生效
{
var i = 0;
while (i < 10)
{
i++;
var promotionTaskSkuList = GetPromotionTaskSku(request.AppKey, request.AppSecret, request.AppToken, request.JDPromotionId);
if (promotionTaskSkuList.Any(s => s.Value<int>("bind_type") == 1 && s.Value<int>("sku_status") == 0))
{
Thread.Sleep(2000);
continue;
}
break;
}
}
#endregion
RollBackWhenStartPromotionError(request.AppKey, request.AppSecret, request.AppToken, request.DeleteGiftSkuList, request.MainProductSpu, request.FullTitle, request.BrandName, true);
}
public override void DeleteJDPromotionTask(DeleteJDPromotionTaskRequest request)
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
//var req = new SellerPromotionDeleteRequest();
//req.promoId = request.PromotionId;
//var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
var req = new SellerPromotionV2RemoveRequest();
req.requestId = Guid.NewGuid().ToString();
req.promoId = request.PromotionId;
req.promoType = 4;
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"删除JD活动失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
}
public override void DeleteJDPromotionTaskSku(DeleteJDPromotionTaskSkuRequest request)
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
var req = new SellerPromotionDeleteSkuInPromoRequest();
req.promoId = request.PromotionId;
req.skuId = request.SkuId;
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"删除JD活动sku失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
}
public override void SuspendJDPromotionTask(SuspendDPromotionTaskRequest request)
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
//var req = new SellerPromotionSuspendRequest();
//req.promoId = request.PromotionId;
var req = new SellerPromotionV2SuspendRequest();
req.requestId = Guid.NewGuid().ToString();
req.promoId = request.PromotionId;
req.promoType = 4;
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"暂停JD活动失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
}
private void CheckJDPromotionTask(long promotionId, string appkey, string appSecret, string token)
{
var jdClient = GetJdClient(appkey, appSecret);
Thread.Sleep(3000);
var req = new PopMarketWritePromotionGiftApproveRequest();
req.promoId = promotionId;
req.requestId = Guid.NewGuid().ToString();
var res = jdClient.Execute(req, token, DateTime.Now.ToLocalTime());
if (res.IsError)
{
//RollBackWhenStartPromotionError(deleteGiftSkuRequest, request, brandName, haveGiftTemplateSku);
throw new BusinessException($"审核活动失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
}
}
private List<JToken> GetPromotionTaskSku(string appkey, string appSecret, string token, long promotionId)
{
var jdClient = GetJdClient(appkey, appSecret);
var pageIndex = 1;
var pageSize = 20;
List<JToken> skuList = new List<JToken>();
while (true)
{
var req = new SellerPromotionV2SkuListRequest();
req.promoId = promotionId;
//req.bindType = ;
req.promoType = 4;
req.page = pageIndex.ToString();
req.pageSSize = pageSize.ToString();
var response = jdClient.Execute(req, token, DateTime.Now.ToLocalTime());
Console.WriteLine(JsonConvert.SerializeObject(response));
if (response.IsError)
continue;
if (response.Json == null)
response.Json = JObject.Parse(response.Body);
var jarray = response.Json["jingdong_seller_promotion_v2_sku_list_responce"]["promotion_sku_list"] as JArray;
skuList.AddRange(jarray);
if (jarray.Count() >= pageSize)
pageIndex++;
else
break;
}
return skuList;
}
public override IList<WaiterResponse> GetServiceGroupList(PlatformRequest request)
{
var jdClient = GetJdClient(request.AppKey, request.AppSecret);
var req = new ImPopGroupinfoGetRequest();
var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime());
if (res.IsError)
throw new BusinessException($"查询客服组失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}");
if (res.Json == null)
res.Json = JsonConvert.DeserializeObject<JObject>(res.Body);
return res.Json["jingdong_im_pop_groupinfo_get_responce"]["popgroup"]["waiterList"].Select(j => new WaiterResponse()
{
Id = "",
Level = j.Value<string>("level"),
Name = j.Value<string>("waiter")
}).ToList();
}
}
}