Commit afe612c7 by lizefeng

完善偏差分析

parent 0624bf84
......@@ -11,8 +11,10 @@ namespace AutoTurnOver.DB
{
public long id { get; set; }
public string sku { get; set; }
public string warehouse_code { get; set; }
public string project { get; set; }
public string field { get; set; }
public string field_type { get; set; }
public decimal val { get; set; }
public DateTime bdate { get; set; }
public DateTime edate { get; set; }
......
......@@ -5,6 +5,8 @@ using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using AutoTurnOver.Models.auto;
using AutoTurnOver.Models.Report;
namespace AutoTurnOver.DB
{
......@@ -16,10 +18,164 @@ namespace AutoTurnOver.DB
/// <param name="taskDto"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public static Task<int> AnaDeviation(t_task_queue taskDto)
public static async Task<int> AnaDeviation(t_task_queue taskDto)
{
throw new NotImplementedException();
var now = DateTime.Now.ToDayHome();
var nowEdate = now.ToDayEnd();
var nowDateStr = now.ToString("yyyy-MM-dd");
// 查询sku
var skuData = await _connection.QueryFirstOrDefaultAsync<dc_ana_deviation_sku>(" select * from dc_ana_deviation_sku where id=@id ", new { id = taskDto.id });
// 确定仓库
var warehouse = await _connection.QueryFirstOrDefaultAsync<dc_base_warehouse>(" select * from dc_base_warehouse where hq_type='FBA仓' and bailun_account_id=@bailun_account_id ", new { bailun_account_id = skuData.account });
// 查询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
{
warehouse_code = warehouse.warehouse_code,
bailun_sku = skuData.sku
});
// 查询库存表
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
{
warehouse_code = warehouse.warehouse_code,
bailun_sku = skuData.sku
});
//查询在途数据
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
{
warehouse_code = warehouse.warehouse_code,
bailun_sku = skuData.sku
});
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 endDate = now.AddDays(turnover_days).ToDayEnd();
// 查询配置的销量
var salesDayConfigs = _connection.Query<sales_day_config>(" select * from sales_day_config where bailun_sku=@bailun_sku and warehouse_code=@warehouse_code and `date`>=@bdate and `date`<=@edate ", new
{
bailun_sku = baseSkuData.bailun_sku,
warehouse_code = warehouse.warehouse_code,
bdate = now,
edate = endDate
}).ToList();
var thisDate = now;
List<dc_ana_deviation> datas = new List<dc_ana_deviation>();
while (thisDate <= endDate)
{
var thisBdate = thisDate.ToDayHome();
var thisEdate = thisDate.ToDayEnd();
var dateStr = thisDate.ToString("yyyy-MM-dd");
var sales = (salesDayConfigs.FirstOrDefault(s => s.date_str == dateStr) ?? new sales_day_config { }).sales;
// 写入 【销售产品产品成本】、【销售产品数量】、【剩余可用库存金额】、【剩余可用库存数量】
SaveDeviation(datas, new dc_ana_deviation { bdate = thisBdate, edate = thisEdate, date_str = dateStr, field_type = "预测值", field = "销售产品数量", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code, val = sales });
SaveDeviation(datas, new dc_ana_deviation { bdate = thisBdate, edate = thisEdate, date_str = dateStr, field_type = "预测值", field = "剩余可用库存数量", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code, val = sales });
SaveDeviation(datas, new dc_ana_deviation { bdate = thisBdate, edate = thisEdate, date_str = dateStr, field_type = "预测值", field = "销售产品成本", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code, val = sales * baseSkuData.unit_price });
SaveDeviation(datas, new dc_ana_deviation { bdate = thisBdate, edate = thisEdate, date_str = dateStr, field_type = "预测值", field = "剩余可用库存金额", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code, val = sales * baseSkuData.unit_price });
thisDate = thisDate.AddDays(1);
}
// 读取实际值 【销售产品数量】、【销售产品产品成本】、【剩余可用库存数量】、【剩余可用库存金额】、【剩余调拨库存数量】、【剩余调拨库存金额】、【采购在途库存金额】、【采购在途库存数量】
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余可用库存数量", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.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 = warehouse.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 = warehouse.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 = warehouse.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 = warehouse.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 = warehouse.warehouse_code, val = transitData.quantity_transfer * baseSkuData.unit_price });
// 查询销量
var omsSale = (await _connection.QueryFirstOrDefaultAsync<decimal?>(" select sum(bailun_sku_quantity_ordered) 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 ", new
{
warehouse_code = warehouse.warehouse_code,
bailun_sku = baseSkuData.bailun_sku,
etime = now,
btime = nowEdate
}, commandTimeout: 0)) ?? 0;
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "销售产品数量", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code, val = omsSale });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "销售产品成本", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code, val = omsSale * baseSkuData.unit_price });
// 推测值 【销售产品数量】【销售产品产品成本】【剩余可用库存数量】【剩余可用库存金额】【采购在途库存数量】【采购在途库存金额】
// 推测值涉及实际数据,所以只能推测明天的数据
var nextBDay = now.AddDays(1).ToDayHome();
var nextEDay = nextBDay.ToDayEnd();
var nextDateStr = nextBDay.ToString("yyyy-MM-dd");
SaveDeviation(datas, new dc_ana_deviation { bdate = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "推测值", field = "销售产品数量", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code, val = stockData.usable_stock });
SaveDeviation(datas, new dc_ana_deviation { bdate = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "推测值", field = "销售产品成本", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code, val = stockData.usable_stock * baseSkuData.unit_price });
// 查询今日的预计到货数据
var baseTransExpectarrivaltimeDatas = _connection.Query<dc_base_trans_expectarrivaltime_temp>(" select * from dc_base_trans_expectarrivaltime where bailun_sku=@bailun_sku and warehouse_code=@warehouse_code and expectarrivaltime>=@btime and expectarrivaltime<=@etime ",new {
warehouse_code = warehouse.warehouse_code,
bailun_sku = baseSkuData.bailun_sku,
etime = now,
btime = nowEdate
});
SaveDeviation(datas, new dc_ana_deviation { bdate = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "推测值", field = "剩余可用库存数量", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code,
val = stockData.usable_stock + baseTransExpectarrivaltimeDatas.Sum(s=>s.count) - datas.FirstOrDefault(s=>s.field== "销售产品数量" && s.field_type== "预测值" && s.date_str== nowDateStr).val
});
SaveDeviation(datas, new dc_ana_deviation { bdate = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "推测值", field = "剩余可用库存金额", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.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 = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "推测值", field = "采购在途库存数量", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code, val = turnover_data.quantity_final_advise });
SaveDeviation(datas, new dc_ana_deviation { bdate = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "推测值", field = "采购在途库存金额", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code, val = turnover_data.quantity_final_advise * baseSkuData.unit_price });
// 偏差分析 【产品成本预计偏差值】、【销售数量预计偏差值】、【产品成本实际偏差值】、【销售数量实际偏差值】
SaveDeviation(datas, new dc_ana_deviation { bdate = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "偏差分析", field = "产品成本预计偏差值", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code,
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 = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "偏差分析", field = "销售数量预计偏差值", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code,
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 = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "偏差分析", field = "产品成本实际偏差值", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code,
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 = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "偏差分析", field = "销售数量实际偏差值", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code,
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 = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "-", field = "超卖数量", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code,
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 = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "-", field = "呆滞数量", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code,
val = datas.FirstOrDefault(s=>s.field== "剩余可用库存数量" && s.field_type== "实际值" && s.date_str== nowDateStr).val
- datas.Where(s => s.field == "销售产品数量" && s.field_type == "预测值" && s.bdate<=endDate && s.edate>=now).Sum(s=>s.val) // 未来周转期的预测销量
});
SaveDeviation(datas, new dc_ana_deviation { bdate = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "-", field = "呆滞库存金额", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code,
val = datas.FirstOrDefault(s=>s.field== "呆滞数量" && s.field_type== "-" && s.date_str== nowDateStr).val * baseSkuData.unit_price
});
return 1;
}
public static void SaveDeviation(List<dc_ana_deviation> datas, dc_ana_deviation data)
{
data._ts = DateTime.Now;
data.id = _connection.QueryFirstOrDefault<int?>(" select id from dc_ana_deviation where sku=@sku and warehouse_code=@warehouse_code and project=@project and field=@field and date_str=@date_str and field_type=@field_type ", new
{
sku = data.sku,
warehouse_code = data.warehouse_code,
project = data.project,
field = data.field,
date_str = data.date_str,
field_type = data.field_type
}) ?? 0;
if (data.id <= 0)
{
_connection.Insert(data);
}
else
{
_connection.Update(data);
}
datas.Add(data);
}
/// <summary>
......@@ -31,7 +187,7 @@ namespace AutoTurnOver.DB
var skus = _connection.Query<int>(" select id from dc_ana_deviation_sku ").ToList();
foreach (var item in skus)
{
RabbitMQHelper.EnqueneMsg("aims:deviation:input",new t_task_queue {id = item.ToString(),create_time= DateTime.Now });
RabbitMQHelper.EnqueneMsg("aims:deviation:input", new t_task_queue { id = item.ToString(), create_time = DateTime.Now });
}
}
}
......
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