//计算佣金
        protected void Count_Btn_Click(object sender, EventArgs e)
        {
            depDT = depBll.SelSumByUid();
            M_User_UnitWeek unitMod = SelAMount(STime);

            MyBind();
        }
 /// <summary>
 /// 1,根据提供的消费数据,递归按用户生成二叉树消费链表,并计算出提成
 /// 2,该方法用于提供后面所需要的逻辑判断的所有数据
 /// </summary>
 /// <param name="dt">需要统计的消费数据:ZL_User_Consume</param>
 /// <param name="pmodel">父模型,可使用一个空的UserID为零的模型,以此作为根</param>
 /// <return>pmodel中的是自己的层级链表,unitList是全数据链接,用于筛选等逻辑</return>
 public void CreateTree(DataTable dt, M_User_UnitWeek pmodel)
 {
     DataRow[] child = null;
     if (pmodel.UserID > 0)
     {
         child = dt.Select("ParentUserID='" + pmodel.UserID + "'");
     }
     else
     {
         //无推荐人
         child = dt.Select("ParentUserID='' OR ParentUserID IS Null OR ParentUserID='0'");
     }
     foreach (DataRow dr in child)
     {
         //返回如下的几个值,金额和分红,子用户详情
         M_User_UnitWeek model = new M_User_UnitWeek()
         {
             CDate = pmodel.CDate
         };
         model.UserID   = Convert.ToInt32(dr["UserID"]);
         model.UserName = DataConvert.CStr(dr["UserName"]);
         model.PUserID  = DataConvert.CLng(dr["ParentUserID"]);
         model.AMount   = DataConvert.CDouble(dr["AMount"]); //不能用Clng否转换失败
         model.GroupID  = Convert.ToInt32(dr["GroupID"]);
         model.Level    = (pmodel.Level + 1);                //注意对用户来说是相对,而不是绝对的
         model.PModel   = pmodel;
         CreateTree(dt, model);                              //递归树顶,从树顶回朔运算
                                                             //不需要统计业绩金额,每层都回朔
                                                             //pmodel.ChildAMount += model.AMount + model.ChildAMount;//业绩金额汇总
                                                             //-------本级可用于提成的金额汇总(需计算后才是真正的提成)
                                                             //pmodel.ChildUnit0 += model.AMount + model.Unit0;
                                                             //pmodel.ChildUnit10 += model.Unit10;
                                                             //pmodel.ChildUnit20 += model.Unit20;
                                                             //pmodel.ChildUnit30 += model.Unit30;
                                                             //pmodel.ChildIDS += model.UserID + "," + model.ChildIDS; model.ChildIDS = "";//下级所有子用户IDS
                                                             //-------下级子会员组别统计(存入GroupID)
                                                             //pmodel.ChildGroupIDS = Arr_Merge(pmodel.ChildGroupIDS, model.ChildGroupIDS, model.GroupID);
                                                             //-------其他
         pmodel.child.Add(model);
         unitList.Add(model);
     }//二叉树 end;
     #region 提成计算区
     if (pmodel.AMount > 0)
     {
         CountUnit(pmodel, pmodel.PModel);
     }
     #endregion
     if (pmodel != null)//插入提成记录,用户
     {
         //unitWeekBll.Insert(pmodel);
         //sumBll.UpdateUnit(pmodel, percent, pmodel.CDate);
     }
 }
        //按用户分红记录,依据此来计算分红
        public M_User_UnitWeek SelAMount(DateTime time)
        {
            unitList.Clear();
            DataTable       sumdt = SelForUnitByTime();
            M_User_UnitWeek model = new M_User_UnitWeek()
            {
                CDate = time, Level = 0
            };

            CreateTree(sumdt, model);
            return(model);
        }
