Browse Source

1

updatebug
shanji 2 years ago
parent
commit
fe2282f64c
  1. 2
      BBWYB.Server.API/Controllers/OrderController.cs
  2. 37
      BBWYB.Server.API/Controllers/PurchaseOrderController.cs
  3. 2
      BBWYB.Server.API/Program.cs
  4. 163
      BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
  5. 14
      BBWYB.Server.Model/Dto/Request/PurchaseOrder/CreateOrderRequest.cs
  6. 11
      SDKAdapter/PurchasePlatform/Client/Base/PP_PlatformClient.cs
  7. 52
      SDKAdapter/PurchasePlatform/Client/Impl/PP_1688Client.cs
  8. 7
      SDKAdapter/PurchasePlatform/Models/Request/Order/PP_QueryOrderDetailRequest.cs
  9. 2
      SDKAdapter/PurchasePlatform/Models/Response/Order/PP_CreateOrderResponse.cs
  10. 54
      SDKAdapter/PurchasePlatform/Models/Response/Order/PP_QueryOrderDetailResponse.cs
  11. 7
      bbwyb.sln

2
BBWYB.Server.API/Controllers/OrderController.cs

@ -1,4 +1,4 @@
using BBWYB.Server.Business.Order; using BBWYB.Server.Business;
using BBWYB.Server.Model.Dto; using BBWYB.Server.Model.Dto;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;

37
BBWYB.Server.API/Controllers/PurchaseOrderController.cs

@ -0,0 +1,37 @@
using BBWYB.Server.Business;
using BBWYB.Server.Model.Dto;
using Microsoft.AspNetCore.Mvc;
namespace BBWYB.Server.API.Controllers
{
public class PurchaseOrderController : BaseApiController
{
private PurchaseOrderBusiness purchaseOrderBusiness;
public PurchaseOrderController(IHttpContextAccessor httpContextAccessor, PurchaseOrderBusiness purchaseOrderBusiness) : base(httpContextAccessor)
{
this.purchaseOrderBusiness = purchaseOrderBusiness;
}
/// <summary>
/// 预览订单
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public PreviewOrderResponse PreviewPurchaseOrder([FromBody] PreviewOrderRequest request)
{
return purchaseOrderBusiness.PreviewPurchaseOrder(request);
}
/// <summary>
/// 创建采购单
/// </summary>
/// <param name="request"></param>
[HttpPost]
public void CreatePurchaseOrder([FromBody] CreateOrderRequest request)
{
purchaseOrderBusiness.CreatePurchaseOrder(request);
}
}
}

2
BBWYB.Server.API/Program.cs

