shanji 3 years ago
parent
commit
79963cf8ba
  1. 24
      BBWY.Server.API/Controllers/StoreHouseSyncController.cs
  2. 61
      BBWY.Server.Business/Order/OrderBusiness.cs
  3. 15
      BBWY.Server.Business/PlatformSDK/JDBusiness.cs
  4. 5
      BBWY.Server.Business/PlatformSDK/PlatformSDKBusiness.cs
  5. 110
      BBWY.Server.Business/Sync/StoreHouseSyncBusiness.cs
  6. 4
      BBWY.Server.Business/TaskSchedulerManager.cs
  7. 39
      BBWY.Server.Model/Db/Order/Order.cs
  8. 31
      BBWY.Server.Model/Db/Stock/StoreHouse.cs
  9. 16
      BBWY.Server.Model/Enums.cs
  10. 13
      JD.API/Controllers/PlatformSDKController.cs
  11. 9
      JD.API/Middlewares/CustomExceptionMiddleWare.cs

24
BBWY.Server.API/Controllers/StoreHouseSyncController.cs

@ -0,0 +1,24 @@
using BBWY.Server.Business.Sync;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace BBWY.Server.API.Controllers
{
public class StoreHouseSyncController : BaseApiController
{
private StoreHouseSyncBusiness storeHouseSyncBusiness;
public StoreHouseSyncController(IHttpContextAccessor httpContextAccessor, StoreHouseSyncBusiness storeHouseSyncBusiness) : base(httpContextAccessor)
{
this.storeHouseSyncBusiness = storeHouseSyncBusiness;
}
/// <summary>
/// 同步全店仓库信息
/// </summary>
[HttpGet]
public void StartSyncAllShopStoreHouse()
{
storeHouseSyncBusiness.StartSyncAllShopStoreHouse();
}
}
}

61
BBWY.Server.Business/Order/OrderBusiness.cs