Esempio n. 4
0
        //更新分成金额
        public void UpdateUnit(M_User_UnitWeek pmodel, double percent, DateTime time)
        {
            string stime, etime; B_User_UnitWeek.GetWeekSE(time, out stime, out etime);

            SqlParameter[] sp = new SqlParameter[] { new SqlParameter("stime", stime), new SqlParameter("etime", etime), new SqlParameter("remind", DateTime.Now) };
            if (pmodel.PUserID == 0 && !string.IsNullOrEmpty(pmodel.ChildIDS.Replace(",", "")))
            {
                pmodel.ChildIDS = pmodel.ChildIDS.Trim(',');
                string sql = "Update " + TbName + " Set UnitPercent=" + percent + ",UnitAmount=AMount*" + percent + ",Remind=@remind Where UserID IN(" + pmodel.ChildIDS + ") And CDate BetWeen @stime AND @etime";
                SqlHelper.ExecuteSql(sql, sp);
            }
        }
Esempio n. 5
0
        public void MyBind()
        {
            M_User_UnitWeek conMod = unitWeekBll.SelReturnModel(Pid);

            DataTable dt = SelByPid(Flow, string.IsNullOrEmpty(conMod.ChildIDS) ? "-1" : conMod.ChildIDS);

            EGV.DataSource = dt;
            EGV.DataBind();
            Call.SetBreadCrumb(Master, "<li><a href='UserManage.aspx'>会员管理</a></li><li><a href='UnitMain.aspx?stime=" + conMod.CDate + "'>会员提成_汇总</a></li><li><a href='" + Request.RawUrl + "'>会员提成_流水</a></li>");
            if (dt != null && dt.Rows.Count > 0)
            {
                TotalAmount_sp.InnerText = Convert.ToDouble(dt.Compute("sum(AMount)", "true")).ToString("0.00");
                TotalUnit_sp.InnerText   = Convert.ToDouble(dt.Compute("sum(RealUnit)", "true")).ToString("0.00");
            }
        }
Esempio n. 6
0
 //用于升级的树,仅用于统计业绩
 public void CreateUpTree(DataTable dt, M_User_UnitWeek pmodel)
 {
     DataRow[] child = null;
     if (pmodel.UserID > 0)
     {
         child = dt.Select("ParentUserID='" + pmodel.UserID + "'");
     }
     else
     {
         //无推荐人
         child = dt.Select("ParentUserID='' OR ParentUserID IS Null OR ParentUserID='0'");
     }
     foreach (DataRow dr in child)
     {
         //返回如下的几个值,金额和分红,子用户详情
         M_User_UnitWeek model = new M_User_UnitWeek()
         {
             CDate = pmodel.CDate
         };
         model.UserID   = Convert.ToInt32(dr["UserID"]);
         model.UserName = DataConvert.CStr(dr["UserName"]);
         model.PUserID  = DataConvert.CLng(dr["ParentUserID"]);
         model.AMount   = DataConvert.CDouble(dr["AMount"]);//不能用Clng否转换失败
         model.GroupID  = Convert.ToInt32(dr["GroupID"]);
         //model.childUser.Add(new M_TempUser(dr));
         model.PModel = pmodel;
         model.Level  = (pmodel.Level + 1);                      //注意对用户来说是相对,而不是绝对的
         CreateUpTree(dt, model);                                //递归树顶,从树顶回朔运算
         pmodel.ChildAMount += model.AMount + model.ChildAMount; //业绩金额汇总
                                                                 //-------本级可用于提成的金额汇总(需计算后才是真正的提成)
         pmodel.ChildUnit0  += model.AMount + model.Unit0;
         pmodel.ChildUnit10 += model.Unit10;
         pmodel.ChildUnit20 += model.Unit20;
         pmodel.ChildUnit30 += model.Unit30;
         //pmodel.ChildIDS += model.UserID + "," + model.ChildIDS; model.ChildIDS = "";//下级所有子用户IDS
         //-------下级子会员组别统计(存入GroupID)
         //pmodel.ChildGroupIDS = Arr_Merge(pmodel.ChildGroupIDS, model.ChildGroupIDS, model.GroupID);
         pmodel.childUser.AddRange(model.childUser);
         pmodel.childUser.Add(new M_ConsumeUser(dr));
         //-------其他
         pmodel.child.Add(model);
         consumeList.Add(model);
     }
 }