@ -11,6 +11,7 @@ using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models;
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Serialization;
using SDKAdapter.OperationPlatform.Client; using SDKAdapter.OperationPlatform.Client;
using SDKAdapter.PurchasePlatform.Client;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using Yitter.IdGenerator; using Yitter.IdGenerator;
@ -54,6 +55,7 @@ services.AddCors(options =>
services.BatchRegisterServices(new Assembly[] { Assembly.Load("BBWYB.Server.Business") }, typeof(IDenpendency)); services.BatchRegisterServices(new Assembly[] { Assembly.Load("BBWYB.Server.Business") }, typeof(IDenpendency));
services.AddSingleton<OP_PlatformClientFactory>(); services.AddSingleton<OP_PlatformClientFactory>();
services.AddSingleton<PP_PlatformClientFactory>();
services.AddMapper(new MappingProfiles()); services.AddMapper(new MappingProfiles());
services.AddControllers(c => services.AddControllers(c =>

163
BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs

@ -1,6 +1,10 @@
using BBWYB.Common.Log; using BBWYB.Common.Log;
using BBWYB.Common.Models; using BBWYB.Common.Models;
using BBWYB.Server.Model;
using BBWYB.Server.Model.Db;
using BBWYB.Server.Model.Dto; using BBWYB.Server.Model.Dto;
using FreeSql;
using Newtonsoft.Json;
using SDKAdapter; using SDKAdapter;
using SDKAdapter.PurchasePlatform.Client; using SDKAdapter.PurchasePlatform.Client;
using SDKAdapter.PurchasePlatform.Models; using SDKAdapter.PurchasePlatform.Models;
@ -55,5 +59,164 @@ namespace BBWYB.Server.Business
} }
public void CreatePurchaseOrder(CreateOrderRequest request)
{
nLogManager.Default().Info($"CreatePurchaseOrder\r\n{JsonConvert.SerializeObject(request)}");
var dbOrder = fsql.Select<Order>(request.OrderId).ToOne();
if (dbOrder == null)
throw new BusinessException("订单不存在");
if (dbOrder.OrderState != Enums.OrderState. && dbOrder.OrderState != Enums.OrderState.)
throw new BusinessException("只能为等待采购或待出库的订单进行采购");
var deleteOrderCostDetail = fsql.Delete<OrderCostDetail>().Where(ocd => ocd.OrderId == dbOrder.Id);
var isRepurchase = fsql.Select<OrderCost>(dbOrder.Id).Any();
#region 合并重复的采购sku
var repeatPurchaseSkuGroups = request.CargoParamList.GroupBy(p => p.SkuId).ToList();
foreach (var group in repeatPurchaseSkuGroups)
{
if (group.Count() > 1)
{
var repeatSkus = group.ToList();
foreach (var repeatSku in repeatSkus)
request.CargoParamList.Remove(repeatSku);
request.CargoParamList.Add(new CargoParamRequest()
{
BelongSkuId = repeatSkus[0].BelongSkuId,
ProductId = repeatSkus[0].ProductId,
SkuId = repeatSkus[0].SkuId,
SpecId = repeatSkus[0].SpecId,
Quantity = repeatSkus.Sum(s => s.Quantity)
});
}
}
#endregion
var orderSkus = fsql.Select<OrderSku>().Where(osku => osku.Price != 0 && osku.OrderId == request.OrderId).ToList();
var orderSkuIds = orderSkus.Select(osku => osku.Id).ToList();
var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)request.Platform);
var createOrderResponse = client.CreateOrder(new PP_CreateOrderRequest()
{
AppKey = request.AppKey,
AppSecret = request.AppSecret,
AppToken = request.AppToken,
Consignee = new PP_ConsigneeRequest()
{
Address = request.Consignee.Address,
City = request.Consignee.City,
ContactName = request.Consignee.ContactName,
County = request.Consignee.County,
Mobile = request.Consignee.Mobile,
Province = request.Consignee.Province,
TelePhone = request.Consignee.TelePhone,
Town = request.Consignee.Town
},
Platform = (AdapterEnums.PlatformType)request.Platform,
PurchaseMode = (AdapterEnums.PurchaseMode)request.PurchaseOrderMode,
Extensions = request.Extensions,
Remark = request.Remark,
OrderProductParamList = request.CargoParamList.Select(p => new PP_OrderProductParamRequest()
{
ProductId = p.ProductId,
Quantity = p.Quantity,
SkuId = p.SkuId,
SpecId = p.SpecId
}).ToList()
});
var purchaseOrderSimpleInfo = client.QueryOrderDetail(new PP_QueryOrderDetailRequest()
{
AppKey = request.AppKey,
AppSecret = request.AppSecret,
AppToken = request.AppToken,
OrderId = createOrderResponse.OrderId
});
nLogManager.Default().Info($"QueryOrderDetail\r\nShopOrderId {request.OrderId}\r\n purchaseOrderSimpleInfo\r\n{JsonConvert.SerializeObject(purchaseOrderSimpleInfo)}");
List<OrderCostDetail> insertOrderCostDetails = new List<OrderCostDetail>();
IInsert<OrderCost> insertOrderCost = null;
IUpdate<OrderCost> updateOrderCost = null;
foreach (var orderSku in orderSkus)
{
#region 计算当前sku的采购成本和采购运费
var currentOrderSkuProductAmount = 0M; //采购成本
var currentOrderSkuCargoParamList = request.CargoParamList.Where(p => p.BelongSkuId == orderSku.SkuId); //找当前skuId的采购skuId
currentOrderSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => currentOrderSkuCargoParamList.Any(p1 => p1.SkuId == p.SkuId))?.Sum(p => p.ProductAmount) ?? 0M;
var currentOrderSkuFreightAmount = purchaseOrderSimpleInfo.FreightAmount / orderSkus.Count(); //采购运费(按sku数均分)
#endregion
#region 成本明细
var orderCostDetail = new OrderCostDetail()
{
Id = idGenerator.NewLong(),
ConsumableAmount = 0,
CreateTime = DateTime.Now,
DeductionQuantity = orderSku.ItemTotal.Value,
DeliveryExpressFreight = 0,
FirstFreight = 0,
//OperationAmount = 0,
InStorageAmount = 0,
OutStorageAmount = 0,
OrderId = request.OrderId,
ProductId = orderSku.ProductId,
PurchaseFreight = currentOrderSkuFreightAmount,
//PurchaseOrderPKId = purchaseOrder.Id,
PurchaseOrderId = purchaseOrderSimpleInfo.OrderId,
SkuAmount = currentOrderSkuProductAmount,
SkuId = orderSku.SkuId,
StorageAmount = 0,
//UnitCost = purchaseOrder.UnitCost,
//TotalCost = currentOrderSkuProductAmount + currentOrderSkuFreightAmount//purchaseOrder.UnitCost * orderSku.ItemTotal.Value
};
//orderCostDetail.SkuGrossProfit = orderSku.Price.Value * orderCostDetail.DeductionQuantity - avgPreferential - (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - orderSku.Price.Value * orderCostDetail.DeductionQuantity * createOnlinePurchaseOrderRequest.PlatformCommissionRatio;
insertOrderCostDetails.Add(orderCostDetail);
#endregion
}
#region 订单成本
var orderCost = new OrderCost()
{
OrderId = request.OrderId,
CreateTime = DateTime.Now,
DeliveryExpressFreight = 0,
IsManualEdited = false,
PlatformCommissionRatio = 0,
PreferentialAmount = 0,
PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount
};
//orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio;
orderCost.Profit = dbOrder.OrderSellerPrice +
dbOrder.FreightPrice -
orderCost.PurchaseAmount -
orderCost.DeliveryExpressFreight; // -orderCost.PlatformCommissionAmount
if (!isRepurchase)
{
insertOrderCost = fsql.Insert(orderCost);
}
else
{
updateOrderCost = fsql.Update<OrderCost>().SetSource(orderCost).IgnoreColumns(a => new { a.CreateTime });
}
#endregion
fsql.Transaction(() =>
{
deleteOrderCostDetail.ExecuteAffrows();
fsql.Insert(insertOrderCostDetails).ExecuteAffrows();
updateOrderCost?.ExecuteAffrows();
insertOrderCost?.ExecuteAffrows();
fsql.Update<Order>(request.OrderId).SetIf(dbOrder.OrderState == Enums.OrderState., o => o.OrderState, Model.Enums.OrderState.)
.Set(o => o.IsPurchased, true)
.ExecuteAffrows();
});
}
} }
} }

