shanji 2 years ago
parent
commit
4d7042b89c
  1. 36
      SBF.API/Controllers/AutoTaskController.cs
  2. 10
      SBF.API/Controllers/TrusteeshipController.cs
  3. 94
      SBF.Business/AutoTaskBusiness.cs
  4. 11
      SBF.Business/TaskSchedulerManager.cs
  5. 38
      SBF.Business/TrusteeshipBusiness.cs
  6. 22
      SBF.Business/VenderBusiness.cs
  7. 192
      SBF.Model/Db/Mds/Shops.cs
  8. 11
      SBF.Model/Db/Trusteeship/Sbf_TrusteeshipTask.cs
  9. 7
      SBF.Model/Dto/Request/TrusteeshipTaskMonitorRequest.cs
  10. 10
      SBF.Model/Dto/Response/TrusteeshipTaskResponse.cs

36
SBF.API/Controllers/AutoTaskController.cs

@ -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);
}
}
}

10
SBF.API/Controllers/TrusteeshipController.cs

@ -56,6 +56,16 @@ namespace SBF.API.Controllers
trusteeshipBusiness.StopTrusteeship(id); trusteeshipBusiness.StopTrusteeship(id);
} }
/// <summary>
/// 删除托管
/// </summary>
/// <param name="id"></param>
[HttpPost("id")]
public void DeleteTrusteehip([FromRoute] long id)
{
trusteeshipBusiness.DeleteTrusteehip(id);
}
/// <summary> /// <summary>
/// 查询托管任务曲线图详情 /// 查询托管任务曲线图详情
/// </summary> /// </summary>

94
SBF.Business/AutoTaskBusiness.cs

@ -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();
});
}
}
}

11
SBF.Business/TaskSchedulerManager.cs

@ -4,18 +4,11 @@ namespace SBF.Business
{ {
public class TaskSchedulerManager public class TaskSchedulerManager
{ {
public LimitedConcurrencyLevelTaskScheduler AggregationSpuGOIScheduler { get; private set; } public LimitedConcurrencyLevelTaskScheduler TaskMonitorScheduler { get; set; }
public LimitedConcurrencyLevelTaskScheduler AggregationCampaignGOIScheduler { get; private set; }
public LimitedConcurrencyLevelTaskScheduler AggregationAdGroupGOIScheduler { get; private set; }
public TaskSchedulerManager() public TaskSchedulerManager()
{ {
AggregationSpuGOIScheduler = new LimitedConcurrencyLevelTaskScheduler(5); TaskMonitorScheduler = new LimitedConcurrencyLevelTaskScheduler(5);
AggregationCampaignGOIScheduler = new LimitedConcurrencyLevelTaskScheduler(5);
AggregationAdGroupGOIScheduler = new LimitedConcurrencyLevelTaskScheduler(5);
} }
} }
} }

38
SBF.Business/TrusteeshipBusiness.cs

