Browse Source

本地界面

qianyi
shanji 3 years ago
parent
commit
ef3861399b
  1. 24
      BBWY.Client/Views/Order/OrderList.xaml
  2. 26
      BBWY.Server.API/Controllers/RefundOrderSyncController.cs
  3. 61
      BBWY.Server.Business/Sync/AfterSaleOrderSyncBusiness.cs
  4. 290
      BBWY.Server.Business/Sync/RefundOrderSyncBusiness.cs
  5. 28
      BBWY.Test/Program.cs

24
BBWY.Client/Views/Order/OrderList.xaml

@ -319,15 +319,13 @@
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="商品信息" Style="{StaticResource middleTextBlock}"/>
<TextBlock Text="退款/赔付" Grid.Column="1" Style="{StaticResource middleTextBlock}"/>
<TextBlock Text="售后成本" Grid.Column="2" Style="{StaticResource middleTextBlock}"/>
<TextBlock Text="成本信息" Grid.Column="3" Style="{StaticResource middleTextBlock}"/>
<TextBlock Text="商品处理" Grid.Column="4" Style="{StaticResource middleTextBlock}"/>
<TextBlock Text="商品情况" Grid.Column="5" Style="{StaticResource middleTextBlock}"/>
<TextBlock Text="采购状态" Grid.Column="6" Style="{StaticResource middleTextBlock}"/>
<TextBlock Text="商品处理" Grid.Column="3" Style="{StaticResource middleTextBlock}"/>
<TextBlock Text="商品情况" Grid.Column="4" Style="{StaticResource middleTextBlock}"/>
<TextBlock Text="采购状态" Grid.Column="5" Style="{StaticResource middleTextBlock}"/>
<Border Width="1" HorizontalAlignment="Right" Background="{StaticResource Border.Brush}"/>
<Border Width="1" HorizontalAlignment="Right" Background="{StaticResource Border.Brush}" Grid.Column="1"/>
@ -1010,7 +1008,6 @@
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid>
<Grid.ColumnDefinitions>
@ -1050,7 +1047,7 @@
<Run Text="单价:"/>
<Run Text="{Binding Price}"/>
</TextBlock>
<TextBlock TextWrapping="Wrap">
<TextBlock TextWrapping="Wrap" Margin="5,0,0,0">
<Run Text="数量:"/>
<Run Text="{Binding ItemTotal}"/>
</TextBlock>
@ -1058,7 +1055,20 @@
</StackPanel>
</Grid>
<Border Width="1" Background="{StaticResource Border.Brush}" HorizontalAlignment="Right"/>
<TextBlock Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<Run Text="退款金额"/>
<Run Text="{Binding RefundAmount}"/>
</TextBlock>
<Border Width="1" Background="{StaticResource Border.Brush}" Grid.Column="1" HorizontalAlignment="Right"/>
</Grid>
<Border Grid.Row="1" VerticalAlignment="Bottom" Height="1" Background="{StaticResource Border.Brush}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>

26
BBWY.Server.API/Controllers/RefundOrderSyncController.cs

@ -1,26 +0,0 @@
using BBWY.Server.Business;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace BBWY.Server.API.Controllers
{
public class RefundOrderSyncController : BaseApiController
{
private RefundOrderSyncBusiness refundOrderSyncBusiness;
public RefundOrderSyncController(RefundOrderSyncBusiness refundOrderSyncBusiness, IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor)
{
this.refundOrderSyncBusiness = refundOrderSyncBusiness;
}
/// <summary>
/// 全店同步退款订单
/// </summary>
[HttpPost]
public void SyncAllShopRefundOrder()
{
refundOrderSyncBusiness.SyncAllShopRefundOrder();
}
}
}

61
BBWY.Server.Business/Sync/AfterSaleOrderSyncBusiness.cs

