Commit 075f7de0 by 泽锋 李

fix

parent 359d6348
...@@ -9,5 +9,6 @@ ...@@ -9,5 +9,6 @@
"CdnUrl": "http://imgcache.bailuntec.com" "CdnUrl": "http://imgcache.bailuntec.com"
}, },
"QiYeJiQiRen": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5fa4c1d5-ce65-4e8a-9ae9-a0d689a13b65", "QiYeJiQiRen": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5fa4c1d5-ce65-4e8a-9ae9-a0d689a13b65",
"GetSchedulings": "http://oa.bailuntec.com/Api/Cq/GetSchedulings?userID=1922" "GetSchedulings": "http://oa.bailuntec.com/Api/Cq/GetSchedulings?userID=1922",
"postaveragesales": "http://doc.bailuntec.com:6032/postaveragesales"
} }
...@@ -9,5 +9,6 @@ ...@@ -9,5 +9,6 @@
"CdnUrl": "http://imgcache.bailuntec.com" "CdnUrl": "http://imgcache.bailuntec.com"
}, },
"QiYeJiQiRen": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5fa4c1d5-ce65-4e8a-9ae9-a0d689a13b65", "QiYeJiQiRen": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5fa4c1d5-ce65-4e8a-9ae9-a0d689a13b65",
"GetSchedulings": "http://oa.bailuntec.com/Api/Cq/GetSchedulings?userID=1922" "GetSchedulings": "http://oa.bailuntec.com/Api/Cq/GetSchedulings?userID=1922",
"postaveragesales": "http://10.0.6.27/pds/PdsOpenApi/postaveragesales"
} }
...@@ -9,5 +9,6 @@ ...@@ -9,5 +9,6 @@
"CdnUrl": "http://imgcache.bailuntec.com" "CdnUrl": "http://imgcache.bailuntec.com"
}, },
"QiYeJiQiRen": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5fa4c1d5-ce65-4e8a-9ae9-a0d689a13b65", "QiYeJiQiRen": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5fa4c1d5-ce65-4e8a-9ae9-a0d689a13b65",
"GetSchedulings": "http://oa.bailuntec.com/Api/Cq/GetSchedulings?userID=1922" "GetSchedulings": "http://oa.bailuntec.com/Api/Cq/GetSchedulings?userID=1922",
"postaveragesales": "http://10.0.6.27/pds/PdsOpenApi/postaveragesales"
} }
\ No newline at end of file
...@@ -5,6 +5,7 @@ using System.Text; ...@@ -5,6 +5,7 @@ using System.Text;
using Dapper; using Dapper;
using System.Linq; using System.Linq;
using AutoTurnOver.Utility; using AutoTurnOver.Utility;
using AutoTurnOver.Models.ApiDto;
namespace AutoTurnOver.DB namespace AutoTurnOver.DB
{ {
...@@ -96,8 +97,8 @@ namespace AutoTurnOver.DB ...@@ -96,8 +97,8 @@ namespace AutoTurnOver.DB
} }
// 匹配规则 // 匹配规则
var item_rule = rule_list.FirstOrDefault(s => s.source == itemGroup.Max(v => v.source) var item_rule = rule_list.FirstOrDefault(s => s.source == itemGroup.Max(v => v.source)
&& s.warehouse_type.Split(',').Any(sp=>sp.Equals(item_warehouse.hq_type, StringComparison.CurrentCultureIgnoreCase)) && s.warehouse_type.Split(',').Any(sp => sp.Equals(item_warehouse.hq_type, StringComparison.CurrentCultureIgnoreCase))
&& (s.brand == "0" || s.brand.Split(',').Any(sp=>sp.Equals(itemGroup.Max(v => v.brand), StringComparison.CurrentCultureIgnoreCase))) && (s.brand == "0" || s.brand.Split(',').Any(sp => sp.Equals(itemGroup.Max(v => v.brand), StringComparison.CurrentCultureIgnoreCase)))
&& s.source == itemGroup.Max(v => v.source) && s.source == itemGroup.Max(v => v.source)
); );
if (item_rule == null) if (item_rule == null)
...@@ -110,17 +111,17 @@ namespace AutoTurnOver.DB ...@@ -110,17 +111,17 @@ namespace AutoTurnOver.DB
List<auto_first_order_detailed_dto> data_detailed_list = new List<auto_first_order_detailed_dto>(); List<auto_first_order_detailed_dto> data_detailed_list = new List<auto_first_order_detailed_dto>();
if (item_rule.lower_limit_sku_count > 0 && itemGroup.Count() > item_rule.lower_limit_sku_count) //if (item_rule.lower_limit_sku_count > 0 && itemGroup.Count() > item_rule.lower_limit_sku_count)
{ //{
remarks.AppendLine($" sku数量不应该超过 {item_rule.lower_limit_sku_count} 个 "); // remarks.AppendLine($" sku数量不应该超过 {item_rule.lower_limit_sku_count} 个 ");
throw new Exception($" sku数量不应该超过 {item_rule.lower_limit_sku_count} 个 "); // throw new Exception($" sku数量不应该超过 {item_rule.lower_limit_sku_count} 个 ");
} //}
if (item_rule.lower_limit_sales > 0 && itemGroup.Max(v => v.product_sales) < item_rule.lower_limit_sales) //if (item_rule.lower_limit_sales > 0 && itemGroup.Max(v => v.product_sales) < item_rule.lower_limit_sales)
{ //{
remarks.AppendLine($" 商品日均不应该低于 {item_rule.lower_limit_sales} 个 "); // remarks.AppendLine($" 商品日均不应该低于 {item_rule.lower_limit_sales} 个 ");
throw new Exception($" 商品日均不应该低于 {item_rule.lower_limit_sales} 个 "); // throw new Exception($" 商品日均不应该低于 {item_rule.lower_limit_sales} 个 ");
} //}
int? max_delivery = null; int? max_delivery = null;
...@@ -136,7 +137,8 @@ namespace AutoTurnOver.DB ...@@ -136,7 +137,8 @@ namespace AutoTurnOver.DB
data_detailed_list.Add(new auto_first_order_detailed_dto data_detailed_list.Add(new auto_first_order_detailed_dto
{ {
bailun_sku = item.bailun_sku, bailun_sku = item.bailun_sku,
quantity = single_sku_count quantity = single_sku_count,
remarks = new StringBuilder()
}); });
} }
...@@ -175,78 +177,123 @@ namespace AutoTurnOver.DB ...@@ -175,78 +177,123 @@ namespace AutoTurnOver.DB
} }
} }
} }
foreach (var item in data_detailed_list)
{
item.remarks.Append(remarks);
}
} }
else // 下一个供应链长度 else // 下一个供应链长度
{ {
remarks.AppendLine($"根据供应链长度下单模式"); remarks.AppendLine($"根据供应链长度下单模式");
// 查询交期 int? moq = 0;
max_delivery = null; if (item_rule.has_collect)
if ("国内仓".Equals(item_warehouse.hq_type))
{
max_delivery = conn.QuerySingleOrDefault<int?>(" select max(supplier_delivery) from dc_base_sku where product_inner_code=@product_inner_code ", new { product_inner_code = itemGroup.Key.product_inner_code });
}
else
{ {
max_delivery = conn.QuerySingleOrDefault<int?>(" select max(supplier_delivery + `transfer_delivery`) from dc_base_sku where product_inner_code=@product_inner_code ", new { product_inner_code = itemGroup.Key.product_inner_code }); //查询商品moq
moq = conn.QuerySingleOrDefault<int?>(" select max(moq) from dc_base_sku where product_inner_code=@product_inner_code ", new { product_inner_code = itemGroup.Key.product_inner_code });
if (moq == null)
{
remarks.AppendLine($"未查询到商品moq");
throw new Exception("未查询到商品moq");
}
} }
if (max_delivery == null) foreach (var item in itemGroup.AsEnumerable())
{ {
remarks.AppendLine($"未查询到交期"); var item_order_detailed = new auto_first_order_detailed_dto
throw new Exception("未查询到交期"); {
} bailun_sku = item.bailun_sku,
quantity = 0,
remarks = new StringBuilder()
};
item_order_detailed.remarks.Append(remarks);
// 查询交期
max_delivery = null;
if ("国内仓".Equals(item_warehouse.hq_type))
{
max_delivery = conn.QuerySingleOrDefault<int?>(" select max(supplier_delivery) from dc_base_sku where bailun_sku=@bailun_sku ", new { bailun_sku = item.bailun_sku });
}
else
{
max_delivery = conn.QuerySingleOrDefault<int?>(" select max(supplier_delivery + `transfer_delivery`) from dc_base_sku where bailun_sku=@bailun_sku ", new { bailun_sku = item.bailun_sku });
}
if (max_delivery == null)
{
item_order_detailed.remarks.AppendLine($"未查询到交期");
continue;
}
item_order_detailed.remarks.AppendLine($"供应链交期 {max_delivery} ");
remarks.AppendLine($"供应链交期 {max_delivery} "); // 查询sku日均销量
try
{
var skuSalesList = GetSkuSales(new List<string> { item.bailun_sku });
// 计算预计下单数量
var sum_quantity = max_delivery.Value * (skuSalesList[0].averageSales * item_rule.sales_ratio);
item_order_detailed.remarks.AppendLine($"经过计算,预计下单数 {sum_quantity} = (供应链交期 {max_delivery} )* (日均销量 {skuSalesList[0].averageSales})* (配置的日均销量比例 {item_rule.sales_ratio})");
item_order_detailed.quantity = sum_quantity;
data_detailed_list.Add(item_order_detailed);
// 计算预计下单数量 }
var sum_quantity = max_delivery * (itemGroup.Max(s => s.product_sales) * item_rule.sales_ratio); catch (Exception ex)
{
item_order_detailed.remarks.AppendLine(ex.Message);
continue;
}
remarks.AppendLine($"经过计算,预计下单数 {sum_quantity} = (供应链交期 {max_delivery} )* (商品日均销量 {itemGroup.Max(s => s.product_sales)})* (配置的日均销量比例 {item_rule.sales_ratio})");
if (sum_quantity <= 0)
{
remarks.AppendLine($"经过计算,无需下单");
throw new Exception("经过计算,无需下单");
} }
foreach (var item in itemGroup.AsEnumerable()) var moqSb = new StringBuilder();
if (item_rule.has_collect)
{ {
data_detailed_list.Add(new auto_first_order_detailed_dto moqSb.AppendLine("开始拼凑moq");
{
bailun_sku = item.bailun_sku,
quantity = 0
});
}
var sum_quantity_index = 0; moqSb.AppendLine($" 商品moq 个数 {moq} ");
while (sum_quantity > 0)
{ if (data_detailed_list.Sum(s => s.quantity ) < moq)
data_detailed_list[sum_quantity_index].quantity++;
if (sum_quantity_index >= (data_detailed_list.Count - 1))
{ {
sum_quantity_index = 0; var demandQuantity = moq - data_detailed_list.Sum(s => s.quantity) ;
moqSb.AppendLine($" 当前需求数量 个数 {data_detailed_list.Sum(s => s.quantity) } ");
int tempIndex = 0;
while (true)
{
if (demandQuantity <= 0)
{
break;
}
data_detailed_list[tempIndex].quantity++;
data_detailed_list[tempIndex].share_quantity++;
demandQuantity--;
if (data_detailed_list.Count-1 == tempIndex)
{
tempIndex = 0;
}
else
{
tempIndex++;
}
}
foreach (var item in data_detailed_list)
{
item.remarks.AppendLine($"累积未商品moq 分摊 {item.share_quantity} 个,当前预计下单 {item.quantity} ");
}
} }
else else
{ {
sum_quantity_index++; moqSb.AppendLine("总需求已经大于moq ,跳过该步骤");
} }
sum_quantity--;
}
// 过滤掉没分配到需要下单的 }
data_detailed_list = data_detailed_list.Where(s => s.quantity > 0).ToList();
}
if (data_detailed_list == null || data_detailed_list.Count <= 0)
{
remarks.AppendLine($"计算完发现没有需求");
throw new Exception("计算完发现没有需求");
} }
foreach (var item in data_detailed_list) foreach (var item in data_detailed_list)
{ {
conn.Insert(new dc_auto_purchase_advise_detailed conn.Insert(new dc_auto_purchase_advise_detailed
...@@ -263,9 +310,8 @@ namespace AutoTurnOver.DB ...@@ -263,9 +310,8 @@ namespace AutoTurnOver.DB
product_inner_code = itemGroup.Key.product_inner_code, product_inner_code = itemGroup.Key.product_inner_code,
good_sku_codes = "", good_sku_codes = "",
purchase_type_jit = 3, purchase_type_jit = 3,
remarks = remarks.ToString(), remarks = item.remarks.ToString(),
turnover_days = max_delivery??0, turnover_days = max_delivery ?? 0,
}, t); }, t);
} }
...@@ -275,9 +321,9 @@ namespace AutoTurnOver.DB ...@@ -275,9 +321,9 @@ namespace AutoTurnOver.DB
} }
catch (Exception ex) catch (Exception ex)
{ {
var is_error = itemGroup.Max(s => s.is_error)+1; var is_error = itemGroup.Max(s => s.is_error) + 1;
var goods_sku = $"【商品sku】:【{itemGroup.Key.product_inner_code}】【{itemGroup.Key.warehouse_code}】"; var goods_sku = $"【商品sku】:【{itemGroup.Key.product_inner_code}】【{itemGroup.Key.warehouse_code}】";
conn.Execute(" update dc_auto_first_order_sku set is_error=@is_error where id in @ids ", new { ids = itemGroup.Select(s=>s.id),is_error = is_error },t); conn.Execute(" update dc_auto_first_order_sku set is_error=@is_error where id in @ids ", new { ids = itemGroup.Select(s => s.id), is_error = is_error }, t);
err_count = true; err_count = true;
conn.Insert(new dc_task_error_log conn.Insert(new dc_task_error_log
{ {
...@@ -286,7 +332,7 @@ namespace AutoTurnOver.DB ...@@ -286,7 +332,7 @@ namespace AutoTurnOver.DB
task_name = "auto_first_order_GeneratePurchaseAdvise", task_name = "auto_first_order_GeneratePurchaseAdvise",
date = DateTime.Now date = DateTime.Now
}, t); }, t);
QiYeJiQiRenHelper.QiYeJiQiRenMsPush(new QiYeJiQiRenHelper.QiYeJiQiRenMsDto { msgtype = "text", text = new QiYeJiQiRenHelper.QiYeJiQiRenMsDto.text_dto { content = " 查收异常消息: "+ goods_sku + ex.Message } }, QiYeJiQiRenHelper.QiYeJiQiRenMsPush(new QiYeJiQiRenHelper.QiYeJiQiRenMsDto { msgtype = "text", text = new QiYeJiQiRenHelper.QiYeJiQiRenMsDto.text_dto { content = " 查收异常消息: " + goods_sku + ex.Message } },
"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=0ff68206-f585-4d1e-824b-630c473978d8"); "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=0ff68206-f585-4d1e-824b-630c473978d8");
foreach (var item in itemGroup.ToList()) foreach (var item in itemGroup.ToList())
{ {
...@@ -319,5 +365,20 @@ namespace AutoTurnOver.DB ...@@ -319,5 +365,20 @@ namespace AutoTurnOver.DB
} }
} }
/// <summary>
/// 获取sku销量
/// </summary>
public static List<pds_sku_sales_dto> GetSkuSales(List<string> skus)
{
string url = ConfigHelper.GetValue("postaveragesales");
string resultStr = HttpHelper.Request(url, RequestType.POST, skus.ToJson(), timeout: 1000 * 60 * 60 * 24, entype: "application/json");
var result = resultStr.ToObj<List<pds_sku_sales_dto>>();
if (result == null)
{
throw new Exception("pds系统异常: 未获取到sku销量数据");
}
return result;
}
} }
} }
using System;
using System.Collections.Generic;
using System.Text;
namespace AutoTurnOver.Models.ApiDto
{
/// <summary>
/// 从pds获取的sku销量
/// </summary>
public class pds_sku_sales_dto
{
public string procudeCode { get; set; }
public string sku { get; set; }
/// <summary>
/// 累积销量
/// </summary>
public decimal salesVolume { get; set; }
/// <summary>
/// 日均销量
/// </summary>
public decimal averageSales { get; set; }
}
}
...@@ -84,6 +84,9 @@ namespace AutoTurnOver.Models ...@@ -84,6 +84,9 @@ namespace AutoTurnOver.Models
{ {
public string bailun_sku { get; set; } public string bailun_sku { get; set; }
public decimal quantity { get; set; } public decimal quantity { get; set; }
public decimal share_quantity { get; set; }
public StringBuilder remarks { get; set; }
} }
} }
...@@ -14,6 +14,7 @@ namespace ShortagePush ...@@ -14,6 +14,7 @@ namespace ShortagePush
Console.WriteLine("推送缺货数据服务"); Console.WriteLine("推送缺货数据服务");
//new ReportServices().ShortagePush(); //new ReportServices().ShortagePush();
//new ReportServices().ShortagePush(platform: "walmart"); //new ReportServices().ShortagePush(platform: "walmart");
new ReportServices().ShortagePush();
var builder = new HostBuilder().ConfigureServices((hostContext, services) => var builder = new HostBuilder().ConfigureServices((hostContext, services) =>
{ {
services.AddHostedService<ShortagePushBackgroundService>(); services.AddHostedService<ShortagePushBackgroundService>();
......
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