//计算佣金 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); }
//更新分成金额 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); } }
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"); } }
//用于升级的树,仅用于统计业绩 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); } }
/// <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); }
// 升级用户,升级完成后,需要重新获取一次数据 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 } }
/// <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); } }