Commit 58641cd0 by guanzhenshan

修复月销售利润报表编辑数据保存不对的问题;增加半成品仓进销存的统计服务

parent 40ab3f24
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.0.30" />
<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.DailySemiPurchaseSellStock
{
class Program
{
//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 _services = new Services();
var start = DateTime.Parse("2019-09-01");
while (start.AddDays(1) < DateTime.Now)
{
Console.WriteLine(start);
_services.Init(start);
start = start.AddDays(1);
}
}
}
}
using Bailun.DC.Models;
using Dapper;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Bailun.DC.DailySemiPurchaseSellStock
{
public class Services
{
public void Init(DateTime day, int count = 0)
{
try
{
var sql = "";
var list = new List<dc_semi_daily_purchase_sell_stock>();
var temparr = new List<Tuple<string, string, string>>();
var objPreStock = new List<mStock>();
var objStock = new List<mStock>();
var objPreOnWay = new List<mStock>();
var objOnWay = new List<mStock>();
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString + "Allow User Variables=True;"))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
var page = 1;
var pagesize = 5000;
//昨日库存
sql = $@"select sku_code as bailun_sku,warehouse_id as warehouse_code,warehouse_name,sum(stock_quantity) as count,sum(inventory_amount) as amount from dc_semi_daily_stock where day='{day.AddDays(-1).ToString("yyyy-MM-dd")}' group by sku_code,warehouse_id";
var temp = cn.Query<mStock>(sql + " limit " + (page - 1) * pagesize + "," + pagesize, null, null, true, 2 * 60);
while (temp.Count() > 0)
{
objPreStock.AddRange(temp);
page++;
temp = cn.Query<mStock>(sql + " limit " + (page - 1) * pagesize + "," + pagesize, null, null, true, 2 * 60);
}
Console.WriteLine("昨日库存done," + DateTime.Now);
//在库库存
page = 1;
pagesize = 5000;
sql = $@"select sku_code as bailun_sku,warehouse_id as warehouse_code,warehouse_name,sum(stock_quantity) as count,sum(inventory_amount) as amount from dc_semi_daily_stock where day='{day.ToString("yyyy-MM-dd")}' group by sku_code,warehouse_id";
temp = cn.Query<mStock>(sql + " limit " + (page - 1) * pagesize + "," + pagesize, null, null, true, 2 * 60);
while (temp.Count() > 0)
{
objStock.AddRange(temp);
page++;
temp = cn.Query<mStock>(sql + " limit " + (page - 1) * pagesize + "," + pagesize, null, null, true, 2 * 60);
}
Console.WriteLine("在库库存done," + DateTime.Now);
//昨日在途库存
page = 1;
sql = $@"select sku_code as bailun_sku,warehouse_id as warehouse_code,warehouse_name,sum(transfer_quantity) as count,sum(transfer_quantity*unit_price) as amount from dc_semi_daily_transfer where day='{day.AddDays(-1).ToString("yyyy-MM-dd")}' group by sku_code,warehouse_id";
temp = cn.Query<mStock>(sql + " limit " + (page - 1) * pagesize + "," + pagesize, null, null, true, 2 * 60);
while (temp.Count() > 0)
{
objPreOnWay.AddRange(temp);
page++;
temp = cn.Query<mStock>(sql + " limit " + (page - 1) * pagesize + "," + pagesize, null, null, true, 2 * 60);
}
Console.WriteLine("昨日在途库存done," + DateTime.Now);
//在途库存
page = 1;
sql = $@"select sku_code as bailun_sku,warehouse_id as warehouse_code,warehouse_name,sum(transfer_quantity) as count,sum(transfer_quantity*unit_price) as amount from dc_semi_daily_transfer where day='{day.ToString("yyyy-MM-dd")}' group by sku_code,warehouse_id";
temp = cn.Query<mStock>(sql + " limit " + (page - 1) * pagesize + "," + pagesize, null, null, true, 2 * 60);
while (temp.Count() > 0)
{
objOnWay.AddRange(temp);
page++;
temp = cn.Query<mStock>(sql + " limit " + (page - 1) * pagesize + "," + pagesize, null, null, true, 2 * 60);
}
Console.WriteLine("在途库存done," + DateTime.Now);
temparr.AddRange(objPreStock.Select(p => new Tuple<string, string, string>(p.bailun_sku.ToUpper(), p.warehouse_code.ToUpper(), p.warehouse_name)));
temparr.AddRange(objStock.Select(p => new Tuple<string, string, string>(p.bailun_sku.ToUpper(), p.warehouse_code.ToUpper(), p.warehouse_name)));
temparr.AddRange(objPreOnWay.Select(p => new Tuple<string, string, string>(p.bailun_sku.ToUpper(), p.warehouse_code.ToUpper(), p.warehouse_name)));
temparr.AddRange(objOnWay.Select(p => new Tuple<string, string, string>(p.bailun_sku.ToUpper(), p.warehouse_code.ToUpper(), p.warehouse_name)));
temparr = temparr.Distinct().ToList();
}
foreach (var item in temparr)
{
var m = new dc_semi_daily_purchase_sell_stock()
{
bailun_sku = item.Item1,
warehouse_code = item.Item2,
warehouse_name = item.Item3,
createtime = DateTime.Now,
record_time = day,
end_onway_amount = 0,
end_onway_count = 0,
end_stock_amount = 0,
end_stock_count = 0,
start_onway_amount = 0,
start_onway_count = 0,
start_stock_amount = 0,
start_stock_count = 0,
};
var p = objPreStock.Where(a => a.bailun_sku.ToUpper() == item.Item1 && a.warehouse_code.ToUpper() == item.Item2).FirstOrDefault();
if (p != null)
{
m.start_stock_count = p.count;
m.start_stock_amount = p.amount;
}
p = objStock.Where(a => a.bailun_sku.ToUpper() == item.Item1 && a.warehouse_code.ToUpper() == item.Item2).FirstOrDefault();
if (p != null)
{
m.end_stock_count = p.count;
m.end_stock_amount = p.amount;
}
p = objPreOnWay.Where(a => a.bailun_sku.ToUpper() == item.Item1 && a.warehouse_code.ToUpper() == item.Item2).FirstOrDefault();
if (p != null)
{
m.start_onway_count = p.count;
m.start_onway_amount = p.amount;
}
p = objOnWay.Where(a => a.bailun_sku.ToUpper() == item.Item1 && a.warehouse_code.ToUpper() == item.Item2).FirstOrDefault();
if (p != null)
{
m.end_onway_count = p.count;
m.end_onway_amount = p.amount;
}
list.Add(m);
}
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString + "Allow User Variables=True"))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
cn.Execute($"delete from dc_semi_daily_purchase_sell_stock where record_time='{day.ToString("yyyy-MM-dd")}'", null, null, 2 * 60);
sql = "insert dc_semi_daily_purchase_sell_stock (bailun_sku,warehouse_code,warehouse_name,createtime,record_time,end_onway_amount,end_onway_count,end_stock_amount,end_stock_count,start_onway_amount,start_onway_count,start_stock_amount,start_stock_count) values ";
var resultcount = 0;
while (resultcount < list.Count)
{
var s = "";
var temp1 = list.Skip(resultcount).Take(5000);
foreach (var item in temp1)
{
s += $"('{item.bailun_sku}','{item.warehouse_code}','{item.warehouse_name}','{item.createtime.ToString("yyyy-MM-dd HH:mm:ss")}','{item.record_time.ToString("yyyy-MM-dd")}',{item.end_onway_amount},{item.end_onway_count},{item.end_stock_amount},{item.end_stock_count},{item.start_onway_amount},{item.start_onway_count},{item.start_stock_amount},{item.start_stock_count}),";
}
resultcount += temp1.Count();
Console.WriteLine("保存" + resultcount + "记录," + DateTime.Now);
if (s.Length > 0)
{
cn.Execute(sql + s.Substring(0, s.Length - 1), null, null, 2 * 60);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("出现异常,异常信息:" + ex.Message);
if (count > 2)
{
Init(day, count++);
Console.WriteLine("===============================重跑" + day + "的数据" + DateTime.Now);
}
else
{
Console.WriteLine("出现异常次数大于" + count + "次,服务关闭重跑");
}
}
}
}
class mStock
{
/// <summary>
/// sku编码
/// </summary>
public string bailun_sku { get; set; }
/// <summary>
/// 仓库编码
/// </summary>
public string warehouse_code { get; set; }
/// <summary>
/// 仓库名称
/// </summary>
public string warehouse_name { get; set; }
/// <summary>
/// 数量
/// </summary>
public int count { get; set; }
/// <summary>
/// 金额
/// </summary>
public decimal amount { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Bailun.DC.Models
{
/// <summary>
/// 半成品每日销进比
/// </summary>
public class dc_semi_daily_purchase_sell_stock
{
/// <summary>
///
/// </summary>
public int id { get; set; }
/// <summary>
/// 记录时间
/// </summary>
public DateTime record_time { get; set; }
/// <summary>
/// sku
/// </summary>
public string bailun_sku { get; set; }
/// <summary>
/// Sku名称
/// </summary>
public string sku_title_cn { get; set; }
/// <summary>
/// 仓库编码
/// </summary>
public string warehouse_code { get; set; }
/// <summary>
/// 仓库名称
/// </summary>
public string warehouse_name { get; set; }
/// <summary>
/// 期初库存数
/// </summary>
public int start_stock_count { get; set; }
/// <summary>
/// 期初库存金额
/// </summary>
public decimal start_stock_amount { get; set; }
/// <summary>
/// 期初在途数量
/// </summary>
public int start_onway_count { get; set; }
/// <summary>
/// 期初在途金额
/// </summary>
public decimal start_onway_amount { get; set; }
/// <summary>
/// 期末库存数量
/// </summary>
public int end_stock_count { get; set; }
/// <summary>
/// 期末库存金额
/// </summary>
public decimal end_stock_amount { get; set; }
/// <summary>
/// 期末在途数
/// </summary>
public int end_onway_count { get; set; }
/// <summary>
/// 期末在途金额
/// </summary>
public decimal end_onway_amount { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime createtime { get; set; }
/// <summary>
/// 在库差异数量
/// </summary>
public int? diff_stock_count { get; set; }
/// <summary>
/// 在库差异金额
/// </summary>
public decimal? diff_stock_amount { get; set; }
/// <summary>
/// 在途差异数量
/// </summary>
public int? diff_onway_count { get; set; }
/// <summary>
/// 在途差异金额
/// </summary>
public decimal? diff_onway_amount { get; set; }
/// <summary>
/// 总数量
/// </summary>
public int count { get; set; }
/// <summary>
/// 总金额
/// </summary>
public int amount { get; set; }
}
}
...@@ -3597,6 +3597,8 @@ group by currency"; ...@@ -3597,6 +3597,8 @@ group by currency";
if (m.cost_sale_.HasValue) if (m.cost_sale_.HasValue)
{ {
obj.cost_sale = (obj.cost_sale - obj.cost_sale_) + m.cost_sale_.Value;
obj.cost_sale_ = m.cost_sale_.Value; obj.cost_sale_ = m.cost_sale_.Value;
} }
...@@ -3612,6 +3614,8 @@ group by currency"; ...@@ -3612,6 +3614,8 @@ group by currency";
if (m.ls_head_cost_.HasValue) if (m.ls_head_cost_.HasValue)
{ {
obj.ls_head_cost = (obj.ls_head_cost - obj.ls_head_cost_) + m.ls_head_cost_.Value;
obj.ls_head_cost_ = m.ls_head_cost_.Value; obj.ls_head_cost_ = m.ls_head_cost_.Value;
} }
...@@ -3622,6 +3626,8 @@ group by currency"; ...@@ -3622,6 +3626,8 @@ group by currency";
if (m.ls_tail_cost_.HasValue) if (m.ls_tail_cost_.HasValue)
{ {
obj.ls_tail_cost = (obj.ls_tail_cost - obj.ls_tail_cost_) + m.ls_tail_cost_.Value;
obj.ls_tail_cost_ = m.ls_tail_cost_.Value; obj.ls_tail_cost_ = m.ls_tail_cost_.Value;
} }
...@@ -3667,11 +3673,15 @@ group by currency"; ...@@ -3667,11 +3673,15 @@ group by currency";
if (m.pt_platform_ad_subscribe_fee_.HasValue) if (m.pt_platform_ad_subscribe_fee_.HasValue)
{ {
obj.pt_platform_ad_subscribe_fee = obj.pt_platform_ad_subscribe_fee - obj.pt_platform_ad_subscribe_fee_ + m.pt_platform_ad_subscribe_fee_.Value;
obj.pt_platform_ad_subscribe_fee_ = m.pt_platform_ad_subscribe_fee_.Value; obj.pt_platform_ad_subscribe_fee_ = m.pt_platform_ad_subscribe_fee_.Value;
} }
if (m.pt_platform_logistics_fee_.HasValue) if (m.pt_platform_logistics_fee_.HasValue)
{ {
obj.pt_platform_logistics_fee = obj.pt_platform_logistics_fee - obj.pt_platform_logistics_fee_ + m.pt_platform_logistics_fee_.Value;
obj.pt_platform_logistics_fee_ = m.pt_platform_logistics_fee_.Value; obj.pt_platform_logistics_fee_ = m.pt_platform_logistics_fee_.Value;
} }
...@@ -3681,19 +3691,19 @@ group by currency"; ...@@ -3681,19 +3691,19 @@ group by currency";
} }
//平台扣费及退款=平台费+ebay刊登费+paypal费用+平台物流费+广告及宣传费|订阅费+平台仓储费+退款 //平台扣费及退款=平台费+ebay刊登费+paypal费用+平台物流费+广告及宣传费|订阅费+平台仓储费+退款
obj.pt_count = obj.pt_platformfee + obj.pt_ebay_postingfee + obj.pt_paypal_fee + (obj.pt_platform_logistics_fee + obj.pt_platform_logistics_fee_) + (obj.pt_platform_ad_subscribe_fee + obj.pt_platform_ad_subscribe_fee_) + obj.pt_platform_storage_fee + obj.pt_refund_amount; obj.pt_count = obj.pt_platformfee + obj.pt_ebay_postingfee + obj.pt_paypal_fee + (obj.pt_platform_logistics_fee ) + (obj.pt_platform_ad_subscribe_fee ) + obj.pt_platform_storage_fee + obj.pt_refund_amount;
//回款=销售额-平台扣费及退款 //回款=销售额-平台扣费及退款
obj.pt_incoming = obj.amount_sale - obj.pt_count; obj.pt_incoming = obj.amount_sale - obj.pt_count;
//物流仓储费用=头程运输+尾程物流+海外仓的仓储费+平台操作费 //物流仓储费用=头程运输+尾程物流+海外仓的仓储费+平台操作费
obj.ls_count = (obj.ls_head_cost + obj.ls_head_cost_) + (obj.ls_tail_cost + obj.ls_tail_cost_) + obj.ls_oversea_storage + obj.ls_platform_operation_fee; obj.ls_count = (obj.ls_head_cost) + (obj.ls_tail_cost ) + obj.ls_oversea_storage + obj.ls_platform_operation_fee;
//销售费用合计=平台扣费及退款+物流仓储费用 //销售费用合计=平台扣费及退款+物流仓储费用
obj.sale_fee_count = obj.pt_count + obj.ls_count; obj.sale_fee_count = obj.pt_count + obj.ls_count;
//销售利润=销售额-成本-销售费用合计 //销售利润=销售额-成本-销售费用合计
obj.sale_profit = obj.amount_sale - (obj.cost_sale + obj.cost_sale_) - obj.sale_fee_count; obj.sale_profit = obj.amount_sale - (obj.cost_sale ) - obj.sale_fee_count;
//销售毛利率 = 销售利润/销售额 //销售毛利率 = 销售利润/销售额
obj.sale_profit_rate = obj.sale_profit / obj.amount_sale; obj.sale_profit_rate = obj.sale_profit / obj.amount_sale;
......
...@@ -39,6 +39,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.DailyPurchaseSell ...@@ -39,6 +39,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.DailyPurchaseSell
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bailun.DC.MonthSaleProfit", "Bailun.DC.MonthSaleProfit\Bailun.DC.MonthSaleProfit.csproj", "{85C62851-D6B3-4D6D-B8C5-D02EAA6838B8}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bailun.DC.MonthSaleProfit", "Bailun.DC.MonthSaleProfit\Bailun.DC.MonthSaleProfit.csproj", "{85C62851-D6B3-4D6D-B8C5-D02EAA6838B8}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bailun.DC.DailySemiPurchaseSellStock", "Bailun.DC.DailySemiPurchaseSellStock\Bailun.DC.DailySemiPurchaseSellStock.csproj", "{BA2836C9-40CD-41FE-9BAD-7D897BB62AF8}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
...@@ -113,6 +115,10 @@ Global ...@@ -113,6 +115,10 @@ Global
{85C62851-D6B3-4D6D-B8C5-D02EAA6838B8}.Debug|Any CPU.Build.0 = Debug|Any CPU {85C62851-D6B3-4D6D-B8C5-D02EAA6838B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{85C62851-D6B3-4D6D-B8C5-D02EAA6838B8}.Release|Any CPU.ActiveCfg = Release|Any CPU {85C62851-D6B3-4D6D-B8C5-D02EAA6838B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{85C62851-D6B3-4D6D-B8C5-D02EAA6838B8}.Release|Any CPU.Build.0 = Release|Any CPU {85C62851-D6B3-4D6D-B8C5-D02EAA6838B8}.Release|Any CPU.Build.0 = Release|Any CPU
{BA2836C9-40CD-41FE-9BAD-7D897BB62AF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BA2836C9-40CD-41FE-9BAD-7D897BB62AF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BA2836C9-40CD-41FE-9BAD-7D897BB62AF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BA2836C9-40CD-41FE-9BAD-7D897BB62AF8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
...@@ -129,6 +135,7 @@ Global ...@@ -129,6 +135,7 @@ Global
{8DE8F6DB-679A-4012-B84E-5D317C7388A0} = {AE2CE86A-8538-4142-920F-684DCF47C064} {8DE8F6DB-679A-4012-B84E-5D317C7388A0} = {AE2CE86A-8538-4142-920F-684DCF47C064}
{10552EC1-917C-4A2D-A483-B16E5930D6FA} = {AE2CE86A-8538-4142-920F-684DCF47C064} {10552EC1-917C-4A2D-A483-B16E5930D6FA} = {AE2CE86A-8538-4142-920F-684DCF47C064}
{85C62851-D6B3-4D6D-B8C5-D02EAA6838B8} = {AE2CE86A-8538-4142-920F-684DCF47C064} {85C62851-D6B3-4D6D-B8C5-D02EAA6838B8} = {AE2CE86A-8538-4142-920F-684DCF47C064}
{BA2836C9-40CD-41FE-9BAD-7D897BB62AF8} = {AE2CE86A-8538-4142-920F-684DCF47C064}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6E53AF28-A282-4FB0-A769-EAEA9769C02A} 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