public ResultInfo SettleCalVerion2(int y, int m)
        {
            db0 = getDB0;
            var r = new ResultInfo();
            try
            {
                #region MyRegion
                //上個月日期
                var p_date = DateTime.Parse(y + "/" + m + "/1").AddMonths(-1);
                //上上個月日期
                var pp_date = DateTime.Parse(y + "/" + m + "/1").AddMonths(-2);

                //清空 SettleCal 資料
                string sql = "delete from SettleCal where sales_no!='A'";
                db0.Database.ExecuteSqlCommandAsync(sql).Wait();

                //清楚計算月的資料
                sql = "delete from SettleDetail where y=@y and m=@m";
                SqlParameter[] sps = new SqlParameter[] { new SqlParameter("@y", y), new SqlParameter("@m", m) };
                db0.Database.ExecuteSqlCommandAsync(sql, sps).Wait();

                var sales_colle = db0.Sales.Select(x => new SalesCalInfo()
                {
                    sales_no = x.sales_no,
                    sales_name = x.sales_name,
                    rank = x.rank,
                    recommend_no = x.recommend_no,
                    recommend_name = x.recommend_name,
                    share_sn = x.share_sn,
                    share_level = x.share_level,
                    share_name = x.ShareParent.sales_name
                }).Where(x => x.sales_no != "A").ToList(); //取得會員

                var sales_sum_kv = db0.PurchaseDetail
                .Where(x => x.Purchase.set_date.Year == y && x.Purchase.set_date.Month == m & (x.Purchase.state == (int)PurchaseState.complete || x.Purchase.state == (int)PurchaseState.onSite))
                .GroupBy(x => new { x.Purchase.sales_no })
                .Select(g => new { sales_no = g.Key.sales_no, sum_kv = g.Sum(x => x.kv_sub_total) }).ToList();

                foreach (var sales in sales_colle)
                {
                    var md = new SettleCal();
                    var obj = sales_sum_kv.FirstOrDefault(x => x.sales_no == sales.sales_no);
                    if (obj != null)
                    {
                        md.sales_no = sales.sales_no;
                        md.sales_name = sales.sales_name;
                        md.rank = sales.rank;
                        md.share_level = sales.share_level;
                        md.share_sn = sales.share_sn;
                        md.share_name = sales.share_name;
                        md.recommend_no = sales.recommend_no;
                        md.recommend_name = sales.recommend_name;
                        md.KV = obj.sum_kv;
                    }
                    else
                    {
                        md.sales_no = sales.sales_no;
                        md.sales_name = sales.sales_name;
                        md.rank = sales.rank;
                        md.share_level = sales.share_level;
                        md.share_sn = sales.share_sn;
                        md.share_name = sales.share_name;
                        md.recommend_no = sales.recommend_no;
                        md.recommend_name = sales.recommend_name;
                        md.KV = 0;
                    }
                    db0.SettleCal.Add(md);
                }

                #region 取出該月獎金計算主檔

                var settle = db0.Settle.Where(x => x.y == y & x.m == m).FirstOrDefault();
                if (settle == null)
                {
                    settle = new Settle()
                    {
                        settle_id = GetNewId(CodeTable.Settle),
                        y = y,
                        m = m,
                        state = (int)SettleState.progress,
                        set_date = DateTime.Now
                    };
                    db0.Settle.Add(settle);
                }
                #endregion

                //以上只算出每位會員KV值
                db0.SaveChangesAsync().Wait();

                var sales_kv_data = db0.SettleCal.Where(x => x.KV >= 1000).ToList();

                //取得上個月結算全部資料
                var sales_settle_pre = db0.SettleDetail.Where(x => x.y == p_date.Year && x.m == p_date.Month).ToList();
                //取得上上個月結算全部資料
                var sales_settle_prepre = db0.SettleDetail.Where(x => x.y == pp_date.Year && x.m == pp_date.Month).ToList();

                #endregion

                #region 消費滿1000kv
                foreach (var sales in sales_kv_data)
                {
                    #region MyRegion
                    var p = sales_settle_pre.FirstOrDefault(x => x.sales_no == sales.sales_no);
                    var md = new SettleDetail();

                    #region 計算共享圈消費總kv
                    //加總子系KV值 且往下只探四層,取當月總消費(未滿1000kv也列入)
                    var cal_kv_sum = sales.SettleCalSub
                        .Traverse(x => x.SettleCalSub)
                        .Where(x => (x.share_level <= sales.share_level + 4))
                        .Sum(x => x.KV);
                    #endregion
                    #region 計算直推會員總kv
                    var r_kv_sum = 0;
                    //加總子系KV值 ,取當月總消費(未滿1000kv也列入)
                    if (sales.rank >= (int)SalesRankState.manager)
                    {//經理人以上才需要計算
                        r_kv_sum = sales.SettleCalRSub.Sum(x => x.KV);
                    }
                    #endregion
                    #region 計算直推經理人是否達30在線&下線總消費額
                    int count_manager = 0;
                    int l_kv_sum = 0;
                    //找出消費滿1000kv且等級為經理人以上且下線有達三位消費滿1000kv
                    if (sales.rank >= (int)SalesRankState.operationsCenter)
                    {//營運中心以上才需要計算                                           
                        foreach (var sub in sales.SettleCalRSub.Where(x => x.KV >= 1000 & x.rank >= (int)SalesRankState.manager))
                        {
                            if (sub.SettleCalRSub.Where(x => x.KV >= 1000).Count() >= 3)
                                count_manager++;
                        }
                        if (count_manager >= 30)
                        {
                            l_kv_sum = sales.SettleCalRSub.Traverse(x => x.SettleCalRSub).Sum(x => x.KV);
                        }
                    }
                    #endregion
                    #region 計算直推營運中心營業總kv
                    var rc_kv_sum = 0;
                    if (sales.rank == (int)SalesRankState.managementOffice)
                    {//管理處以上才需要計算
                        rc_kv_sum = sales.SettleCalRSub.Where(x => x.rank >= (int)SalesRankState.operationsCenter)
                                                             .Traverse(x => x.SettleCalRSub).Sum(x => x.KV);
                    }
                    #endregion

                    md.settle_id = settle.settle_id;
                    md.y = y;
                    md.m = m;

                    md.sales_no = sales.sales_no;
                    md.sales_name = sales.sales_name;
                    md.rank = sales.rank;

                    md.kv_p_sum = sales.KV;//個人_kv總計
                    md.kv_g_sum = cal_kv_sum;//共享圈_kv總計
                    md.kv_r_sum = r_kv_sum;//直推會員_kv總計
                    md.kv_l_sum = l_kv_sum;//直推+間接會員_kv總計
                    md.kv_rc_sum = rc_kv_sum;//直推營運中心營業額_kv總計

                    md.count_manager = count_manager;//直推經理人在線人數

                    var x1 = Convert.ToInt32(cal_kv_sum * 0.01);
                    var x2 = Convert.ToInt32(sales.KV * 0.75);

                    md.a = x1 > x2 ? x2 : x1;

                    #region 上月累計獎金
                    if (p != null)
                    {
                        md.a_p = p.a;
                        md.b_p = p.b;
                    }
                    else
                    {
                        md.a_p = 0;
                        md.b_p = 0;
                    }
                    #endregion

                    //計算本月累計回饋金
                    md.b = x2 + md.b_p - md.a;

                    if (sales.rank >= (int)SalesRankState.manager) //經理人獎金
                    {
                        md.bound = Convert.ToInt32(md.kv_r_sum * 0.12);
                    }
                    if (sales.rank == (int)SalesRankState.operationsCenter & count_manager >= 30) //營運中心
                    {//30位經理人在線
                        md.center_bonus = Convert.ToInt32(md.kv_l_sum * 0.02);
                    }
                    if (sales.rank == (int)SalesRankState.managementOffice & count_manager >= 30)//管理處
                    {//30位經理人在線
                        md.center_bonus = Convert.ToInt32((md.kv_l_sum - md.kv_rc_sum) * 0.02);//管理處的營運中心紅利算法(與rank=營運中心)不太一樣
                        md.office_bonus = Convert.ToInt32(md.kv_rc_sum * 0.01);
                    }

                    db0.SettleDetail.Add(md);

                    #endregion
                }
                #endregion

                #region 消費未滿1000kv(計算累計回饋)
                var accumulate_kv_data = db0.SettleCal.Where(x => x.KV < 1000 & x.sales_no != "A").ToList();
                foreach (var sales in accumulate_kv_data)
                {
                    #region MyRegion
                    var p = sales_settle_pre.FirstOrDefault(x => x.sales_no == sales.sales_no);
                    var pp = sales_settle_pre.FirstOrDefault(x => x.sales_no == sales.sales_no);
                    var md = new SettleDetail();

                    md.settle_id = settle.settle_id;
                    md.y = y;
                    md.m = m;

                    md.sales_no = sales.sales_no;
                    md.sales_name = sales.sales_name;
                    md.rank = sales.rank;

                    md.kv_p_sum = sales.KV;//個人_kv總計
                    md.kv_g_sum = 0;//共享圈_kv總計
                    md.kv_r_sum = 0;//直推會員_kv總計
                    md.kv_l_sum = 0;//直推+間接會員_kv總計
                    md.kv_rc_sum = 0;//直推營運中心營業額_kv總計

                    md.count_manager = 0;//直推經理人在線人數
                    md.bound = 0;//經理人獎金
                    md.center_bonus = 0;//營運中心獎金
                    md.office_bonus = 0;//管理處獎金

                    //var x1 = Convert.ToInt32(cal_kv_sum * 0.01);
                    var x2 = Convert.ToInt32(sales.KV * 0.75);

                    md.a = 0;//未滿1000kv回饋金為0

                    #region 上月累計獎金
                    int pp_kv_p_sum = 0;//上上個月個人_kv總計
                    int p_kv_p_sum = 0;//上個月個人_kv總計
                    if (p != null)
                    {
                        md.a_p = p.a;
                        md.b_p = p.b;
                        p_kv_p_sum = p.kv_p_sum;
                    }
                    else
                    {
                        md.a_p = 0;
                        md.b_p = 0;
                    }
                    pp_kv_p_sum = pp != null ? pp.kv_p_sum : 0;
                    #endregion

                    //計算本月累計回饋金
                    md.b = x2 + md.b_p - md.a;
                    //連續三個月消費未滿1000kv累計回饋金歸0
                    if (pp_kv_p_sum < 1000 & p_kv_p_sum < 1000)
                        md.b = 0;

                    db0.SettleDetail.Add(md);

                    #endregion
                }
                #endregion

                db0.SaveChangesAsync().Wait();

                r.result = true;
                return r;
            }
            catch (Exception ex)
            {
                r.result = false;
                r.message = ex.Message;
                return r;
            }
            finally
            {
                db0.Dispose();
            }
        }
        public ResultInfo SettleCal(int y, int m)
        {
            db0 = getDB0;
            var r = new ResultInfo();
            try
            {
                #region MyRegion
                //上個月日期
                var p_date = DateTime.Parse(y + "/" + m + "/1").AddMonths(-1);

                //清空 SettleCal 資料
                string sql = "delete from SettleCal where sales_no!='A'";
                db0.Database.ExecuteSqlCommandAsync(sql).Wait();

                //清楚計算月的資料
                sql = "delete from SettleDetail where y=@y and m=@m";
                SqlParameter[] sps = new SqlParameter[] { new SqlParameter("@y", y), new SqlParameter("@m", m) };
                db0.Database.ExecuteSqlCommandAsync(sql, sps).Wait();

                var sales_colle = db0.Sales.Select(x => new SalesCalInfo()
                {
                    sales_no = x.sales_no,
                    sales_name = x.sales_name,
                    rank = x.rank,
                    share_sn = x.share_sn,
                    share_level = x.share_level,
                    share_name = x.ShareParent.sales_name
                }).Where(x => x.sales_no != "A").ToList(); //取得會員

                var sales_sum_kv = db0.PurchaseDetail
                .Where(x => x.Purchase.set_date.Year == y && x.Purchase.set_date.Month == m)
                .GroupBy(x => new { x.Purchase.sales_no })
                .Select(g => new { sales_no = g.Key.sales_no, sum_kv = g.Sum(x => x.kv_sub_total) }).ToList();

                foreach (var sales in sales_colle)
                {
                    var md = new SettleCal();
                    var obj = sales_sum_kv.FirstOrDefault(x => x.sales_no == sales.sales_no);
                    if (obj != null)
                    {
                        md.sales_no = sales.sales_no;
                        md.sales_name = sales.sales_name;
                        md.rank = sales.rank;
                        md.share_level = sales.share_level;
                        md.share_sn = sales.share_sn;
                        md.share_name = sales.share_name;
                        md.KV = obj.sum_kv;
                    }
                    else
                    {
                        md.sales_no = sales.sales_no;
                        md.sales_name = sales.sales_name;
                        md.rank = sales.rank;
                        md.share_level = sales.share_level;
                        md.share_sn = sales.share_sn;
                        md.share_name = sales.share_name;
                        md.KV = 0;
                    }
                    db0.SettleCal.Add(md);
                }
                //以上只算出每位會員KV值
                db0.SaveChangesAsync().Wait();

                var sales_kv_data = db0.SettleCal.Where(x => x.KV >= 1000).ToList();

                //取得上個月結算全部資料
                var sales_settle_pre = db0.SettleDetail.Where(x => x.y == p_date.Year && x.m == p_date.Month).ToList();
                #endregion

                foreach (var sales in sales_kv_data)
                {
                    #region MyRegion
                    var p = sales_settle_pre.FirstOrDefault(x => x.sales_no == sales.sales_no);
                    var md = new SettleDetail();

                    //加總子系KV值 且往下只探四層
                    var cal_kv_sum = sales.SettleCalSub
                        .Traverse(x => x.SettleCalSub)
                        .Where(x => x.share_level < sales.share_level + 4)
                        .Sum(x => x.KV);

                    md.settle_id = 1;
                    md.y = y;
                    md.m = m;

                    md.sales_no = sales.sales_no;
                    md.sales_name = sales.sales_name;
                    md.rank = sales.rank;

                    md.kv_p_sum = sales.KV;
                    md.kv_g_sum = cal_kv_sum;

                    var x1 = Convert.ToInt32(cal_kv_sum * 0.01);
                    var x2 = Convert.ToInt32(sales.KV * 0.75);

                    md.a = x1 > x2 ? x2 : x1;

                    if (p != null)
                    {
                        md.a_p = p.a;
                        md.b_p = p.b;
                    }
                    else
                    {
                        md.a_p = 0;
                        md.b_p = 0;
                    }

                    //計算本月累計回饋金
                    md.b = x2 + md.b_p - md.a_p;

                    //全部總KV
                    var total_kv = sales_kv_data.Sum(x => x.KV);
                    if (sales.rank == 1 || sales.rank == 2) //經理人獎金
                    {
                        var f = sales.SettleCalSub.Sum(x => x.KV) * 0.12;
                    }

                    if (sales.rank == 2) //營運中心
                    {

                    }

                    db0.SettleDetail.Add(md);

                    #endregion
                }

                db0.SaveChangesAsync().Wait();

                r.result = true;
                return r;
            }
            catch (Exception ex)
            {
                r.result = false;
                r.message = ex.Message;
                return r;
            }
            finally
            {
                db0.Dispose();
            }
        }