Commit 94db69a2 by guanzhenshan

完善不合理报告

parent 1cd7b30f
...@@ -22,7 +22,7 @@ namespace Bailun.DC.DailyPurchaseSellStock ...@@ -22,7 +22,7 @@ namespace Bailun.DC.DailyPurchaseSellStock
{ {
var _services = new Services(); var _services = new Services();
var start = DateTime.Parse("2020-01-02"); var start = DateTime.Parse("2020-01-05");
_services.Init(start); _services.Init(start);
} }
......
...@@ -15,6 +15,11 @@ namespace Bailun.DC.Models ...@@ -15,6 +15,11 @@ namespace Bailun.DC.Models
public int id { get; set; } public int id { get; set; }
/// <summary> /// <summary>
///
/// </summary>
public int sale_putin_id { get; set; }
/// <summary>
/// 仓库编码 /// 仓库编码
/// </summary> /// </summary>
public string warehouse_code { get; set; } public string warehouse_code { get; set; }
...@@ -99,5 +104,20 @@ namespace Bailun.DC.Models ...@@ -99,5 +104,20 @@ namespace Bailun.DC.Models
/// </summary> /// </summary>
public DateTime createtime { get; set; } public DateTime createtime { get; set; }
/// <summary>
/// 是否清货,1:是,0:否
/// </summary>
public int? is_clear { get; set; }
/// <summary>
/// 是否新品,1:是,0:否
/// </summary>
public int? is_new { get; set; }
/// <summary>
/// 是否aims下单,1:是,0:否
/// </summary>
public int? is_aimsorder { get; set; }
} }
} }
FROM microsoft/dotnet:2.1-runtime AS base
WORKDIR /app
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY Bailun.DC.MonthSalePutin/Bailun.DC.MonthSalePutin.csproj Bailun.DC.MonthSalePutin/
COPY Bailun.DC.Common/Bailun.DC.Common.csproj Bailun.DC.Common/
COPY Bailun.DC.Models/Bailun.DC.Models.csproj Bailun.DC.Models/
RUN dotnet restore Bailun.DC.MonthSalePutin/Bailun.DC.MonthSalePutin.csproj
COPY . .
WORKDIR /src/Bailun.DC.MonthSalePutin
RUN dotnet build Bailun.DC.MonthSalePutin.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish Bailun.DC.MonthSalePutin.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Bailun.DC.MonthSalePutin.dll"]
using System; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading.Tasks;
namespace Bailun.DC.MonthSalePutin namespace Bailun.DC.MonthSalePutin
{ {
class Program class Program
{ {
static void Main(string[] args) static async Task Main(string[] args)
{ {
//Console.WriteLine("Hello World!"); Console.WriteLine("启动服务 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
var builder = new HostBuilder().ConfigureServices((hostContext, services) =>
Services _service = new Services(); {
services.AddHostedService<Services>();
});
_service.Init(DateTime.Parse("2019-12-01")); await builder.RunConsoleAsync();
} }
//static void Main(string[] args)
//{
// //Console.WriteLine("Hello World!");
// Services _service = new Services();
// //_service.Init(DateTime.Parse("2019-12-01"));
// //_service.UnReasonable("2019-12");
// //_service.Analyze("2019-12");
//}
} }
} }
...@@ -5,11 +5,55 @@ using MySql.Data.MySqlClient; ...@@ -5,11 +5,55 @@ using MySql.Data.MySqlClient;
using Dapper; using Dapper;
using Bailun.DC.Common; using Bailun.DC.Common;
using Bailun.DC.Models; using Bailun.DC.Models;
using Microsoft.Extensions.Hosting;
using System.Threading;
using System.Threading.Tasks;
namespace Bailun.DC.MonthSalePutin namespace Bailun.DC.MonthSalePutin
{ {
public class Services public class Services : BackgroundService
{ {
private Timer _timer;
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(1));
return Task.CompletedTask;
}
private void DoWork(object state)
{
try
{
var now = DateTime.Now;
if (now.Day == 1 && now.Hour == 0 && now.Minute == 1) //每个月的1日0点1分启动
{
Console.WriteLine("开始启动 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
var start = DateTime.Parse(now.AddMonths(-1).ToShortDateString());
Init(start);
Console.WriteLine("完成销进比报表生成 "+DateTime.Now);
UnReasonable(start.ToString("yyyy-MM"));
Console.WriteLine(start.ToString("yyyy-MM")+" 完成不合理数据生成 " +DateTime.Now);
Analyze(start.ToString("yyyy-MM"));
Console.WriteLine(start.ToString("yyyy-MM")+ " 完成不合理数据分析 " +DateTime.Now);
Console.WriteLine("任务运行完成 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public void Init(DateTime day) public void Init(DateTime day)
{ {
...@@ -111,7 +155,218 @@ namespace Bailun.DC.MonthSalePutin ...@@ -111,7 +155,218 @@ namespace Bailun.DC.MonthSalePutin
} }
//public void //不合理数据
public void UnReasonable(string month)
{
var sql = "";
var sql_head = "insert dc_mid_month_sale_putin_report (sale_putin_id,count_usable_stock,avg_sevenday_sales,avg_fourteenday_sales,avg_thirtyday_sales,avg_sales,type,createtime) values ";
var str = "";
var total = 0;
//FBA 不合理数据,消耗天数>69 or 30天内没销量
sql = $@"select tb.*,(tb.count_usable_stock/((tb.avg_sevenday_sales+tb.avg_fourteenday_sales+tb.avg_thirtyday_sales)/3)) avg_sales from (
select t1.id as sale_putin_id,if(t3.usable_stock is null,0,t3.usable_stock) count_usable_stock,if(t4.sevenday_average_sales is null,0,t4.sevenday_average_sales) avg_sevenday_sales,if(t4.fourteenday_average_sales is null,0,t4.fourteenday_average_sales) avg_fourteenday_sales,if(t4.thirtyday_average_sales is null,0,thirtyday_average_sales) avg_thirtyday_sales from (select t1.* from dc_mid_month_sale_putin t1
join dc_base_warehouse t2 on t1.warehouse_code=t2.warehouse_code and t2.hq_type='FBA仓'
where t1.`month`='{month}' and t1.warehouse_type='FBA仓'
) t1
left join dc_daily_stock t3 on t1.warehouse_code=t3.warehouse_code and t1.bailun_sku=t3.bailun_sku and t3.record_time='{DateTime.Parse(month+"-1").AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd")}'
left join dc_daily_sales t4 on t1.warehouse_code=t4.warehouse_code and t1.bailun_sku=t4.bailun_sku and t4.record_date='{DateTime.Parse(month + "-1").AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd")}'
) tb
where tb.count_usable_stock/((tb.avg_sevenday_sales+tb.avg_fourteenday_sales+tb.avg_thirtyday_sales)/3)>69 or tb.avg_thirtyday_sales=0";
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
var list = cn.Query<dc_mid_month_sale_putin_report>(sql, null, null, true, 3 * 60).AsList();
cn.Execute($@"delete t1 from dc_mid_month_sale_putin_report t1
join dc_mid_month_sale_putin t2 on t1.sale_putin_id=t2.id and t2.warehouse_type='FBA仓' and t2.`month`='{month}'");
foreach (var item in list)
{
str += $" ({item.sale_putin_id},{item.count_usable_stock},{item.avg_sevenday_sales},{item.avg_fourteenday_sales},{item.avg_thirtyday_sales},{item.avg_sales},1,'{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}'),";
if ((total != 0 && total % 5000 == 0) || (total + 1) == list.Count)
{
if (str.Length > 0)
{
str = str.Substring(0, str.Length - 1);
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
cn.Execute(sql_head + str);
str = "";
}
}
total++;
}
}
//第三方仓不合理数据,消耗天数>45 or 30天内没销量
total = 0;
str = "";
sql = $@"select tb.*,(tb.count_usable_stock/((tb.avg_sevenday_sales+tb.avg_fourteenday_sales+tb.avg_thirtyday_sales)/3)) avg_sales from (
select t1.id as sale_putin_id,if(t3.usable_stock is null,0,t3.usable_stock) count_usable_stock,if(t4.sevenday_average_sales is null,0,t4.sevenday_average_sales) avg_sevenday_sales,if(t4.fourteenday_average_sales is null,0,t4.fourteenday_average_sales) avg_fourteenday_sales,if(t4.thirtyday_average_sales is null,0,thirtyday_average_sales) avg_thirtyday_sales from (select t1.* from dc_mid_month_sale_putin t1
join dc_base_warehouse t2 on t1.warehouse_code=t2.warehouse_code and t2.hq_type='第三方仓库'
where t1.`month`='{month}' and t1.warehouse_type='第三方仓库'
) t1
left join dc_daily_stock t3 on t1.warehouse_code=t3.warehouse_code and t1.bailun_sku=t3.bailun_sku and t3.record_time='{DateTime.Parse(month + "-1").AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd")}'
left join dc_daily_sales t4 on t1.warehouse_code=t4.warehouse_code and t1.bailun_sku=t4.bailun_sku and t4.record_date='{DateTime.Parse(month + "-1").AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd")}'
) tb
where tb.count_usable_stock/((tb.avg_sevenday_sales+tb.avg_fourteenday_sales+tb.avg_thirtyday_sales)/3)>45 or tb.avg_thirtyday_sales=0";
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
var list = cn.Query<dc_mid_month_sale_putin_report>(sql, null, null, true, 3 * 60).AsList();
cn.Execute($@"delete t1 from dc_mid_month_sale_putin_report t1
join dc_mid_month_sale_putin t2 on t1.sale_putin_id=t2.id and t2.warehouse_type='第三方仓库' and t2.`month`='{month}'");
foreach (var item in list)
{
str += $" ({item.sale_putin_id},{item.count_usable_stock},{item.avg_sevenday_sales},{item.avg_fourteenday_sales},{item.avg_thirtyday_sales},{item.avg_sales},1,'{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}'),";
if ((total != 0 && total % 5000 == 0) || (total + 1) == list.Count)
{
if (str.Length > 0)
{
str = str.Substring(0, str.Length - 1);
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
cn.Execute(sql_head + str);
str = "";
}
}
total++;
}
}
//国内仓不合理数据,消耗天数>14 or 30天内没销量
total = 0;
str = "";
sql = $@"select tb.*,(tb.count_usable_stock/((tb.avg_sevenday_sales+tb.avg_fourteenday_sales+tb.avg_thirtyday_sales)/3)) avg_sales from (
select t1.id as sale_putin_id,if(t3.usable_stock is null,0,t3.usable_stock) count_usable_stock,if(t4.sevenday_average_sales is null,0,t4.sevenday_average_sales) avg_sevenday_sales,if(t4.fourteenday_average_sales is null,0,t4.fourteenday_average_sales) avg_fourteenday_sales,if(t4.thirtyday_average_sales is null,0,thirtyday_average_sales) avg_thirtyday_sales from (select t1.* from dc_mid_month_sale_putin t1
join dc_base_warehouse t2 on t1.warehouse_code=t2.warehouse_code and t2.hq_type='国内仓'
where t1.`month`='{month}' and t1.warehouse_type='国内仓'
) t1
left join dc_daily_stock t3 on t1.warehouse_code=t3.warehouse_code and t1.bailun_sku=t3.bailun_sku and t3.record_time='{DateTime.Parse(month + "-1").AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd")}'
left join dc_daily_sales t4 on t1.warehouse_code=t4.warehouse_code and t1.bailun_sku=t4.bailun_sku and t4.record_date='{DateTime.Parse(month + "-1").AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd")}'
) tb
where tb.count_usable_stock/((tb.avg_sevenday_sales+tb.avg_fourteenday_sales+tb.avg_thirtyday_sales)/3)>14 or tb.avg_thirtyday_sales=0";
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
var list = cn.Query<dc_mid_month_sale_putin_report>(sql, null, null, true, 3 * 60).AsList();
cn.Execute($@"delete t1 from dc_mid_month_sale_putin_report t1
join dc_mid_month_sale_putin t2 on t1.sale_putin_id=t2.id and t2.warehouse_type='国内仓' and t2.`month`='{month}'");
foreach (var item in list)
{
str += $" ({item.sale_putin_id},{item.count_usable_stock},{item.avg_sevenday_sales},{item.avg_fourteenday_sales},{item.avg_thirtyday_sales},{item.avg_sales},1,'{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}'),";
if ((total != 0 && total % 5000 == 0) || (total + 1) == list.Count)
{
if (str.Length > 0)
{
str = str.Substring(0, str.Length - 1);
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
cn.Execute(sql_head + str);
str = "";
}
}
total++;
}
}
}
/// <summary>
/// 分析不合理原因,是否清货,是否新品,是否aims下单
/// </summary>
/// <param name="month">月份</param>
public void Analyze(string month)
{
var sql = @"";
//是否清货
sql = $@"select DISTINCT t1.id from dc_mid_month_sale_putin_report t1
join dc_mid_month_sale_putin t2 on t1.sale_putin_id = t2.id
left join dc_base_purchase t3 on t2.bailun_sku=t3.bailun_sku and t2.warehouse_code=t3.warehouse_code and t3.create_time>'{DateTime.Now.AddMonths(-2).ToString("yyyy-MM-dd HH:mm:ss")}'
where t2.`month`='{month}' and t3.create_time is null";
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
var list = cn.Query<int>(sql, null, null, true, 2 * 60).AsList();
cn.Execute("update dc_mid_month_sale_putin_report set is_clear=1 where id in (" + string.Join(",", list) + ")");
}
//是否新品
sql = $@"select t1.id from dc_mid_month_sale_putin_report t1
join dc_mid_month_sale_putin t2 on t1.sale_putin_id = t2.id
left join dc_base_sku t3 on t2.bailun_sku=t3.bailun_sku and t3.create_time>'{DateTime.Now.AddMonths(-2).ToString("yyyy-MM-dd HH:mm:ss")}'
where t2.month='{month}' and t3.create_time is not null";
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
var list = cn.Query<int>(sql, null, null, true, 2 * 60).AsList();
cn.Execute("update dc_mid_month_sale_putin_report set is_new=1 where id in (" + string.Join(",", list) + ")");
}
//是否aims下单
}
} }
} }
...@@ -90,3 +90,10 @@ services: ...@@ -90,3 +90,10 @@ services:
context: . context: .
dockerfile: Bailun.DC.DailyPlatformReceivable/Dockerfile dockerfile: Bailun.DC.DailyPlatformReceivable/Dockerfile
bailun.dc.monthsaleputin:
image: ${DOCKER_REGISTRY}bailundcmonthsaleputin
build:
context: .
dockerfile: Bailun.DC.MonthSalePutin/Dockerfile
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment