10 changed files with 412 additions and 19 deletions
@ -0,0 +1,36 @@ |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using SBF.Business; |
|||
using SBF.Model.Dto; |
|||
|
|||
namespace SBF.API.Controllers |
|||
{ |
|||
|
|||
public class AutoTaskController : BaseApiController |
|||
{ |
|||
private AutoTaskBusiness autoTaskBusiness; |
|||
|
|||
public AutoTaskController(IHttpContextAccessor httpContextAccessor, AutoTaskBusiness autoTaskBusiness) : base(httpContextAccessor) |
|||
{ |
|||
this.autoTaskBusiness = autoTaskBusiness; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 统计全店托管任务
|
|||
/// </summary>
|
|||
[HttpPost] |
|||
public void StartAllShopTrusteeshipTaskStatistics() |
|||
{ |
|||
autoTaskBusiness.StartTrusteeshipTaskStatistics(new TrusteeshipTaskMonitorRequest() { ShopId = null }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 统计指定店铺托管任务
|
|||
/// </summary>
|
|||
/// <param name="request"></param>
|
|||
[HttpPost] |
|||
public void StartTrusteeshipTaskStatistics(TrusteeshipTaskMonitorRequest request) |
|||
{ |
|||
autoTaskBusiness.StartTrusteeshipTaskStatistics(request); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,94 @@ |
|||
using FreeSql; |
|||
using SBF.Common.Log; |
|||
using SBF.Common.Models; |
|||
using SBF.Model.Db; |
|||
using SBF.Model.Dto; |
|||
using SiNan.Business; |
|||
using Yitter.IdGenerator; |
|||
|
|||
namespace SBF.Business |
|||
{ |
|||
public class AutoTaskBusiness : BaseBusiness, IDenpendency |
|||
{ |
|||
private VenderBusiness venderBusiness; |
|||
private TaskSchedulerManager taskSchedulerManager; |
|||
|
|||
public AutoTaskBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, VenderBusiness venderBusiness, TaskSchedulerManager taskSchedulerManager) : base(fsql, nLogManager, idGenerator) |
|||
{ |
|||
this.venderBusiness = venderBusiness; |
|||
this.taskSchedulerManager = taskSchedulerManager; |
|||
} |
|||
|
|||
public void StartTrusteeshipTaskStatistics(TrusteeshipTaskMonitorRequest request) |
|||
{ |
|||
var shopList = venderBusiness.GetShopList(request.ShopId); |
|||
foreach (var shop in shopList) |
|||
{ |
|||
Task.Factory.StartNew(() => TrusteeshipTaskStatistics(long.Parse(shop.ShopId)), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.TaskMonitorScheduler); |
|||
} |
|||
} |
|||
|
|||
private void TrusteeshipTaskStatistics(long shopId) |
|||
{ |
|||
var inTrusteeshipTaskList = fsql.Select<Sbf_TrusteeshipTask>().Where(s => s.ShopId == shopId && s.IsEnd == false && s.IsEnabled == true) |
|||
.ToList(); |
|||
|
|||
if (inTrusteeshipTaskList.Count() == 0) |
|||
return; |
|||
|
|||
var mindate = inTrusteeshipTaskList.Min(s => s.StartTrusteeshipDate); |
|||
var maxdate = DateTime.Now.Date.AddDays(-1); |
|||
|
|||
if (maxdate < mindate) |
|||
return; |
|||
|
|||
var skuIdList = inTrusteeshipTaskList.Select(s => s.SkuId).Distinct().ToList(); |
|||
|
|||
#region 推广花费
|
|||
var adskudailyAggregationList = fsql.Select<AggregationJDPopularizeAdSkuDaily>() |
|||
.Where(x => x.ShopId == shopId && |
|||
x.Date >= mindate && x.Date <= maxdate && |
|||
skuIdList.Contains(x.SkuId)) |
|||
.ToList(x => new |
|||
{ |
|||
x.Date, |
|||
x.SkuId, |
|||
x.CampaignId, |
|||
x.BusinessType, |
|||
x.Cost |
|||
}); |
|||
#endregion
|
|||
|
|||
#region SKU商品营业额
|
|||
var actualAmountList = fsql.Select<AggregationJDPopularizeSkuDaily>() |
|||
.Where(x => x.ShopId == shopId && |
|||
x.Date >= mindate && x.Date <= maxdate && |
|||
skuIdList.Contains(x.SkuId)) |
|||
.ToList(x => new |
|||
{ |
|||
x.Date, |
|||
x.SkuId, |
|||
//x.Cost,
|
|||
x.ActualAmount |
|||
}); |
|||
|
|||
#endregion
|
|||
|
|||
IList<IUpdate<Sbf_TrusteeshipTask>> updateList = new List<IUpdate<Sbf_TrusteeshipTask>>(); |
|||
foreach (var task in inTrusteeshipTaskList) |
|||
{ |
|||
task.CostInTrusteeship = adskudailyAggregationList.Where(x => x.SkuId == task.SkuId && x.CampaignId == task.CampaignId).Sum(x => x.Cost); |
|||
task.ActualAmountInTrusteeship = actualAmountList.Where(x => x.SkuId == task.SkuId).Sum(x => x.ActualAmount); |
|||
var update = fsql.Update<Sbf_TrusteeshipTask>(task.Id).Set(t => t.CostInTrusteeship, task.CostInTrusteeship) |
|||
.Set(t => t.ActualAmountInTrusteeship, task.ActualAmountInTrusteeship); |
|||
updateList.Add(update); |
|||
} |
|||
|
|||
fsql.Transaction(() => |
|||
{ |
|||
foreach (var update in updateList) |
|||
update.ExecuteAffrows(); |
|||
}); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,22 @@ |
|||
using SBF.Common.Models; |
|||
using SBF.Model.Db.Mds; |
|||
|
|||
namespace SBF.Business |
|||
{ |
|||
public class VenderBusiness : IDenpendency |
|||
{ |
|||
private FreeSqlMultiDBManager freeSqlMultiDBManager; |
|||
public VenderBusiness(FreeSqlMultiDBManager freeSqlMultiDBManager) |
|||
{ |
|||
this.freeSqlMultiDBManager = freeSqlMultiDBManager; |
|||
} |
|||
|
|||
public IList<Shops> GetShopList(long? shopId = null) |
|||
{ |
|||
return freeSqlMultiDBManager.MDSfsql.Select<Shops>().Where(s => !string.IsNullOrEmpty(s.ShopId)) |
|||
.WhereIf(shopId != null, s => s.ShopId == shopId.ToString()) |
|||
.Where(s => s.IsEnabled == true) |
|||
.ToList(); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,192 @@ |
|||
using FreeSql.DataAnnotations; |
|||
using System; |
|||
|
|||
namespace SBF.Model.Db.Mds |
|||
{ |
|||
|
|||
[Table(Name = "shops", DisableSyncStructure = true)] |
|||
public partial class Shops |
|||
{ |
|||
|
|||
/// <summary>
|
|||
/// Id
|
|||
/// </summary>
|
|||
[Column(StringLength = 50, IsPrimary = true, IsNullable = false)] |
|||
public string Id { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 店铺Key
|
|||
/// </summary>
|
|||
|
|||
public string AppKey { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 店铺Secret
|
|||
/// </summary>
|
|||
|
|||
public string AppSecret { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 店铺Token
|
|||
/// </summary>
|
|||
|
|||
public string AppToken { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 店铺Key 暂定商品管理Key
|
|||
/// </summary>
|
|||
|
|||
public string AppKey2 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 店铺Secret 暂定商品管理Secret
|
|||
/// </summary>
|
|||
|
|||
public string AppSecret2 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 店铺Token
|
|||
/// </summary>
|
|||
|
|||
public string AppToken2 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 创建时间
|
|||
/// </summary>
|
|||
[Column(DbType = "datetime")] |
|||
public DateTime CreateTime { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 创建人Id
|
|||
/// </summary>
|
|||
[Column(StringLength = 50)] |
|||
public string CreatorId { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 创建人
|
|||
/// </summary>
|
|||
[Column(StringLength = 50, IsNullable = false)] |
|||
public string CreatorRealName { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 0淘宝,1京东,2阿里巴巴
|
|||
/// </summary>
|
|||
|
|||
public int? PlatformId { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 平台名称
|
|||
/// </summary>
|
|||
[Column(StringLength = 50)] |
|||
public string PlatformName { get; set; } |
|||
|
|||
|
|||
public string PurchaseAppKey { get; set; } |
|||
|
|||
|
|||
public string PurchaseAppSecret { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 采购平台
|
|||
/// </summary>
|
|||
[Column(StringLength = 50)] |
|||
public string PurchasePlatformId { get; set; } |
|||
|
|||
|
|||
/// <summary>
|
|||
/// 商家编号
|
|||
/// </summary>
|
|||
public string VenderId { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 店铺ID
|
|||
/// </summary>
|
|||
|
|||
public string ShopId { get; set; } |
|||
|
|||
|
|||
public string ShopName { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 店铺账号
|
|||
/// </summary>
|
|||
|
|||
public string ShopNick { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 店铺类型
|
|||
/// </summary>
|
|||
|
|||
public string ShopType { get; set; } |
|||
|
|||
public string ManagePwd { get; set; } |
|||
|
|||
[Column(DbType = "decimal(11,2)")] |
|||
public decimal? PlatformCommissionRatio { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// SKU库存安全周转天数
|
|||
/// </summary>
|
|||
public int SkuSafeTurnoverDays { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 钉钉WebHook地址
|
|||
/// </summary>
|
|||
[Column(StringLength = 255)] |
|||
public string DingDingWebHook { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 钉钉密钥
|
|||
/// </summary>
|
|||
[Column(StringLength = 100)] |
|||
public string DingDingKey { get; set; } |
|||
|
|||
|
|||
/// <summary>
|
|||
/// 司南策略等级
|
|||
/// </summary>
|
|||
public int SiNanPolicyLevel { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 司南钉钉WebHook地址
|
|||
/// </summary>
|
|||
[Column(StringLength = 255)] |
|||
public string SiNanDingDingWebHook { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 司南钉钉密钥
|
|||
/// </summary>
|
|||
[Column(StringLength = 100)] |
|||
public string SiNanDingDingKey { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// PJZS钉钉WebHook地址
|
|||
/// </summary>
|
|||
[Column(StringLength = 255)] |
|||
public string PJZSDingDingWebHook { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// PJZS钉钉密钥
|
|||
/// </summary>
|
|||
[Column(StringLength = 100)] |
|||
public string PJZSDingDingKey { get; set; } |
|||
|
|||
|
|||
|
|||
/// <summary>
|
|||
/// 齐库钉钉WebHook地址
|
|||
/// </summary>
|
|||
[Column(StringLength = 255)] |
|||
public string QiKuDingDingWebHook { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 齐库钉钉密钥
|
|||
/// </summary>
|
|||
[Column(StringLength = 100)] |
|||
public string QiKuDingDingKey { get; set; } |
|||
|
|||
[Column(DbType = "bit", IsNullable = true)] |
|||
public bool? IsEnabled { get; set; } = true; |
|||
} |
|||
|
|||
} |
@ -0,0 +1,7 @@ |
|||
namespace SBF.Model.Dto |
|||
{ |
|||
public class TrusteeshipTaskMonitorRequest |
|||
{ |
|||
public long? ShopId { get; set; } |
|||
} |
|||
} |
Loading…
Reference in new issue