Commit 89bcf65e by guanzhenshan

增加同步itemno的广告GMV服务

parent 33eca712
<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" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Bailun.DC.Common\Bailun.DC.Common.csproj" />
</ItemGroup>
</Project>
#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.DailyItemNoAdGMV/Bailun.DC.DailyItemNoAdGMV.csproj", "Bailun.DC.DailyItemNoAdGMV/"]
COPY ["Bailun.DC.Common/Bailun.DC.Common.csproj", "Bailun.DC.Common/"]
RUN dotnet restore "Bailun.DC.DailyItemNoAdGMV/Bailun.DC.DailyItemNoAdGMV.csproj"
COPY . .
WORKDIR "/src/Bailun.DC.DailyItemNoAdGMV"
RUN dotnet build "Bailun.DC.DailyItemNoAdGMV.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Bailun.DC.DailyItemNoAdGMV.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Bailun.DC.DailyItemNoAdGMV.dll"]
using System;
using System.Collections.Generic;
using System.Text;
namespace Bailun.DC.DailyItemNoAdGMV.Models
{
public class dc_exchange_rate
{
public int id { get; set; }
public string init_curreny { get; set; }
public string final_curreny { get; set; }
public decimal exchange_rate { get; set; }
public DateTime record_time { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Bailun.DC.DailyItemNoAdGMV.Models
{
public class mResponse
{
public mResponseResult result { get; set; }
public int StatusCode { get; set; }
public string Message { get; set; }
}
public class mResponseResult
{
public bool isSucceeded { get; set; }
public string message { get; set; }
public List<mResponseData> objData { get; set; }
}
public class mResponseData
{
public string site { get; set; }
public string itemNo { get; set; }
public List<mResponseData_item> saleDatas { get; set; }
}
public class mResponseData_item
{
/// <summary>
/// 售出额(总量)
/// </summary>
public decimal saleAmount { get; set; }
/// <summary>
/// 售出个数(总量)
/// </summary>
public decimal sales { get; set; }
/// <summary>
/// 广告费用(总量)
/// </summary>
public decimal adFees { get; set; }
/// <summary>
/// 售出额货币
/// </summary>
public string saleCurrency { get; set; }
/// <summary>
/// 广告费用货币
/// </summary>
public string adFeeCurrency { get; set; }
/// <summary>
/// 哪一天的销量(平台时间)
/// </summary>
public DateTime saleDate { get; set; }
}
}
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading.Tasks;
namespace Bailun.DC.DailyItemNoAdGMV
{
/// <summary>
/// Item id 的广告GMV
/// </summary>
class Program
{
static async Task Main(string[] args)
{
//Console.WriteLine("获取ItemNo的广告GMV!");
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("2020-10-01");
//while(day.AddDays(1)<DateTime.Now)
//{
// _services.Init(day);
// day = day.AddDays(1);
//}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using MySql.Data.MySqlClient;
using Dapper;
using System.Linq;
using Microsoft.Extensions.Hosting;
using System.Threading;
using System.Threading.Tasks;
namespace Bailun.DC.DailyItemNoAdGMV
{
public class Services : BackgroundService
{
private string url = "http://pps.bailuntec.com/listingapi/EbayPublish/GetEbayAdSale";
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 == 17 && now.Minute == 05)) //16:05启动
{
Console.WriteLine("开始启动 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
var day = DateTime.Parse(now.AddDays(-1).ToShortDateString());
Init(day);
Console.WriteLine("任务运行完成 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public void Init(DateTime day)
{
var result = Bailun.DC.Common.HttpHelper.NetHelper.HttpPostJson(url, JsonConvert.SerializeObject(new {
startDate = day.ToString("yyyy-MM-dd"),
endDate = day.ToString("yyyy-MM-dd")
}));
var json = JsonConvert.DeserializeObject<Models.mResponse>(result);
if(json.StatusCode==200 && json.result.isSucceeded)
{
Save(json.result.objData,day);
}
else
{
Console.WriteLine(json.Message);
System.Threading.Thread.Sleep(1000 * 30); //30秒重启一次
Console.WriteLine(day.ToString("yyyy-MM-dd") + " 重跑服务" + DateTime.Now);
Init(day); //重跑服务
}
}
private void Save(List<Models.mResponseData> list,DateTime day)
{
try
{
var listRate = GetExchangeRate(day);
var total = list.Count;
var index = 1;
var pagesize = 1000;
var str = "";
var sql = "insert dc_daily_itemno_ad_gmv (day,item_id,website,sales_amount,sales_count,ad_fees,sales_currency,sales_rate,ad_currency,ad_rate,sale_date,sale_date_bj) values ";
Console.WriteLine(day.ToString("yyyy-MM-dd") + " 总记录:" + total);
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
cn.Execute("delete from dc_daily_itemno_ad_gmv where day='" + day.ToString("yyyy-MM-dd") + "'");
}
foreach (var item in list)
{
if (item.site.ToLower() == "gb") //英国站点特殊处理,转换为我们的系统的短码
{
item.site = "UK";
}
var timeInterval = GetTimeToUTCInterval(item.site);
var listData = item.saleDatas.Where(a => a.saleAmount > 0 && a.adFees > 0).ToList(); //过滤数据为空的数据
foreach (var c in listData)
{
var objSaleRate = listRate.Where(a => a.init_curreny.ToLower() == c.saleCurrency.ToLower() && a.final_curreny.ToLower() == "cny").FirstOrDefault();
var objAdRate = objSaleRate;
if (c.saleCurrency.ToLower() != c.adFeeCurrency.ToLower())
{
objAdRate = listRate.Where(a => a.init_curreny.ToLower() == c.adFeeCurrency.ToLower() && a.final_curreny.ToLower() == "cny").FirstOrDefault();
}
//销售时间转北京时间
//var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("");
var bjdate = c.saleDate.AddHours(8-timeInterval); //先转UTC时间再转北京时间
str += $"('{day.ToString("yyyy-MM-dd")}','{item.itemNo}','{item.site}',{c.saleAmount},{c.sales},{c.adFees},'{c.saleCurrency}',{(objSaleRate != null ? objSaleRate.exchange_rate : 1)},'{c.adFeeCurrency}',{(objAdRate != null ? objAdRate.exchange_rate : 1)},'{c.saleDate.ToString("yyyy-MM-dd HH:mm:ss")}','{bjdate.ToString("yyyy-MM-dd HH:mm:ss")}'),";
}
//执行插入
if ((index == total || index % pagesize == 0) && !string.IsNullOrEmpty(str))
{
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
cn.Execute(sql + str.Substring(0, str.Length - 1));
Console.WriteLine("保存一次数据,索引:" + index + " ;" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
str = "";
}
index++;
}
}
catch (Exception ex)
{
Console.WriteLine("保存数据异常:" + ex.Message);
}
}
/// <summary>
/// 获取当天汇率
/// </summary>
/// <param name="day"></param>
/// <returns></returns>
private List<Models.dc_exchange_rate> GetExchangeRate(DateTime day)
{
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if(cn.State== System.Data.ConnectionState.Closed)
{
cn.Open();
}
return cn.Query<Models.dc_exchange_rate>("select * from dc_exchange_rate where record_time='" + day.ToString("yyyy-MM-dd")+"'").AsList();
}
}
/// <summary>
/// 站点转UTC的时间差
/// </summary>
/// <param name="website"></param>
/// <returns></returns>
private int GetTimeToUTCInterval(string website)
{
switch(website)
{
case "UK": //英国
return 0;
case "CA": //加拿大和美国取太平洋时间
case "US":
return -5;
case "AU": //澳大利亚
return 10;
case "DE": //德国
case "ES": //西班牙
case "FR": //法国
case "NL": //荷兰
case "SE": //瑞典
case "IT": //意大利
return 1;
case "JP": //日本
return 9;
case "ID": //印度尼西亚
case "MY": //马来西亚
case "PH": //菲律宾
case "SG": //新加坡
case "CN": //中国
return 8;
case "TH": //泰国
return 7;
default:
return 0;
}
}
}
}
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15 # Visual Studio Version 16
VisualStudioVersion = 15.0.28010.0 VisualStudioVersion = 16.0.30621.155
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.Web", "Bailun.DC.Web\Bailun.DC.Web.csproj", "{435067E0-19A0-4616-8109-C17682E89BC3}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.Web", "Bailun.DC.Web\Bailun.DC.Web.csproj", "{435067E0-19A0-4616-8109-C17682E89BC3}"
EndProject EndProject
...@@ -67,7 +67,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.SkuStatistics", " ...@@ -67,7 +67,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.SkuStatistics", "
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.SemiSkuWarehouseSales", "Bailun.DC.SemiSkuWarehouseSales\Bailun.DC.SemiSkuWarehouseSales.csproj", "{39AFD398-27D0-4C3D-98C7-7BDDC7A7BCBA}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.SemiSkuWarehouseSales", "Bailun.DC.SemiSkuWarehouseSales\Bailun.DC.SemiSkuWarehouseSales.csproj", "{39AFD398-27D0-4C3D-98C7-7BDDC7A7BCBA}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bailun.DC.CostFirstMonitoring", "Bailun.DC.CostFirstMonitoring\Bailun.DC.CostFirstMonitoring.csproj", "{2FF9E656-0E88-4A0E-84EC-4FBB26001580}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.CostFirstMonitoring", "Bailun.DC.CostFirstMonitoring\Bailun.DC.CostFirstMonitoring.csproj", "{2FF9E656-0E88-4A0E-84EC-4FBB26001580}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bailun.DC.DailyItemNoAdGMV", "Bailun.DC.DailyItemNoAdGMV\Bailun.DC.DailyItemNoAdGMV.csproj", "{9605282C-81F9-44C6-BADA-D0DFFDE9880B}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
...@@ -203,6 +205,10 @@ Global ...@@ -203,6 +205,10 @@ Global
{2FF9E656-0E88-4A0E-84EC-4FBB26001580}.Debug|Any CPU.Build.0 = Debug|Any CPU {2FF9E656-0E88-4A0E-84EC-4FBB26001580}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2FF9E656-0E88-4A0E-84EC-4FBB26001580}.Release|Any CPU.ActiveCfg = Release|Any CPU {2FF9E656-0E88-4A0E-84EC-4FBB26001580}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2FF9E656-0E88-4A0E-84EC-4FBB26001580}.Release|Any CPU.Build.0 = Release|Any CPU {2FF9E656-0E88-4A0E-84EC-4FBB26001580}.Release|Any CPU.Build.0 = Release|Any CPU
{9605282C-81F9-44C6-BADA-D0DFFDE9880B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9605282C-81F9-44C6-BADA-D0DFFDE9880B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9605282C-81F9-44C6-BADA-D0DFFDE9880B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9605282C-81F9-44C6-BADA-D0DFFDE9880B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
...@@ -234,6 +240,7 @@ Global ...@@ -234,6 +240,7 @@ Global
{08962ABF-57F6-4B3A-B46E-32B57C1BE126} = {AE2CE86A-8538-4142-920F-684DCF47C064} {08962ABF-57F6-4B3A-B46E-32B57C1BE126} = {AE2CE86A-8538-4142-920F-684DCF47C064}
{39AFD398-27D0-4C3D-98C7-7BDDC7A7BCBA} = {AE2CE86A-8538-4142-920F-684DCF47C064} {39AFD398-27D0-4C3D-98C7-7BDDC7A7BCBA} = {AE2CE86A-8538-4142-920F-684DCF47C064}
{2FF9E656-0E88-4A0E-84EC-4FBB26001580} = {AE2CE86A-8538-4142-920F-684DCF47C064} {2FF9E656-0E88-4A0E-84EC-4FBB26001580} = {AE2CE86A-8538-4142-920F-684DCF47C064}
{9605282C-81F9-44C6-BADA-D0DFFDE9880B} = {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