三级分销,不管是一级分销,二级分销,还是三级分销。都是根据三级分销来做的。
相关数据库:
user(用户表): 需要添加 '冻结佣&金、可提佣&金、已提佣&金、一级会员、二级会员、三级会员' 字段
CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `pid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '父ID', `nickname` varchar(50) NOT NULL DEFAULT '' COMMENT '昵称', `head` varchar(200) NOT NULL DEFAULT '' COMMENT '头像 从小程序获取', `mobile` varchar(11) NOT NULL DEFAULT '' COMMENT '手机号', `email` varchar(50) NOT NULL DEFAULT '', `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '用户金额', `total_amount` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '消费累计', `reg_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间', `openid` varchar(200) NOT NULL DEFAULT '' COMMENT '微信验证后返回openid', `token` varchar(32) NOT NULL DEFAULT '', `token_time` int(10) unsigned NOT NULL DEFAULT '0', `money_frozen` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '冻结佣&金', `money_cash` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '可提佣&金', `money_cashed` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '已提佣&金', `first_member` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '一级会员', `second_member` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '二级会员', `third_member` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '三级会员', PRIMARY KEY (`id`) USING BTREE ) ENGINE=MyISAM AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
user_relation(用户关系表):
CREATE TABLE `fox_user_relation` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `pid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '上级用户id' , `level` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '当前用户是上级用户的几级分销' , `uid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户id', PRIMARY KEY (`id`) USING BTREE ) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;
distribute(分销订单表):
CREATE TABLE `distribute` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `order_sn` varchar(20) NOT NULL DEFAULT '' COMMENT '订单号', `uid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID', `buyer_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '买家ID', `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '佣&金', `money_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '获佣时间', `state` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '佣&金状态 0未付 1已冻结 2解除冻结', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
money_apply(用户佣&金可提表):
CREATE TABLE `fox_money_apply` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `uid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID', `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '可提金额', `alipay_account` varchar(50) NOT NULL DEFAULT '' COMMENT '支付宝账号', `alipay_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '支付宝姓名', `apply_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '申请时间', `state` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '审核状态 0审核中 1已打款', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
几张表的关系
// 分销系统大体流程
// 用户下&单-未支付:后台开启分销功能,此用户有上级,分销订单表增加记录,最多三条,状态为未付
// 支付成功:后台开启分销功能,此用户有上级,改分销订单表中状态为已冻结,用户表更新冻结佣&金
// 确认收货:用户表冻结佣&金转可提佣&金和分销订单表状态改为解除冻结
// 用户提=现:增加可提表一条记录,修改用户表信息
当用户注册时:判断用户是否是其他用户推荐注册的,如果是,在用户关系表(user_relation)中生成多则三条少则一条的用户关系数据。
获取当前用户的上级用户的一级上级和二级上级。如果存在则添加对应的数据:如用户(uid)11,
// 用户下&单-未支付:后台开启分销功能,此用户有上级,分销订单表(distribute)增加记录,最多三条,状态为未付
当用户11下订单后,寻找他的一级上级,二级上级,三级上级,存在则添加记录,根据不同的等级佣&金比例得到佣&金值。
// 支付成功:后台开启分销功能,此用户有上级,改分销订单表(distribute)中状态为已冻结,用户表(user)更新冻结佣&金
if($res = $this->checkDistribute($uid)){//判断后台是否开启分销并且用户是否有上级 Db::name('distribute')->where('order_sn', $order['order_sn'])->update(['state'=>1]); // 获取用户ID和对应佣&金 $dis_data = Db::name('distribute')->where('order_sn', $order['order_sn'])->column('uid,money'); //更新用户表冻结佣&金 foreach ($dis_data as $key => $value) { Db::name('user')->where('id', $key)->setInc('money_frozen', $value); } }
//确认收货:用户表冻结佣&金转可提佣&金和分销订单表状态改为解除冻结
if($res = $this->checkDistribute($uid)){//判断后台是否开启分销并且用户是否有上级 //获取订单号 $order_sn = Db::name('order')->where('id',$oid)->value('order_sn'); // 更新分销订单表状态改为解除冻结 Db::name('distribute')->where('order_sn', $order_sn)->update(['state'=>2]); // 获取用户ID和对应佣&金 $dis_data = Db::name('distribute')->where('order_sn', $order_sn)->column('uid,money'); //更新用户表冻结佣&金转可提佣&金 foreach ($dis_data as $key => $value) { Db::name('user')->where('id', $key)->setDec('money_frozen', $value); Db::name('user')->where('id', $key)->setInc('money_cash', $value); } }
//用户提:增加可提表一条记录,修改用户表信息
当用户可提时:1、先判断用户登录状态 。2、获取用户可提金额。3、获取最低可提金额。4、判断是否可体现,5、可提,用户表可提金额减少,已提金额增加。6、增加一条提记录