public void _原先计算方式(List <decimal> list1, List <decimal> list2, List <decimal> list3, ref _计算过程 detail) { int count1 = list1.Count; int count2 = list2.Count; int count3 = list3.Count; detail._参数1_销量总和 = list1.Sum(); detail._参数2_销量总和 = list2.Sum(); detail._参数3_销量总和 = list3.Sum(); detail._日平均销量 = Math.Round((detail._参数1_销量总和 / count1 + detail._参数2_销量总和 / count2 + detail._参数3_销量总和 / count3) / 3, 1); detail._库存上限 = _预警销售天数 * detail._日平均销量; detail._库存下限 = _采购到货天数 * detail._日平均销量; detail._建议采购 = Math.Round(detail._库存上限 + detail._库存下限 - _可用数量 - _采购未入库 + _缺货及未派单数量, 0); }
public void _中位数计算方式(List <decimal> list1, List <decimal> list2, List <decimal> list3, ref _计算过程 detail) { detail._参数1_中位数 = Calcu中位数(list1); detail._参数2_中位数 = Calcu中位数(list2); detail._参数3_中位数 = Calcu中位数(list3); detail._日平均销量 = Math.Round((detail._参数1_中位数 + detail._参数2_中位数 + detail._参数3_中位数) / 3, 1); detail._库存上限 = _预警销售天数 * detail._日平均销量; detail._库存下限 = _采购到货天数 * detail._日平均销量; detail._建议采购 = Math.Round(detail._库存上限 + detail._库存下限 - _可用数量 - _采购未入库 + _缺货及未派单数量, 0); }
private void btn处理数据_Click(object sender, EventArgs e) { var list库存预警原表 = new List <_库存预警>(); var list库存预警中位数 = new List <_库存预警>(); var list每月流水 = new List <_每月流水>(); var list两表都有的SKUs = new List <string>(); var list缺货所有SKUs = new List <string>(); var list处理结果 = new List <_订单分配>(); var list计算详情 = new List <_计算详情>(); var list异常SKUs = new List <string>(); int iDay1 = Convert.ToInt32(nupDay1.Value); int iDay2 = Convert.ToInt32(nupDay2.Value); int iDay3 = Convert.ToInt32(nupDay3.Value); #region 读取数据 var actReadData = new Action(() => { var strError = string.Empty; ShowMsg("开始读取预警原表数据"); FormHelper.ReadCSVFile(txt库存预警原表.Text, ref list库存预警原表, ref strError); ShowMsg("开始读取预警中位数表数据"); FormHelper.ReadCSVFile(txt库存预警中位数.Text, ref list库存预警中位数, ref strError); ShowMsg("开始读取每月流水数据"); FormHelper.ReadCSVFile(txt每月流水.Text, ref list每月流水, ref strError); ShowMsg("开始过滤每月流水中不需要的数据"); //过滤掉流水表里面不需要的sku数据,因为该表太大 var sku_yb = list库存预警原表.Select(x => x.SKU).ToList(); var sku_zw = list库存预警中位数.Select(x => x.SKU).ToList(); var q = from t1 in sku_yb join t2 in sku_zw on t1 equals t2 select t1; list两表都有的SKUs = q.ToList(); sku_yb.AddRange(sku_zw); list缺货所有SKUs = sku_yb.Select(x => x).Distinct().ToList(); list每月流水 = list每月流水.Where(x => list缺货所有SKUs.Contains(x.SKU)).ToList(); }); #endregion #region 处理数据 actReadData.BeginInvoke((obj) => { ShowMsg("正在处理数据"); foreach (var sku in list缺货所有SKUs) { //if (sku== "AMKA1A03-WR") //{ //} var _计算详情Model = new _计算详情(); var model = new _订单分配(); model._SKU = sku; _计算详情Model._SKU = sku; var refer库存预警原表 = list库存预警原表.FirstOrDefault(x => x.SKU == sku); var refer库存预警中位数 = list库存预警中位数.FirstOrDefault(x => x.SKU == sku); var refer流水 = list每月流水.FirstOrDefault(x => x.SKU == sku); if (refer流水 == null) { list异常SKUs.Add(sku); continue; } bool bShareSKU = refer库存预警原表 != null && refer库存预警中位数 != null; //公共信息 var common = refer库存预警原表 != null ? refer库存预警原表 : refer库存预警中位数; model._预计可用库存 = common._预计可用库存; model._供应商 = common._供应商; model._采购员 = common._采购员; model._含税单价 = common._商品成本单价; model._制单人 = common._采购员; //详情基本信息 _计算详情Model._采购员 = common._采购员; _计算详情Model._含税单价 = common._商品成本单价; _计算详情Model._可用数量 = common._可用数量; _计算详情Model._采购未入库 = common._采购未入库; _计算详情Model._缺货及未派单数量 = common._缺货及未派单数量; _计算详情Model._预计可用库存 = common._预计可用库存; _计算详情Model._预警销售天数 = common._预警销售天数; _计算详情Model._采购到货天数 = common._采购到货天数; _计算详情Model._缺货占用数量 = common._缺货占用数量; //特有信息 model._原表格导出的建议采购数量_原预警表 = refer库存预警原表 != null ? refer库存预警原表._表格导出的原始建议采购 : 0; model._原表格导出的建议采购数量_中位数表 = refer库存预警中位数 != null ? refer库存预警中位数._表格导出的原始建议采购 : 0; #region 两种算法的结果 { var list1 = refer流水._月销量流水.Take(iDay1).ToList(); var list2 = refer流水._月销量流水.Take(iDay2).ToList(); var list3 = refer流水._月销量流水.Take(iDay3).ToList(); #region 记录销量详情 { _计算详情Model._参数1详情 = string.Join(",", list1); _计算详情Model._参数2详情 = string.Join(",", list2); _计算详情Model._参数3详情 = string.Join(",", list3); } #endregion #region 原先算法 { var detail = new _计算过程(); common._原先计算方式(list1, list2, list3, ref detail); model._计算后的建议采购数量_原先算法 = detail._建议采购; _计算详情Model._库存上限_原先算法 = detail._库存上限; _计算详情Model._库存下限_原先算法 = detail._库存下限; _计算详情Model._日平均销量_原先算法 = detail._日平均销量; _计算详情Model._计算后的建议采购数量_原先算法 = detail._建议采购; _计算详情Model._参数1_销量总和 = detail._参数1_销量总和; _计算详情Model._参数2_销量总和 = detail._参数2_销量总和; _计算详情Model._参数3_销量总和 = detail._参数3_销量总和; } #endregion #region 中位数算法 { var detail = new _计算过程(); common._中位数计算方式(list1, list2, list3, ref detail); model._计算后的建议采购数量_中位数算法 = detail._建议采购; _计算详情Model._库存上限_中位数 = detail._库存上限; _计算详情Model._库存下限_中位数 = detail._库存下限; _计算详情Model._日平均销量_中位数 = detail._日平均销量; _计算详情Model._计算后的建议采购数量_中位数 = detail._建议采购; _计算详情Model._参数1_中位数 = detail._参数1_中位数; _计算详情Model._参数2_中位数 = detail._参数2_中位数; _计算详情Model._参数3_中位数 = detail._参数3_中位数; } #endregion _计算详情Model._原表格导出的建议采购数量_原预警表 = model._原表格导出的建议采购数量_原预警表; _计算详情Model._原表格导出的建议采购数量_中位数表 = model._原表格导出的建议采购数量_中位数表; } #endregion /* * 建议采购量以库存预警-中位数为主,但是需要修改以下条件: *(1)如果建议采购量 和 预计可用数量 一致或者差不多(建议采购量刚好够补缺货订单),那么建议采购最终数量= * (库存预警建议采购量+库存预警中位数建议采购量)/2 *(2)当库存预警建议采购量<库存预警中位数建议采购量,以库存预警建议采购量为主 *(3)当库存预警中位数 标记建议采购,但是建议采购量为0时,对应的SKU 以库存预警的建议采购量为主 * (这个是普源数据的问题,已经联系崔总做修改,待回复) *(4)当库存预警中位数建议采购量<库存预警建议采购量,商品成本单价小于1元的,最终建议采购量=(库存预警建议采购量+库存预警中位数建议采购量)/2 *(5)商品单价低于10元的,建议采购量小于5个的,最终建议采购量为 5个。(已经在建议采购做判断了) */ //中位数算法为主 model._Qty = model._计算后的建议采购数量_中位数算法; if (bShareSKU) { /* * (2)当库存预警建议采购量<库存预警中位数建议采购量,以库存预警建议采购量为主 */ if (model._计算后的建议采购数量_原先算法 < model._计算后的建议采购数量_中位数算法) { model._Qty = model._计算后的建议采购数量_原先算法; } else { if (common._商品成本单价 < 1) { decimal culc = (model._计算后的建议采购数量_原先算法 + model._计算后的建议采购数量_中位数算法) / 2; model._Qty = Math.Round(culc, 0); } } } _计算详情Model.Qty = model._Qty; list处理结果.Add(model); list计算详情.Add(_计算详情Model); } ExportExcel(list处理结果, list计算详情, list异常SKUs, iDay1, iDay2, iDay3); }, null); #endregion }