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
        }