@ -50,13 +50,14 @@ namespace BBWY.Server.Business
productBusinessLazy = new Lazy<ProductBusiness>(() => serviceProvider.GetService<ProductBusiness>());
}
private ISelect<Order, OrderConsignee, OrderCost> GetOrderListQueryConditions(SearchOrderRequest searchOrderRequest)
private ISelect<Order, OrderConsignee, OrderCost, Storehouse> GetOrderListQueryConditions(SearchOrderRequest searchOrderRequest)
{
var select = fsql.Select<Order, OrderConsignee, OrderCost>().LeftJoin((o, ocs, oct) => o.Id == ocs.OrderId)
.LeftJoin((o, ocs, oct) => o.Id == oct.OrderId);
var select = fsql.Select<Order, OrderConsignee, OrderCost, Storehouse>().LeftJoin((o, ocs, oct, sh) => o.Id == ocs.OrderId)
.LeftJoin((o, ocs, oct, sh) => o.Id == oct.OrderId)
.LeftJoin((o, ocs, oct, sh) => o.StoreId == sh.Id);
if (!string.IsNullOrEmpty(searchOrderRequest.OrderId))
{
select = select.Where((o, ocs, oct) => o.Id == searchOrderRequest.OrderId);
select = select.Where((o, ocs, oct, sh) => o.Id == searchOrderRequest.OrderId);
}
else
{
@ -66,35 +67,35 @@ namespace BBWY.Server.Business
.WhereIf(!string.IsNullOrEmpty(searchOrderRequest.Sku), osku => osku.SkuId == searchOrderRequest.Sku)
.WhereIf(!string.IsNullOrEmpty(searchOrderRequest.ProductId), osku => osku.ProductId == searchOrderRequest.ProductId)
.WhereIf(!string.IsNullOrEmpty(searchOrderRequest.ProductNo), osku => osku.ProductNo == searchOrderRequest.ProductNo);
select = select.Where((o, ocs, oct) => childSelect.Where(osku => osku.OrderId == o.Id).Any());
select = select.Where((o, ocs, oct, sh) => childSelect.Where(osku => osku.OrderId == o.Id).Any());
}
select = select.WhereIf(searchOrderRequest.OrderState != null, (o, ocs, oct) => o.OrderState == searchOrderRequest.OrderState)
.WhereIf(searchOrderRequest.StartDate != null, (o, ocs, oct) => o.StartTime >= searchOrderRequest.StartDate)
.WhereIf(searchOrderRequest.EndDate != null, (o, ocs, oct) => o.StartTime <= searchOrderRequest.EndDate)
select = select.WhereIf(searchOrderRequest.OrderState != null, (o, ocs, oct, sh) => o.OrderState == searchOrderRequest.OrderState)
.WhereIf(searchOrderRequest.StartDate != null, (o, ocs, oct, sh) => o.StartTime >= searchOrderRequest.StartDate)
.WhereIf(searchOrderRequest.EndDate != null, (o, ocs, oct, sh) => o.StartTime <= searchOrderRequest.EndDate)
.WhereIf(searchOrderRequest.IncludeExceptionOrder,
(o, ocs, oct) => o.OrderState != Enums.OrderState. &&
(o, ocs, oct, sh) => o.OrderState != Enums.OrderState. &&
((o.StorageType != Enums.StorageType.SD && o.StorageType != null && oct.PurchaseAmount == 0M) ||
(o.StorageType != Enums.StorageType.SD && oct.PurchaseAmount + oct.DeliveryExpressFreight > o.OrderSellerPrice + o.FreightPrice) ||
(o.StorageType == null && o.OrderState != Enums.OrderState.)))
.WhereIf(searchOrderRequest.OnlyDF, (o, ocs, oct) => o.StorageType == Enums.StorageType.)
.WhereIf(searchOrderRequest.ExcludeCanceled, (o, ocs, oct) => o.OrderState != Enums.OrderState.)
.WhereIf(searchOrderRequest.ExcludeSD && !searchOrderRequest.OnlyDF, (o, ocs, oct) => o.StorageType == null || o.StorageType != Enums.StorageType.SD)
.WhereIf(string.IsNullOrEmpty(searchOrderRequest.ContactName) == false, (o, ocs, oct) => ocs.ContactName == searchOrderRequest.ContactName)
.WhereIf(string.IsNullOrEmpty(searchOrderRequest.Waybill) == false, (o, ocs, oct) => o.WaybillNo == searchOrderRequest.Waybill);
.WhereIf(searchOrderRequest.OnlyDF, (o, ocs, oct, sh) => o.StorageType == Enums.StorageType.)
.WhereIf(searchOrderRequest.ExcludeCanceled, (o, ocs, oct, sh) => o.OrderState != Enums.OrderState.)
.WhereIf(searchOrderRequest.ExcludeSD && !searchOrderRequest.OnlyDF, (o, ocs, oct, sh) => o.StorageType == null || o.StorageType != Enums.StorageType.SD)
.WhereIf(string.IsNullOrEmpty(searchOrderRequest.ContactName) == false, (o, ocs, oct, sh) => ocs.ContactName == searchOrderRequest.ContactName)
.WhereIf(string.IsNullOrEmpty(searchOrderRequest.Waybill) == false, (o, ocs, oct, sh) => o.WaybillNo == searchOrderRequest.Waybill);
}
select = select.WhereIf(searchOrderRequest.ShopId != null, (o, ocs, oct) => o.ShopId == searchOrderRequest.ShopId)
.WhereIf(!string.IsNullOrEmpty(searchOrderRequest.SDOperator), (o, ocs, oct) => o.SDOperator == searchOrderRequest.SDOperator);
select = select.WhereIf(searchOrderRequest.ShopId != null, (o, ocs, oct, sh) => o.ShopId == searchOrderRequest.ShopId)
.WhereIf(!string.IsNullOrEmpty(searchOrderRequest.SDOperator), (o, ocs, oct, sh) => o.SDOperator == searchOrderRequest.SDOperator);
//select = select.Where((o, ocs, oct) => o.ShopId == searchOrderRequest.ShopId);
return select;
}
private Expression<Func<Order, OrderConsignee, OrderCost, Order>> GetOrderListField()
private Expression<Func<Order, OrderConsignee, OrderCost, Storehouse, Order>> GetOrderListField()
{
return (o, ocs, oct) => new Order()
return (o, ocs, oct, sh) => new Order()
{
Id = o.Id,
BuyerRemark = o.BuyerRemark,
@ -147,7 +148,9 @@ namespace BBWY.Server.Business
SDOrderAmount = oct.SDOrderAmount,
RefundAmount = oct.RefundAmount,
RefundPurchaseAmount = oct.RefundPurchaseAmount,
AfterTotalCost = oct.AfterTotalCost
AfterTotalCost = oct.AfterTotalCost,
StoreName = sh.Name
};
}
@ -162,7 +165,7 @@ namespace BBWY.Server.Business
//var noCancelSelect = GetOrderListQueryConditions(searchOrderRequest);
//var currentConditionsTotalProfit = noCancelSelect.Where((o, ocs, oct) => o.OrderState != Enums.OrderState.已取消).ToAggregate((o, ocs, oct) => oct.Sum(oct.Key.Profit));
var select = GetOrderListQueryConditions(searchOrderRequest).OrderByDescending((o, ocs, oct) => o.StartTime)
var select = GetOrderListQueryConditions(searchOrderRequest).OrderByDescending((o, ocs, oct, sh) => o.StartTime)
.Count(out var total)
.Page(searchOrderRequest.PageIndex, searchOrderRequest.PageSize);
@ -222,10 +225,10 @@ namespace BBWY.Server.Business
order.AfterSaleOrderList = afterSaleOrderList.Where(aso => aso.OrderId == order.Id).ToList();
#endregion
#region 翻译仓库Id
foreach (var order in orderList)
order.StoreName = globalConfig.Stores.FirstOrDefault(s => s.StoreId == order.StoreId)?.StoreName ?? order.StoreId;
#endregion
//#region 翻译仓库Id
//foreach (var order in orderList)
// order.StoreName = globalConfig.Stores.FirstOrDefault(s => s.StoreId == order.StoreId)?.StoreName ?? order.StoreId;
//#endregion
}
var response = new OrderListResponse()
@ -338,10 +341,10 @@ namespace BBWY.Server.Business
public OrderResponse GetOrderById(string orderId)
{
var order = fsql.Select<Order, OrderConsignee, OrderCost>().LeftJoin((o, ocs, oct) => o.Id == ocs.OrderId)
.LeftJoin((o, ocs, oct) => o.Id == oct.OrderId)
.Where((o, ocs, oct) => o.Id == orderId)
.ToOne(GetOrderListField());
var order = fsql.Select<Order, OrderConsignee, OrderCost, Storehouse>().LeftJoin((o, ocs, oct, sh) => o.Id == ocs.OrderId)
.LeftJoin((o, ocs, oct, sh) => o.Id == oct.OrderId)
.Where((o, ocs, oct, sh) => o.Id == orderId)
.ToOne(GetOrderListField());
if (order == null)
throw new BusinessException("订单不存在");
@ -369,7 +372,7 @@ namespace BBWY.Server.Business
orderResponse.OrderCouponList = orderCouponList;
orderResponse.OrderCostDetailList = orderCostDetailList;
orderResponse.StoreName = globalConfig.Stores.FirstOrDefault(s => s.StoreId == orderResponse.StoreId)?.StoreName ?? order.StoreId;
//orderResponse.StoreName = globalConfig.Stores.FirstOrDefault(s => s.StoreId == orderResponse.StoreId)?.StoreName ?? order.StoreId;
return orderResponse;
}

