Commit 1006eb60 by lizefeng

新增站点销量导入计算

parent b66bfff5
......@@ -1995,6 +1995,50 @@ and start_date<=@end_date and end_date>=@start_date
}
}
public static string SaveSalesDayConfig2(sales_day_config_input_dto2 m, UserData user, bool is_reset_data = true)
{
try
{
var data = new dc_ana_deviation_sales_day_config()
{
sales = m.sales,
create_date = DateTime.Now,
date_str = m.date.ToString("yyyy-MM-dd"),
bailun_sku = m.bailun_sku,
site = m.site_code,
create_user = user.UserName,
date = m.date,
update_date = DateTime.Now,
update_user = user.UserName,
project = m.project
};
var odlData = _connection.QueryFirstOrDefault<sales_day_config>(" select * from dc_ana_deviation_sales_day_config where `site`=@site and bailun_sku=@bailun_sku and date_str=@date_str ", new
{
site = data.site,
bailun_sku = data.bailun_sku,
date_str = data.date_str
});
if (odlData != null)
{
data.id = odlData.id;
data.create_user = odlData.create_user;
data.create_date = odlData.create_date;
_connection.Update(data);
}
else
{
_connection.Insert(data);
}
return "";
}
catch (Exception ex)
{
return ex.Message;
}
}
public static string BatchSaveSalesDayConfig(batch_sales_day_config_input_dto m, UserData user)
{
foreach (var item in m.datas)
......
......@@ -28,32 +28,34 @@ namespace AutoTurnOver.DB
var skuDatas = taskDto.id.ToObj<List<dc_ana_deviation_sku>>();
var skuData = skuDatas[0];
var warehouse_codes = skuDatas.Select(s => s.warehouse_code).ToList();
// 查询sku的供应链长度
var turnover_data = await _connection.QueryFirstOrDefaultAsync<Models.dc_auto_turnover>(" select * from dc_auto_turnover where warehouse_code=@warehouse_code and bailun_sku=@bailun_sku ", new
var turnover_datas = (await _connection.QueryAsync<Models.dc_auto_turnover>(" select * from dc_auto_turnover where warehouse_code in @warehouse_codes and bailun_sku=@bailun_sku ", new
{
warehouse_code = skuData.warehouse_code,
warehouse_codes = warehouse_codes,
bailun_sku = skuData.sku
});
})).ToList();
// 查询库存表
var stockData = await _connection.QueryFirstOrDefaultAsync<Models.dc_base_stock>(" select * from dc_base_stock where warehouse_code=@warehouse_code and bailun_sku=@bailun_sku ", new
var stockDatas =( await _connection.QueryAsync<Models.dc_base_stock>(" select * from dc_base_stock where warehouse_code in @warehouse_codes and bailun_sku=@bailun_sku ", new
{
warehouse_code = skuData.warehouse_code,
warehouse_code = warehouse_codes,
bailun_sku = skuData.sku
});
})).ToList();
//查询在途数据
var transitData = await _connection.QueryFirstOrDefaultAsync<Models.dc_mid_transit>(" select * from dc_mid_transit where warehouse_code=@warehouse_code and bailun_sku=@bailun_sku ", new
var transitDatas =( await _connection.QueryAsync<Models.dc_mid_transit>(" select * from dc_mid_transit where warehouse_code in @warehouse_codes and bailun_sku=@bailun_sku ", new
{
warehouse_code = skuData.warehouse_code,
warehouse_code = warehouse_codes,
bailun_sku = skuData.sku
});
})).ToList();
var baseSkuData = _connection.QueryFirstOrDefault<dc_base_sku>(" select * from dc_base_sku where bailun_sku=@bailun_sku ", new { bailun_sku = skuData.sku });
var turnover_days = turnover_data.turnover_days;
var turnover_days = turnover_datas[0].turnover_days;
var endDate = now.AddDays(turnover_days).LastDayOfMonth().ToDayEnd();
// 查询配置的销量
var salesDayConfigs = _connection.Query<dc_ana_deviation_sales_day_config>(" select * from sales_day_config where project=@project and bailun_sku=@bailun_sku and warehouse_code=@warehouse_code and `date`>=@bdate and `date`<=@edate ", new
var salesDayConfigs = _connection.Query<dc_ana_deviation_sales_day_config>(" select * from dc_ana_deviation_sales_day_config where project=@project and bailun_sku=@bailun_sku and site in @sites and `date`>=@bdate and `date`<=@edate ", new
{
bailun_sku = baseSkuData.bailun_sku,
warehouse_code = skuData.warehouse_code,
sites = skuDatas.Select(s=>s.site).ToList(),
bdate = now,
edate = endDate,
project = skuData.project
......@@ -79,12 +81,12 @@ namespace AutoTurnOver.DB
// 读取实际值 【销售产品数量】、【销售产品产品成本】、【剩余可用库存数量】、【剩余可用库存金额】、【剩余调拨库存数量】、【剩余调拨库存金额】、【采购在途库存金额】、【采购在途库存数量】
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余可用库存数量", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = stockData.usable_stock });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余可用库存金额", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = stockData.usable_stock * baseSkuData.unit_price });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "采购在途库存数量", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = transitData.quantity_purchase });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "采购在途库存金额", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = transitData.quantity_purchase * baseSkuData.unit_price });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余调拨库存数量", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = transitData.quantity_transfer });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余调拨库存金额", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = transitData.quantity_transfer * baseSkuData.unit_price });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余可用库存数量", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = stockDatas.Sum(s=>s.usable_stock) });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余可用库存金额", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = stockDatas.Sum(s => s.usable_stock) * baseSkuData.unit_price });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "采购在途库存数量", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = transitDatas.Sum(s=>s.quantity_purchase) });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "采购在途库存金额", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = transitDatas.Sum(s => s.quantity_purchase) * baseSkuData.unit_price });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余调拨库存数量", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = transitDatas.Sum(s=>s.quantity_transfer) });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余调拨库存金额", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = transitDatas.Sum(s => s.quantity_transfer) * baseSkuData.unit_price });
// 查询销量
var omsSale = await GetOmsSale(now, nowEdate, skuDatas);
......@@ -169,11 +171,11 @@ namespace AutoTurnOver.DB
warehouse_code = skuData.warehouse_code,
val = datas.FirstOrDefault(s => s.field == "剩余可用库存数量" && s.field_type == "推测值" && s.date_str == nowDateStr).val * baseSkuData.unit_price
});
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "推测值", field = "采购在途库存数量", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = turnover_data.quantity_final_advise });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "推测值", field = "采购在途库存金额", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = turnover_data.quantity_final_advise * baseSkuData.unit_price });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "推测值", field = "采购在途库存数量", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = turnover_datas.Sum(s=>s.quantity_final_advise) });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "推测值", field = "采购在途库存金额", project = skuData.project, sku = skuData.sku, warehouse_code = skuData.warehouse_code, val = turnover_datas.Sum(s => s.quantity_final_advise) * baseSkuData.unit_price });
// 偏差分析 【产品成本预计偏差值】、【销售数量预计偏差值】、【产品成本实际偏差值】、【销售数量实际偏差值
// 偏差分析 【产品成本预计偏差值】、【产品成本预计偏差比例】、【销售数量预计偏差值】、【销售数量预计偏差比例】、【产品成本实际偏差值】、【产品成本实际偏差比例】、【销售数量实际偏差值】、【销售数量实际偏差比例
SaveDeviation(datas, new dc_ana_deviation
{
bdate = now,
......@@ -193,6 +195,19 @@ namespace AutoTurnOver.DB
edate = nowEdate,
date_str = nowDateStr,
field_type = "偏差分析",
field = "产品成本预计偏差比例",
project = skuData.project,
sku = skuData.sku,
warehouse_code = skuData.warehouse_code,
val = datas.FirstOrDefault(s => s.field == "产品成本预计偏差值" && s.field_type == "偏差分析" && s.date_str == nowDateStr).val
.Division( datas.FirstOrDefault(s => s.field == "销售产品成本" && s.field_type == "预测值" && s.date_str == nowDateStr).val)
});
SaveDeviation(datas, new dc_ana_deviation
{
bdate = now,
edate = nowEdate,
date_str = nowDateStr,
field_type = "偏差分析",
field = "销售数量预计偏差值",
project = skuData.project,
sku = skuData.sku,
......@@ -206,6 +221,19 @@ namespace AutoTurnOver.DB
edate = nowEdate,
date_str = nowDateStr,
field_type = "偏差分析",
field = "销售数量预计偏差比例",
project = skuData.project,
sku = skuData.sku,
warehouse_code = skuData.warehouse_code,
val = datas.FirstOrDefault(s => s.field == "销售数量预计偏差值" && s.field_type == "偏差分析" && s.date_str == nowDateStr).val
.Division(datas.FirstOrDefault(s => s.field == "销售产品数量" && s.field_type == "预测值" && s.date_str == nowDateStr).val)
});
SaveDeviation(datas, new dc_ana_deviation
{
bdate = now,
edate = nowEdate,
date_str = nowDateStr,
field_type = "偏差分析",
field = "产品成本实际偏差值",
project = skuData.project,
sku = skuData.sku,
......@@ -219,6 +247,19 @@ namespace AutoTurnOver.DB
edate = nowEdate,
date_str = nowDateStr,
field_type = "偏差分析",
field = "产品成本实际偏差比例",
project = skuData.project,
sku = skuData.sku,
warehouse_code = skuData.warehouse_code,
val = datas.FirstOrDefault(s => s.field == "产品成本实际偏差值" && s.field_type == "偏差分析" && s.date_str == nowDateStr).val
.Division(datas.FirstOrDefault(s => s.field == "销售产品成本" && s.field_type == "预测值" && s.date_str == nowDateStr).val)
});
SaveDeviation(datas, new dc_ana_deviation
{
bdate = now,
edate = nowEdate,
date_str = nowDateStr,
field_type = "偏差分析",
field = "销售数量实际偏差值",
project = skuData.project,
sku = skuData.sku,
......@@ -226,6 +267,19 @@ namespace AutoTurnOver.DB
val = datas.FirstOrDefault(s => s.field == "销售产品数量" && s.field_type == "实际值" && s.date_str == nowDateStr).val
- datas.FirstOrDefault(s => s.field == "销售产品数量" && s.field_type == "预测值" && s.date_str == nowDateStr).val
});
SaveDeviation(datas, new dc_ana_deviation
{
bdate = now,
edate = nowEdate,
date_str = nowDateStr,
field_type = "偏差分析",
field = "销售数量实际偏差比例",
project = skuData.project,
sku = skuData.sku,
warehouse_code = skuData.warehouse_code,
val = datas.FirstOrDefault(s => s.field == "销售数量实际偏差值" && s.field_type == "偏差分析" && s.date_str == nowDateStr).val
.Division(datas.FirstOrDefault(s => s.field == "销售产品数量" && s.field_type == "预测值" && s.date_str == nowDateStr).val)
});
SaveDeviation(datas, new dc_ana_deviation
......@@ -277,7 +331,7 @@ namespace AutoTurnOver.DB
project = skuData.project,
sku = skuData.sku,
warehouse_code = skuData.warehouse_code,
val = stockData.usable_stock
val = stockDatas.Sum(s=>s.usable_stock)
});
return 1;
......@@ -286,9 +340,9 @@ namespace AutoTurnOver.DB
public async static Task<decimal> GetOmsSale(DateTime btime, DateTime etime, List<dc_ana_deviation_sku> anaSkus)
{
var sql = " select * from dc_base_oms_sku where warehouse_code=@warehouse_code and bailun_sku=@bailun_sku and bailun_order_status not in ('Canceled') and bailun_interception_status in ('None', 'Failed') and paid_time<=@etime and paid_time>=@btime ";
var sql = " select * from dc_base_oms_sku where warehouse_code in @warehouse_codes and bailun_sku=@bailun_sku and bailun_order_status not in ('Canceled') and bailun_interception_status in ('None', 'Failed') and paid_time<=@etime and paid_time>=@btime ";
DynamicParameters parameters = new DynamicParameters();
parameters.Add("warehouse_code", anaSkus[0].warehouse_code);
parameters.Add("warehouse_codes", anaSkus.Select(s=>s.warehouse_code).ToList());
parameters.Add("bailun_sku", anaSkus[0].sku);
parameters.Add("btime", btime);
parameters.Add("etime", etime);
......@@ -344,10 +398,10 @@ namespace AutoTurnOver.DB
public static void PushAnaTask()
{
// 查询所有需要分析的sku
var skuGroups = _connection.Query<dc_ana_deviation_sku>(" select * from dc_ana_deviation_sku ").ToList().GroupBy(s => new { s.sku, s.warehouse_code });
var skuGroups = _connection.Query<dc_ana_deviation_sku>(" select * from dc_ana_deviation_sku ").ToList().GroupBy(s => new { s.sku, s.project });
foreach (var item in skuGroups)
{
RabbitMQHelper.EnqueneMsg("aims:deviation:input", new t_task_queue { id = item.ToJson(), create_time = DateTime.Now });
RabbitMQHelper.EnqueneMsg("aims:deviation-v2:input", new t_task_queue { id = item.ToJson(), create_time = DateTime.Now });
}
}
}
......
......@@ -27,8 +27,7 @@ namespace AutoTurnOver.Models.auto
public int id { get; set; }
public string project { get; set; }
public string bailun_sku { get; set; }
public string warehouse_code { get; set; }
public string bailun_sku_warehouse_code { get; set; }
public string site { get; set; }
public DateTime date { get; set; }
public string date_str { get; set; }
public decimal sales { get; set; }
......@@ -46,6 +45,15 @@ namespace AutoTurnOver.Models.auto
public decimal sales { get; set; }
}
public class sales_day_config_input_dto2
{
public string bailun_sku { get; set; }
public string project { get; set; }
public string site_code { get; set; }
public DateTime date { get; set; }
public decimal sales { get; set; }
}
public class batch_sales_day_config_input_dto
{
public string bailun_sku { get; set; }
......
......@@ -870,6 +870,91 @@ namespace AutoTurnOver.Services
return table;
}
public DataTable SalesDayConfigImport2(Stream fileInfo, UserData user)
{
var data_set = EPPlusHelper.ReadExcel(fileInfo);
var table = data_set.Tables[0];
if (!table.Columns.Contains("导入结果")) table.Columns.Add("导入结果");
if (!table.Columns.Contains("导入异常")) table.Columns.Add("导入异常");
var warehouse_list = DB.common.ListWareHouse(null, null);
DateTime now = DateTime.Now;
int index = 1;
foreach (DataRow row in table.Rows)
{
index++;
try
{
var bailun_sku = row["SKU"].ToString();
var site_code = row["站点"].ToString();
if (string.IsNullOrWhiteSpace(bailun_sku)) throw new Exception("SKU必填");
if (string.IsNullOrWhiteSpace(site_code)) throw new Exception("站点必填");
{
var cols = table.Columns;
foreach (DataColumn col in cols)
{
if (col.ColumnName.Contains("销量") && col.ColumnName.Length > 20)
{
decimal sales = 0;
var salesObj = row[col.ColumnName];
if (salesObj != null)
{
if (!decimal.TryParse(salesObj.ToString(), out sales))
{
throw new Exception("销量格式异常");
}
// 取开始结束时间
var btime = DateTime.Parse(col.ColumnName.Substring(2, 10));
var etime = DateTime.Parse(col.ColumnName.Substring(13, 10));
var s_sales = (sales / ((int)Math.Ceiling((etime - btime).TotalDays + 1)));
while (btime.ToDayHome() <= etime.ToDayEnd())
{
var new_data = new sales_day_config_input_dto2
{
bailun_sku = bailun_sku,
site_code = site_code,
sales = s_sales,
date = btime
};
DB.db_config.SaveSalesDayConfig2(new_data, user, false);
btime = btime.AddDays(1);
}
}
}
}
}
row["导入结果"] = "成功";
row["导入异常"] = "";
}
catch (Exception ex)
{
row["导入结果"] = "失败";
row["导入异常"] = ex.Message;
}
}
return table;
}
/// <summary>
/// 默认头程方式
/// </summary>
......
......@@ -1114,7 +1114,7 @@ namespace AutoTurnOver.Controllers
/// <returns></returns>
[HttpPost]
[UseAction]
[BrowseLog("Bailun_aims", "触发【百伦自动周转系统】->【周转表】->【销量导入】->【导入】操作", 1)]
[BrowseLog("Bailun_aims", "触发【百伦自动周转系统】->【周转表】->【销量导入(仓库)】->【导入】操作", 1)]
public async Task<ActionResult<RequestResultDto>> SalesDayConfigImport(IFormFile file)
{
try
......@@ -1149,6 +1149,42 @@ namespace AutoTurnOver.Controllers
/// <param name="fileName"></param>
/// <returns></returns>
[HttpPost]
[UseAction]
[BrowseLog("Bailun_aims", "触发【百伦自动周转系统】->【周转表】->【销量导入(站点)】->【导入】操作", 1)]
public async Task<ActionResult<RequestResultDto>> SalesDayConfigImport2(IFormFile file)
{
try
{
var user = AutoUtility.GetUser();
var dataTable = new Services.ConfigServices().SalesDayConfigImport2(file.OpenReadStream(), user);
var fileName = AppContext.BaseDirectory + $@"Result\销量(手动)导入结果.csv";
CsvFileHelper.SaveCSV(dataTable, fileName);
var memory = new MemoryStream();
using (var stream = new FileStream(fileName, FileMode.Open))
{
stream.CopyTo(memory);
}
memory.Position = 0;
var fileData = await QiNiuCloudHelper.UploadAsync(memory, $"{user.UserName}-{DateTime.Now.ToString("yyyyMMddHHmmss")}销量(手动)导入结果.csv");
return new RequestResultDto { success = true, data = fileData };
}
catch (Exception ex)
{
return new RequestResultDto { success = false, message = ex.Message, err_data = ex.StackTrace };
}
}
/// <summary>
/// 导入
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
[HttpPost]
//[UseAction]
[BrowseLog("Bailun_aims", "触发【百伦自动周转系统】->【周转表】->【默认头程方式】->【导入】操作", 1)]
public async Task<ActionResult<RequestResultDto>> HeadConfigImport(IFormFile file)
......
......@@ -11,7 +11,7 @@ namespace ResetOutofstock
class DeviationRabbitBackgroundService : RabbitWorkerBase<t_task_queue>
{
public DeviationRabbitBackgroundService() : base("差异分析服务", "aims:deviation:input", 1)
public DeviationRabbitBackgroundService() : base("差异分析服务", "aims:deviation-v2:input", 1)
{
}
......@@ -27,7 +27,7 @@ namespace ResetOutofstock
}
catch (Exception e)
{
RabbitMQHelper.EnqueneMsg("aims:deviation:input", taskDto);
RabbitMQHelper.EnqueneMsg("aims:deviation-v2:input", taskDto);
Console.WriteLine($"差异分析服务 数据异常,异常原因为:{e.Message},异常堆栈为:{e.StackTrace}");
}
......
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