diff --git a/BBWYB.Server.Business/Order/OrderBusiness.cs b/BBWYB.Server.Business/Order/OrderBusiness.cs new file mode 100644 index 0000000..2edbbd0 --- /dev/null +++ b/BBWYB.Server.Business/Order/OrderBusiness.cs @@ -0,0 +1,124 @@ +using BBWY.Server.Model.Dto; +using BBWYB.Common.Log; +using BBWYB.Common.Models; +using BBWYB.Server.Model.Dto; +using FreeSql; +using Yitter.IdGenerator; +using BBWYB.Server.Model.Db; +using System.Linq.Expressions; + +namespace BBWYB.Server.Business.Order +{ + public class OrderBusiness : BaseBusiness, IDenpendency + { + public OrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator) : base(fsql, nLogManager, idGenerator) + { + + } + + 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.Sku) || !string.IsNullOrEmpty(request.ProductId)) + { + var childSelect = fsql.Select().As("osku") + .WhereIf(!string.IsNullOrEmpty(request.Sku), osku => osku.SkuId == request.Sku) + .WhereIf(!string.IsNullOrEmpty(request.ProductId), osku => osku.ProductId == request.ProductId); + select = select.Where((o, ocs, oct) => childSelect.Where(osku => osku.OrderId == o.Id).Any()); + } + + select = select.WhereIf(request.OrderState != null, (o, ocs, oct) => o.OrderState == request.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) + .WhereIf(!string.IsNullOrEmpty(request.SourceShopName), (o, ocs, oct) => o.SourceShopName == request.SourceShopName) + .WhereIf(!string.IsNullOrEmpty(request.SourceSku), (o, ocs, oct) => o.SourceSku == request.SourceSku); + } + + 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, sh) => new Order() + { + Id = o.Id, + BuyerRemark = o.BuyerRemark, + 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, + StorageType = o.StorageType, + StoreId = o.StoreId, + StoreOrder = o.StoreOrder, + VenderRemark = o.VenderRemark, + PurchaseRemark = o.PurchaseRemark, + WaybillNo = o.WaybillNo, + Flag = o.Flag, + SDType = o.SDType, + SDKey = o.SDKey, + SDOperator = o.SDOperator, + SDPayBillNo = o.SDPayBillNo, + SDPayChannel = o.SDPayChannel, + IsAfterSaleOrder = o.IsAfterSaleOrder, + SellerPreferentialAmount = o.SellerPreferentialAmount, + PreferentialAmount = o.PreferentialAmount, + + ContactName = ocs.ContactName, + Address = ocs.Address, + Province = ocs.Province, + County = ocs.County, + Town = ocs.Town, + City = ocs.City, + IsDecode = ocs.IsDecode, + Mobile = ocs.Mobile, + TelePhone = ocs.TelePhone, + + DeliveryExpressFreight = oct.DeliveryExpressFreight, + PlatformCommissionAmount = oct.PlatformCommissionAmount, + PlatformCommissionRatio = oct.PlatformCommissionRatio, + //PreferentialAmount = oct.PreferentialAmount, + Profit = oct.Profit, + PurchaseAmount = oct.PurchaseAmount, + IsManualEdited = oct.IsManualEdited, + SDCommissionAmount = oct.SDCommissionAmount, + SDOrderAmount = oct.SDOrderAmount, + RefundAmount = oct.RefundAmount, + RefundPurchaseAmount = oct.RefundPurchaseAmount, + AfterTotalCost = oct.AfterTotalCost, + + StoreName = sh.Name + }; + } + + public OrderListResponse GetOrderList(QueryOrderRequest request) + { + var select = GetOrderListQueryConditions(request).OrderByDescending((o, ocs, oct) => o.StartTime) + .Count(out var total) + .Page(request.PageIndex, request.PageSize); + return new OrderListResponse() + { + Count = total + }; + } + } +} diff --git a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs index 4531419..15ed45a 100644 --- a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs +++ b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs @@ -4,6 +4,7 @@ using BBWYB.Server.Model; using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Dto; using FreeSql; +using Newtonsoft.Json.Linq; using SDKAdapter; using SDKAdapter.OperationPlatform.Client; using SDKAdapter.OperationPlatform.Models; @@ -74,6 +75,9 @@ namespace BBWYB.Server.Business.Sync var dbOrderList = fsql.Select(qtOrderIdList).ToList(); List insertOrderList = new List(); + List insertOrderSkuList = new List(); + List insertOrderConsigneeList = new List(); + List> updateOrderList = new List>(); foreach (var qtOrder in qtOrderList.Items) @@ -107,11 +111,58 @@ namespace BBWYB.Server.Business.Sync StorageType = 0, VenderRemark = qtOrder.VenderRemark, WaybillNo = qtOrder.DeliveryResponse.WayBillNo, - OrderState = orderState + OrderState = orderState, + ClientOrderId = qtOrder.ClientOrderId }; + if (!string.IsNullOrEmpty(qtOrder.Extended)) + { + try + { + var jobject = JObject.Parse(qtOrder.Extended); + dbOrder.SourceSku = jobject.Value("SourceSku"); + dbOrder.SourceShopName = jobject.Value("SourceShopName"); + } + catch (Exception ex) + { + + } + } if (!insertOrderList.Any(o => o.Id == dbOrder.Id)) insertOrderList.Add(dbOrder); + + //订单sku + foreach (var qtOrderSku in qtOrder.OrderSkuList) + { + insertOrderSkuList.Add(new OrderSku() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + SkuId = qtOrderSku.SkuId, + ItemTotal = qtOrderSku.Quantity, + Logo = qtOrderSku.SkuLogo, + OrderId = qtOrder.OrderId, + Price = qtOrderSku.SkuPrice, + Title = qtOrderSku.SkuTitle, + ShopId = shopId, + ProductId = qtOrderSku.ProductId + }); + } + + //收货人 + insertOrderConsigneeList.Add(new OrderConsignee() + { + OrderId = qtOrder.OrderId, + Address = qtOrder.Consignee.Address, + City = qtOrder.Consignee.City, + ContactName = qtOrder.Consignee.ContactName, + County = qtOrder.Consignee.County, + CreateTime = DateTime.Now, + Mobile = qtOrder.Consignee.Mobile, + Province = qtOrder.Consignee.Province, + TelePhone = qtOrder.Consignee.Mobile, + Town = qtOrder.Consignee.Town + }); } else { @@ -153,6 +204,12 @@ namespace BBWYB.Server.Business.Sync if (insertOrderList.Count > 0) fsql.Insert(insertOrderList).ExecuteAffrows(); + if (insertOrderSkuList.Count() > 0) + fsql.Insert(insertOrderSkuList).ExecuteAffrows(); + + if (insertOrderConsigneeList.Count() > 0) + fsql.Insert(insertOrderConsigneeList).ExecuteAffrows(); + if (updateOrderList.Count() > 0) foreach (var update in updateOrderList) update.ExecuteAffrows(); diff --git a/BBWYB.Server.Model/Db/Order/Order.cs b/BBWYB.Server.Model/Db/Order/Order.cs index b6843db..361cb3c 100644 --- a/BBWYB.Server.Model/Db/Order/Order.cs +++ b/BBWYB.Server.Model/Db/Order/Order.cs @@ -148,6 +148,24 @@ namespace BBWYB.Server.Model.Db [Column(StringLength = 100)] public string ExpressName { get; set; } + /// + /// 来源Sku + /// + [Column(StringLength = 100)] + public string SourceSku { get; set; } + + /// + /// 来源店铺名 + /// + [Column(StringLength = 100)] + public string SourceShopName { get; set; } + + /// + /// 业务端订单号 + /// + [Column(StringLength = 100)] + public string ClientOrderId { get; set; } + } } diff --git a/BBWYB.Server.Model/Dto/Request/Order/QueryOrderRequest.cs b/BBWYB.Server.Model/Dto/Request/Order/QueryOrderRequest.cs new file mode 100644 index 0000000..4b5b9f7 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/Order/QueryOrderRequest.cs @@ -0,0 +1,31 @@ +namespace BBWYB.Server.Model.Dto +{ + public class QueryOrderRequest + { + /// 当订单号有值时会忽略其余所有条件 + /// + public string OrderId { get; set; } + + public long? ShopId { get; set; } + + public DateTime? StartDate { get; set; } + + public DateTime? EndDate { get; set; } + + public Enums.OrderState? OrderState { get; set; } + + public int PageIndex { get; set; } + + public int PageSize { get; set; } + + public string ProductId { get; set; } + + public string Sku { get; set; } + + public string ClientOrderId { get; set; } + + public string SourceShopName { get; set; } + + public string SourceSku { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/Order/ConsigneeResponse.cs b/BBWYB.Server.Model/Dto/Response/Order/ConsigneeResponse.cs new file mode 100644 index 0000000..e818d7c --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/Order/ConsigneeResponse.cs @@ -0,0 +1,79 @@ +namespace BBWY.Server.Model.Dto +{ + public class ConsigneeResponse + { + /// + /// 联系人名称 + /// + public string ContactName { get; set; } + + /// + /// 座机 + /// + public string TelePhone { get; set; } + + /// + /// 手机 + /// + public string Mobile { get; set; } + + public string Address { get; set; } + + /// + /// 省 + /// + public string Province { get; set; } + + /// + /// 市 + /// + public string City { get; set; } + + /// + /// 县 + /// + public string County { get; set; } + + /// + /// 镇 + /// + public string Town { get; set; } + + /// + /// 是否解码 + /// + public bool? IsDecode { get; set; } + } + + /// + /// 收货人信息(不含省市区) + /// + public class ConsigneeSimpleResponse + { + /// + /// 联系人名称 + /// + public string ContactName { get; set; } + + /// + /// 座机 + /// + public string TelePhone { get; set; } + + /// + /// 手机 + /// + public string Mobile { get; set; } + + /// + /// 地址 + /// + public string Address { get; set; } + + /// + /// 买家账号 + /// + public string BuyerAccount { get; set; } + } + +} diff --git a/BBWYB.Server.Model/Dto/Response/Order/OrderCostDetailResponse.cs b/BBWYB.Server.Model/Dto/Response/Order/OrderCostDetailResponse.cs new file mode 100644 index 0000000..2f24ee1 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/Order/OrderCostDetailResponse.cs @@ -0,0 +1,15 @@ +using BBWY.Server.Model.Db; + +namespace BBWY.Server.Model.Dto +{ + public class OrderCostDetailResponse : OrderCostDetail + { + /// + /// 总成本(包含销售运费) + /// + public decimal TotalCost2 + { + get { return TotalCost + DeliveryExpressFreight; } + } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/Order/OrderCostResponse.cs b/BBWYB.Server.Model/Dto/Response/Order/OrderCostResponse.cs new file mode 100644 index 0000000..8a2d31f --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/Order/OrderCostResponse.cs @@ -0,0 +1,9 @@ +using BBWY.Server.Model.Db; + +namespace BBWY.Server.Model.Dto +{ + public class OrderCostResponse : OrderCost + { + + } +} diff --git a/BBWYB.Server.Model/Dto/Response/Order/OrderResponse.cs b/BBWYB.Server.Model/Dto/Response/Order/OrderResponse.cs new file mode 100644 index 0000000..3e1b6e1 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/Order/OrderResponse.cs @@ -0,0 +1,147 @@ +using BBWYB.Server.Model; + +namespace BBWY.Server.Model.Dto +{ + public class OrderResponse + { + public string Id { get; set; } + + /// + /// 商家Id + /// + public string ShopId { get; set; } + + /// + /// 下单时间 + /// + public DateTime StartTime { get; set; } + + /// + /// 结单时间 + /// + public DateTime? EndTime { get; set; } + + /// + /// 修改时间 + /// + public DateTime ModifyTime { get; set; } + + /// + /// 订单平台 + /// + public Enums.Platform Platform { get; set; } + + /// + /// 订单类型 + /// + public Enums.OrderType OrderType { get; set; } + + /// + /// 支付方式 + /// + public Enums.PayType PayType { get; set; } + + /// + /// 订单状态 + /// + public Enums.OrderState OrderState { get; set; } + + /// + /// 订单总价 + /// + public decimal OrderTotalPrice { get; set; } + + /// + /// 订单货款金额 + /// + public decimal OrderSellerPrice { get; set; } + + /// + /// 用户应付金额 + /// + public decimal OrderPayment { get; set; } + + /// + /// 商品运费(用户付) + /// + public decimal FreightPrice { get; set; } + + /// + /// 平台补贴 + /// + public decimal PreferentialAmount { get; set; } + + /// + /// 商家优惠金额 + /// + public decimal SellerPreferentialAmount { get; set; } + + /// + /// 买家备注 + /// + public string BuyerRemark { get; set; } + + /// + /// 商家备注 + /// + public string VenderRemark { get; set; } + + /// + /// 采购备注 + /// + public string PurchaseRemark { get; set; } + + public Enums.StorageType? StorageType { get; set; } + + /// + /// 运单号 + /// + public string WaybillNo { get; set; } + + /// + /// 快递公司名称 + /// + public string ExpressName { get; set; } + + /// + /// 来源Sku + /// + public string SourceSku { get; set; } + + /// + /// 来源店铺名 + /// + public string SourceShopName { get; set; } + + /// + /// 业务端订单号 + /// + public string ClientOrderId { get; set; } + + /// + /// 收货人信息 + /// + public ConsigneeResponse Consignee { get; set; } + + /// + /// 产品信息 + /// + public IList ItemList { get; set; } + + /// + /// 订单成本 + /// + public OrderCostResponse OrderCost { get; set; } + /// + /// 订单成本明细列表 + /// + public IList OrderCostDetailList { get; set; } + } + + public class OrderListResponse + { + public long Count { get; set; } + + public IList Items { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/Order/OrderSkuResponse.cs b/BBWYB.Server.Model/Dto/Response/Order/OrderSkuResponse.cs new file mode 100644 index 0000000..c2198e9 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/Order/OrderSkuResponse.cs @@ -0,0 +1,24 @@ +namespace BBWY.Server.Model.Dto +{ + public class OrderSkuResponse : ProductSkuResponse + { + public string OrderId { get; set; } + + /// + /// 购买数量 + /// + public int ItemTotal { get; set; } + + public string ProductNo { get; set; } + + /// + /// 代发信息Id + /// + public long? OrderDropShippingId { get; set; } + + /// + /// 是否退款 + /// + public bool IsRefund { get; set; } = false; + } +}