Esempio n. 7
0
        /// <summary>
        /// 按用户计算出本周的计录,用于计算提成(是否不需要重复计算?)
        /// 并生成分红记录写入数据表中
        /// </summary>
        /// <param name="time">时间</param>
        /// <returns></returns>
        public M_User_UnitWeek SelAMount(DateTime time)
        {
            consumeList.Clear();
            DataTable       sumdt = sumBll.SelByTime();
            M_User_UnitWeek model = new M_User_UnitWeek()
            {
                CDate = time, Level = 0
            };

            CreateTree(sumdt, model);
            //抽出所有的股东,再对其进行一次总业绩的1%加权分红
            List <M_User_UnitWeek> holderList = consumeList.Where(p => p.GroupID == (int)Level.StockHolder).ToList();

            if (holderList.Count > 0)
            {
                double allmoney = consumeList.Sum(p => p.AMount);
                double bonus    = (allmoney * 0.01) / holderList.Count;
                foreach (M_User_UnitWeek holder in holderList)
                {
                    holder.Bonus = bonus;
                }
            }
            return(model);
        }
        /// <summary>
        /// 递归最多20层分配用户的分红,每次分红都产生一条数据库记录
        /// </summary>
        /// <param name="startMod">起始模型,有分红数据,层次等信息</param>
        /// <param name="model">开始计算的模型,传值为 pmodel</param>
        /// <param name="dep">深度,从0开始</param>
        private void CountUnit(M_User_UnitWeek startMod, M_User_UnitWeek model)
        {
            int curLevel = (startMod.Level - model.Level);//起始层与现在层的层级差

            //根据层级,用户的投资额,计算出用户的分红比率,存入unit0中
            DataRow[] drs = depDT.Select("UserID=" + model.UserID);
            if (drs.Length > 1)
            {
                throw new Exception(model.UserID + "异常,同一用户出现多个数值");
            }
            if (drs.Length > 0)//如果有存值存在(现记录),则记算分红
            {
                double    bonus = 0, curper = 0;
                double    per2 = 0.02, per5 = 0.05, per10 = 0.10;
                M_Deposit depMod = new M_Deposit().GetModelFromUnit(drs[0]);
                if (false)//预留给IB,最大20层
                {
                }
                else if (depMod.Money >= 50000)//15层
                {
                    if (curLevel <= 5)
                    {
                        curper = per10;
                    }
                    else if (curLevel <= 10)
                    {
                        curper = per5;
                    }
                    else if (curLevel <= 15)
                    {
                        curper = per2;
                    }
                }
                else if (depMod.Money >= 10000)
                {
                    if (curLevel <= 5)
                    {
                        curper = per10;
                    }
                    else if (curLevel <= 10)
                    {
                        curper = per5;
                    }
                }
                else if (depMod.Money > 1000)
                {
                    if (curLevel <= 5)
                    {
                        curper = per10;
                    }
                }
                else//不给予分红
                {
                }
                bonus = startMod.AMount * curper;
                //分红计算完毕,如有值,写入记录
                if (bonus > 0)
                {
                    M_PromoBonus promoMod = new M_PromoBonus();
                    promoMod.AMount    = startMod.AMount;
                    promoMod.MyLevel   = curLevel;
                    promoMod.Unit      = bonus;
                    promoMod.UserID    = model.UserID;
                    promoMod.UserName  = model.UserName;
                    promoMod.SUserID   = startMod.UserID;
                    promoMod.SUserName = startMod.UserName;
                    //托管理财金额
                    promoMod.Remark = "金额:" + depMod.Money + ",分红:" + startMod.AMount.ToString("f0") + ",层级:" + curLevel + ",佣金比率:" + curper.ToString("f2") + ",佣金:" + bonus;
                    DataRow dr = promoMod.ModelToDR(promoStruct);
                    promoBll.Insert(dr);
                }
            }
            //ZLLog.L(ZLEnum.Log.safe, model.PUserID + ":" + (model.PModel == null) + ":" + (startMod.Level - model.Level));
            //出口
            if (model.PUserID == 0 || model.PModel == null || (startMod.Level - model.Level) > 20)
            {
                return;
            }
            CountUnit(startMod, model.PModel);
        }
