diff --git a/BBWYB.Client/APIServices/BaseApiService.cs b/BBWYB.Client/APIServices/BaseApiService.cs index 747db0f..1ff52e0 100644 --- a/BBWYB.Client/APIServices/BaseApiService.cs +++ b/BBWYB.Client/APIServices/BaseApiService.cs @@ -32,9 +32,9 @@ namespace BBWYB.Client.APIServices if (headers == null) headers = new Dictionary(); if (!headers.ContainsKey("ClientCode")) - headers.Add("ClientCode", "BBWY"); + headers.Add("ClientCode", "BBWYB"); if (!headers.ContainsKey("ClientVersion")) - headers.Add("ClientVersion", "1.0.0.0"); + headers.Add("ClientVersion", globalContext.BBWYBApiVersion); if (!headers.ContainsKey("Authorization") && !string.IsNullOrEmpty(globalContext.UserToken)) headers.Add("Authorization", $"Bearer {globalContext.UserToken}"); if (!headers.ContainsKey("qy")) diff --git a/BBWYB.Client/GlobalContext.cs b/BBWYB.Client/GlobalContext.cs index becd36d..9a6e868 100644 --- a/BBWYB.Client/GlobalContext.cs +++ b/BBWYB.Client/GlobalContext.cs @@ -13,6 +13,7 @@ namespace BBWYB.Client { public GlobalContext() { + BBWYBApiVersion = "10018"; } private User user; @@ -35,10 +36,17 @@ namespace BBWYB.Client public string BBWYCApiHost { get; set; } public string QKApiHost { get; set; } + public string BBWYBApiVersion { get; set; } + public string GetUserString() { return JsonConvert.SerializeObject(User); } + + public string GetBBWYBApiVersion() + { + return BBWYBApiVersion; + } #endregion } } \ No newline at end of file diff --git a/BBWYB.Client/Views/MainWindow.xaml b/BBWYB.Client/Views/MainWindow.xaml index b86f1a9..a72f884 100644 --- a/BBWYB.Client/Views/MainWindow.xaml +++ b/BBWYB.Client/Views/MainWindow.xaml @@ -24,7 +24,7 @@ - + diff --git a/BBWYB.Client/Views/Order/OrderList.xaml.cs b/BBWYB.Client/Views/Order/OrderList.xaml.cs index d0f7e38..999a77e 100644 --- a/BBWYB.Client/Views/Order/OrderList.xaml.cs +++ b/BBWYB.Client/Views/Order/OrderList.xaml.cs @@ -19,7 +19,7 @@ namespace BBWYB.Client.Views.Order { this.Dispatcher.Invoke(() => { - scrollviewer_OrderList.Dispatcher.Invoke(() => scrollviewer_OrderList.ScrollToTop()); + scrollviewer_OrderList.Dispatcher?.Invoke(() => scrollviewer_OrderList.ScrollToTop()); }); }); } diff --git a/BBWYB.Client/Views/WebB/WebB.xaml.cs b/BBWYB.Client/Views/WebB/WebB.xaml.cs index a4ae4c4..fd34972 100644 --- a/BBWYB.Client/Views/WebB/WebB.xaml.cs +++ b/BBWYB.Client/Views/WebB/WebB.xaml.cs @@ -1,6 +1,8 @@ using BBWYB.Client.APIServices; using Microsoft.Extensions.DependencyInjection; using System.Collections.Generic; +using System.IO; +using System.Reflection; using System.Windows; using System.Windows.Controls; @@ -23,6 +25,14 @@ namespace BBWYB.Client.Views.WebB { InitializeComponent(); this.Loaded += WebB_Loaded; + this.Unloaded += WebB_Unloaded; + } + + private void WebB_Unloaded(object sender, RoutedEventArgs e) + { + grid.Children.Remove(w2m.wb2); + //w2m.wb2.Dispose(); + w2m.Close(); } private void WebB_Loaded(object sender, System.Windows.RoutedEventArgs e) @@ -36,7 +46,13 @@ namespace BBWYB.Client.Views.WebB shopService = s.ServiceProvider.GetRequiredService(); } - var url = "http://qtbbwy.qiyue666.com"; +#if DEBUG + var url = "http://192.168.1.2:8080"; + //var url = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "s.html"); +#else + var url = "http://qtbbwy.qiyue666.com"; +#endif + w2m.CoreWebView2InitializationCompleted = (e) => { w2m.wb2.CoreWebView2.AddHostObjectToScript("qtbbwybContext", this.globalContext); @@ -48,6 +64,7 @@ namespace BBWYB.Client.Views.WebB w2m.Init(); w2m.wb2.SetValue(Grid.RowProperty, 1); w2m.wb2.Margin = new Thickness(1, 0, 1, 0); + //grid.Children.Clear(); grid.Children.Add(w2m.wb2); if (w2m.IsInitializationCompleted && !isNavigated) diff --git a/BBWYB.Server.API/Controllers/BaseApiController.cs b/BBWYB.Server.API/Controllers/BaseApiController.cs index 32fe69d..bfb1ca8 100644 --- a/BBWYB.Server.API/Controllers/BaseApiController.cs +++ b/BBWYB.Server.API/Controllers/BaseApiController.cs @@ -1,9 +1,11 @@ -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Cors; +using Microsoft.AspNetCore.Mvc; namespace BBWYB.Server.API.Controllers { [Produces("application/json")] [Route("Api/[Controller]/[Action]")] [ApiController] + [EnableCors("cors")] public class BaseApiController : ControllerBase { protected IHttpContextAccessor httpContextAccessor; diff --git a/BBWYB.Server.API/Controllers/PurchaseOrderController.cs b/BBWYB.Server.API/Controllers/PurchaseOrderController.cs index 98e3bfe..56829c6 100644 --- a/BBWYB.Server.API/Controllers/PurchaseOrderController.cs +++ b/BBWYB.Server.API/Controllers/PurchaseOrderController.cs @@ -37,6 +37,37 @@ namespace BBWYB.Server.API.Controllers purchaseOrderBusiness.CreatePurchaseOrder(request); } + /// + /// 获取关联采购单列表 + /// + /// + /// + [HttpGet("{orderId}")] + public IList GetAssociationPurchaseOrderList([FromRoute] string orderId) + { + return purchaseOrderBusiness.GetAssociationPurchaseOrderList(orderId); + } + + /// + /// 关联采购单 + /// + /// + [HttpPost] + public void AssociatePurchaseOrder([FromBody] AssociationOrderRequest request) + { + purchaseOrderBusiness.AssociatePurchaseOrder(request); + } + + /// + /// 设置历史采购单 + /// + /// + [HttpPost] + public void SetHistoryPurchaseOrder([FromBody] SetHistoryPurchaseOrderRequest request) + { + purchaseOrderBusiness.SetHistoryPurchaseOrder(request); + } + /// /// 1688回调 /// diff --git a/BBWYB.Server.API/Middlewares/ClientVersionValidationMiddleWare.cs b/BBWYB.Server.API/Middlewares/ClientVersionValidationMiddleWare.cs new file mode 100644 index 0000000..cdd75c1 --- /dev/null +++ b/BBWYB.Server.API/Middlewares/ClientVersionValidationMiddleWare.cs @@ -0,0 +1,55 @@ +using BBWYB.Common.Models; +using Microsoft.Extensions.Options; +using Microsoft.Extensions.Primitives; + +namespace BBWYB.Server.API.Middlewares +{ + public class ClientVersionValidationMiddleWare + { + /// + /// 管道请求委托 + /// + private RequestDelegate _next; + + private IDictionary apiVersionDictionary; + + private IOptionsMonitor> _monitor; + + public ClientVersionValidationMiddleWare(RequestDelegate requestDelegate, IOptionsMonitor> monitor) + { + _next = requestDelegate; + _monitor = monitor; + apiVersionDictionary = new Dictionary(); + } + + public async Task Invoke(HttpContext context) + { + try + { + Console.WriteLine(context.Request.Path); + var apiRequirement = _monitor.CurrentValue.FirstOrDefault(x => x.Api.Equals(context.Request.Path, StringComparison.CurrentCultureIgnoreCase)); + if (apiRequirement != null) + { + if (!context.Request.Headers.TryGetValue("ClientVersion", out StringValues clientVersionStr)) + throw new BusinessException("未读取到ClientVersion"); + if (!int.TryParse(clientVersionStr, out int clientVersion)) + throw new BusinessException("非法ClientVersion"); + if (clientVersion < apiRequirement.MinimumVersion) + throw new BusinessException("当前ClientVersion低于接口最低要求,请升级到最新版"); + } + await _next(context); //调用管道执行下一个中间件 + } + catch + { + throw; + } + } + } + + public class ClientVersionValidationModel + { + public string Api { get; set; } + + public int MinimumVersion { get; set; } + } +} diff --git a/BBWYB.Server.API/Program.cs b/BBWYB.Server.API/Program.cs index 1da4090..94be203 100644 --- a/BBWYB.Server.API/Program.cs +++ b/BBWYB.Server.API/Program.cs @@ -63,6 +63,7 @@ services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddMapper(new MappingProfiles()); +services.Configure>(configuration.GetSection("ApiVersionRequirements")); services.AddControllers(c => { @@ -166,6 +167,7 @@ if (isAllowedSwagger) app.UseMiddleware(); app.UseRouting(); app.UseCors("cors"); +app.UseMiddleware(); app.UseAuthorization(); app.MapControllers(); diff --git a/BBWYB.Server.API/appsettings.json b/BBWYB.Server.API/appsettings.json index 503362a..9be7fb6 100644 --- a/BBWYB.Server.API/appsettings.json +++ b/BBWYB.Server.API/appsettings.json @@ -13,5 +13,11 @@ "MDSDB": "data source=rm-bp1508okrh23710yfao.mysql.rds.aliyuncs.com;port=3306;user id=qyroot;password=kaicn1132+-;initial catalog=mds;charset=utf8;sslmode=none;" }, "AllowedSwagger": true, - "Secret": "D96BFA5B-F2AF-45BC-9342-5A55C3F9BBB0" + "Secret": "D96BFA5B-F2AF-45BC-9342-5A55C3F9BBB0", + "ApiVersionRequirements": [ + { + "Api": "/api/purchaseOrder/createpurchaseorder", + "MinimumVersion": 10017 + } + ] } diff --git a/BBWYB.Server.Business/Order/OrderBusiness.cs b/BBWYB.Server.Business/Order/OrderBusiness.cs index 8dbd5a7..44a917b 100644 --- a/BBWYB.Server.Business/Order/OrderBusiness.cs +++ b/BBWYB.Server.Business/Order/OrderBusiness.cs @@ -54,7 +54,7 @@ namespace BBWYB.Server.Business } select = select.WhereIf(request.OrderState != null && request.OrderState != Enums.OrderState.待配置, (o, ocs, oct) => o.OrderState == request.OrderState) - .WhereIf(request.OrderState == Enums.OrderState.待配置, (o, ocs, oct) =>o.OrderState != Enums.OrderState.已取消&&o.PackConfigState!=null)//&&o.OrderState> Enums.OrderState.等待采购 + .WhereIf(request.OrderState == Enums.OrderState.待配置, (o, ocs, oct) => o.OrderState != Enums.OrderState.已取消 && o.PackConfigState != null)//&&o.OrderState> Enums.OrderState.等待采购 .WhereIf(request.StartDate != null, (o, ocs, oct) => o.StartTime >= request.StartDate) .WhereIf(request.EndDate != null, (o, ocs, oct) => o.StartTime <= request.EndDate) .WhereIf(!string.IsNullOrEmpty(request.ClientOrderId), (o, ocs, oct) => o.ClientOrderId == request.ClientOrderId) @@ -113,7 +113,7 @@ namespace BBWYB.Server.Business Profit = oct.Profit, PurchaseAmount = oct.PurchaseAmount, IsManualEdited = oct.IsManualEdited, - PackConfigState= o.PackConfigState, + PackConfigState = o.PackConfigState, }; } @@ -148,7 +148,7 @@ namespace BBWYB.Server.Business #endregion #region 处理采购信息 - var orderPurchaseInfoList = fsql.Select().Where(op => orderIdList.Contains(op.OrderId)).ToList(); + var orderPurchaseInfoList = fsql.Select().Where(op => orderIdList.Contains(op.OrderId) && op.IsEnabled == true).ToList(); var orderPurchaseSkuInfoList = fsql.Select().Where(o => orderIdList.Contains(o.OrderId)).ToList(); foreach (var order in orderList) diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index 5b887d4..5357d1d 100644 --- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -71,6 +71,12 @@ namespace BBWYB.Server.Business return orderProductParamList; } + /// + /// 预览采购单 + /// + /// + /// + /// public PreviewOrderResponse PreviewPurchaseOrder(PreviewOrderRequest request) { nLogManager.Default().Info($"PreviewPurchaseOrder {JsonConvert.SerializeObject(request)}"); @@ -145,6 +151,11 @@ namespace BBWYB.Server.Business }; } + /// + /// 创建采购单 + /// + /// + /// public void CreatePurchaseOrder(CreateOrderRequest request) { nLogManager.Default().Info($"CreatePurchaseOrder\r\n{JsonConvert.SerializeObject(request)}"); @@ -165,7 +176,7 @@ namespace BBWYB.Server.Business if (request.CargoParamGroupList == null || request.CargoParamGroupList.Count() == 0) throw new BusinessException("缺少下单商品参数"); - var deleteOrderCostDetail = fsql.Delete().Where(ocd => ocd.OrderId == dbOrder.Id); + //var deleteOrderCostDetail = fsql.Delete().Where(ocd => ocd.OrderId == dbOrder.Id); var isRepurchase = fsql.Select(dbOrder.Id).Any(); var orderSkus = fsql.Select().Where(osku => osku.Price != 0 && osku.OrderId == request.OrderId).ToList(); @@ -178,6 +189,16 @@ namespace BBWYB.Server.Business List insertOrderPurchaseSkuInfos = new List(); List updatePurchaseTimeSchemeIdList = new List(); List insertOrderPurchaseRelationInfoList = new List(); + + #region 待更新 + IList updateOrderCostDetailIdList = fsql.Select() + .Where(ocd => ocd.OrderId == request.OrderId && ocd.IsEnabled == true) + .ToList(ocd => ocd.Id); + IList updatePurchaseOrderIdList = fsql.Select() + .Where(opi => opi.OrderId == request.OrderId && opi.IsEnabled == true) + .ToList(opi => opi.Id); + #endregion + IInsert insertOrderCost = null; IUpdate updateOrderCost = null; var totalPurchaseAmount = 0M; @@ -286,8 +307,10 @@ namespace BBWYB.Server.Business PurchaseFreight = currentOrderSkuFreightAmount, PurchaseOrderId = purchaseOrderSimpleInfo.OrderId, SkuAmount = currentOrderSkuProductAmount, + TotalCost = currentOrderSkuProductAmount + currentOrderSkuFreightAmount, SkuId = belongSkuId, - StorageAmount = 0 + StorageAmount = 0, + IsEnabled = true }; insertOrderCostDetails.Add(orderCostDetail); #endregion @@ -304,9 +327,11 @@ namespace BBWYB.Server.Business PurchaseMethod = Enums.PurchaseMethod.线上采购, PurchaseOrderId = createOrderResponse.OrderId, PurchasePlatform = cargoParamGroup.PurchasePlatform, + PurchaserId = cargoParamGroup.PurchaserId, PurchaserName = cargoParamGroup.PurchaserName, ShopId = request.ShopId, - BelongSkuIds = string.Join(",", belongSkuGroups.Select(bsg => bsg.Key)) + BelongSkuIds = string.Join(",", belongSkuGroups.Select(bsg => bsg.Key)), + IsEnabled = true }; insertOrderPurchaseInfos.Add(orderPurchaserInfo); #endregion @@ -338,7 +363,8 @@ namespace BBWYB.Server.Business IsManualEdited = false, PlatformCommissionRatio = 0, PreferentialAmount = 0, - PurchaseAmount = totalPurchaseAmount + PurchaseAmount = totalPurchaseAmount, + TotalCost = totalPurchaseAmount }; //orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio; orderCost.Profit = dbOrder.OrderTotalPrice - @@ -356,7 +382,12 @@ namespace BBWYB.Server.Business fsql.Transaction(() => { - deleteOrderCostDetail.ExecuteAffrows(); + //deleteOrderCostDetail.ExecuteAffrows(); + if (updatePurchaseOrderIdList.Count() > 0) + fsql.Update(updatePurchaseOrderIdList).Set(opi => opi.IsEnabled, false).ExecuteAffrows(); + if (updateOrderCostDetailIdList.Count() > 0) + fsql.Update(updateOrderCostDetailIdList).Set(ocd => ocd.IsEnabled, false).ExecuteAffrows(); + fsql.Insert(insertOrderCostDetails).ExecuteAffrows(); fsql.Insert(insertOrderPurchaseInfos).ExecuteAffrows(); fsql.Insert(insertOrderPurchaseSkuInfos).ExecuteAffrows(); @@ -373,6 +404,240 @@ namespace BBWYB.Server.Business }); } + /// + /// 获取关联订单列表 + /// + /// + /// + public IList GetAssociationPurchaseOrderList(string orderId) + { + IList list = new List(); + var purchaseOrderList = fsql.Select().Where(opi => opi.OrderId == orderId).ToList(); + var orderSkuList = fsql.Select().Where(osku => osku.OrderId == orderId).ToList(); + var orderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == orderId).ToList(); + + foreach (var purchaseOrder in purchaseOrderList) + { + var associationPurchaseOrder = new AssociationPurchaseOrderResponse() + { + PurchaseAccountId = purchaseOrder.PurchaseAccountId, + PurchaseAccountName = purchaseOrder.PurchaseAccountName, + PurchasePlatform = purchaseOrder.PurchasePlatform.Value, + PurchaserId = purchaseOrder.PurchaserId, + PurchaserName = purchaseOrder.PurchaserName, + PurchaserOrderId = purchaseOrder.PurchaseOrderId, + IsEnabled = purchaseOrder.IsEnabled + }; + + var currentOrderCostDetailList = orderCostDetailList.Where(ocd => ocd.PurchaseOrderId == purchaseOrder.PurchaseOrderId).ToList(); + + foreach (var orderCostDetail in currentOrderCostDetailList) + { + var orderSku = orderSkuList.FirstOrDefault(osku => osku.SkuId == orderCostDetail.SkuId); + var assocationOrderCostDetail = new AssocationOrderCostDetailResponse() + { + Id = orderCostDetail.Id, + Logo = orderSku.Logo, + Title = orderSku.Title, + OrderId = orderSku.OrderId, + SkuId = orderSku.SkuId, + PurchaseQuantity = orderCostDetail.DeductionQuantity ?? 0, + PurchaseFreight = orderCostDetail.PurchaseFreight ?? 0M, + SkuAmount = orderCostDetail.SkuAmount ?? 0M, + }; + if (assocationOrderCostDetail.PurchaseQuantity != 0) + assocationOrderCostDetail.PurchasePrice = assocationOrderCostDetail.SkuAmount / assocationOrderCostDetail.PurchaseQuantity; + + associationPurchaseOrder.AssocationOrderCostDetailList.Add(assocationOrderCostDetail); + } + associationPurchaseOrder.PurchaseAmount = associationPurchaseOrder.AssocationOrderCostDetailList.Sum(x => x.SkuAmount); + associationPurchaseOrder.PurchaseFreight = associationPurchaseOrder.AssocationOrderCostDetailList.Sum(x => x.PurchaseFreight); + list.Add(associationPurchaseOrder); + } + return list; + } + + /// + /// 关联订单 + /// + /// + public void AssociatePurchaseOrder(AssociationOrderRequest request) + { + if (request.AssociationPurchaseOrderList == null || request.AssociationPurchaseOrderList.Count() == 0) + throw new BusinessException("缺少采购单信息"); + + + var dbPurchaseOrderList = fsql.Select().Where(opi => opi.OrderId == request.OrderId).ToList(); + var dbInvalidPurchaseOrderIdList = dbPurchaseOrderList.Where(opi => !opi.IsEnabled).Select(opi => opi.PurchaseOrderId).ToList(); + + var dbOrderSkuList = fsql.Select().Where(osku => osku.OrderId == request.OrderId).ToList(); + var dbOrderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == request.OrderId && ocd.IsEnabled == true).ToList(); + var dbOrderCost = fsql.Select(request.OrderId).ToOne(); + var dbOrder = fsql.Select(request.OrderId).ToOne(); + + List insertOrderPurchaseInfoList = new List(); + IList> updateOrderPurchaseInfoList = new List>(); + List insertOrderCostDetailList = new List(); + IList> updateOrderCostDetailList = new List>(); + IInsert insertOrderCost = null; + IUpdate updateOrderCost = null; + + foreach (var purchaseOrder in request.AssociationPurchaseOrderList) + { + if (dbInvalidPurchaseOrderIdList.Contains(purchaseOrder.PurchaserOrderId)) + continue; + + var avgFreight = purchaseOrder.PurchaseFreight / purchaseOrder.AssocationOrderCostDetailList.Count(); + var dbPurchaserOrder = dbPurchaseOrderList.FirstOrDefault(x => x.PurchaseOrderId == purchaseOrder.PurchaserOrderId); + if (dbPurchaserOrder == null) + { + dbPurchaserOrder = new OrderPurchaseInfo() + { + Id = idGenerator.NewLong(), + OrderId = request.OrderId, + PurchaseAccountId = purchaseOrder.PurchaseAccountId, + PurchaseAccountName = purchaseOrder.PurchaseAccountName, + IsEnabled = true, + BelongSkuIds = string.Join(",", purchaseOrder.AssocationOrderCostDetailList.Select(x => x.SkuId)), + CreateTime = DateTime.Now, + PurchaseMethod = Enums.PurchaseMethod.线下采购, + PurchaseOrderId = purchaseOrder.PurchaserOrderId, + PurchasePlatform = purchaseOrder.PurchasePlatform, + PurchaserId = purchaseOrder.PurchaserId, + PurchaserName = purchaseOrder.PurchaserName, + ShopId = request.ShopId + }; + insertOrderPurchaseInfoList.Add(dbPurchaserOrder); + + foreach (var assOrderCostDetail in purchaseOrder.AssocationOrderCostDetailList) + { + var dbOrderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == assOrderCostDetail.SkuId); + var orderCostDetail = new OrderCostDetail() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + DeductionQuantity = assOrderCostDetail.PurchaseQuantity, + IsEnabled = true, + OrderId = request.OrderId, + ProductId = dbOrderSku.ProductId, + SkuId = assOrderCostDetail.SkuId, + PurchaseFreight = avgFreight, + TotalCost = assOrderCostDetail.SkuAmount + avgFreight + }; + insertOrderCostDetailList.Add(orderCostDetail); + } + } + else + { + dbPurchaserOrder.PurchaseAccountId = purchaseOrder.PurchaseAccountId; + dbPurchaserOrder.PurchaseAccountName = purchaseOrder.PurchaseAccountName; + //dbPurchaserOrder.BelongSkuIds = string.Join(",", purchaseOrder.AssocationOrderCostDetailList.Select(x => x.SkuId)); + dbPurchaserOrder.PurchasePlatform = purchaseOrder.PurchasePlatform; + dbPurchaserOrder.PurchaserId = purchaseOrder.PurchaserId; + dbPurchaserOrder.PurchaserName = purchaseOrder.PurchaserName; + updateOrderPurchaseInfoList.Add(fsql.Update().SetSource(dbPurchaserOrder)); + + foreach (var assOrderCostDetail in purchaseOrder.AssocationOrderCostDetailList) + { + var dbOrderCostDetail = dbOrderCostDetailList.FirstOrDefault(ocd => ocd.SkuId == assOrderCostDetail.SkuId); + dbOrderCostDetail.SkuAmount = assOrderCostDetail.SkuAmount; + dbOrderCostDetail.DeductionQuantity = assOrderCostDetail.PurchaseQuantity; + dbOrderCostDetail.PurchaseFreight = avgFreight; + dbOrderCostDetail.TotalCost = assOrderCostDetail.SkuAmount + avgFreight; + updateOrderCostDetailList.Add(fsql.Update().SetSource(dbOrderCostDetail)); + } + } + } + + var totalPurchaseAmount = request.AssociationPurchaseOrderList.Where(x => !dbInvalidPurchaseOrderIdList.Contains(x.PurchaserOrderId)) + .Sum(p => p.PurchaseAmount + p.PurchaseFreight); + var profit = dbOrder.OrderTotalPrice - totalPurchaseAmount - (dbOrderCost?.DeliveryExpressFreight ?? 0); // -orderCost.PlatformCommissionAmount + + if (dbOrderCost == null) + { + dbOrderCost = new OrderCost() + { + OrderId = request.OrderId, + DeliveryExpressFreight = 0, + IsManualEdited = false, + PlatformCommissionAmount = 0, + PlatformCommissionRatio = 0, + PreferentialAmount = 0, + CreateTime = DateTime.Now, + PurchaseAmount = totalPurchaseAmount, + TotalCost = totalPurchaseAmount, + Profit = profit + }; + insertOrderCost = fsql.Insert(dbOrderCost); + } + else + { + dbOrderCost.PurchaseAmount = totalPurchaseAmount; + dbOrderCost.Profit = profit; + updateOrderCost = fsql.Update(request.OrderId).Set(oc => oc.PurchaseAmount, totalPurchaseAmount) + .Set(oc => oc.TotalCost, totalPurchaseAmount) + .Set(oc => oc.Profit, profit); + } + + fsql.Transaction(() => + { + if (insertOrderPurchaseInfoList.Count() > 0) + fsql.Insert(insertOrderPurchaseInfoList).ExecuteAffrows(); + if (updateOrderPurchaseInfoList.Count() > 0) + { + foreach (var update in updateOrderPurchaseInfoList) + update.ExecuteAffrows(); + } + if (insertOrderCostDetailList.Count() > 0) + fsql.Insert(insertOrderCostDetailList).ExecuteAffrows(); + if (updateOrderCostDetailList.Count() > 0) + { + foreach (var update in updateOrderCostDetailList) + update.ExecuteAffrows(); + } + insertOrderCost?.ExecuteAffrows(); + updateOrderCost?.ExecuteAffrows(); + }); + } + + public void SetHistoryPurchaseOrder(SetHistoryPurchaseOrderRequest request) + { + var dbOrderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == request.OrderId) + .ToList(); + var dbOrderCost = fsql.Select(request.OrderId).ToOne(); + var dbOrder = fsql.Select(request.OrderId).ToOne(); + + var invalidCost = dbOrderCostDetailList.Sum(ocd => ocd.SkuAmount + ocd.PurchaseFreight); + + //orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio; + try + { + dbOrderCost.PurchaseAmount = dbOrderCostDetailList.Where(ocd => ocd.PurchaseOrderId != request.PurchaseOrderId).Sum(ocd => ocd.TotalCost); + } + catch + { + dbOrderCost.PurchaseAmount = 0; + } + dbOrderCost.Profit = dbOrder.OrderTotalPrice - + dbOrderCost.PurchaseAmount - + dbOrderCost.DeliveryExpressFreight; // -orderCost.PlatformCommissionAmount + + fsql.Transaction(() => + { + fsql.Update() + .Set(opi => opi.IsEnabled, false) + .Where(opi => opi.PurchaseOrderId == request.PurchaseOrderId) + .ExecuteAffrows(); + + fsql.Update() + .Set(ocd => ocd.IsEnabled, false) + .Where(ocd => ocd.PurchaseOrderId == request.PurchaseOrderId) + .ExecuteAffrows(); + + fsql.Update().SetSource(dbOrderCost).ExecuteAffrows(); + }); + } + #region 1688CallBack public void CallbackFrom1688(string jsonStr) { @@ -678,26 +943,36 @@ namespace BBWYB.Server.Business { var orderPurchaseInfo = fsql.Select().Where(opi => opi.PurchaseOrderId == purchaseOrderId).ToOne(); if (orderPurchaseInfo == null) - throw new Exception($"未查询到采购单{orderPurchaseInfo.PurchaseAccountId}"); + throw new Exception($"采购单{purchaseOrderId}-未查询到采购单"); var purchaseAccount = fsqlManager.MDSfsql.Select().Where(pa => pa.Id == orderPurchaseInfo.PurchaseAccountId).ToOne(); if (purchaseAccount == null) - throw new Exception($"未查询到采购账号{orderPurchaseInfo.PurchaseAccountId}"); + throw new Exception($"采购单{purchaseOrderId}-未查询到采购账号{orderPurchaseInfo.PurchaseAccountId}"); - var dbOrder = fsql.Select(orderPurchaseInfo.OrderId).ToOne(o => new { o.OrderTotalPrice }); + var dbOrder = fsql.Select(orderPurchaseInfo.OrderId).ToOne(); var dbOrderCost = fsql.Select(orderPurchaseInfo.OrderId).ToOne(); if (dbOrderCost == null) - throw new Exception($"未查询到订单成本 {orderPurchaseInfo.OrderId}"); + throw new Exception($"采购单{purchaseOrderId}-未查询到订单{orderPurchaseInfo.OrderId}的成本"); + + var dbOrderCostDetails = fsql.Select().Where(ocd => ocd.OrderId == dbOrder.Id && ocd.IsEnabled == true).ToList(); + if (dbOrderCostDetails.Count() == 0) + throw new Exception($"采购单{purchaseOrderId}-未查询到订单{orderPurchaseInfo.OrderId}的明细成本"); + + var dbOrderPurchaseRelationInfos = fsql.Select().Where(x => x.OrderId == dbOrder.Id).ToList(); + if (dbOrderPurchaseRelationInfos.Count() == 0) + throw new Exception($"采购单{purchaseOrderId}-未查询到采购单关联明细,手动关联的采购单不支持改价"); + + var dbOrderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == orderPurchaseInfo.OrderId && opi.IsEnabled == true).ToList(); + if (dbOrderPurchaseInfoList.Count() == 0) + throw new Exception($"采购单{purchaseOrderId}-未查询到订单{orderPurchaseInfo.OrderId}的采购单集合"); + + List> updateOrderCostDetailList = new List>(); + IUpdate updateOrderCost = null; - var orderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == orderPurchaseInfo.OrderId).ToList(opi => new - { - opi.PurchaseOrderId, - opi.PurchaseAccountId - }); var client = ppPlatformClientFactory.GetClient(AdapterEnums.PlatformType.阿里巴巴); var totalPurchaseAmount = 0M; - foreach (var opi in orderPurchaseInfoList) + foreach (var opi in dbOrderPurchaseInfoList) { var purchaseOrderSimpleInfo = client.QueryOrderDetail(new PP_QueryOrderDetailRequest() { @@ -707,25 +982,50 @@ namespace BBWYB.Server.Business OrderId = opi.PurchaseOrderId }); totalPurchaseAmount += purchaseOrderSimpleInfo.TotalAmount; - } + var currentPurchaseOrderRelationInfos = dbOrderPurchaseRelationInfos.Where(x => x.PurchaseOrderId == opi.PurchaseOrderId).ToList(); - //var oldTotalAmount = dbOrderCost.PurchaseAmount; - //var oldProductAmount = dbOrderCostDetailList.Sum(ocd => ocd.SkuAmount); - //var oldPurchaseFreight = dbOrderCostDetailList.Sum(ocd => ocd.PurchaseFreight); + var belongSkuGroups = currentPurchaseOrderRelationInfos.GroupBy(p => p.BelongSkuId); + foreach (var belongSkuGroup in belongSkuGroups) + { + var belongSkuId = belongSkuGroup.Key; + var currentOrderSkuProductAmount = 0M; //采购成本 + var currentOrderSkuCargoParamList = belongSkuGroup.ToList(); //找当前skuId的采购skuId - dbOrderCost.PurchaseAmount = totalPurchaseAmount; - dbOrderCost.Profit = dbOrder.OrderTotalPrice - - dbOrderCost.PurchaseAmount - - dbOrderCost.DeliveryExpressFreight; // -orderCost.PlatformCommissionAmount + foreach (var currentOrderSkuCargo in currentOrderSkuCargoParamList) + { + var purchaseSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.PurchaseSkuId) + .Sum(p => p.ProductAmount); + var purchaseSkuTotalQuantity = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.PurchaseSkuId) + .Sum(p => p.Quantity); + currentOrderSkuProductAmount += purchaseSkuProductAmount * (1.0M * currentOrderSkuCargo.Quantity.Value / purchaseSkuTotalQuantity); + } - fsql.Transaction(() => - { - fsql.Update(dbOrderCost.OrderId).Set(oc => oc.PurchaseAmount, dbOrderCost.PurchaseAmount) - .Set(oc => oc.Profit, dbOrderCost.Profit) - .ExecuteAffrows(); - }); + var currentOrderSkuFreightAmount = purchaseOrderSimpleInfo.FreightAmount / belongSkuGroups.Count(); //采购运费(按sku数均分) + + var dbOrderSkuDetail = dbOrderCostDetails.FirstOrDefault(ocd => ocd.SkuId == belongSkuId); + dbOrderSkuDetail.SkuAmount = currentOrderSkuProductAmount; + dbOrderSkuDetail.PurchaseFreight = currentOrderSkuFreightAmount; + dbOrderSkuDetail.TotalCost = currentOrderSkuProductAmount + currentOrderSkuFreightAmount; + updateOrderCostDetailList.Add(fsql.Update().SetSource(dbOrderSkuDetail)); + } + dbOrderCost.PurchaseAmount = totalPurchaseAmount; + dbOrderCost.Profit = dbOrder.OrderTotalPrice - + dbOrderCost.PurchaseAmount - + dbOrderCost.DeliveryExpressFreight; // -orderCost.PlatformCommissionAmount + + fsql.Transaction(() => + { + foreach (var update in updateOrderCostDetailList) + update.ExecuteAffrows(); + updateOrderCost?.ExecuteAffrows(); + + //fsql.Update(dbOrderCost.OrderId).Set(oc => oc.PurchaseAmount, dbOrderCost.PurchaseAmount) + // .Set(oc => oc.Profit, dbOrderCost.Profit) + // .ExecuteAffrows(); + }); + } } catch (Exception ex) { diff --git a/BBWYB.Server.Model/Db/Order/OrderCostDetail.cs b/BBWYB.Server.Model/Db/Order/OrderCostDetail.cs index 3ba1064..6f4b31f 100644 --- a/BBWYB.Server.Model/Db/Order/OrderCostDetail.cs +++ b/BBWYB.Server.Model/Db/Order/OrderCostDetail.cs @@ -109,12 +109,6 @@ namespace BBWYB.Server.Model.Db [Column(DbType = "decimal(20,2)")] public decimal? StorageAmount { get; set; } = 0.00M; - /// - /// 采购成本(不含发货运费) - /// - [Column(DbType = "decimal(20,2)")] - public decimal? PurchaseAmount { get; set; } = 0.00M; - /// /// 成本总计 /// diff --git a/BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs b/BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs index fdeb97a..a45ec29 100644 --- a/BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs +++ b/BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs @@ -39,6 +39,12 @@ namespace BBWYB.Server.Model.Db [Column(MapType = typeof(int?))] public Enums.Platform? PurchasePlatform { get; set; } + /// + /// ɹId + /// + [Column(StringLength = 100)] + public string PurchaserId { get; set; } + /// /// ɹ /// @@ -85,6 +91,9 @@ namespace BBWYB.Server.Model.Db /// [Column(StringLength = 500)] public string BelongSkuIds { get; set; } + + [Column(DbType = "bit")] + public bool IsEnabled { get; set; } = true; } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/AssocationOrderCostDetailRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/AssocationOrderCostDetailRequest.cs new file mode 100644 index 0000000..bec6e2e --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/AssocationOrderCostDetailRequest.cs @@ -0,0 +1,32 @@ +namespace BBWYB.Server.Model.Dto +{ + public class AssocationOrderCostDetailRequest + { + /// + /// 订单Id + /// + public string OrderId { get; set; } + + public string SkuId { get; set; } + + /// + /// 采购货款 + /// + public decimal SkuAmount { get; set; } + + ///// + ///// 采购运费 + ///// + //public decimal PurchaseFreight { get; set; } + + /// + /// 采购数量 + /// + public int PurchaseQuantity { get; set; } + + ///// + ///// 采购单价 + ///// + //public decimal PurchasePrice { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/AssociationOrderRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/AssociationOrderRequest.cs new file mode 100644 index 0000000..e303045 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/AssociationOrderRequest.cs @@ -0,0 +1,20 @@ +namespace BBWYB.Server.Model.Dto +{ + public class AssociationOrderRequest + { + /// + /// 订单Id + /// + public string OrderId { get; set; } + + /// + /// 店铺Id (Shop对象的ShopId) + /// + public long ShopId { get; set; } + + /// + /// 采购单列表 + /// + public IList AssociationPurchaseOrderList { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/AssociationPurchaseOrderRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/AssociationPurchaseOrderRequest.cs new file mode 100644 index 0000000..5076f39 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/AssociationPurchaseOrderRequest.cs @@ -0,0 +1,52 @@ +namespace BBWYB.Server.Model.Dto +{ + public class AssociationPurchaseOrderRequest + { + public AssociationPurchaseOrderRequest() + { + AssocationOrderCostDetailList = new List(); + } + + /// + /// 采购单号 + /// + public string PurchaserOrderId { get; set; } + + public Enums.Platform PurchasePlatform { get; set; } + + /// + /// 买家账号Id (如果采购平台为不支持的平台,此Id可填空) + /// + public string PurchaseAccountId { get; set; } + + /// + /// 买家账号 + /// + public string PurchaseAccountName { get; set; } + + /// + /// 商家Id + /// + public string PurchaserId { get; set; } + + /// + /// 商家名称 + /// + public string PurchaserName { get; set; } + + /// + /// 采购金额 + /// + public decimal PurchaseAmount { get; set; } + + /// + /// 采购运费 + /// + public decimal PurchaseFreight { get; set; } + + /// + /// 订单成本明细列表 + /// + public IList AssocationOrderCostDetailList { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/SetHistoryPurchaseOrderRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/SetHistoryPurchaseOrderRequest.cs new file mode 100644 index 0000000..72a02b9 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/SetHistoryPurchaseOrderRequest.cs @@ -0,0 +1,15 @@ +namespace BBWYB.Server.Model.Dto +{ + public class SetHistoryPurchaseOrderRequest + { + /// + /// 订单Id + /// + public string OrderId { get; set; } + + /// + /// 采购单Id + /// + public string PurchaseOrderId { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/PurchaseOrder/AssocationOrderCostDetailResponse.cs b/BBWYB.Server.Model/Dto/Response/PurchaseOrder/AssocationOrderCostDetailResponse.cs new file mode 100644 index 0000000..164f6c9 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/PurchaseOrder/AssocationOrderCostDetailResponse.cs @@ -0,0 +1,44 @@ +namespace BBWYB.Server.Model.Dto +{ + public class AssocationOrderCostDetailResponse + { + /// + /// SKU成本Id + /// + public long Id { get; set; } + + /// + /// 订单Id + /// + public string OrderId { get; set; } + + public string SkuId { get; set; } + + /// + /// SKU标题 + /// + public string Title { get; set; } + + public string Logo { get; set; } + + /// + /// 采购货款 + /// + public decimal SkuAmount { get; set; } + + /// + /// 采购运费 + /// + public decimal PurchaseFreight { get; set; } + + /// + /// 采购数量 + /// + public int PurchaseQuantity { get; set; } + + /// + /// 采购单价 + /// + public decimal PurchasePrice { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/PurchaseOrder/AssociationPurchaseOrderResponse.cs b/BBWYB.Server.Model/Dto/Response/PurchaseOrder/AssociationPurchaseOrderResponse.cs new file mode 100644 index 0000000..095d7f8 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/PurchaseOrder/AssociationPurchaseOrderResponse.cs @@ -0,0 +1,58 @@ +namespace BBWYB.Server.Model.Dto +{ + public class AssociationPurchaseOrderResponse + { + public AssociationPurchaseOrderResponse() + { + AssocationOrderCostDetailList = new List(); + } + + /// + /// 采购单号 + /// + public string PurchaserOrderId { get; set; } + + public Enums.Platform PurchasePlatform { get; set; } + + /// + /// 买家账号Id (如果采购平台为不支持的平台,此Id可填空) + /// + public string PurchaseAccountId { get; set; } + + /// + /// 买家账号 + /// + public string PurchaseAccountName { get; set; } + + + /// + /// 商家Id + /// + public string PurchaserId { get; set; } + + /// + /// 商家名称 + /// + public string PurchaserName { get; set; } + + /// + /// 采购金额 + /// + public decimal PurchaseAmount { get; set; } + + /// + /// 采购运费 + /// + public decimal PurchaseFreight { get; set; } + + /// + /// 是否有效(以此判定是否为历史采购单) + /// + public bool IsEnabled { get; set; } + + /// + /// 订单成本明细列表 + /// + public IList AssocationOrderCostDetailList { get; set; } + } +}