15
BBWY.Server.Business/PlatformSDK/JDBusiness.cs

@ -607,5 +607,20 @@ namespace BBWY.Server.Business
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"];
}
}
}

5
BBWY.Server.Business/PlatformSDK/PlatformSDKBusiness.cs

@ -137,5 +137,10 @@ namespace BBWY.Server.Business
{
throw new NotImplementedException();
}
public virtual JArray GetStoreHouseList(PlatformRequest request)
{
throw new NotImplementedException();
}
}
}

110
BBWY.Server.Business/Sync/StoreHouseSyncBusiness.cs

@ -0,0 +1,110 @@
using BBWY.Common.Http;
using BBWY.Common.Models;
using BBWY.Server.Model;
using BBWY.Server.Model.Db;
using BBWY.Server.Model.Dto;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Yitter.IdGenerator;
namespace BBWY.Server.Business.Sync
{
public class StoreHouseSyncBusiness : BaseSyncBusiness, IDenpendency
{
private IDictionary<Enums.Platform, Action<JArray, ShopResponse, IList<Storehouse>>> storeHouseSyncMethodDic;
public StoreHouseSyncBusiness(RestApiService restApiService,
IOptions<GlobalConfig> options,
NLogManager nLogManager,
IFreeSql fsql,
IIdGenerator idGenerator,
TaskSchedulerManager taskSchedulerManager,
VenderBusiness venderBusiness,
YunDingBusiness yunDingBusiness) : base(restApiService,
options,
nLogManager,
fsql,
idGenerator,
taskSchedulerManager,
venderBusiness,
yunDingBusiness)
{
storeHouseSyncMethodDic = new Dictionary<Enums.Platform, Action<JArray, ShopResponse, IList<Storehouse>>>()
{
{ Enums.Platform., ResolveJDStoreHouse}
};
}
public void StartSyncAllShopStoreHouse()
{
Task.Factory.StartNew(SyncAllShopStoreHouse, CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.StoreHouseTaskScheduler);
}
public void SyncAllShopStoreHouse()
{
var shopList = venderBusiness.GetShopList();
var storeHouseList = new List<Storehouse>();
foreach (var shop in shopList)
{
Thread.Sleep(1000);
try
{
var restApiResult = restApiService.SendRequest(GetPlatformRelayAPIHost(shop.PlatformId), "api/PlatformSDK/GetStoreHouseList", new PlatformRequest()
{
AppKey = shop.AppKey,
AppSecret = shop.AppSecret,
AppToken = shop.AppToken,
Platform = shop.PlatformId,
SaveResponseLog = false
}, GetYunDingRequestHeader(), HttpMethod.Post);
if (restApiResult.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception(restApiResult.Content);
var response = JsonConvert.DeserializeObject<ApiResponse<JArray>>(restApiResult.Content);
if (response.Data == null || response.Data.Count() == 0)
continue;
//ResolveJDStoreHouse(response.Data, shop, storeHouseList);
storeHouseSyncMethodDic[shop.PlatformId](response.Data, shop, storeHouseList);
}
catch (Exception ex)
{
nLogManager.Default().Error(ex, $"{shop.ShopName} 获取仓库列表失败");
}
}
var storeHouseIds = storeHouseList.Select(s => s.Id).ToArray();
var dbStoreIds = fsql.Select<Storehouse>(storeHouseIds).ToList(s => s.Id);
var exceptIds = storeHouseIds.Except(dbStoreIds);
if (exceptIds.Count() > 0)
{
var insertList = storeHouseList.Where(s => exceptIds.Contains(s.Id)).ToList();
fsql.Insert(insertList).ExecuteAffrows();
}
}
private void ResolveJDStoreHouse(JArray jarray, ShopResponse shop, IList<Storehouse> storeHouseList)
{
foreach (var storeHouseJToken in jarray)
{
var seq_num = storeHouseJToken.Value<string>("seq_num");
if (storeHouseList.Count(s => s.Id == seq_num) > 0)
continue;
storeHouseList.Add(new Storehouse()
{
Id = seq_num,
Name = storeHouseJToken.Value<string>("name"),
Platform = shop.PlatformId,
CreateTime = DateTime.Now,
Status = (Enums.StockStatus)storeHouseJToken.Value<int>("use_flag"),
Type = (Enums.StockType)storeHouseJToken.Value<int>("type")
});
}
}
}
}

4
BBWY.Server.Business/TaskSchedulerManager.cs

@ -16,6 +16,8 @@ namespace BBWY.Server.Business
public LimitedConcurrencyLevelTaskScheduler JDPopularizeTaskScheduler { get; private set; }
public LimitedConcurrencyLevelTaskScheduler StoreHouseTaskScheduler { get; private set; }
public TaskSchedulerManager()
{
SyncOrderTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10);
@ -24,6 +26,8 @@ namespace BBWY.Server.Business
PurchaseOrderCallbackTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10);
ProductSyncTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(5);
JDPopularizeTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10);
StoreHouseTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(2);
}
}
}