@ -54,10 +54,10 @@ namespace BBWY.Server.Business
};
}
private void SyncJDAfterOrder(JArray afterOrderTokenJArray, ShopResponse shopResponse)
private void SyncJDAfterOrder(JArray afterOrderTokenJArray, ShopResponse shop)
{
var shopId = long.Parse(shopResponse.ShopId);
var validAfterOrderJArray = afterOrderTokenJArray.Where(j => j.Value<int>("serviceStatus") != 10011 && //取消
var shopId = long.Parse(shop.ShopId);
var validAfterOrderJArray = afterOrderTokenJArray.Where(j => j.Value<int>("serviceStatus") == 10010 && //完成
processResultDic.ContainsKey(j.Value<int>("processResult")));
@ -87,13 +87,25 @@ namespace BBWY.Server.Business
if (dbOrderSku == null)
continue;
decimal refundAmount = 0M;
try
{
if (processResult == Enums.ServiceResult.退)
refundAmount = SyncJDRefundOrder(shop, orderId, serviceId);
}
catch (Exception ex)
{
logger.Error(ex, $"SyncAfterOrder-SyncRefound ServiceId:{serviceId} OrderId:{orderId} ShopData:{JsonConvert.SerializeObject(shop)}");
}
insertAfterSaleOrders.Add(new AfterSaleOrder()
{
Id = idGenerator.NewLong(),
CreateTime = DateTime.Now,
OrderId = dbOrderSku.OrderId,
ProductId = dbOrderSku.ProductId,
RefundAmount = 0,
RefundAmount = refundAmount,
SkuId = skuId,
ShopId = shopId,
ServiceResult = processResult,
@ -132,7 +144,6 @@ namespace BBWY.Server.Business
});
}
private void SyncAfterOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false)
{
try
@ -144,7 +155,7 @@ namespace BBWY.Server.Business
var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId);
var afterOrderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetAfterOrderList", new SyncAfterOrderRequest()
{
StartDate = startTime ?? DateTime.Now.Date.AddDays(-1),
StartDate = startTime ?? DateTime.Now.Date.AddDays(-5),
EndDate = endTime ?? DateTime.Now,
AppKey = shop.AppKey,
AppSecret = shop.AppSecret,
@ -187,5 +198,43 @@ namespace BBWY.Server.Business
taskSchedulerManager.SyncAfterOrderTaskScheduler);
}
}
/// <summary>
/// 获取退款单
/// </summary>
/// <param name="shop"></param>
/// <param name="orderId"></param>
/// <param name="serviceId"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
private decimal SyncJDRefundOrder(ShopResponse shop, string orderId, string serviceId)
{
var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId);
var refundOrderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetRefundList", new SearchRefundPlatformOrderRequest()
{
AppKey = shop.AppKey,
AppSecret = shop.AppSecret,
AppToken = shop.AppToken,
PageIndex = 1,
PageSize = 50,
Platform = shop.PlatformId,
SaveResponseLog = false,
OrderId = orderId
}, null, HttpMethod.Post);
if (refundOrderListApiResult.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}");
var refundOrderListResponse = JsonConvert.DeserializeObject<ApiResponse<JArray>>(refundOrderListApiResult.Content);
if (!refundOrderListResponse.Success)
throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}");
if (refundOrderListResponse.Data == null || refundOrderListResponse.Data.Count == 0)
return 0M;
var jtoken = refundOrderListResponse.Data.FirstOrDefault(j => j["sameOrderServiceBill"]["serviceId"].ToString() == serviceId &&
j.Value<int>("status") == 13 &&
j.Value<decimal>("refoundAmount") != 0M);
return jtoken == null ? 0M : jtoken.Value<decimal>("refoundAmount");
}
}
}

290
BBWY.Server.Business/Sync/RefundOrderSyncBusiness.cs