14
BBWYB.Server.Model/Dto/Request/PurchaseOrder/CreateOrderRequest.cs

@ -0,0 +1,14 @@
namespace BBWYB.Server.Model.Dto
{
public class CreateOrderRequest: PreviewOrderRequest
{
public string Extensions { get; set; }
public string Remark { get; set; }
/// <summary>
/// 店铺订单Id
/// </summary>
public string OrderId { get; set; }
}
}

11
SDKAdapter/PurchasePlatform/Client/Base/PP_PlatformClient.cs

@ -35,5 +35,16 @@ namespace SDKAdapter.PurchasePlatform.Client
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
/// <summary>
/// 查询订单详情
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public virtual PP_QueryOrderDetailResponse QueryOrderDetail(PP_QueryOrderDetailRequest request)
{
throw new NotImplementedException();
}
} }
} }

52
SDKAdapter/PurchasePlatform/Client/Impl/PP_1688Client.cs

@ -191,6 +191,58 @@ namespace SDKAdapter.PurchasePlatform.Client
FailProductMessageList = failedOfferJArray == null ? null : failedOfferJArray.Select(failedOfferJToken => failedOfferJToken.ToString()).ToList() FailProductMessageList = failedOfferJArray == null ? null : failedOfferJArray.Select(failedOfferJToken => failedOfferJToken.ToString()).ToList()
}; };
} }
public override PP_QueryOrderDetailResponse QueryOrderDetail(PP_QueryOrderDetailRequest request)
{
var client = GetSyncAPIClient(request.AppKey, request.AppSecret);
RequestPolicy reqPolicy = new RequestPolicy();
reqPolicy.HttpMethod = "POST";
reqPolicy.NeedAuthorization = false;
reqPolicy.RequestSendTimestamp = false;
reqPolicy.UseHttps = false;
reqPolicy.UseSignture = true;
reqPolicy.AccessPrivateApi = false;
Request _request = new Request();
APIId apiId = new APIId
{
Name = "alibaba.trade.get.buyerView",
NamespaceValue = "com.alibaba.trade",
Version = 1
};
_request.ApiId = apiId;
var param = new
{
webSite = "1688",
orderId = request.OrderId,
includeFields = "baseInfo,productItems"
};
_request.RequestEntity = param;
if (!string.IsNullOrEmpty(request.AppToken))
_request.AccessToken = request.AppToken;
var result = client.NewRequest(_request, reqPolicy);
if (result.Value<bool>("success") != true)
throw new Exception(result.Value<string>("errorMessage"));
return new PP_QueryOrderDetailResponse()
{
OrderId = request.OrderId,
FreightAmount = result["result"]["baseInfo"].Value<decimal>("shippingFee"),
ProductAmount = result["result"]["baseInfo"].Value<decimal>("totalAmount") - result["result"]["baseInfo"].Value<decimal>("shippingFee"),
TotalAmount = result["result"]["baseInfo"].Value<decimal>("totalAmount"),
ItemList = result["result"]["productItems"].Select(itemJToken => new PP_QueryOrderDetailSkuResponse()
{
ProductId = itemJToken.Value<string>("productID"),
SkuId = itemJToken.Value<string>("skuID"),
SpecId = itemJToken.Value<string>("specId"),
ProductAmount = itemJToken.Value<decimal>("itemAmount"),
Quantity = Convert.ToInt32(itemJToken.Value<decimal>("quantity")),
Price = itemJToken.Value<decimal>("price")
}).ToList()
};
}
} }
public class _1688TradeTypeCompare : IEqualityComparer<JToken> public class _1688TradeTypeCompare : IEqualityComparer<JToken>

