75 changed files with 3371 additions and 821 deletions
@ -0,0 +1,17 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Text; |
|||
|
|||
namespace BBWY.Client.Models |
|||
{ |
|||
public class CargoParam |
|||
{ |
|||
public string ProductId { get; set; } |
|||
public string SkuId { get; set; } |
|||
public string SpecId { get; set; } |
|||
public int Quantity { get; set; } |
|||
public string BelongSkuId { get; set; } |
|||
|
|||
public long SchemeId { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,56 @@ |
|||
using BBWY.Server.Business; |
|||
using BBWY.Server.Model.Dto; |
|||
using Microsoft.AspNetCore.Http; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
|
|||
namespace BBWY.Server.API.Controllers |
|||
{ |
|||
|
|||
public class OrderEstimateCostSyncController : BaseApiController |
|||
{ |
|||
private OrderEstimateCostSyncBusiness orderEstimateCostSyncBusiness; |
|||
|
|||
public OrderEstimateCostSyncController(IHttpContextAccessor httpContextAccessor, OrderEstimateCostSyncBusiness orderEstimateCostSyncBusiness) : base(httpContextAccessor) |
|||
{ |
|||
this.orderEstimateCostSyncBusiness = orderEstimateCostSyncBusiness; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 同步所有店铺的SKU最近成本
|
|||
/// </summary>
|
|||
[HttpPost] |
|||
public void SyncAllShopOrderSkuRecentCost() |
|||
{ |
|||
orderEstimateCostSyncBusiness.SyncAllShopOrderSkuRecentCost(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 同步指定条件的SKU最近成本
|
|||
/// </summary>
|
|||
/// <param name="request"></param>
|
|||
[HttpPost] |
|||
public void SyncOrderSkuRecentCost([FromBody] SkuRecentCostRequest request) |
|||
{ |
|||
orderEstimateCostSyncBusiness.SyncOrderSkuRecentCost(request); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 为所有店铺没有成本的订单预估成本和毛利
|
|||
/// </summary>
|
|||
[HttpPost] |
|||
public void EstimateCostForAllShopNoCostOrder() |
|||
{ |
|||
orderEstimateCostSyncBusiness.EstimateCostForAllShopNoCostOrder(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 按指定条件预估成本和毛利
|
|||
/// </summary>
|
|||
/// <param name="request"></param>
|
|||
[HttpPost] |
|||
public void EstimateCostForNoCostOrder([FromBody] SkuRecentCostRequest request) |
|||
{ |
|||
orderEstimateCostSyncBusiness.EstimateCostForNoCostOrder(request); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,397 @@ |
|||
using BBWY.Common.Extensions; |
|||
using BBWY.Common.Models; |
|||
using BBWY.Server.Business.Extensions; |
|||
using BBWY.Server.Model; |
|||
using BBWY.Server.Model.Db; |
|||
using BBWY.Server.Model.Dto; |
|||
using FreeSql; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using Yitter.IdGenerator; |
|||
|
|||
namespace BBWY.Server.Business |
|||
{ |
|||
public class OrderEstimateCostSyncBusiness : BaseBusiness, IDenpendency |
|||
{ |
|||
private TaskSchedulerManager taskSchedulerManager; |
|||
private VenderBusiness venderBusiness; |
|||
private List<Enums.OrderState?> invalidOrderStateList; |
|||
public OrderEstimateCostSyncBusiness(IFreeSql fsql, |
|||
NLogManager nLogManager, |
|||
IIdGenerator idGenerator, |
|||
TaskSchedulerManager taskSchedulerManager, |
|||
VenderBusiness venderBusiness) : base(fsql, nLogManager, idGenerator) |
|||
{ |
|||
this.taskSchedulerManager = taskSchedulerManager; |
|||
this.venderBusiness = venderBusiness; |
|||
invalidOrderStateList = new List<Enums.OrderState?>() { |
|||
Enums.OrderState.待付款, |
|||
Enums.OrderState.已取消, |
|||
Enums.OrderState.暂停 |
|||
}; |
|||
} |
|||
|
|||
#region 同步SKU最近成本
|
|||
|
|||
public void SyncAllShopOrderSkuRecentCost() |
|||
{ |
|||
var date = DateTime.Now.Date.AddDays(-1); |
|||
SyncOrderSkuRecentCost(new SkuRecentCostRequest() |
|||
{ |
|||
ShopId = null, |
|||
StartDate = date, |
|||
EndDate = date |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 同步昨天SKU的采购成本
|
|||
/// </summary>
|
|||
/// <param name="request"></param>
|
|||
public void SyncOrderSkuRecentCost(SkuRecentCostRequest request) |
|||
{ |
|||
var shopList = venderBusiness.GetShopList(request.ShopId, Model.Enums.Platform.京东); |
|||
request.EndDate = request.EndDate.Date.AddDays(1).AddSeconds(-1); |
|||
foreach (var shop in shopList) |
|||
{ |
|||
var _shopId = long.Parse(shop.ShopId); |
|||
Task.Factory.StartNew(() => SyncOrderSkuRecentCost(shop, request.StartDate, request.EndDate), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncSkuYesterdayCostTaskScheduler); |
|||
} |
|||
} |
|||
|
|||
private void SyncOrderSkuRecentCost(ShopResponse shop, DateTime startDate, DateTime endDate) |
|||
{ |
|||
try |
|||
{ |
|||
var shopId = long.Parse(shop.ShopId); |
|||
|
|||
|
|||
var yesterdaycostDetailist = fsql.Select<OrderCostDetail, Order>() |
|||
.InnerJoin((ocd, o) => ocd.OrderId == o.Id) |
|||
.Where((ocd, o) => o.ShopId == shopId && |
|||
o.StartTime >= startDate && |
|||
o.StartTime <= endDate && |
|||
!invalidOrderStateList.Contains(o.OrderState) && |
|||
o.IsGift == false && |
|||
o.StorageType != Enums.StorageType.SD && |
|||
ocd.IsEnabled == true && |
|||
ocd.IsEstimateCost == false) |
|||
.GroupBy((ocd, o) => ocd.SkuId) |
|||
.WithTempQuery(g => new { MaxId = g.Max(g.Value.Item1.Id), SkuId = g.Key }) |
|||
.From<OrderCostDetail>() |
|||
.InnerJoin((ocd1, ocd2) => ocd1.MaxId == ocd2.Id) |
|||
.ToList((ocd1, ocd2) => ocd2); |
|||
Console.WriteLine($"SKU最近成本同步-{shop.ShopName},有销量的订单sku一共{yesterdaycostDetailist.Count()}个"); |
|||
if (yesterdaycostDetailist.Count() == 0) |
|||
return; |
|||
|
|||
var skuIdList = yesterdaycostDetailist.Select(ocd => ocd.SkuId).Distinct().ToList(); |
|||
var dbSkuRecentCostList = fsql.Select<SkuRecentCost>(skuIdList).ToList(); |
|||
|
|||
List<SkuRecentCost> insertSkuRecetCostList = new List<SkuRecentCost>(); |
|||
List<IUpdate<SkuRecentCost>> updateSkuRecentCostList = new List<IUpdate<SkuRecentCost>>(); |
|||
foreach (var yesocd in yesterdaycostDetailist) |
|||
{ |
|||
var q = yesocd.DeductionQuantity; |
|||
if (q <= 0) |
|||
q = 1; |
|||
var singleConsumableAmount = yesocd.ConsumableAmount / q; |
|||
var singleDeliveryFreight = yesocd.DeliveryExpressFreight / q; |
|||
var singleFirstFreight = yesocd.FirstFreight / q; |
|||
var singleFreight = yesocd.PurchaseFreight / q; |
|||
var singleInStorageAmount = yesocd.InStorageAmount / q; |
|||
var singleOutStorageAmount = yesocd.OutStorageAmount / q; |
|||
var singleSkuAmount = yesocd.SkuAmount / q; |
|||
//var singleStorageAmount = yesocd.StorageAmount / q;
|
|||
var singlePackagingLaborAmount = yesocd.PackagingLaborAmount / q; |
|||
|
|||
var skuRecentCost = dbSkuRecentCostList.FirstOrDefault(x => x.SkuId == yesocd.SkuId); |
|||
if (skuRecentCost != null) |
|||
{ |
|||
if (skuRecentCost.SingleConsumableAmount != singleConsumableAmount || |
|||
skuRecentCost.SingleDeliveryFreight != singleDeliveryFreight || |
|||
skuRecentCost.SingleFirstFreight != singleFirstFreight || |
|||
skuRecentCost.SingleFreight != singleFreight || |
|||
skuRecentCost.SingleInStorageAmount != singleInStorageAmount || |
|||
skuRecentCost.SingleOutStorageAmount != singleOutStorageAmount || |
|||
skuRecentCost.SingleSkuAmount != singleSkuAmount || |
|||
skuRecentCost.SinglePackagingLaborAmount != singlePackagingLaborAmount) |
|||
//skuRecentCost.SingleStorageAmount != singleStorageAmount)
|
|||
{ |
|||
skuRecentCost.UpdateTime = DateTime.Now; |
|||
var update = fsql.Update<SkuRecentCost>(yesocd.SkuId) |
|||
.SetIf(skuRecentCost.SingleConsumableAmount != singleConsumableAmount, s => s.SingleConsumableAmount, singleConsumableAmount) |
|||
.SetIf(skuRecentCost.SingleDeliveryFreight != singleDeliveryFreight, s => s.SingleDeliveryFreight, singleDeliveryFreight) |
|||
.SetIf(skuRecentCost.SingleFirstFreight != singleFirstFreight, s => s.SingleFirstFreight, singleFirstFreight) |
|||
.SetIf(skuRecentCost.SingleFreight != singleFreight, s => s.SingleFreight, singleFreight) |
|||
.SetIf(skuRecentCost.SingleInStorageAmount != singleInStorageAmount, s => s.SingleInStorageAmount, singleInStorageAmount) |
|||
.SetIf(skuRecentCost.SingleOutStorageAmount != singleOutStorageAmount, s => s.SingleOutStorageAmount, singleOutStorageAmount) |
|||
.SetIf(skuRecentCost.SingleSkuAmount != singleSkuAmount, s => s.SingleSkuAmount, singleSkuAmount) |
|||
//.SetIf(skuRecentCost.SingleStorageAmount != singleStorageAmount, s => s.SingleStorageAmount, singleStorageAmount)
|
|||
.SetIf(skuRecentCost.SinglePackagingLaborAmount != singlePackagingLaborAmount, s => s.SinglePackagingLaborAmount, singlePackagingLaborAmount) |
|||
.Set(s => s.UpdateTime, DateTime.Now); |
|||
updateSkuRecentCostList.Add(update); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
skuRecentCost = new SkuRecentCost() |
|||
{ |
|||
SkuId = yesocd.SkuId, |
|||
CreateTime = DateTime.Now, |
|||
UpdateTime = DateTime.Now, |
|||
ProductId = yesocd.ProductId, |
|||
RecentOrderId = yesocd.OrderId, |
|||
ShopId = shopId, |
|||
SingleConsumableAmount = singleConsumableAmount, |
|||
SingleDeliveryFreight = singleDeliveryFreight, |
|||
SingleFirstFreight = singleFirstFreight, |
|||
SingleFreight = singleFreight, |
|||
SingleInStorageAmount = singleInStorageAmount, |
|||
SingleOutStorageAmount = singleOutStorageAmount, |
|||
SingleSkuAmount = singleSkuAmount, |
|||
SinglePackagingLaborAmount = singlePackagingLaborAmount |
|||
//SingleStorageAmount = singleStorageAmount
|
|||
}; |
|||
insertSkuRecetCostList.Add(skuRecentCost); |
|||
} |
|||
} |
|||
|
|||
if (insertSkuRecetCostList.Count() > 0) |
|||
{ |
|||
var insertList = new List<SkuRecentCost>(); |
|||
var index = 0; |
|||
foreach (var insert in insertSkuRecetCostList) |
|||
{ |
|||
insertList.Add(insert); |
|||
if (insertList.Count() == 50) |
|||
{ |
|||
index++; |
|||
Console.WriteLine($"SKU最近成本同步-{shop.ShopName},执行插入{index}"); |
|||
fsql.Transaction(() => |
|||
{ |
|||
fsql.Insert(insertList).ExecuteAffrows(); |
|||
}); |
|||
insertList.Clear(); |
|||
} |
|||
} |
|||
|
|||
if (insertList.Count() > 0) |
|||
{ |
|||
index++; |
|||
Console.WriteLine($"SKU最近成本同步-{shop.ShopName},执行最后插入{index}"); |
|||
fsql.Transaction(() => |
|||
{ |
|||
fsql.Insert(insertList).ExecuteAffrows(); |
|||
}); |
|||
insertList.Clear(); |
|||
} |
|||
insertSkuRecetCostList.Clear(); |
|||
} |
|||
|
|||
if (updateSkuRecentCostList.Count() > 0) |
|||
{ |
|||
List<IUpdate<SkuRecentCost>> updateList = new List<IUpdate<SkuRecentCost>>(); |
|||
var index = 0; |
|||
foreach (var update in updateSkuRecentCostList) |
|||
{ |
|||
updateList.Add(update); |
|||
if (updateList.Count == 20) |
|||
{ |
|||
index++; |
|||
Console.WriteLine($"SKU最近成本同步-{shop.ShopName},执行更新{index}"); |
|||
fsql.Transaction(() => |
|||
{ |
|||
foreach (var _update in updateList) |
|||
_update.ExecuteAffrows(); |
|||
}); |
|||
updateList.Clear(); |
|||
} |
|||
} |
|||
|
|||
if (updateList.Count > 0) |
|||
{ |
|||
index++; |
|||
Console.WriteLine($"SKU最近成本同步-{shop.ShopName},执行最后更新{index}"); |
|||
fsql.Transaction(() => |
|||
{ |
|||
foreach (var _update in updateList) |
|||
_update.ExecuteAffrows(); |
|||
}); |
|||
updateList.Clear(); |
|||
} |
|||
updateSkuRecentCostList.Clear(); |
|||
} |
|||
|
|||
//fsql.Transaction(() =>
|
|||
//{
|
|||
// if (insertSkuRecetCostList.Count() > 0)
|
|||
// fsql.Insert(insertSkuRecetCostList).ExecuteAffrows();
|
|||
// if (updateSkuRecentCostList.Count() > 0)
|
|||
// {
|
|||
// foreach (var update in updateSkuRecentCostList)
|
|||
// update.ExecuteAffrows();
|
|||
// }
|
|||
//});
|
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
Console.WriteLine($"{shop.ShopName},{ex.Message}"); |
|||
nLogManager.GetLogger($"SKU最近成本-{shop.ShopName}").Error(ex); |
|||
} |
|||
} |
|||
|
|||
#endregion
|
|||
|
|||
#region 预估成本
|
|||
public void EstimateCostForAllShopNoCostOrder() |
|||
{ |
|||
EstimateCostForNoCostOrder(new SkuRecentCostRequest() |
|||
{ |
|||
ShopId = null, |
|||
StartDate = DateTime.Now.AddHours(-3), |
|||
EndDate = DateTime.Now |
|||
}); |
|||
} |
|||
|
|||
public void EstimateCostForNoCostOrder(SkuRecentCostRequest request) |
|||
{ |
|||
var shopList = venderBusiness.GetShopList(request.ShopId, Model.Enums.Platform.京东); |
|||
//request.EndDate = request.EndDate.Date.AddDays(1).AddSeconds(-1);
|
|||
foreach (var shop in shopList) |
|||
{ |
|||
Task.Factory.StartNew(() => EstimateCostForNoCostOrder(shop, request.StartDate, request.EndDate), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncSkuYesterdayCostTaskScheduler); |
|||
} |
|||
} |
|||
|
|||
private void EstimateCostForNoCostOrder(ShopResponse shop, DateTime startTime, DateTime endTime) |
|||
{ |
|||
try |
|||
{ |
|||
var jcycStorageTypeList = new List<Enums.StorageType?>() { Enums.StorageType.京仓, Enums.StorageType.云仓 }; |
|||
var shopId = long.Parse(shop.ShopId); |
|||
var orderList = fsql.Select<Order>().Where(o => o.ShopId == shopId && |
|||
o.ModifyTime >= startTime && |
|||
o.ModifyTime <= endTime && |
|||
!invalidOrderStateList.Contains(o.OrderState) && |
|||
o.IsGift == false && |
|||
(o.StorageType == null || jcycStorageTypeList.Contains(o.StorageType)) && |
|||
!fsql.Select<OrderCost>().Where(oc => oc.OrderId == o.Id).Any()) |
|||
.ToList(); |
|||
Console.WriteLine($"预估成本-{shop.ShopName},符合条件且没有成本的订单一共{orderList.Count()}个"); |
|||
if (orderList.Count() == 0) |
|||
return; |
|||
var orderIdList = orderList.Select(o => o.Id).ToList(); |
|||
|
|||
List<OrderCostDetail> insertOrderCostDetailList = new List<OrderCostDetail>(); |
|||
List<OrderCost> insertOrderCostList = new List<OrderCost>(); |
|||
|
|||
var orderSkuAndRecentList = fsql.Select<OrderSku, SkuRecentCost>() |
|||
.LeftJoin((osku, src) => osku.SkuId == src.SkuId) |
|||
.Where((osku, src) => orderIdList.Contains(osku.OrderId) && osku.Price > 0) |
|||
.ToList((osku, src) => new |
|||
{ |
|||
osku.Id, |
|||
osku.OrderId, |
|||
osku.SkuId, |
|||
osku.ProductId, |
|||
osku.ShouldPay, |
|||
osku.PingTaiChengDanYouHuiQuan, |
|||
osku.SuperRedEnvelope, |
|||
osku.XianPinLeiDongQuan, |
|||
osku.VenderFee, |
|||
osku.JingDou, |
|||
osku.DongQuan, |
|||
osku.Balance, |
|||
osku.ItemTotal, |
|||
src.SingleConsumableAmount, |
|||
src.SingleSkuAmount, |
|||
src.SingleDeliveryFreight, |
|||
src.SingleFirstFreight, |
|||
src.SingleFreight, |
|||
src.SingleInStorageAmount, |
|||
src.SingleOutStorageAmount, |
|||
src.SinglePackagingLaborAmount |
|||
//src.SingleStorageAmount
|
|||
}); |
|||
foreach (var order in orderList) |
|||
{ |
|||
var currentOrderSkuList = orderSkuAndRecentList.Where(osku => osku.OrderId == order.Id).ToList(); |
|||
if (currentOrderSkuList.Any(osku => osku.ShouldPay == null || |
|||
osku.ShouldPay == 0 || |
|||
osku.SingleSkuAmount == null || |
|||
osku.SingleSkuAmount == 0)) |
|||
continue; //预估成本和毛利,必须订单下的每一笔sku都具备最近成本
|
|||
|
|||
List<OrderCostDetail> currentOrderInsertOcdList = new List<OrderCostDetail>(); |
|||
foreach (var osku in currentOrderSkuList) |
|||
{ |
|||
var ocd = new OrderCostDetail() |
|||
{ |
|||
Id = idGenerator.NewLong(), |
|||
ConsumableAmount = (osku.SingleConsumableAmount * osku.ItemTotal) ?? 0M, |
|||
DeductionQuantity = osku.ItemTotal ?? 1, |
|||
CreateTime = DateTime.Now, |
|||
DeliveryExpressFreight = (osku.SingleDeliveryFreight * osku.ItemTotal) ?? 0M, |
|||
FirstFreight = (osku.SingleFirstFreight * osku.ItemTotal) ?? 0M, |
|||
InStorageAmount = (osku.SingleInStorageAmount * osku.ItemTotal) ?? 0M, |
|||
OutStorageAmount = (osku.SingleOutStorageAmount * osku.ItemTotal) ?? 0M, |
|||
OrderId = order.Id, |
|||
ProductId = osku.ProductId, |
|||
PurchaseFreight = (osku.SingleFreight * osku.ItemTotal) ?? 0M, |
|||
PurchaseOrderPKId = 0, |
|||
SkuAmount = (osku.SingleSkuAmount * osku.ItemTotal) ?? 0M, |
|||
SkuId = osku.SkuId, |
|||
//StorageAmount = (osku.SingleStorageAmount * osku.ItemTotal) ?? 0M,
|
|||
PackagingLaborAmount = (osku.SinglePackagingLaborAmount * osku.ItemTotal) ?? 0M, |
|||
IsEnabled = true, |
|||
IsEstimateCost = true |
|||
}; |
|||
ocd.CalculationSkuGrossProfit(osku.ShouldPay ?? 0M, |
|||
osku.PingTaiChengDanYouHuiQuan ?? 0M, |
|||
osku.SuperRedEnvelope ?? 0M, |
|||
osku.XianPinLeiDongQuan ?? 0M, |
|||
osku.VenderFee ?? 0M, |
|||
osku.JingDou ?? 0M, |
|||
osku.DongQuan ?? 0M, |
|||
osku.Balance ?? 0M, |
|||
shop.PlatformCommissionRatio ?? 0.05M); |
|||
currentOrderInsertOcdList.Add(ocd); |
|||
} |
|||
|
|||
var orderCost = new OrderCost() |
|||
{ |
|||
OrderId = order.Id, |
|||
CreateTime = DateTime.Now, |
|||
AfterTotalCost = 0M, |
|||
DeliveryExpressFreight = currentOrderInsertOcdList.Sum(ocd => ocd.DeliveryExpressFreight), |
|||
IsEstimateCost = true, |
|||
IsManualEdited = false, |
|||
PlatformCommissionRatio = shop.PlatformCommissionRatio ?? 0.05M, |
|||
PurchaseAmount = currentOrderInsertOcdList.Sum(ocd => ocd.TotalCost), |
|||
PreferentialAmount = order.PreferentialAmount |
|||
}; |
|||
orderCost.CalculationOrderProfitAndCost(order, null); |
|||
insertOrderCostDetailList.AddRange(currentOrderInsertOcdList); |
|||
insertOrderCostList.Add(orderCost); |
|||
} |
|||
|
|||
fsql.Transaction(() => |
|||
{ |
|||
if (insertOrderCostDetailList.Count() > 0) |
|||
fsql.Insert(insertOrderCostDetailList).ExecuteAffrows(); |
|||
if (insertOrderCostList.Count() > 0) |
|||
fsql.Insert(insertOrderCostList).ExecuteAffrows(); |
|||
}); |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
nLogManager.GetLogger($"预估成本-{shop.ShopName}").Error(ex); |
|||
} |
|||
} |
|||
#endregion
|
|||
} |
|||
} |
@ -0,0 +1,426 @@ |
|||
using FreeSql.DataAnnotations; |
|||
using System; |
|||
|
|||
namespace JDXX.Model.Db |
|||
{ |
|||
[Table(Name = "newskus", DisableSyncStructure = true)] |
|||
public partial class Newskus |
|||
{ |
|||
|
|||
/// <summary>
|
|||
/// Id
|
|||
/// </summary>
|
|||
[Column(StringLength = 50, IsPrimary = true, IsNullable = false)] |
|||
public string Id { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 加购物车数量
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? AddCardCount { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 加购人数
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? AddCardMember { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 加购率
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(11,2)")] |
|||
public decimal? AddCardRate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 点击次数
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? ClickCount { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 点击率
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(11,2)")] |
|||
public decimal? ClickRate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 栏目订单
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? ColumnOrder { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 转化率
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(11,2)")] |
|||
public decimal? ConversionRate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 收费流量
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? CostUv { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 创建时间
|
|||
/// </summary>
|
|||
[Column(DbType = "datetime")] |
|||
public DateTime CreateTime { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 盈亏小节
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? EarningsPrice { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 曝光量
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? Exposure { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 快车点击率
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(11,2)")] |
|||
public decimal? ExposureClickRate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 快车点击
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? ExpressClick { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 快车花费
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? ExpressCost { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 快车展现
|
|||
/// </summary>
|
|||
|
|||
public decimal? ExpressExposure { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 快车订单
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? ExpressOrder { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 快车成交额
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? ExpressPayPrice { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 快车人均点击
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(11,4)")] |
|||
public decimal? ExpressPeopleClick { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 快车访客
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? ExpressUv { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 免费订单
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? FreeOrder { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 免费成交额
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? FreePayPrice { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 免费流量
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? FreeUv { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 首页访客
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? IndexUv { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 是否收藏
|
|||
/// </summary>
|
|||
[Column(DbType = "tinyint")] |
|||
public sbyte? IsStar { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 新品交易榜单
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? NewSaleTopIndex { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 新品人气榜单
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? NewUvTopIndex { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 一级类目
|
|||
/// </summary>
|
|||
[Column(StringLength = 50)] |
|||
public string OneCatId { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 其他订单
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? OtherOrder { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 其他成交额
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? OtherPrice { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 其他访客
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? OtherUv { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 流量路径
|
|||
/// </summary>
|
|||
[Column(StringLength = -2)] |
|||
public string PathList { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 下单商品件数
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? PayItemCount { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 下单客户数
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? PayMember { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 下单数
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? PayOrder { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 下单金额
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? PayPrice { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 下单转化率
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(11,2)")] |
|||
public decimal? PayRate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 毛利
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? Profits { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 流量
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? Pv { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 真实转化率
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(11,2)")] |
|||
public decimal? RealConversionRate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 真实成交额
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? RealPrice { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 成交客户数
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? SaleMember { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 成交金额
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? SalePrice { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 成交转化率
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(11,2)")] |
|||
public decimal? SaleRate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 成交件数
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? Sales { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 交易榜单排名
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? SaleTopIndex { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 风向标
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(11,2)")] |
|||
public decimal? ScoreRank { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 刷单花费
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? SdCost { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 刷单单量
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? SdOrder { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 刷单成交额
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? SdPrice { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 搜索访客
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? SearchUv { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 二级类目
|
|||
/// </summary>
|
|||
[Column(StringLength = 50)] |
|||
public string SecondCatId { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 自主订单
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? SelfOrder { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 店铺ID
|
|||
/// </summary>
|
|||
[Column(StringLength = 50)] |
|||
public string ShopId { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 海投点击
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? ShotgunClick { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 海投点击率
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(11,2)")] |
|||
public decimal? ShotgunClickRate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 海投花费
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? ShotgunCost { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 海投展现
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(11,2)")] |
|||
public decimal? ShotgunExposure { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 海投订单
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? ShotgunOrder { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 海投成交额
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? ShotgunPayPrice { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 海投人均点击
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(11,4)")] |
|||
public decimal? ShotgunPeopleClick { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 海投访客
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? ShotgunUv { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// sku
|
|||
/// </summary>
|
|||
[Column(StringLength = 50)] |
|||
public string Sku { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// Spu
|
|||
/// </summary>
|
|||
[Column(StringLength = 50)] |
|||
public string Spu { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐访客
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? StarUv { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 三级类目
|
|||
/// </summary>
|
|||
[Column(StringLength = 50)] |
|||
public string ThirdCatId { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 总花费
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(19,4)")] |
|||
public decimal? TotalCost { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 访客
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? Uv { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 人气榜单排名
|
|||
/// </summary>
|
|||
[Column(DbType = "int")] |
|||
public int? UvTopIndex { get; set; } |
|||
|
|||
} |
|||
|
|||
} |
@ -0,0 +1,100 @@ |
|||
using FreeSql.DataAnnotations; |
|||
using System; |
|||
|
|||
namespace BBWY.Server.Model.Db |
|||
{ |
|||
|
|||
[Table(Name = "skurecentcost", DisableSyncStructure = true)] |
|||
public partial class SkuRecentCost |
|||
{ |
|||
|
|||
[Column(StringLength = 50, IsPrimary = true, IsNullable = false)] |
|||
public string SkuId { get; set; } |
|||
|
|||
[Column(DbType = "datetime")] |
|||
public DateTime? CreateTime { get; set; } |
|||
|
|||
[Column(StringLength = 50)] |
|||
public string ProductId { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 最近一笔订单来源
|
|||
/// </summary>
|
|||
[Column(StringLength = 50)] |
|||
public string RecentOrderId { get; set; } |
|||
|
|||
[Column(DbType = "bigint")] |
|||
public long? ShopId { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 耗材费(单件)
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(20,2)")] |
|||
public decimal? SingleConsumableAmount { get; set; } = 0.00M; |
|||
|
|||
/// <summary>
|
|||
/// 发货运费(单件)
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(20,2)")] |
|||
public decimal? SingleDeliveryFreight { get; set; } = 0.00M; |
|||
|
|||
/// <summary>
|
|||
/// 头程运费(单件)
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(20,2)")] |
|||
public decimal? SingleFirstFreight { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 采购运费(单件)
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(20,2)")] |
|||
public decimal? SingleFreight { get; set; } = 0.00M; |
|||
|
|||
/// <summary>
|
|||
/// 入仓操作费(单件)
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(20,2)")] |
|||
public decimal? SingleInStorageAmount { get; set; } = 0.00M; |
|||
|
|||
/// <summary>
|
|||
/// 操作费(单件)
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(20,2)")] |
|||
public decimal? SingleOperationAmount { get; set; } = 0.00M; |
|||
|
|||
/// <summary>
|
|||
/// 出仓操作费(单件)
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(20,2)")] |
|||
public decimal? SingleOutStorageAmount { get; set; } = 0.00M; |
|||
|
|||
///// <summary>
|
|||
///// 退货入仓操作费(单件)
|
|||
///// </summary>
|
|||
//[Column(DbType = "decimal(20,2)")]
|
|||
//public decimal? SingleRefundInStorageAmount { get; set; } = 0.00M;
|
|||
|
|||
/// <summary>
|
|||
/// SKU成本(单件)
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(20,2)")] |
|||
public decimal? SingleSkuAmount { get; set; } |
|||
|
|||
///// <summary>
|
|||
///// 仓储费(单件)
|
|||
///// </summary>
|
|||
//[Column(DbType = "decimal(20,2)")]
|
|||
//public decimal? SingleStorageAmount { get; set; } = 0.00M;
|
|||
|
|||
[Column(DbType = "datetime")] |
|||
public DateTime? UpdateTime { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 包装人工单价
|
|||
/// </summary>
|
|||
[Column(DbType = "decimal(20,2)")] |
|||
public decimal SinglePackagingLaborAmount { get; set; } = 0.00M; |
|||
|
|||
} |
|||
|
|||
} |
@ -0,0 +1,15 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Text; |
|||
|
|||
namespace BBWY.Server.Model.Dto |
|||
{ |
|||
public class SkuRecentCostRequest |
|||
{ |
|||
public long? ShopId { get; set; } |
|||
|
|||
public DateTime StartDate { get; set; } |
|||
|
|||
public DateTime EndDate { get; set; } |
|||
} |
|||
} |
Loading…
Reference in new issue