Commit bf52845c by guanzhenshan

增加库存汇总分析计算服务

parent 9ff67102
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.0.78" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.0.0" />
<PackageReference Include="MySql.Data" Version="8.0.18" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Bailun.DC.Common\Bailun.DC.Common.csproj" />
<ProjectReference Include="..\Bailun.DC.Models\Bailun.DC.Models.csproj" />
</ItemGroup>
</Project>
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading.Tasks;
namespace Bailun.DC.DailyInventorySummary
{
class Program
{
/// <summary>
/// 库存汇总分析报表
/// 数据来源于逻辑仓库,逻辑仓库6点启动计算,预计50分钟内跑完数据
/// </summary>
/// <param name="args"></param>
static async Task Main(string[] args)
{
Console.WriteLine("启动服务 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
var builder = new HostBuilder().ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Services>();
});
await builder.RunConsoleAsync();
//var _services = new Services();
//var day = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"));
//_services.Init(day);
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using MySql.Data.MySqlClient;
using Dapper;
using Bailun.DC.Models;
using System.Linq;
using Microsoft.Extensions.Hosting;
using System.Threading;
using System.Threading.Tasks;
namespace Bailun.DC.DailyInventorySummary
{
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.Hour == 8 && now.Minute == 1) //每天8点1分启动
{
Console.WriteLine("开始启动 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
var start = DateTime.Parse(now.AddDays(-1).ToShortDateString());
Init(start);
Console.WriteLine("任务运行完成 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public void Init(DateTime day)
{
//数据来源取自逻辑仓库
var sql = "";
var listWarehouse = new List<string>();
var list = new List<Models.Warehouse.dc_skuwarehouse_stock_sales>();
var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString_read);
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
listWarehouse = cn.Query<string>("select warehouse_code from dc_skuwarehouse_stock_sales where hq_type!='半成品仓' group by warehouse_code").ToList();
var obj = new List<dc_daily_inventory_summary>();
foreach (var item in listWarehouse)
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
sql = $"select warehouse_code,warehouse_name,hq_type,usable_stock,amount_stock,quantity_purchase,purchase_amount,quantity_transfer,amount_transit,oneday_total_sales,amount_onedaysale from dc_skuwarehouse_stock_sales where warehouse_code='{item}';";
list = cn.Query<Models.Warehouse.dc_skuwarehouse_stock_sales>(sql).ToList();
if(list.Count>0)
{
var m = new dc_daily_inventory_summary();
m.warehousecode = list.FirstOrDefault().warehouse_code;
m.warehousename = list.FirstOrDefault().warehouse_name;
m.warehousetype = list.FirstOrDefault().hq_type;
m.createtime = DateTime.Now;
m.day = day;
m.purchase_amount = list.Sum(a => a.purchase_amount??0);
m.quantity_purchase = list.Sum(a => a.quantity_purchase??0);
m.quantity_purchase_product = list.Where(a=>a.quantity_purchase>0).Count();
m.transfer_amount = list.Sum(a => a.amount_transit ?? 0);
m.quantity_transfer = list.Sum(a=>a.quantity_transfer??0);
m.quantity_transfer_product = list.Where(a=>a.quantity_transfer>0).Count();
m.usable_stock = list.Sum(a => a.usable_stock??0);
m.amount_stock = list.Sum(a => a.amount_stock ?? 0);
//日销大于10
m.sale10_count = list.Where(a => a.oneday_total_sales > 10).Sum(a => a.usable_stock ?? 0);
m.sale10_rate = (m.usable_stock > 0?((decimal)m.sale10_count/(decimal)m.usable_stock):0);
m.sale10_amount = list.Where(a => a.oneday_total_sales > 10).Sum(a => a.amount_stock ?? 0);
m.sale10_amount_rate = (m.amount_stock > 0 ? (m.sale10_amount / m.amount_stock) : 0);
//日销5-10
m.sale5_10_count = list.Where(a => a.oneday_total_sales > 5 && a.oneday_total_sales<=10).Sum(a => a.usable_stock ?? 0);
m.sale5_10_rate = (m.usable_stock > 0 ? ((decimal)m.sale5_10_count / (decimal)m.usable_stock) : 0);
m.sale5_10_amount = list.Where(a => a.oneday_total_sales > 5 && a.oneday_total_sales <= 10).Sum(a => a.amount_stock ?? 0);
m.sale5_10_amount_rate = (m.amount_stock > 0 ? (m.sale5_10_amount / m.amount_stock) : 0);
//日销1-5
m.sale1_5_amount = list.Where(a => a.oneday_total_sales > 1 && a.oneday_total_sales <= 5).Sum(a => a.amount_stock ?? 0);
m.sale1_5_amount_rate = (m.amount_stock > 0 ? (m.sale1_5_amount / m.amount_stock) : 0);
//日销 0-1
m.sale1_amount = list.Where(a => a.oneday_total_sales > 0 && a.oneday_total_sales <= 1).Sum(a => a.amount_stock ?? 0);
m.sale1_amount_rate = (m.amount_stock > 0 ? (m.sale1_amount / m.amount_stock) : 0);
//日销为0
m.sale0_amount = list.Where(a => a.oneday_total_sales == 0).Sum(a => a.amount_stock ?? 0);
m.sale0_amount_rate = (m.amount_stock > 0 ? (m.sale0_amount / m.amount_stock) : 0);
obj.Add(m);
}
}
cn.Close();
cn.Dispose();
if(obj.Count>0)
{
using (var cnn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if(cnn.State== System.Data.ConnectionState.Closed)
{
cnn.Open();
}
foreach (var item in obj)
{
cnn.Execute($"delete from dc_daily_inventory_summary where day='{day.ToString("yyyy-MM-dd")}' and warehousecode='{item.warehousecode}'");
sql = $"insert dc_daily_inventory_summary (warehousecode,warehousename,warehousetype,usable_stock,amount_stock,quantity_purchase,purchase_amount,quantity_purchase_product,quantity_transfer,transfer_amount,quantity_transfer_product,sale10_count,sale10_rate,sale10_amount,sale10_amount_rate,sale5_10_count,sale5_10_rate,sale5_10_amount,sale5_10_amount_rate,sale1_5_amount,sale1_5_amount_rate,sale1_amount,sale1_amount_rate,sale0_amount,sale0_amount_rate,day) value ('{item.warehousecode}','{item.warehousename}','{item.warehousetype}',{item.usable_stock},{item.amount_stock},{item.quantity_purchase},{item.purchase_amount},{item.quantity_purchase_product},{item.quantity_transfer},{item.transfer_amount},{item.quantity_transfer_product},{item.sale10_count},{item.sale10_rate},{item.sale10_amount},{item.sale10_amount_rate},{item.sale5_10_count},{item.sale5_10_rate},{item.sale5_10_amount},{item.sale5_10_amount_rate},{item.sale1_5_amount},{item.sale1_5_amount_rate},{item.sale1_amount},{item.sale1_amount_rate},{item.sale0_amount},{item.sale0_amount_rate},'{item.day.ToString("yyyy-MM-dd")}');";
cnn.Execute(sql);
}
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Bailun.DC.Models
{
/// <summary>
/// 库存汇总分析报表
/// </summary>
public class dc_daily_inventory_summary
{
/// <summary>
///
/// </summary>
public int id { get; set; }
/// <summary>
/// 仓库编码
/// </summary>
public string warehousecode { get; set; }
/// <summary>
/// 仓库名称
/// </summary>
public string warehousename { get; set; }
/// <summary>
/// 仓库类型
/// </summary>
public string warehousetype { get; set; }
/// <summary>
/// 库存数
/// </summary>
public int usable_stock { get; set; }
/// <summary>
/// 库存金额
/// </summary>
public decimal amount_stock { get; set; }
/// <summary>
/// 采购在途
/// </summary>
public int quantity_purchase { get; set; }
/// <summary>
/// 采购在途金额
/// </summary>
public decimal purchase_amount { get; set; }
/// <summary>
/// 采购在途产品(种)数
/// </summary>
public int quantity_purchase_product { get; set; }
/// <summary>
/// 调拨在途
/// </summary>
public int quantity_transfer { get; set; }
/// <summary>
/// 调拨在途金额
/// </summary>
public decimal transfer_amount { get; set; }
/// <summary>
/// 调拨在途产品(种)数
/// </summary>
public int quantity_transfer_product { get; set; }
/// <summary>
/// 日销大于10的sku数
/// </summary>
public int sale10_count { get; set; }
/// <summary>
/// 日销大于10的sku占比
/// </summary>
public decimal sale10_rate { get; set; }
/// <summary>
/// 日销大于10的库存金额
/// </summary>
public decimal sale10_amount { get; set; }
/// <summary>
/// 日销大于10的库存金额占比
/// </summary>
public decimal sale10_amount_rate { get; set; }
/// <summary>
/// 日销5-10的sku数
/// </summary>
public int sale5_10_count { get; set; }
/// <summary>
/// 日销5-10的sku占比
/// </summary>
public decimal sale5_10_rate { get; set; }
/// <summary>
/// 日销5-10的库存金额
/// </summary>
public decimal sale5_10_amount { get; set; }
/// <summary>
/// 日销5-10的库存金额占比
/// </summary>
public decimal sale5_10_amount_rate { get; set; }
/// <summary>
/// 日销1-5的库存金额
/// </summary>
public decimal sale1_5_amount { get; set; }
/// <summary>
/// 日销1-5的库存金额占比
/// </summary>
public decimal sale1_5_amount_rate { get; set; }
/// <summary>
/// 日销0-1的库存金额
/// </summary>
public decimal sale1_amount { get; set; }
/// <summary>
/// 日销0-1的库存金额占比
/// </summary>
public decimal sale1_amount_rate { get; set; }
/// <summary>
/// 日销为0的库存金额
/// </summary>
public decimal sale0_amount { get; set; }
/// <summary>
/// 日销为0的库存金额占比
/// </summary>
public decimal sale0_amount_rate { get; set; }
/// <summary>
/// 统计日期
/// </summary>
public DateTime day { get; set; }
/// <summary>
///
/// </summary>
public DateTime createtime { get; set; }
}
}
......@@ -73,7 +73,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.DailyItemNoAdGMV"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.DailyItemNoProfitRate", "Bailun.DC.DailyItemNoProfitRate\Bailun.DC.DailyItemNoProfitRate.csproj", "{0BDF5631-AA7C-4548-84ED-740D861D569E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bailun.DC.BalanceSheet4K", "Bailun.DC.BalanceSheet4K\Bailun.DC.BalanceSheet4K.csproj", "{935E0EAE-B824-4507-9D32-6F7F959B140A}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.BalanceSheet4K", "Bailun.DC.BalanceSheet4K\Bailun.DC.BalanceSheet4K.csproj", "{935E0EAE-B824-4507-9D32-6F7F959B140A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bailun.DC.DailyInventorySummary", "Bailun.DC.DailyInventorySummary\Bailun.DC.DailyInventorySummary.csproj", "{692343B9-C7D6-4F8A-9580-BE048F4E1A40}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
......@@ -221,6 +223,10 @@ Global
{935E0EAE-B824-4507-9D32-6F7F959B140A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{935E0EAE-B824-4507-9D32-6F7F959B140A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{935E0EAE-B824-4507-9D32-6F7F959B140A}.Release|Any CPU.Build.0 = Release|Any CPU
{692343B9-C7D6-4F8A-9580-BE048F4E1A40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{692343B9-C7D6-4F8A-9580-BE048F4E1A40}.Debug|Any CPU.Build.0 = Debug|Any CPU
{692343B9-C7D6-4F8A-9580-BE048F4E1A40}.Release|Any CPU.ActiveCfg = Release|Any CPU
{692343B9-C7D6-4F8A-9580-BE048F4E1A40}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......@@ -255,6 +261,7 @@ Global
{9605282C-81F9-44C6-BADA-D0DFFDE9880B} = {AE2CE86A-8538-4142-920F-684DCF47C064}
{0BDF5631-AA7C-4548-84ED-740D861D569E} = {AE2CE86A-8538-4142-920F-684DCF47C064}
{935E0EAE-B824-4507-9D32-6F7F959B140A} = {AE2CE86A-8538-4142-920F-684DCF47C064}
{692343B9-C7D6-4F8A-9580-BE048F4E1A40} = {AE2CE86A-8538-4142-920F-684DCF47C064}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6E53AF28-A282-4FB0-A769-EAEA9769C02A}
......
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