7
SDKAdapter/PurchasePlatform/Models/Request/Order/PP_QueryOrderDetailRequest.cs

@ -0,0 +1,7 @@
namespace SDKAdapter.PurchasePlatform.Models
{
public class PP_QueryOrderDetailRequest: BasePlatformRequest
{
public string OrderId { get; set; }
}
}

2
SDKAdapter/PurchasePlatform/Models/Response/Order/PP_CreateOrderResponse.cs

@ -3,7 +3,7 @@
public class PP_CreateOrderResponse : PP_PreviewOrderResponse public class PP_CreateOrderResponse : PP_PreviewOrderResponse
{ {
/// <summary> /// <summary>
/// 单Id /// 采购单Id
/// </summary> /// </summary>
public string OrderId { get; set; } public string OrderId { get; set; }

54
SDKAdapter/PurchasePlatform/Models/Response/Order/PP_QueryOrderDetailResponse.cs

@ -0,0 +1,54 @@
namespace SDKAdapter.PurchasePlatform.Models
{
public class PP_QueryOrderDetailResponse
{
/// <summary>
/// 采购单号
/// </summary>
public string OrderId { get; set; }
/// <summary>
/// 订单总额
/// </summary>
public decimal TotalAmount { get; set; }
/// <summary>
/// 货款总额
/// </summary>
public decimal ProductAmount { get; set; }
/// <summary>
/// 运费总额
/// </summary>
public decimal FreightAmount { get; set; }
/// <summary>
/// 订单Sku明细列表
/// </summary>
public IList<PP_QueryOrderDetailSkuResponse> ItemList { get; set; }
}
/// <summary>
/// 采购单简单明细
/// </summary>
public class PP_QueryOrderDetailSkuResponse
{
public string ProductId { get; set; }
public string SkuId { get; set; }
public string SpecId { get; set; }
/// <summary>
/// 货款金额
/// </summary>
public decimal ProductAmount { get; set; }
/// <summary>
/// 单价
/// </summary>
public decimal Price { get; set; }
public int Quantity { get; set; }
}
}

7
bbwyb.sln

@ -25,15 +25,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SDK", "SDK", "{B4ED118A-2CF
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SDKAdapter", "SDKAdapter\SDKAdapter.csproj", "{442CC858-3A90-48EE-932D-756169EAC2A4}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SDKAdapter", "SDKAdapter\SDKAdapter.csproj", "{442CC858-3A90-48EE-932D-756169EAC2A4}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuanTan.SDK", "QuanTan.SDK\QuanTan.SDK.csproj", "{D5D93778-14D7-45F7-A77C-397FDBA408A1}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QuanTan.SDK", "QuanTan.SDK\QuanTan.SDK.csproj", "{D5D93778-14D7-45F7-A77C-397FDBA408A1}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "C", "C", "{AE01E0D8-FE79-4E30-B68F-862A5907EB3A}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "C", "C", "{AE01E0D8-FE79-4E30-B68F-862A5907EB3A}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "B", "B", "{0142C6AF-5824-4665-8E9E-3A3C547BA109}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "B", "B", "{0142C6AF-5824-4665-8E9E-3A3C547BA109}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "_1688.SDK", "_1688.SDK\_1688.SDK.csproj", "{450F51B1-29E6-47F3-A517-AD5814EC9129}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_1688.SDK", "_1688.SDK\_1688.SDK.csproj", "{450F51B1-29E6-47F3-A517-AD5814EC9129}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JD.SDK", "JD.SDK\JD.SDK.csproj", "{A4C4F802-D298-42DE-B410-50C8C87EFFAA}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JD.SDK", "JD.SDK\JD.SDK.csproj", "{A4C4F802-D298-42DE-B410-50C8C87EFFAA}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -87,6 +87,7 @@ Global
EndGlobalSection EndGlobalSection
GlobalSection(NestedProjects) = preSolution GlobalSection(NestedProjects) = preSolution
{B6039632-07B7-4C74-9F74-F16B6782EF56} = {99D234A0-6830-4C0C-91E8-C626DA939D59} {B6039632-07B7-4C74-9F74-F16B6782EF56} = {99D234A0-6830-4C0C-91E8-C626DA939D59}
{99D234A0-6830-4C0C-91E8-C626DA939D59} = {0142C6AF-5824-4665-8E9E-3A3C547BA109}
{1E7D36DB-A817-4208-8FC6-36A66FAB17E5} = {0142C6AF-5824-4665-8E9E-3A3C547BA109} {1E7D36DB-A817-4208-8FC6-36A66FAB17E5} = {0142C6AF-5824-4665-8E9E-3A3C547BA109}
{D52D0167-EF94-4FC8-91BF-FCE5B3ED9C6A} = {1E7D36DB-A817-4208-8FC6-36A66FAB17E5} {D52D0167-EF94-4FC8-91BF-FCE5B3ED9C6A} = {1E7D36DB-A817-4208-8FC6-36A66FAB17E5}
{52DF7178-3C36-4CA6-A2E9-D9E2BB41C0B8} = {99D234A0-6830-4C0C-91E8-C626DA939D59} {52DF7178-3C36-4CA6-A2E9-D9E2BB41C0B8} = {99D234A0-6830-4C0C-91E8-C626DA939D59}

Loading…
Cancel
Save