Esempio n. 9
0
        // 升级用户,升级完成后,需要重新获取一次数据
        public void UpdateUser()
        {
            //string logTlp = "用户:{0}升级,升级前:{1},升级后:{2}";
            consumeList.Clear();
            DataTable       sumdt = sumBll.SelByTime();//业绩记录表
            M_User_UnitWeek model = new M_User_UnitWeek()
            {
                CDate = DateTime.Now
            };

            CreateUpTree(sumdt, model);
            //-------------开始升级
            DataTable userdt = buser.Sel();

            DataRow[] userdrs = userdt.Select("GroupID=" + (int)Level.User);
            for (int i = 0; i < userdrs.Length; i++)
            {
                DataRow                dr     = userdrs[i];
                M_UserInfo             mu     = new M_UserInfo().GetModelFromReader(dr);
                List <M_User_UnitWeek> myList = consumeList.Where(p => p.PUserID == mu.UserID).ToList();
                bool upflag = false;
                #region 普通会员升经理
                int line        = 100 * 10000;//必须到100W
                int bigManCount = myList.Where(p => (p.AMount + p.ChildAMount) >= line).ToArray().Length;
                //必须有最少一个,超过100W的大部门下级
                if (bigManCount < 1)
                {
                    continue;
                }
                else if (bigManCount >= 2)//超过两个用户达到了100W,直接升级
                {
                    upflag = true;
                }
                else //拥有1个大部门情况下,判断小部门(未满100W的部门)合计是否达到了100W
                {
                    double allmoney = myList.Where(p => (p.AMount + p.ChildAMount) < line).ToList().Sum(p => (p.ChildAMount + p.AMount));
                    if (allmoney >= line)
                    {
                        upflag = true;
                    }
                }
                if (upflag)
                {
                    //检测用户是否普通用户,避免错升
                    if (mu.GroupID == (int)Level.User)
                    {
                        mu.GroupID = (int)Level.Manager;
                        buser.UpDateUser(mu);
                        dr["GroupID"] = mu.GroupID;//参加下一级运算
                        UpdateTemp(model.childUser, mu.UserID, Level.Manager);
                    }
                }
                #endregion
            }
            //-----------------------------
            userdrs = userdt.Select("GroupID=" + (int)Level.Manager);
            for (int i = 0; i < userdrs.Length; i++)
            {
                DataRow dr = userdrs[i];
                //相对于上方不同的在于,需要统计下线(所有级中是否有人达到需求)
                M_UserInfo      mu      = new M_UserInfo().GetModelFromReader(dr);
                M_User_UnitWeek selfMod = consumeList.Where(p => p.UserID == mu.UserID).ToList()[0];
                #region 经理升级为总监(两名经理)
                //int count = selfMod.ChildGroupIDS.Where(p => p >= (int)Level.Manager).ToArray().Length;
                int count = selfMod.childUser.Where(p => p.GroupID >= (int)Level.Manager).ToList().Count;
                if (count >= 2)
                {
                    if (mu.GroupID == (int)Level.Manager)
                    {
                        mu.GroupID = (int)Level.Supervisor;
                        UpdateTemp(model.childUser, mu.UserID, Level.Supervisor);
                        dr["GroupID"] = mu.GroupID;
                        buser.UpDateUser(mu);
                    }
                }
                #endregion
            }
            userdrs = userdt.Select("GroupID=" + (int)Level.Supervisor);
            for (int i = 0; i < userdrs.Length; i++)
            {
                DataRow         dr      = userdrs[i];
                M_UserInfo      mu      = new M_UserInfo().GetModelFromReader(dr);
                M_User_UnitWeek selfMod = consumeList.Where(p => p.UserID == mu.UserID).ToList()[0];
                #region 总监升级为总裁(两名总监,一名经理级别以上)
                int supCount    = selfMod.childUser.Where(p => p.GroupID >= (int)Level.Supervisor).ToList().Count;
                int manageCount = selfMod.childUser.Where(p => p.GroupID == (int)Level.Manager).ToList().Count;
                //int supCount = selfMod.ChildGroupIDS.Where(p => p >= (int)Level.Supervisor).ToArray().Length;
                //int manageCount = selfMod.ChildGroupIDS.Where(p => p == (int)Level.Manager).ToArray().Length;
                if (supCount >= 3 || (supCount == 2 && manageCount > 1))
                {
                    if (mu.GroupID == (int)Level.Supervisor)
                    {
                        mu.GroupID = (int)Level.ChairMan;
                        buser.UpDateUser(mu);
                        UpdateTemp(model.childUser, mu.UserID, Level.ChairMan);
                        dr["GroupID"] = mu.GroupID;
                    }
                }
                #endregion
            }
            userdrs = userdt.Select("GroupID=" + (int)Level.Supervisor);
            for (int i = 0; i < userdrs.Length; i++)
            {
                DataRow         dr      = userdrs[i];
                M_UserInfo      mu      = new M_UserInfo().GetModelFromReader(dr);
                M_User_UnitWeek selfMod = consumeList.Where(p => p.UserID == mu.UserID).ToList()[0];
                #region 总裁升级为股东(仅需一名总裁)
                //int count = selfMod.ChildGroupIDS.Where(p => p >= (int)Level.ChairMan).ToArray().Length;
                int count = selfMod.childUser.Where(p => p.GroupID >= (int)Level.ChairMan).ToArray().Length;
                if (count >= 1)
                {
                    if (mu.GroupID == (int)Level.ChairMan)
                    {
                        mu.GroupID = (int)Level.StockHolder;
                        buser.UpDateUser(mu);
                        UpdateTemp(model.childUser, mu.UserID, Level.StockHolder);
                        dr["GroupID"] = mu.GroupID;
                    }
                }
                #endregion
            }
        }