@ -18,149 +18,149 @@ using Yitter.IdGenerator;
namespace BBWY.Server.Business
{
public class RefundOrderSyncBusiness : BaseSyncBusiness, IDenpendency
{
private IDictionary<Enums.Platform, Action<JArray, ShopResponse>> syncRefundOrderMethodDic;
public RefundOrderSyncBusiness(RestApiService restApiService,
IOptions<GlobalConfig> options,
ILogger logger,
IFreeSql fsql,
IIdGenerator idGenerator,
TaskSchedulerManager taskSchedulerManager,
VenderBusiness venderBusiness) : base(restApiService,
options,
logger,
fsql,
idGenerator,
taskSchedulerManager,
venderBusiness)
{
syncRefundOrderMethodDic = new Dictionary<Enums.Platform, Action<JArray, ShopResponse>>()
{
{ Enums.Platform., SyncJDRefundOrder}
};
}
private void SyncJDRefundOrder(JArray refundOrderTokenJArray, ShopResponse shopResponse)
{
var shopId = long.Parse(shopResponse.ShopId);
var validRefundOrderTokenJArray = refundOrderTokenJArray.Where(j => j.Value<int>("status") == 13 && j.Value<decimal>("refoundAmount") != 0M).ToList();
var orderIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["orderId"].ToString()).Distinct().ToList();
var orderSkuIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["wareId"].ToString()).Distinct().ToList();
var updateOrders = fsql.Select<Order>().Where(o => orderIds.Contains(o.Id) && o.IsAfterSaleOrder == false).ToList();
var dbOrderSkus = fsql.Select<OrderSku>().Where(osku => orderIds.Contains(osku.OrderId) && orderSkuIds.Contains(osku.SkuId)).ToList();
var updateOrderSkus = dbOrderSkus.Where(osku => osku.IsRefund == false).ToList();
var afterOrders = fsql.Select<AfterSaleOrder>().Where(aso => orderIds.Contains(aso.OrderId)).ToList();
List<AfterSaleOrder> insertAfterSaleOrders = new List<AfterSaleOrder>();
List<IUpdate<AfterSaleOrder>> updateAfterSaleOrders = new List<IUpdate<AfterSaleOrder>>();
foreach (var refundOrderJToken in validRefundOrderTokenJArray)
{
var skuId = refundOrderJToken["sameOrderServiceBill"]["wareId"].ToString();
var orderId = refundOrderJToken["sameOrderServiceBill"]["orderId"].ToString();
var refundAmount = refundOrderJToken.Value<decimal>("refoundAmount");
var refundCompleteTime = refundOrderJToken.Value<long>("completeTime").StampToDateTime();
var serviceId = refundOrderJToken["sameOrderServiceBill"]["serviceId"].ToString();
var afterOrder = afterOrders.FirstOrDefault(aso => aso.ServiceId == serviceId);
if (afterOrder == null)
{
var dbSku = dbOrderSkus.FirstOrDefault(osku => osku.OrderId == orderId && osku.SkuId == skuId);
if (dbSku == null)
continue;
insertAfterSaleOrders.Add(new AfterSaleOrder()
{
Id = idGenerator.NewLong(),
CreateTime = DateTime.Now,
OrderId = dbSku.OrderId,
ProductId = dbSku.ProductId,
RefundAmount = refundAmount,
RefundTime = refundCompleteTime,
SkuId = skuId,
ShopId = shopId,
ServiceId = serviceId,
ApplyTime = long.Parse(refundOrderJToken["sameOrderServiceBill"]["afsApplyTime"].ToString()).StampToDateTime()
});
}
else if (afterOrder.RefundAmount == 0)
{
var update = fsql.Update<AfterSaleOrder>(afterOrder.Id).Set(aso => aso.RefundAmount, refundAmount)
.Set(aso => aso.RefundTime, refundCompleteTime);
updateAfterSaleOrders.Add(update);
}
}
fsql.Transaction(() =>
{
if (updateOrders.Count() > 0)
foreach (var updateOrder in updateOrders)
fsql.Update<Order>(updateOrder.Id).Set(o => o.IsAfterSaleOrder, true).ExecuteAffrows();
if (updateOrderSkus.Count() > 0)
foreach (var updateOrderSku in updateOrderSkus)
fsql.Update<OrderSku>(updateOrderSku.Id).Set(osku => osku.IsRefund, true).ExecuteAffrows();
if (insertAfterSaleOrders.Count() > 0)
fsql.Insert(insertAfterSaleOrders).ExecuteAffrows();
if (updateAfterSaleOrders.Count() > 0)
foreach (var update in updateAfterSaleOrders)
update.ExecuteAffrows();
});
}
private void SyncRefundOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false)
{
try
{
//logger.Info($"退款订单同步 {shop.ShopName} isAuto {isAuto}");
if (!syncRefundOrderMethodDic.ContainsKey(shop.PlatformId))
throw new Exception("不支持的平台");
var shopId = long.Parse(shop.ShopId);
var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId);
var refundOrderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetRefundList", new SearchRefundPlatformOrderRequest()
{
StartDate = startTime ?? DateTime.Now.Date.AddDays(-1),
EndDate = endTime ?? DateTime.Now,
AppKey = shop.AppKey,
AppSecret = shop.AppSecret,
AppToken = shop.AppToken,
PageIndex = 1,
PageSize = 50,
Platform = shop.PlatformId,
SaveResponseLog = true,
OrderId = orderId
}, null, HttpMethod.Post);
if (refundOrderListApiResult.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}");
var refundOrderListResponse = JsonConvert.DeserializeObject<ApiResponse<JArray>>(refundOrderListApiResult.Content);
if (!refundOrderListResponse.Success)
throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}");
if (refundOrderListResponse.Data == null || refundOrderListResponse.Data.Count == 0)
return;
syncRefundOrderMethodDic[shop.PlatformId](refundOrderListResponse.Data, shop);
}
catch (Exception ex)
{
var shopData = JsonConvert.SerializeObject(shop);
logger.Error(ex, $"SyncRefundOrder ShopData:{shopData}");
}
}
public void SyncAllShopRefundOrder()
{
var shopList = venderBusiness.GetShopList();
//SyncRefundOrder(shopList.FirstOrDefault(s => s.ShopName == "赟娅墨森专卖店"), string.Empty, isAuto: true);
foreach (var shop in shopList)
{
Task.Factory.StartNew(() => SyncRefundOrder(shop, string.Empty, isAuto: true), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncRefundOrderTaskScheduler);
}
}
}
//public class RefundOrderSyncBusiness : BaseSyncBusiness, IDenpendency
//{
// private IDictionary<Enums.Platform, Action<JArray, ShopResponse>> syncRefundOrderMethodDic;
// public RefundOrderSyncBusiness(RestApiService restApiService,
// IOptions<GlobalConfig> options,
// ILogger logger,
// IFreeSql fsql,
// IIdGenerator idGenerator,
// TaskSchedulerManager taskSchedulerManager,
// VenderBusiness venderBusiness) : base(restApiService,
// options,
// logger,
// fsql,
// idGenerator,
// taskSchedulerManager,
// venderBusiness)
// {
// syncRefundOrderMethodDic = new Dictionary<Enums.Platform, Action<JArray, ShopResponse>>()
// {
// { Enums.Platform.京东, SyncJDRefundOrder}
// };
// }
// private void SyncJDRefundOrder(JArray refundOrderTokenJArray, ShopResponse shopResponse)
// {
// var shopId = long.Parse(shopResponse.ShopId);
// var validRefundOrderTokenJArray = refundOrderTokenJArray.Where(j => j.Value<int>("status") == 13 && j.Value<decimal>("refoundAmount") != 0M).ToList();
// var orderIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["orderId"].ToString()).Distinct().ToList();
// var orderSkuIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["wareId"].ToString()).Distinct().ToList();
// var updateOrders = fsql.Select<Order>().Where(o => orderIds.Contains(o.Id) && o.IsAfterSaleOrder == false).ToList();
// var dbOrderSkus = fsql.Select<OrderSku>().Where(osku => orderIds.Contains(osku.OrderId) && orderSkuIds.Contains(osku.SkuId)).ToList();
// var updateOrderSkus = dbOrderSkus.Where(osku => osku.IsRefund == false).ToList();
// var afterOrders = fsql.Select<AfterSaleOrder>().Where(aso => orderIds.Contains(aso.OrderId)).ToList();
// List<AfterSaleOrder> insertAfterSaleOrders = new List<AfterSaleOrder>();
// List<IUpdate<AfterSaleOrder>> updateAfterSaleOrders = new List<IUpdate<AfterSaleOrder>>();
// foreach (var refundOrderJToken in validRefundOrderTokenJArray)
// {
// var skuId = refundOrderJToken["sameOrderServiceBill"]["wareId"].ToString();
// var orderId = refundOrderJToken["sameOrderServiceBill"]["orderId"].ToString();
// var refundAmount = refundOrderJToken.Value<decimal>("refoundAmount");
// var refundCompleteTime = refundOrderJToken.Value<long>("completeTime").StampToDateTime();
// var serviceId = refundOrderJToken["sameOrderServiceBill"]["serviceId"].ToString();
// var afterOrder = afterOrders.FirstOrDefault(aso => aso.ServiceId == serviceId);
// if (afterOrder == null)
// {
// var dbSku = dbOrderSkus.FirstOrDefault(osku => osku.OrderId == orderId && osku.SkuId == skuId);
// if (dbSku == null)
// continue;
// insertAfterSaleOrders.Add(new AfterSaleOrder()
// {
// Id = idGenerator.NewLong(),
// CreateTime = DateTime.Now,
// OrderId = dbSku.OrderId,
// ProductId = dbSku.ProductId,
// RefundAmount = refundAmount,
// RefundTime = refundCompleteTime,
// SkuId = skuId,
// ShopId = shopId,
// ServiceId = serviceId,
// ApplyTime = long.Parse(refundOrderJToken["sameOrderServiceBill"]["afsApplyTime"].ToString()).StampToDateTime()
// });
// }
// else if (afterOrder.RefundAmount == 0)
// {
// var update = fsql.Update<AfterSaleOrder>(afterOrder.Id).Set(aso => aso.RefundAmount, refundAmount)
// .Set(aso => aso.RefundTime, refundCompleteTime);
// updateAfterSaleOrders.Add(update);
// }
// }
// fsql.Transaction(() =>
// {
// if (updateOrders.Count() > 0)
// foreach (var updateOrder in updateOrders)
// fsql.Update<Order>(updateOrder.Id).Set(o => o.IsAfterSaleOrder, true).ExecuteAffrows();
// if (updateOrderSkus.Count() > 0)
// foreach (var updateOrderSku in updateOrderSkus)
// fsql.Update<OrderSku>(updateOrderSku.Id).Set(osku => osku.IsRefund, true).ExecuteAffrows();
// if (insertAfterSaleOrders.Count() > 0)
// fsql.Insert(insertAfterSaleOrders).ExecuteAffrows();
// if (updateAfterSaleOrders.Count() > 0)
// foreach (var update in updateAfterSaleOrders)
// update.ExecuteAffrows();
// });
// }
// private void SyncRefundOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false)
// {
// try
// {
// //logger.Info($"退款订单同步 {shop.ShopName} isAuto {isAuto}");
// if (!syncRefundOrderMethodDic.ContainsKey(shop.PlatformId))
// throw new Exception("不支持的平台");
// var shopId = long.Parse(shop.ShopId);
// var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId);
// var refundOrderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetRefundList", new SearchRefundPlatformOrderRequest()
// {
// StartDate = startTime ?? DateTime.Now.Date.AddDays(-5),
// EndDate = endTime ?? DateTime.Now,
// AppKey = shop.AppKey,
// AppSecret = shop.AppSecret,
// AppToken = shop.AppToken,
// PageIndex = 1,
// PageSize = 50,
// Platform = shop.PlatformId,
// SaveResponseLog = true,
// OrderId = orderId
// }, null, HttpMethod.Post);
// if (refundOrderListApiResult.StatusCode != System.Net.HttpStatusCode.OK)
// throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}");
// var refundOrderListResponse = JsonConvert.DeserializeObject<ApiResponse<JArray>>(refundOrderListApiResult.Content);
// if (!refundOrderListResponse.Success)
// throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}");
// if (refundOrderListResponse.Data == null || refundOrderListResponse.Data.Count == 0)
// return;
// syncRefundOrderMethodDic[shop.PlatformId](refundOrderListResponse.Data, shop);
// }
// catch (Exception ex)
// {
// var shopData = JsonConvert.SerializeObject(shop);
// logger.Error(ex, $"SyncRefundOrder ShopData:{shopData}");
// }
// }
// public void SyncAllShopRefundOrder()
// {
// var shopList = venderBusiness.GetShopList();
// SyncRefundOrder(shopList.FirstOrDefault(s => s.ShopName == "布莱特玩具专营店"), string.Empty, isAuto: true);
// //foreach (var shop in shopList)
// //{
// // Task.Factory.StartNew(() => SyncRefundOrder(shop, string.Empty, isAuto: true), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncRefundOrderTaskScheduler);
// //}
// }
//}
}