39
BBWY.Server.Model/Db/Order/Order.cs

@ -276,42 +276,9 @@ namespace BBWY.Server.Model.Db
public bool? IsDecode { get; set; }
#endregion
#region 代发信息
///// <summary>
///// 买家账号
///// </summary>
//[Column(IsIgnore = true)]
//public string BuyerAccount { get; set; }
///// <summary>
///// 发货运费
///// </summary>
//[Column(IsIgnore = true)]
//public decimal DeliveryFreight { get; set; } = 0.00M;
///// <summary>
///// 采购单号
///// </summary>
//[Column(IsIgnore = true)]
//public string PurchaseOrderId { get; set; }
///// <summary>
///// 采购平台
///// </summary>
//[Column(IsIgnore = true)]
//public Enums.Platform? PurchasePlatform { get; set; }
///// <summary>
///// 卖家账号
///// </summary>
//[Column(IsIgnore = true)]
//public string SellerAccount { get; set; }
//[Column(IsIgnore = true)]
//public decimal OrderDropShippingSkuAmount { get; set; }
//[Column(IsIgnore = true)]
//public decimal OrderDropShippingPurchaseFreight { get; set; }
#region 仓库
[Column(IsIgnore = true)]
public string StoreName { get; set; }
#endregion
}

31
BBWY.Server.Model/Db/Stock/StoreHouse.cs