Esempio n. 10
0
        /// <summary>
        /// 1,根据提供的消费数据,递归按用户生成二叉树消费链表,并计算出提成
        /// 2,该方法用于提供后面所需要的逻辑判断的所有数据
        /// </summary>
        /// <param name="dt">需要统计的消费数据:ZL_User_Consume</param>
        /// <param name="pmodel">父模型,可使用一个空的UserID为零的模型,以此作为根</param>
        /// <return>pmodel中的是自己的层级链表,consumeList是全数据链接,用于筛选等逻辑</return>
        public void CreateTree(DataTable dt, M_User_UnitWeek pmodel)
        {
            DataRow[] child = null;
            if (pmodel.UserID > 0)
            {
                child = dt.Select("ParentUserID='" + pmodel.UserID + "'");
            }
            else
            {
                //无推荐人
                child = dt.Select("ParentUserID='' OR ParentUserID IS Null OR ParentUserID='0'");
            }
            foreach (DataRow dr in child)
            {
                //返回如下的几个值,金额和分红,子用户详情
                M_User_UnitWeek model = new M_User_UnitWeek()
                {
                    CDate = pmodel.CDate
                };
                model.UserID   = Convert.ToInt32(dr["UserID"]);
                model.UserName = DataConvert.CStr(dr["UserName"]);
                model.PUserID  = DataConvert.CLng(dr["ParentUserID"]);
                model.AMount   = DataConvert.CDouble(dr["AMount"]);//不能用Clng否转换失败
                model.GroupID  = Convert.ToInt32(dr["GroupID"]);
                model.PModel   = pmodel;
                model.Level    = (pmodel.Level + 1);                    //注意对用户来说是相对,而不是绝对的
                CreateTree(dt, model);                                  //递归树顶,从树顶回朔运算
                pmodel.ChildAMount += model.AMount + model.ChildAMount; //业绩金额汇总
                                                                        //-------本级可用于提成的金额汇总(需计算后才是真正的提成)
                pmodel.ChildUnit0  += model.AMount + model.Unit0;
                pmodel.ChildUnit10 += model.Unit10;
                pmodel.ChildUnit20 += model.Unit20;
                pmodel.ChildUnit30 += model.Unit30;
                //pmodel.ChildIDS += model.UserID + "," + model.ChildIDS; model.ChildIDS = "";//下级所有子用户IDS,用于查看业绩流水记录
                //-------下级子会员组别统计(存入GroupID)
                pmodel.childUser.AddRange(model.childUser);
                pmodel.childUser.Add(new M_ConsumeUser(dr));
                //pmodel.ChildGroupIDS = Arr_Merge(pmodel.ChildGroupIDS, model.ChildGroupIDS, model.GroupID);
                //-------其他
                pmodel.child.Add(model);
                consumeList.Add(model);
            }
            #region 提成计算区,根据不同的逻辑此块更改
            //经理:1%,总监:最大2%,总裁:最大3%,股东:最大3%,另有业绩加权分红1%(平分给所有股东)
            switch ((Level)pmodel.GroupID)
            {
            case Level.User:
                pmodel.RealUnit0 = pmodel.ChildUnit30 + pmodel.ChildUnit20 + pmodel.ChildUnit10 + pmodel.ChildUnit0;
                pmodel.Unit0     = pmodel.ChildUnit0;
                pmodel.Unit10    = pmodel.ChildUnit10;
                pmodel.Unit20    = pmodel.ChildUnit20;
                pmodel.Unit30    = pmodel.ChildUnit30;
                break;

            case Level.Manager:    //提成1%
                pmodel.RealUnit10 = pmodel.ChildUnit0;
                pmodel.RealUnit0  = pmodel.ChildUnit30 + pmodel.ChildUnit20 + pmodel.ChildUnit10;

                pmodel.Unit10 = pmodel.ChildUnit0 + pmodel.ChildUnit10;
                pmodel.Unit20 = pmodel.ChildUnit20;
                pmodel.Unit30 = pmodel.ChildUnit30;
                break;

            case Level.Supervisor:
                pmodel.RealUnit20 = pmodel.ChildUnit0;
                pmodel.RealUnit10 = pmodel.ChildUnit10;
                pmodel.RealUnit0  = pmodel.ChildUnit30 + pmodel.ChildUnit20;

                pmodel.Unit20 = pmodel.ChildUnit0 + pmodel.ChildUnit10 + pmodel.ChildUnit20;
                pmodel.Unit30 = pmodel.ChildUnit30;
                break;

            case Level.ChairMan:
            case Level.StockHolder:
                pmodel.RealUnit30 = pmodel.ChildUnit0;
                pmodel.RealUnit20 = pmodel.ChildUnit10;
                pmodel.RealUnit10 = pmodel.ChildUnit20;
                pmodel.RealUnit0  = pmodel.ChildUnit30;
                //提成后的值转换提成比较,这样更上一级便不会重复计算提成
                pmodel.Unit30 = pmodel.ChildUnit0 + pmodel.ChildUnit10 + pmodel.ChildUnit20 + pmodel.ChildUnit30;
                break;
            }
            #endregion
            if (pmodel != null)//插入提成记录,用户
            {
                unitWeekBll.Insert(pmodel);
                //sumBll.UpdateUnit(pmodel, percent, pmodel.CDate);
            }
        }