@ -63,7 +63,7 @@ namespace SBF.Business
.WhereIf(skuList.Count() > 1, (ads, c, ad) => skuList.Contains(ads.Sku)) .WhereIf(skuList.Count() > 1, (ads, c, ad) => skuList.Contains(ads.Sku))
.WhereIf(skuList.Count() == 1, (ads, c, ad) => ads.Sku == skuList[0]) .WhereIf(skuList.Count() == 1, (ads, c, ad) => ads.Sku == skuList[0])
.Where((ads, c, ad) => !fsql.Select<Sbf_TrusteeshipTask>() .Where((ads, c, ad) => !fsql.Select<Sbf_TrusteeshipTask>()
.Where(s => s.ShopId == request.ShopId && s.CampaignId == ads.CampaignId && s.SkuId == ads.Sku) .Where(s => s.ShopId == request.ShopId && s.CampaignId == ads.CampaignId && s.SkuId == ads.Sku && s.IsEnabled == true)
.Any()) .Any())
.GroupBy((ads, c, ad) => new { ads.BusinessType, ads.CampaignId, c.CampaignName, ads.AdGroupId, ad.AdGroupName, ads.AdId, ads.AdName, ads.Sku }) .GroupBy((ads, c, ad) => new { ads.BusinessType, ads.CampaignId, c.CampaignName, ads.AdGroupId, ad.AdGroupName, ads.AdId, ads.AdName, ads.Sku })
.ToList(g => new SkuJoinPopularizeChannelResponse .ToList(g => new SkuJoinPopularizeChannelResponse
@ -85,8 +85,6 @@ namespace SBF.Business
/// 查询托管任务 /// 查询托管任务
/// </summary> /// </summary>
/// <param name="request"></param> /// <param name="request"></param>
/// <param name="startDateDiffDays"></param>
/// <param name="isContainPopularizeProfit"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="BusinessException"></exception> /// <exception cref="BusinessException"></exception>
public ListResponse<TrusteeshipTaskResponse> QueryTrusteeship(QueryTrusteeshipRequest request) public ListResponse<TrusteeshipTaskResponse> QueryTrusteeship(QueryTrusteeshipRequest request)
@ -97,7 +95,9 @@ namespace SBF.Business
var list = fsql.Select<Sbf_TrusteeshipTask, Product, ProductSku>() var list = fsql.Select<Sbf_TrusteeshipTask, Product, ProductSku>()
.InnerJoin((t, p, ps) => t.SpuId == p.Id) .InnerJoin((t, p, ps) => t.SpuId == p.Id)
.InnerJoin((t, p, ps) => t.SkuId == ps.Id) .InnerJoin((t, p, ps) => t.SkuId == ps.Id)
.Where((t, p, ps) => t.ShopId == request.ShopId && t.BusinessType == request.BusinessType) .Where((t, p, ps) => t.ShopId == request.ShopId &&
t.BusinessType == request.BusinessType &&
t.IsEnabled == true)
.WhereIf(request.Stage != null, (t, p, ps) => p.Stage == request.Stage) .WhereIf(request.Stage != null, (t, p, ps) => p.Stage == request.Stage)
.WhereIf(!string.IsNullOrEmpty(request.Spu), (t, p, ps) => t.SpuId == request.Spu) .WhereIf(!string.IsNullOrEmpty(request.Spu), (t, p, ps) => t.SpuId == request.Spu)
.WhereIf(!string.IsNullOrEmpty(request.Sku), (t, p, ps) => t.SkuId == request.Sku) .WhereIf(!string.IsNullOrEmpty(request.Sku), (t, p, ps) => t.SkuId == request.Sku)
@ -126,10 +126,12 @@ namespace SBF.Business
CampaignId = t.CampaignId, CampaignId = t.CampaignId,
CostInTrusteeship = t.CostInTrusteeship, CostInTrusteeship = t.CostInTrusteeship,
CreateTime = t.CreateTime, CreateTime = t.CreateTime,
UpdateTime = t.UpdateTime,
EndTime = t.EndTime, EndTime = t.EndTime,
IsEnd = t.IsEnd, IsEnd = t.IsEnd,
StartTrusteeshipDate = t.StartTrusteeshipDate, StartTrusteeshipDate = t.StartTrusteeshipDate,
PolicyType = t.PolicyType, PolicyType = t.PolicyType,
IsEnabled = t.IsEnabled,
Logo = ps.Logo, Logo = ps.Logo,
Price = ps.Price, Price = ps.Price,
@ -179,7 +181,7 @@ namespace SBF.Business
{ {
x.Date, x.Date,
x.SkuId, x.SkuId,
x.Cost, //x.Cost,
x.ActualAmount x.ActualAmount
}); });
@ -197,8 +199,7 @@ namespace SBF.Business
foreach (var task in list) foreach (var task in list)
{ {
task.CostByDateList = costList.Where(x => x.SkuId == task.SkuId && task.CostByDateList = costList.Where(x => x.SkuId == task.SkuId &&
x.CampaignId == task.CampaignId && x.CampaignId == task.CampaignId)
x.BusinessType == task.BusinessType)
.OrderBy(x => x.Date) .OrderBy(x => x.Date)
.Select(x => new NumberByDate() .Select(x => new NumberByDate()
{ {
@ -257,7 +258,8 @@ namespace SBF.Business
StartTrusteeshipDate = DateTime.Now.Date.AddDays(1), StartTrusteeshipDate = DateTime.Now.Date.AddDays(1),
ShopId = request.ShopId, ShopId = request.ShopId,
SkuId = x.Sku, SkuId = x.Sku,
PolicyType = Model.Enums.PolicyType. PolicyType = Model.Enums.PolicyType.,
IsEnabled = true
}).ToList(); }).ToList();
var skuIdList = insertList.Select(x => x.SkuId).Distinct().ToList(); var skuIdList = insertList.Select(x => x.SkuId).Distinct().ToList();
@ -277,16 +279,30 @@ namespace SBF.Business
return; return;
fsql.Update<Sbf_TrusteeshipTask>(id).Set(t => t.IsEnd, true) fsql.Update<Sbf_TrusteeshipTask>(id).Set(t => t.IsEnd, true)
.Set(t => t.EndTime, DateTime.Now) .Set(t => t.EndTime, DateTime.Now)
.Set(t => t.UpdateTime, DateTime.Now)
.ExecuteAffrows(); .ExecuteAffrows();
} }
public TrusteeshipTaskResponse GetTrusteeshipTaskCurveResponse(long Id) public void DeleteTrusteehip(long id)
{ {
var task = fsql.Select<Sbf_TrusteeshipTask>(id).ToOne();
if (task == null)
throw new BusinessException("托管任务不存在");
if (task.IsEnabled == false)
return;
fsql.Update<Sbf_TrusteeshipTask>(id).Set(t => t.IsEnabled, false)
.Set(t => t.IsEnd, true)
.Set(t => t.EndTime, DateTime.Now)
.Set(t => t.UpdateTime, DateTime.Now)
.ExecuteAffrows();
}
public TrusteeshipTaskResponse GetTrusteeshipTaskCurveResponse(long Id)
{
var task = fsql.Select<Sbf_TrusteeshipTask, Product, ProductSku>() var task = fsql.Select<Sbf_TrusteeshipTask, Product, ProductSku>()
.InnerJoin((t, p, ps) => t.SpuId == p.Id) .InnerJoin((t, p, ps) => t.SpuId == p.Id)
.InnerJoin((t, p, ps) => t.SkuId == ps.Id) .InnerJoin((t, p, ps) => t.SkuId == ps.Id)
.Where((t, p, ps) => t.Id == Id) .Where((t, p, ps) => t.Id == Id && t.IsEnabled == true)
.OrderByDescending((t, p, ps) => t.CreateTime) .OrderByDescending((t, p, ps) => t.CreateTime)
.ToOne((t, p, ps) => new Sbf_TrusteeshipTask() .ToOne((t, p, ps) => new Sbf_TrusteeshipTask()
{ {
@ -307,10 +323,12 @@ namespace SBF.Business
CampaignId = t.CampaignId, CampaignId = t.CampaignId,
CostInTrusteeship = t.CostInTrusteeship, CostInTrusteeship = t.CostInTrusteeship,
CreateTime = t.CreateTime, CreateTime = t.CreateTime,
UpdateTime = t.UpdateTime,
EndTime = t.EndTime, EndTime = t.EndTime,
IsEnd = t.IsEnd, IsEnd = t.IsEnd,
StartTrusteeshipDate = t.StartTrusteeshipDate, StartTrusteeshipDate = t.StartTrusteeshipDate,
PolicyType = t.PolicyType, PolicyType = t.PolicyType,
IsEnabled = t.IsEnabled,
Logo = ps.Logo, Logo = ps.Logo,
Price = ps.Price, Price = ps.Price,

22
SBF.Business/VenderBusiness.cs

@ -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();
}
}
}

192
SBF.Model/Db/Mds/Shops.cs

@ -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;
}
}

11
SBF.Model/Db/Trusteeship/Sbf_TrusteeshipTask.cs

@ -88,6 +88,12 @@ namespace SBF.Model.Db
[Column(DbType = "datetime")] [Column(DbType = "datetime")]
public DateTime? CreateTime { get; set; } public DateTime? CreateTime { get; set; }
/// <summary>
/// 更新时间
/// </summary>
[Column(DbType = "datetime")]
public DateTime? UpdateTime { get; set; }
/// <summary> /// <summary>
/// 托管结束时间 /// 托管结束时间
/// </summary> /// </summary>
@ -117,6 +123,11 @@ namespace SBF.Model.Db
[Column(MapType = typeof(int?))] [Column(MapType = typeof(int?))]
public Enums.PolicyType? PolicyType { get; set; } = Enums.PolicyType.; public Enums.PolicyType? PolicyType { get; set; } = Enums.PolicyType.;
/// <summary>
/// 是否有效
/// </summary>
public bool? IsEnabled { get; set; } = true;
#region Product #region Product
[Column(IsIgnore = true)] [Column(IsIgnore = true)]
public DateTime? ProductCreateTime { get; set; } public DateTime? ProductCreateTime { get; set; }

7
SBF.Model/Dto/Request/TrusteeshipTaskMonitorRequest.cs

@ -0,0 +1,7 @@
namespace SBF.Model.Dto
{
public class TrusteeshipTaskMonitorRequest
{
public long? ShopId { get; set; }
}
}

10
SBF.Model/Dto/Response/TrusteeshipTaskResponse.cs

@ -100,6 +100,11 @@ namespace SBF.Model.Dto
/// </summary> /// </summary>
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime? UpdateTime { get; set; }
/// <summary> /// <summary>
/// 托管结束时间 /// 托管结束时间
/// </summary> /// </summary>
@ -110,6 +115,11 @@ namespace SBF.Model.Dto
/// </summary> /// </summary>
public bool IsEnd { get; set; } public bool IsEnd { get; set; }
/// <summary>
/// 是否有效
/// </summary>
public bool? IsEnabled { get; set; } = true;
/// <summary> /// <summary>
/// 开始计算托管日期 /// 开始计算托管日期
/// </summary> /// </summary>

Loading…
Cancel
Save