@ -0,0 +1,31 @@
using FreeSql.DataAnnotations;
using System;
namespace BBWY.Server.Model.Db
{
[Table(Name = "storehouse", DisableSyncStructure = true)]
public partial class Storehouse
{
[Column(DbType = "datetime")]
public DateTime? CreateTime { get; set; }
[Column(StringLength = 50, IsPrimary = true, IsNullable = false)]
public string Id { get; set; }
[Column(StringLength = 50)]
public string Name { get; set; }
[Column(MapType = typeof(int))]
public Enums.Platform Platform { get; set; }
[Column(MapType = typeof(int))]
public Enums.StockStatus Status { get; set; }
[Column(MapType = typeof(int))]
public Enums.StockType Type { get; set; }
}
}

16
BBWY.Server.Model/Enums.cs

@ -196,5 +196,21 @@
= 18,
= 19
}
/// <summary>
/// 京东仓库类型 1商家仓 2京东仓
/// </summary>
public enum StockType
{
= 1, = 2
}
/// <summary>
/// 仓库状态 0暂停,1使用
/// </summary>
public enum StockStatus
{
= 0, 使 = 1
}
}
}

13
JD.API/Controllers/PlatformSDKController.cs

@ -250,9 +250,20 @@ namespace JD.API.API.Controllers
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public JArray GetJDSopularizeReportFormByOrderLevel(SyncJDPopularizeReportFormRequest request)
public JArray GetJDSopularizeReportFormByOrderLevel([FromBody] SyncJDPopularizeReportFormRequest request)
{
return platformSDKBusinessList.FirstOrDefault(p => p.Platform == request.Platform).GetJDSopularizeReportFormByOrderLevel(request);
}
/// <summary>
/// 获取仓库列表
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public JArray GetStoreHouseList([FromBody] PlatformRequest request)
{
return platformSDKBusinessList.FirstOrDefault(p => p.Platform == request.Platform).GetStoreHouseList(request);
}
}
}

9
JD.API/Middlewares/CustomExceptionMiddleWare.cs

@ -22,12 +22,13 @@ namespace JD.API.Middlewares
/// </summary>
private IDictionary<int, string> _exceptionStatusCodeDic;
private ILogger logger;
//private ILogger logger;
private NLogManager nLogManager;
public CustomExceptionMiddleWare(RequestDelegate next, ILogger logger)
public CustomExceptionMiddleWare(RequestDelegate next, NLogManager nLogManager)
{
_next = next;
this.logger = logger;
this.nLogManager = nLogManager;
_exceptionStatusCodeDic = new Dictionary<int, string>
{
{ 401, "未授权的请求" },
@ -57,7 +58,7 @@ namespace JD.API.Middlewares
{
context.Response.Clear();
context.Response.StatusCode = 500; //发生未捕获的异常,手动设置状态码
logger.Error(ex); //记录错误
nLogManager.Default().Error(ex); //记录错误
}
}
finally

Loading…
Cancel
Save