You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

304 lines
15 KiB

using BBWYB.Common.Extensions;
using BBWYB.Common.Http;
2 years ago
using BBWYB.Common.Log;
using BBWYB.Common.Models;
using BBWYB.Server.Model;
using BBWYB.Server.Model.Db;
2 years ago
using BBWYB.Server.Model.Dto;
using FreeSql;
2 years ago
using Newtonsoft.Json;
using SDKAdapter;
using SDKAdapter.OperationPlatform.Client;
using SDKAdapter.OperationPlatform.Models;
2 years ago
using System.Linq.Expressions;
2 years ago
using System.Security.Cryptography;
using Yitter.IdGenerator;
2 years ago
2 years ago
namespace BBWYB.Server.Business
2 years ago
{
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;
2 years ago
}
2 years ago
private ISelect<Order, OrderConsignee, OrderCost> GetOrderListQueryConditions(QueryOrderRequest request)
2 years ago
{
2 years ago
var select = fsql.Select<Order, OrderConsignee, OrderCost>()
.LeftJoin((o, ocs, oct) => o.Id == ocs.OrderId)
.LeftJoin((o, ocs, oct) => o.Id == oct.OrderId);
2 years ago
if (!string.IsNullOrEmpty(request.OrderId))
{
2 years ago
select = select.Where((o, ocs, oct) => o.Id == request.OrderId);
2 years ago
}
else
{
if (!string.IsNullOrEmpty(request.Sku) || !string.IsNullOrEmpty(request.ProductId))
{
var childSelect = fsql.Select<OrderSku>().As("osku")
.WhereIf(!string.IsNullOrEmpty(request.Sku), osku => osku.SkuId == request.Sku)
.WhereIf(!string.IsNullOrEmpty(request.ProductId), osku => osku.ProductId == request.ProductId);
2 years ago
select = select.Where((o, ocs, oct) => childSelect.Where(osku => osku.OrderId == o.Id).Any());
2 years ago
}
2 years ago
if (!string.IsNullOrEmpty(request.PurchaseOrderId))
{
var childSelect = fsql.Select<OrderPurchaseInfo>().As("opi")
.Where(opi => opi.PurchaseOrderId == request.PurchaseOrderId);
select = select.Where((o, ocs, oct) => childSelect.Where(opi => opi.OrderId == o.Id).Any());
}
2 years ago
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)
2 years ago
.WhereIf(!string.IsNullOrEmpty(request.SourceSku), (o, ocs, oct) => o.SourceSku.Contains(request.SourceSku));
2 years ago
}
2 years ago
select = select.WhereIf(request.ShopId != null, (o, ocs, oct) => o.ShopId == request.ShopId);
2 years ago
//select = select.Where((o, ocs, oct) => o.ShopId == searchOrderRequest.ShopId);
return select;
}
2 years ago
private Expression<Func<Order, OrderConsignee, OrderCost, Order>> GetOrderListField()
2 years ago
{
2 years ago
return (o, ocs, oct) => new Order()
2 years ago
{
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,
VenderRemark = o.VenderRemark,
PurchaseRemark = o.PurchaseRemark,
2 years ago
//WaybillNo = o.WaybillNo,
2 years ago
SellerPreferentialAmount = o.SellerPreferentialAmount,
PreferentialAmount = o.PreferentialAmount,
ClientOrderId = o.ClientOrderId,
SourceShopName = o.SourceShopName,
SourceSku = o.SourceSku,
2 years ago
//ExpressName = o.ExpressName,
IsPurchased = o.IsPurchased,
2 years ago
BuyerAccount = o.BuyerAccount,
2 years ago
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,
2 years ago
IsManualEdited = oct.IsManualEdited
2 years ago
};
}
public OrderListResponse GetOrderList(QueryOrderRequest request)
{
2 years ago
if (request.EndDate != null)
request.EndDate = request.EndDate.Value.Date.AddDays(1).AddSeconds(-1);
2 years ago
var select = GetOrderListQueryConditions(request).OrderByDescending((o, ocs, oct) => o.StartTime)
2 years ago
.Count(out var total)
.Page(request.PageIndex, request.PageSize);
2 years ago
var orderSourceList = select.ToList(GetOrderListField());
var orderList = orderSourceList.Map<IList<OrderResponse>>();
var orderIdList = orderList.Select(o => o.Id).ToList();
if (orderList.Count() > 0)
{
#region 处理Sku
var orderSkuList = fsql.Select<OrderSku>().Where(osku => osku.Price != 0 &&
orderIdList.Contains(osku.OrderId)).ToList<OrderSkuResponse>();
foreach (var order in orderList)
{
order.ItemList = orderSkuList.Where(osku => osku.OrderId == order.Id).ToList();
}
#endregion
#region 处理订单成本明细
var orderCostDetailList = fsql.Select<OrderCostDetail>().Where(ocd => orderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true).ToList<OrderCostDetailResponse>();
foreach (var order in orderList)
order.OrderCostDetailList = orderCostDetailList.Where(ocd => ocd.OrderId == order.Id).ToList();
#endregion
2 years ago
#region 处理采购信息
var orderPurchaseInfoList = fsql.Select<OrderPurchaseInfo>().Where(op => orderIdList.Contains(op.OrderId)).ToList<OrderPurchaseInfoResponse>();
var orderPurchaseSkuInfoList = fsql.Select<OrderPurchaseSkuInfo>().Where(o => orderIdList.Contains(o.OrderId)).ToList();
2 years ago
foreach (var order in orderList)
{
2 years ago
order.OrderPurchaseInfoList = orderPurchaseInfoList.Where(op => op.OrderId == order.Id).ToList();
foreach (var purchaseOrder in order.OrderPurchaseInfoList)
{
purchaseOrder.ExpressState = orderPurchaseSkuInfoList.FirstOrDefault(x => !string.IsNullOrEmpty(x.ExpressState) &&
x.PurchaseOrderId == purchaseOrder.PurchaseOrderId)?.ExpressState;
}
}
2 years ago
#endregion
2 years ago
}
2 years ago
return new OrderListResponse()
{
2 years ago
Count = total,
Items = orderList
2 years ago
};
}
public void OutStock(OutStockRequest request)
{
var dbOrder = fsql.Select<Order>(request.OrderId).ToOne();
if (dbOrder == null)
throw new BusinessException($"订单{request.OrderId}不存在");
2 years ago
//if (dbOrder.OrderState != Enums.OrderState.待出库)
// throw new BusinessException($"订单{request.OrderId} 只有在待出库时才允许出库");
if (!string.IsNullOrEmpty(request.TargetExpressId))
{
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)}");
}
}
fsql.Transaction(() =>
{
fsql.Update<OrderPurchaseInfo>().Where(opi => opi.PurchaseOrderId == request.PurchaseOrderId)
.Set(opi => opi.WaybillNo, request.WayBillNo)
.Set(opi => opi.SourceExpressId, request.SourceExpressId)
.Set(opi => opi.SourceExpressName, request.SourceExpressName)
.Set(opi => opi.TargetExpressId, request.TargetExpressId)
.Set(opi => opi.TargetExpressName, request.TargetExpressName)
.ExecuteAffrows();
if (dbOrder.OrderState == Enums.OrderState.)
fsql.Update<Order>(request.OrderId).Set(o => o.OrderState, Enums.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<Order>(request.OrderId).Set(o => o.OrderState, Enums.OrderState.).ExecuteAffrows();
var sql = $"update purchaseorderv2 set OrderState=7 where Id='{request.OrderId}'";
//取消C端采购单
restApiService.SendRequest("https://bbwy.qiyue666.com",
"/Api/Sql/ExecuteNonQuery",
new { sql = sql.AESEncrypt() },
new Dictionary<string, string>() { { "Authorization", $"{mdsToken}" } },
HttpMethod.Post);
}
2 years ago
public void EditPrice(OP_EditPriceRequest request)
{
var client = opPlatformClientFactory.GetClient((AdapterEnums.PlatformType)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<OrderCost>(request.OrderId).ToOne();
//orderCost.Profit = dbOrder.OrderTotalPrice -
// orderCost.PurchaseAmount -
// orderCost.DeliveryExpressFreight; // -orderCost.PlatformCommissionAmount
IList<IUpdate<OrderSku>> updates_orderSku = new List<IUpdate<OrderSku>>();
foreach (var orderSku in order.OrderSkuList)
{
updates_orderSku.Add(fsql.Update<OrderSku>(orderSku.Id).Set(osku => osku.Price, orderSku.SkuPrice));
}
fsql.Transaction(() =>
{
fsql.Update<Order>(request.OrderId).Set(o => o.OrderTotalPrice, order.OrderTotalAmount)
.Set(o => o.OrderSellerPrice, order.OrderProductAmount)
.Set(o => o.FreightPrice, order.FreightAmount)
.ExecuteAffrows();
if (orderCost != null)
fsql.Update<OrderCost>(request.OrderId).Set(oc => oc.Profit, order.OrderTotalAmount - orderCost.PurchaseAmount - orderCost.DeliveryExpressFreight)
.ExecuteAffrows();
if (updates_orderSku.Count() > 0)
{
foreach (var update in updates_orderSku)
update.ExecuteAffrows();
}
});
#region 通知C端
2 years ago
restApiService.SendRequest("https://bbwy.qiyue666.com",
"/Api/PurchaseOrder/QuanTanEditPriceCallback",
new { orderId = request.OrderId },
null,
HttpMethod.Post);
2 years ago
#endregion
}
2 years ago
}
}