28
BBWY.Test/Program.cs

@ -21,26 +21,26 @@ namespace BBWY.Test
var token = "2ace3023200c4ea9aa682bbf8bffee18jztm";
var jdClient = GetJdClient(appKey, appSecret);
//var req = new AscQueryListRequest();
//req.buId = "10598776";
//req.operatePin = "开发测试";
//req.operateNick = "开发测试";
//req.pageNumber = "1";
//req.pageSize = "50";
//req.serviceId = 1472302469;
//AscQueryListResponse response1 = jdClient.Execute(req, token, DateTime.Now.ToLocalTime());
var req = new AscQueryListRequest();
req.buId = "10598776";
req.operatePin = "开发测试";
req.operateNick = "开发测试";
req.pageNumber = "1";
req.pageSize = "50";
req.serviceId = 1469772993;
AscQueryListResponse response1 = jdClient.Execute(req, token, DateTime.Now.ToLocalTime());
//Console.WriteLine(JsonConvert.SerializeObject(response1));
Console.WriteLine(JsonConvert.SerializeObject(response1));
//250134673037
AscServiceAndRefundViewRequest req = new AscServiceAndRefundViewRequest();
AscServiceAndRefundViewRequest req1 = new AscServiceAndRefundViewRequest();
req.orderId = 250134673037;
req.pageNumber = 1.ToString();
req.pageSize = 10.ToString();
req1.orderId = 246319928886;
req1.pageNumber = 1.ToString();
req1.pageSize = 10.ToString();
var response = jdClient.Execute(req, token, DateTime.Now.ToLocalTime());
var response = jdClient.Execute(req1, token, DateTime.Now.ToLocalTime());
Console.WriteLine(JsonConvert.SerializeObject(response));
Console.ReadKey();
}

Loading…
Cancel
Save