using BBWYB.Common.Extensions; using BBWYB.Common.Http; using BBWYB.Common.Log; using BBWYB.Common.Models; using BBWYB.Server.Business.Extensions; using BBWYB.Server.Model; using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Dto; using FreeSql; using Newtonsoft.Json; using SDKAdapter; using SDKAdapter.OperationPlatform.Client; using SDKAdapter.OperationPlatform.Models; using System.Linq.Expressions; using System.Security.Cryptography; using Yitter.IdGenerator; namespace BBWYB.Server.Business { public class OrderBusiness : BaseBusiness, IDenpendency { private OP_PlatformClientFactory opPlatformClientFactory; private RestApiService restApiService; public OrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, OP_PlatformClientFactory opPlatformClientFactory, RestApiService restApiService) : base(fsql, nLogManager, idGenerator) { this.opPlatformClientFactory = opPlatformClientFactory; this.restApiService = restApiService; } private ISelect GetOrderListQueryConditions(QueryOrderRequest request) { var select = fsql.Select() .LeftJoin((o, ocs, oct) => o.Id == ocs.OrderId) .LeftJoin((o, ocs, oct) => o.Id == oct.OrderId); if (!string.IsNullOrEmpty(request.OrderId)) select = select.Where((o, ocs, oct) => o.Id == request.OrderId); else if (!string.IsNullOrEmpty(request.OrderSn)) select = select.Where((o, ocs, oct) => o.OrderSn == request.OrderSn); else { if (!string.IsNullOrEmpty(request.Sku) || !string.IsNullOrEmpty(request.SourceSku) || !string.IsNullOrEmpty(request.ProductId)) { var childSelect = fsql.Select().As("osku") .WhereIf(!string.IsNullOrEmpty(request.Sku), osku => osku.SkuId == request.Sku) .WhereIf(!string.IsNullOrEmpty(request.SourceSku), osku => osku.BelongSkuId == request.SourceSku) .WhereIf(!string.IsNullOrEmpty(request.ProductId), osku => osku.ProductId == request.ProductId); select = select.Where((o, ocs, oct) => childSelect.Where(osku => osku.OrderId == o.Id).Any()); } if (!string.IsNullOrEmpty(request.PurchaseOrderId)) { var childSelect = fsql.Select().As("opi") .Where(opi => opi.PurchaseOrderId == request.PurchaseOrderId); select = select.Where((o, ocs, oct) => childSelect.Where(opi => opi.OrderId == o.Id).Any()); } select = select.WhereIf(request.OrderState == Enums.OrderState.待付款 || request.OrderState == Enums.OrderState.打包中 || request.OrderState == Enums.OrderState.待完结 || request.OrderState == Enums.OrderState.已完成 || request.OrderState == Enums.OrderState.已取消, (o, ocs, oct) => o.OrderState == request.OrderState) .WhereIf(request.OrderState == Enums.OrderState.等待采购, (o, ocs, oct) => o.OrderState == Enums.OrderState.等待采购 || o.OrderState == Enums.OrderState.部分采购) .WhereIf(request.OrderState == Enums.OrderState.待发货, (o, ocs, oct) => o.OrderState == Enums.OrderState.待发货 || o.OrderState == Enums.OrderState.部分发货) .WhereIf(request.OrderState == Enums.OrderState.待收货, (o, ocs, oct) => o.OrderState == Enums.OrderState.待收货 || o.OrderState == Enums.OrderState.部分收货) .WhereIf(request.IsWaitConfig, (o, ocs, oct) => o.OrderState != Enums.OrderState.已取消 && o.IsPurchased == true) .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) .WhereIf(!string.IsNullOrEmpty(request.SourceShopName), (o, ocs, oct) => o.SourceShopName == request.SourceShopName); } select = select.WhereIf(request.ShopId != null, (o, ocs, oct) => o.ShopId == request.ShopId); //select = select.Where((o, ocs, oct) => o.ShopId == searchOrderRequest.ShopId); return select; } private Expression> GetOrderListField() { return (o, ocs, oct) => new Order() { Id = o.Id, OrderSn = o.OrderSn, EndTime = o.EndTime, FreightPrice = o.FreightPrice, ModifyTime = o.ModifyTime, OrderPayment = o.OrderPayment, OrderSellerPrice = o.OrderSellerPrice, OrderState = o.OrderState, OrderTotalPrice = o.OrderTotalPrice, OrderType = o.OrderType, PayType = o.PayType, Platform = o.Platform, ShopId = o.ShopId, StartTime = o.StartTime, VenderRemark = o.VenderRemark, PurchaseRemark = o.PurchaseRemark, BuyerRemark = o.BuyerRemark, //WaybillNo = o.WaybillNo, SellerPreferentialAmount = o.SellerPreferentialAmount, PreferentialAmount = o.PreferentialAmount, ClientOrderId = o.ClientOrderId, SourceShopName = o.SourceShopName, //SourceSku = o.SourceSku, //ExpressName = o.ExpressName, IsPurchased = o.IsPurchased, BuyerAccount = o.BuyerAccount, InPackAmount = o.InPackAmount, IsWaitPack = o.IsWaitPack, ContactName = ocs.ContactName, Address = ocs.Address, Province = ocs.Province, County = ocs.County, Town = ocs.Town, City = ocs.City, Mobile = ocs.Mobile, TelePhone = ocs.TelePhone, DeliveryExpressFreight = oct.DeliveryExpressFreight, PlatformCommissionAmount = oct.PlatformCommissionAmount, PlatformCommissionRatio = oct.PlatformCommissionRatio, Profit = oct.Profit, PurchaseAmount = oct.PurchaseAmount, IsManualEdited = oct.IsManualEdited, PackConfigState = o.PackConfigState, }; } public OrderListResponse GetOrderList(QueryOrderRequest request) { if (request.EndDate != null) request.EndDate = request.EndDate.Value.Date.AddDays(1).AddSeconds(-1); var select = GetOrderListQueryConditions(request).OrderByDescending((o, ocs, oct) => o.StartTime) .Count(out var total) .Page(request.PageIndex, request.PageSize); var orderSourceList = select.ToList(GetOrderListField()); var orderList = orderSourceList.Map>(); var orderIdList = orderList.Select(o => o.Id).ToList(); if (orderList.Count() > 0) { #region 查询关联信息 var orderPurchaseRelationInfoList = fsql.Select().Where(ori => orderIdList.Contains(ori.OrderId)).ToList(); #endregion #region 查询快递单信息 var purchaseExpressOrderList = fsql.Select().Where(peo => orderIdList.Contains(peo.OrderId)).ToList(); #endregion #region 处理订单成本明细 var orderCostDetailList = fsql.Select().Where(ocd => orderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true).ToList(); foreach (var order in orderList) order.OrderCostDetailList = orderCostDetailList.Where(ocd => ocd.OrderId == order.Id).ToList(); #endregion #region 处理采购信息 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) { order.OrderPurchaseInfoList = orderPurchaseInfoList.Where(op => op.OrderId == order.Id).ToList(); foreach (var orderPurchaseInfo in order.OrderPurchaseInfoList) { orderPurchaseInfo.OrderPurchaseSkuInfoList = orderPurchaseSkuInfoList.Where(opsi => opsi.PurchaseOrderId == orderPurchaseInfo.PurchaseOrderId).ToList(); orderPurchaseInfo.PurchaseExpressOrderList = purchaseExpressOrderList.Where(peo => peo.PurchaseOrderId == orderPurchaseInfo.PurchaseOrderId).ToList(); } } #endregion #region 处理SKU var orderSkuList = fsql.Select().Where(osku => osku.Price != 0 && orderIdList.Contains(osku.OrderId)).ToList(); foreach (var order in orderList) { order.ItemList = orderSkuList.Where(osku => osku.OrderId == order.Id).ToList(); } #endregion #region 处理SKU的快递单 foreach (var purchaseExpressOrder in purchaseExpressOrderList) { var purchaseOrder = orderPurchaseInfoList.FirstOrDefault(po => po.PurchaseOrderId == purchaseExpressOrder.PurchaseOrderId); if (purchaseOrder == null) continue; if (purchaseOrder.PurchasePlatform == Enums.Platform.阿里巴巴) { var purchaseSkuIds = orderPurchaseSkuInfoList.Where(posku => posku.WaybillNo == purchaseExpressOrder.WaybillNo && posku.PurchaseOrderId == purchaseOrder.PurchaseOrderId) .Select(posku => posku.PurchaseSkuId).ToList(); var orderSkuIds = orderPurchaseRelationInfoList.Where(ori => ori.PurchaseOrderId == purchaseOrder.PurchaseOrderId && purchaseSkuIds.Contains(ori.PurchaseSkuId)) .Select(ori => ori.BelongSkuId) .Distinct() .ToList(); var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == purchaseOrder.OrderId && orderSkuIds.Contains(osku.SkuId)).ToList(); foreach (var osku in currentOrderSkuList) { if (osku.PurchaseExpressOrderList.Any(peo => peo.WaybillNo == purchaseExpressOrder.WaybillNo)) continue; osku.PurchaseExpressOrderList.Add(purchaseExpressOrder); } } else { var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == purchaseOrder.OrderId && purchaseOrder.BelongSkuIds.Contains(osku.SkuId)).ToList(); foreach (var osku in currentOrderSkuList) { if (osku.PurchaseExpressOrderList.Any(peo => peo.WaybillNo == purchaseExpressOrder.WaybillNo)) continue; osku.PurchaseExpressOrderList.Add(purchaseExpressOrder); } } } #endregion } return new OrderListResponse() { Count = total, Items = orderList }; } //public void OutStock(OutStockRequest request) //{ // var dbOrder = fsql.Select(request.OrderId).ToOne(); // if (dbOrder == null) // throw new BusinessException($"订单{request.OrderId}不存在"); // var dbOrderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == request.OrderId && opi.IsEnabled == true).ToList(); // var dbOrderPurchaseInfo = dbOrderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaseOrderId == request.PurchaseOrderId); // dbOrderPurchaseInfo.WaybillNo = request.WayBillNo; // dbOrderPurchaseInfo.SourceExpressId = request.SourceExpressId; // dbOrderPurchaseInfo.SourceExpressName = request.SourceExpressName; // dbOrderPurchaseInfo.TargetExpressId = request.TargetExpressId; // dbOrderPurchaseInfo.TargetExpressName = request.TargetExpressName; // dbOrderPurchaseInfo.OrderState = Enums.PurchaseOrderState.待收货; // #region 订单状态 // dbOrder.CalculationOrderState(fsql, null, dbOrderPurchaseInfoList); // #endregion // if (!string.IsNullOrEmpty(request.TargetExpressId)) // { // #region 订阅快递100 // #endregion // //try // //{ // // opPlatformClientFactory.GetClient((AdapterEnums.PlatformType)request.Platform) // // .OutStock(new OP_OutStockRequest() // // { // // AppKey = request.AppKey, // // AppSecret = request.AppSecret, // // AppToken = request.AppToken, // // ExpressId = request.TargetExpressId, // // ExpressName = request.TargetExpressName, // // OrderId = request.OrderId, // // Platform = (AdapterEnums.PlatformType)request.Platform, // // WayBillNo = request.WayBillNo // // }); // //} // //catch (Exception ex) // //{ // // nLogManager.Default().Error(ex, $"OutStock Request {JsonConvert.SerializeObject(request)}"); // //} // } // #region 通知C端出库 // //通知C端 // try // { // restApiService.SendRequest("https://bbwy.qiyue666.com", // "/Api/PurchaseOrder/QuanTanSendGoodsCallback", // new // { // OrderId = request.OrderId, // ExpressId = request.SourceExpressId, // ExpressName = request.SourceExpressName, // request.WayBillNo // }, // null, // HttpMethod.Post); // } // catch (Exception ex) // { // } // #endregion // fsql.Transaction(() => // { // fsql.Update().SetSource(dbOrderPurchaseInfo).ExecuteAffrows(); // fsql.Update(request.OrderId).Set(o => o.OrderState, dbOrder.OrderState).ExecuteAffrows(); // }); //} public void CancelOrder(CancelOrderRequest request, string mdsToken) { opPlatformClientFactory.GetClient((AdapterEnums.PlatformType)request.Platform).CancelOrder(new OP_CancelOrderRequest() { AppKey = request.AppKey, AppSecret = request.AppSecret, AppToken = request.AppToken, OrderId = request.OrderId, Platform = (AdapterEnums.PlatformType)request.Platform, Remark = request.Remark }); fsql.Update(request.OrderId).Set(o => o.OrderState, Enums.OrderState.已取消).ExecuteAffrows(); var sql = $"update purchaseorderv2 set OrderState=6 where Id='{request.OrderId}'"; //取消C端采购单 restApiService.SendRequest("https://bbwy.qiyue666.com", "/Api/Sql/ExecuteNonQuery", new { sql = sql.AESEncrypt() }, new Dictionary() { { "Authorization", $"{mdsToken}" } }, HttpMethod.Post); try { //取消齐库的任务 var qikuResponse = restApiService.SendRequest("http://qiku.qiyue666.com/", $"/api/PackPurchaseTask/CancelOrderPackTask?orderId={request.OrderId}", null, null, HttpMethod.Post); if (qikuResponse.StatusCode != System.Net.HttpStatusCode.OK) throw new Exception(qikuResponse.Content); } catch (Exception ex) { nLogManager.GetLogger($"取消打包任务-{request.OrderId}").Error(ex, JsonConvert.SerializeObject(request)); } } public void EditPrice(OP_EditPriceRequest request) { var client = opPlatformClientFactory.GetClient(request.Platform); client.EditPrice(new OP_EditPriceRequest() { AppKey = request.AppKey, AppSecret = request.AppSecret, AppToken = request.AppToken, OrderId = request.OrderId, EditItems = request.EditItems }); var orderListResponse = client.GetOrderList(new OP_QueryOrderRequest() { AppKey = request.AppKey, AppSecret = request.AppSecret, AppToken = request.AppToken, OrderId = request.OrderId, PageIndex = 1, PageSize = 1, SortTimeField = AdapterEnums.SortTimeField.Modify, SortType = AdapterEnums.SortType.Desc }); var order = orderListResponse.Items.FirstOrDefault(); var orderCost = fsql.Select(request.OrderId).ToOne(); IList> updates_orderSku = new List>(); IUpdate updateOrderCost = null; foreach (var orderSku in order.OrderSkuList) { updates_orderSku.Add(fsql.Update(orderSku.Id).Set(osku => osku.Price, orderSku.SkuPrice) .Set(osku => osku.BuyerPayFreight, orderSku.FreightAmount) .Set(osku => osku.InPackAmount, orderSku.PackAmount)); } if (orderCost != null) { orderCost.CalculationOrderCostCostAndProfit(order.OrderTotalAmount, orderCost.SkuAmount ?? 0M, orderCost.PurchaseFreight ?? 0M, orderCost.OutPackAmount ?? 0M, orderCost.DeliveryExpressFreight ?? 0M); updateOrderCost = fsql.Update().SetSource(orderCost); } fsql.Transaction(() => { fsql.Update(request.OrderId).Set(o => o.OrderTotalPrice, order.OrderTotalAmount) .Set(o => o.OrderSellerPrice, order.OrderProductAmount) .Set(o => o.FreightPrice, order.FreightAmount) .ExecuteAffrows(); updateOrderCost?.ExecuteAffrows(); if (updates_orderSku.Count() > 0) { foreach (var update in updates_orderSku) update.ExecuteAffrows(); } }); #region 通知C端 restApiService.SendRequest("https://bbwy.qiyue666.com", "/Api/PurchaseOrder/QuanTanEditPriceCallback", new { orderId = request.OrderId }, null, HttpMethod.Post); #endregion } public void EditVenderRemark(EditVenderRemarkRequest request) { fsql.Update(request.OrderId).Set(o => o.VenderRemark, request.VenderRemark).ExecuteAffrows(); } public void EditOrderSkuRemark(EditOrderSkuRemarkRequest request) { fsql.Update().Set(osku => osku.Remark, request.Remark) .Where(osku => osku.OrderId == request.OrderId) .Where(osku => osku.SkuId == request.SkuId) .ExecuteAffrows(); } public void QiKuPublishPackAmount(QiKuPublishPackAmountRequest request) { } } }