Commit 257c8820 by guanzhenshan

完成库龄推送逻辑服务的功能

parent 757a038d
......@@ -9,17 +9,17 @@ namespace Bailun.DC.Common
public class GlobalConfig
{
#if DEBUG
public static string ConnectionString = "server=gz-cdb-kp7s5i79.sql.tencentcdb.com;port=61691;database=bailun_datacenter;uid=root;password=#7kfnymAM$Y9-Ntf;";
public static string ConnectionString = "server=gz-cdb-kp7s5i79.sql.tencentcdb.com;port=61691;database=bailun_datacenter;uid=root;password=#7kfnymAM$Y9-Ntf;SslMode=none;";
//public static string ConnectionString_read = "server=gz-cdbrg-qdyec2j3.sql.tencentcdb.com;port=59667;database=bailun_datacenter;uid=root;password=#7kfnymAM$Y9-Ntf;";
public static string ConnectionString_read = "server=gz-cdbrg-qdyec2j3.sql.tencentcdb.com;port=59667;database=bailun_datacenter;uid=root;password=#7kfnymAM$Y9-Ntf;";
public static string ConnectionString_read = "server=gz-cdbrg-qdyec2j3.sql.tencentcdb.com;port=59667;database=bailun_datacenter;uid=root;password=#7kfnymAM$Y9-Ntf;SslMode=none";
/// <summary>
/// sku分类url
/// </summary>
public static string SkumsCategory = "http://api.sku.bailuntec.com/api/BailunCateData/GetAllCategoryList";
#else
public static string ConnectionString = "server=10.0.8.15;port=3306;database=bailun_datacenter;uid=root;password=#7kfnymAM$Y9-Ntf;";
public static string ConnectionString = "server=10.0.8.15;port=3306;database=bailun_datacenter;uid=root;password=#7kfnymAM$Y9-Ntf;SslMode=none";
//public static string ConnectionString_read = "server=10.0.8.21;port=3306;database=bailun_datacenter;uid=root;password=#7kfnymAM$Y9-Ntf;";
public static string ConnectionString_read = "server=10.0.8.21;port=3306;database=bailun_datacenter;uid=root;password=#7kfnymAM$Y9-Ntf;";
public static string ConnectionString_read = "server=10.0.8.21;port=3306;database=bailun_datacenter;uid=root;password=#7kfnymAM$Y9-Ntf;SslMode=none";
/// <summary>
/// sku分类url
/// </summary>
......
......@@ -3,6 +3,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
......@@ -12,6 +13,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Bailun.DC.Common\Bailun.DC.Common.csproj" />
<ProjectReference Include="..\Bailun.DC.Models\Bailun.DC.Models.csproj" />
</ItemGroup>
......
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base
WORKDIR /app
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["Bailun.DC.DailyStockAge/Bailun.DC.DailyStockAge.csproj", "Bailun.DC.DailyStockAge/"]
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.DailyStockAge/Bailun.DC.DailyStockAge.csproj"
COPY . .
WORKDIR "/src/Bailun.DC.DailyStockAge"
RUN dotnet build "Bailun.DC.DailyStockAge.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Bailun.DC.DailyStockAge.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Bailun.DC.DailyStockAge.dll"]
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading.Tasks;
namespace Bailun.DC.DailyStockAge
{
class Program
{
static void Main(string[] args)
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();
}
//static void Main(string[] args)
//{
// var _service = new Services();
// _service.Init(DateTime.Parse("2021-03-16"));
//}
}
}
......@@ -3,28 +3,243 @@ using System.Collections.Generic;
using System.Text;
using MySql.Data.MySqlClient;
using Dapper;
using Bailun.DC.Models;
using Bailun.DC.Models.Stock;
using Bailun.DC.Common;
using Bailun.DC.Models.Purchase;
using Bailun.DC.Models.Allot;
using System.Linq;
using Microsoft.Extensions.Hosting;
using System.Threading;
using System.Threading.Tasks;
namespace Bailun.DC.DailyStockAge
{
public class Services
public class Services : BackgroundService
{
private Timer _timer;
public void Init()
private decimal hl_amount_pay = 0;
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(1));
return Task.CompletedTask;
}
private void DoWork(object state)
{
var now = DateTime.Now;
if (now.Hour == 3 && now.Minute == 5) //每天 3:05分启动
{
Init(DateTime.Parse(now.AddDays(-1).ToString("yyyy-MM-dd")));
}
}
public void Init(DateTime day)
{
Console.WriteLine("开始启动 >>" + DateTime.Now);
var cn_update = new MySqlConnection(Common.GlobalConfig.ConnectionString);
if (cn_update.State == System.Data.ConnectionState.Closed)
{
cn_update.Open();
}
cn_update.Execute("TRUNCATE dc_mid_stock_age;");
public void Aging(string sku,string warehousecode,int stock)
//获取当前的库存记录
var liststock = new List<mSkuStock>();
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString_read))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
var sql = "select * from dc_base_purchase_inbound where bailun_sku='' and warehouse_code=''";
cn.Open();
}
//采购入库
liststock = cn.Query<mSkuStock>("select bailun_sku,warehouse_code,usable_stock from dc_base_stock where usable_stock>0").AsList();
//调拨入库
Console.WriteLine("库存大于0的记录数:"+ liststock.Count+ " >>" + DateTime.Now);
//对比库存和入库数据,记录库龄数据
foreach (var item in liststock)
{
CalculateAging(day, item.bailun_sku, item.warehouse_code, item.usable_stock, cn, cn_update);
Console.WriteLine($"Sku:{item.bailun_sku},WareHouseCode:{item.warehouse_code},Count:{item.usable_stock} >>" + DateTime.Now);
}
Console.WriteLine("服务结束 " + " >>" + DateTime.Now);
}
cn_update.Close();
cn_update.Dispose();
}
public void CalculateAging(DateTime day, string sku, string warehousecode, int stock,MySqlConnection cn,MySqlConnection cn_update)
{
if (stock <= 0) //更新历史的库龄数据为0
{
UpdateHistoryToZero(sku, warehousecode);
}
else
{
//获取当天的入库数,包括非调拨采购入库和调拨入库
var dailyCountPurchasePutIn = 0;
var dailyCountAllotPutIn = 0;
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
dailyCountPurchasePutIn = cn.QueryFirstOrDefault<int?>($"select sum(count) from dc_base_purchase_inbound where bailun_sku='{sku}' and warehouse_code='{warehousecode}' and status=1 and has_transfer=0 and update_time>='{day.ToString("yyyy-MM-dd")}' and update_time<'{day.AddDays(1).ToString("yyyy-MM-dd")}'")??0;
dailyCountPurchasePutIn = cn.QueryFirstOrDefault<int?>($"select sum(t1.count) from dc_base_transfer_complete t1 where t1.deleted=0 and t1.bailun_sku='{sku}' and t1.warehouse_code='{warehousecode}' and t1.create_time>='{day.ToString("yyyy-MM-dd")}' and t1.create_time<'{day.AddDays(1).ToString("yyyy-MM-dd")}'")??0;
if (stock > (dailyCountPurchasePutIn + dailyCountAllotPutIn)) //当前库存大于当天的入库记录
{
//获取历史入库记录数据
//对比当前库存数据更新库龄数据
var listPurchasePutIn = cn.Query<dc_base_purchase_inbound>($"select * from dc_base_purchase_inbound where bailun_sku='{sku}' and warehouse_code='{warehousecode}' and status=1 and has_transfer=0 order by update_time desc").AsList();
var listAllotPutIn = cn.Query<dc_base_transfer_complete>($"select * from dc_base_transfer_complete t1 where t1.deleted=0 and t1.bailun_sku='{sku}' and t1.warehouse_code='{warehousecode}' order by create_time desc").AsList();
if (listPurchasePutIn.Count == 0 && listAllotPutIn.Count == 0) //没有找到入库记录
{
//把库龄都记录到2019-01-01的日期上
if (cn_update.State == System.Data.ConnectionState.Closed)
{
cn_update.Open();
}
cn_update.Execute($"insert dc_mid_stock_age (createtime,warehouse_code,bailun_sku,day,stock,warehouse_name) value ('{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}','{warehousecode}','{sku}','{"2019-01-01"}','{stock}','');");
//var m = new dc_mid_stock_age
//{
// createtime = DateTime.Now,
// warehouse_code = warehousecode,
// bailun_sku = sku,
// day = DateTime.Parse("2019-01-01"),
// stock = stock,
// warehouse_name = "",
//};
}
else
{
var listdate = listPurchasePutIn.Select(a => a.update_time.ToString("yyyy-MM-dd")).ToList();
listdate.AddRange(listAllotPutIn.Select(a => a.create_time.ToString("yyyy-MM-dd")).ToList());
listdate = listdate.Distinct().OrderByDescending(a => a).ToList();
var count = 0;
foreach (var item in listdate)
{
var putinCount = listPurchasePutIn.Where(a => a.update_time.ToString("yyyy-MM-dd") == item)?.Sum(a => a.count)??0;
putinCount += listAllotPutIn.Where(a => a.create_time.ToString("yyyy-MM-dd") == item)?.Sum(a => a.count) ?? 0;
var key = item;
if (item == "0001-01-01")
{
key = "2019-01-01";
}
if ((putinCount + count) <= stock)
{
if (cn_update.State == System.Data.ConnectionState.Closed)
{
cn_update.Open();
}
cn_update.Execute($"insert dc_mid_stock_age (createtime,warehouse_code,bailun_sku,day,stock,warehouse_name) value ('{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}','{warehousecode}','{sku}','{key}','{putinCount}','');");
//var m = new dc_mid_stock_age
//{
// createtime = DateTime.Now,
// warehouse_code = warehousecode,
// bailun_sku = sku,
// day = DateTime.Parse(item),
// stock = putinCount,
// warehouse_name = "",
//};
count += putinCount;
}
else
{
//var m = new dc_mid_stock_age
//{
// createtime = DateTime.Now,
// warehouse_code = warehousecode,
// bailun_sku = sku,
// day = DateTime.Parse(item),
// stock = stock-(putinCount + count),
// warehouse_name = "",
//};
if (cn_update.State == System.Data.ConnectionState.Closed)
{
cn_update.Open();
}
cn_update.Execute($"insert dc_mid_stock_age (createtime,warehouse_code,bailun_sku,day,stock,warehouse_name) value ('{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}','{warehousecode}','{sku}','{key}','{(stock-count)}','');");
count = stock;
break;
}
}
if (count < stock)
{
cn_update.Execute($"insert dc_mid_stock_age (createtime,warehouse_code,bailun_sku,day,stock,warehouse_name) value ('{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}','{warehousecode}','{sku}','{"2019-01-01"}','{(stock-count)}','');");
}
}
}
else
{
//计算差值为今天的库龄数据
//var m = new dc_mid_stock_age {
// createtime = DateTime.Now,
// warehouse_code = warehousecode,
// bailun_sku = sku,
// day = day,
// stock = (dailyCountPurchasePutIn+dailyCountAllotPutIn)-stock,
// warehouse_name = "",
//};
cn_update.Execute($"insert dc_mid_stock_age (createtime,warehouse_code,bailun_sku,day,stock,warehouse_name) value ('{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}','{warehousecode}','{sku}','{day.ToString("yyyy-MM-dd")}','{(stock)}','');");
}
}
}
private string UpdateHistoryToZero(string sku, string warehousecode)
{
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
cn.Execute("update dc_mid_stock_age set stock=0 where bailun_sku='" + sku + "' and warehouse_code='" + warehousecode + "'");
return "";
}
}
}
......
using System;
using System.Collections.Generic;
using System.Text;
namespace Bailun.DC.Models.Allot
{
/// <summary>
/// 调拨完成
/// </summary>
public class dc_base_transfer_complete
{
/// <summary>
///
/// </summary>
public int id { get; set; }
/// <summary>
/// 数据中心创建时间
/// </summary>
public DateTime gmt_create { get; set; }
/// <summary>
/// 数据中心更新时间
/// </summary>
public DateTime gmt_modified { get; set; }
/// <summary>
/// 百伦SKU
/// </summary>
public string bailun_sku { get; set; }
/// <summary>
/// 调拨单号
/// </summary>
public string transfer_order_id { get; set; }
/// <summary>
/// 调拨目的仓库编码
/// </summary>
public string warehouse_code { get; set; }
/// <summary>
/// 调拨目的仓库名称
/// </summary>
public string warehouse_name { get; set; }
/// <summary>
/// 打包状态
/// </summary>
public string status { get; set; }
/// <summary>
/// 调拨系统创建时间
/// </summary>
public DateTime create_time { get; set; }
/// <summary>
/// 调拨数量
/// </summary>
public int count { get; set; }
/// <summary>
/// SKU标题
/// </summary>
public string sku_title { get; set; }
/// <summary>
/// 调拨系统主键
/// </summary>
public int transfer_key { get; set; }
/// <summary>
/// 是否被删除
/// </summary>
public int deleted { get; set; }
/// <summary>
/// 公司Id,0和1是百伦
/// </summary>
public int company_id { get; set; }
/// <summary>
/// 起始仓库
/// </summary>
public string source_warehouse_code { get; set; }
/// <summary>
/// 是否异常
/// </summary>
public int? isexception { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Bailun.DC.Models.Purchase
{
public class dc_base_purchase_inbound
{
/// <summary>
///
/// </summary>
public int id { get; set; }
/// <summary>
///
/// </summary>
public DateTime gmt_create { get; set; }
/// <summary>
///
/// </summary>
public DateTime gmt_modified { get; set; }
/// <summary>
///
/// </summary>
public string bailun_sku { get; set; }
/// <summary>
/// 入库单号
/// </summary>
public string inbound_id { get; set; }
/// <summary>
/// 采购单号
/// </summary>
public string purchase_id { get; set; }
/// <summary>
/// 采购仓库编码
/// </summary>
public string warehouse_code { get; set; }
/// <summary>
/// 采购仓库名称
/// </summary>
public string warehouse_name { get; set; }
/// <summary>
/// 入库状态
/// </summary>
public string status { get; set; }
/// <summary>
/// 采购系统创建时间
/// </summary>
public DateTime create_time { get; set; }
/// <summary>
/// 采购系统更新时间
/// </summary>
public DateTime update_time { get; set; }
/// <summary>
/// 入库数量
/// </summary>
public int count { get; set; }
/// <summary>
///
/// </summary>
public string sku_name { get; set; }
/// <summary>
/// 1是调拨的
/// </summary>
public int has_transfer { get; set; }
/// <summary>
///
/// </summary>
public int parent_id { get; set; }
/// <summary>
/// 公司Id,0和1是百伦
/// </summary>
public int company_id { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Bailun.DC.Models.Stock
{
/// <summary>
/// 实时库存数据
/// </summary>
public class mSkuStock
{
public string bailun_sku { get; set; }
public string warehouse_code { get; set; }
public int usable_stock { get; set; }
}
}
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