|
@@ -0,0 +1,341 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace app\index\controller;
|
|
|
+use think\Controller;
|
|
|
+use think\Db;
|
|
|
+use app\common\model\Wallet;
|
|
|
+
|
|
|
+class Plantask extends Controller
|
|
|
+{
|
|
|
+ public function index()
|
|
|
+ {
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ //确定用不到了
|
|
|
+ //10天不买的用户,第10天结算完,第11天自动滑落,上下级自动衔接
|
|
|
+ //该用户的所有下级,的推荐人,改成此人的上级。
|
|
|
+ public function auto_hualuo(){
|
|
|
+ $nowtime = time();
|
|
|
+ $toweek = date('w',$nowtime);
|
|
|
+ if($toweek == 1){
|
|
|
+ //周日不结算(自动到下周一),所以,周一不滑落
|
|
|
+ echo '周一不滑落';
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ //最后买东西是11天前了,intro_num在这里使用,减少查到的数据量
|
|
|
+ $tendays_ago = hualuo_tendays_ago();
|
|
|
+// echo $tendays_ago;
|
|
|
+ Db::startTrans();
|
|
|
+ $user = Db::name('user')->where('last_paytime','lt',$tendays_ago)->where('intro_num','gt',0)->lock(true)->find();
|
|
|
+
|
|
|
+ if(empty($user)){
|
|
|
+ echo '没有数据';
|
|
|
+ Db::rollback();
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+// dump($user);
|
|
|
+
|
|
|
+ //我的多个下级,的推荐人,改成我的上级。也就是跳过了我
|
|
|
+ $my_down = Db::name('user')->where('intro_uid',$user['id'])->select();
|
|
|
+// dump($my_down);
|
|
|
+ if(!empty($my_down)){
|
|
|
+ $new_intro_uid = $user['intro_uid'] ?: 0;
|
|
|
+ $rs_down = Db::name('user')->where('intro_uid',$user['id'])->update(['intro_uid'=>$new_intro_uid]);
|
|
|
+ if($rs_down === false){
|
|
|
+ Db::rollback();
|
|
|
+ $this->error('操作失败');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //记录个日志
|
|
|
+ $log = [
|
|
|
+ 'info' => '用户['.$user['id'].']滑落,其名下直推有['.implode(',',array_column($my_down,'id')).'],都改到其上级['.$user['intro_uid'].']名下',
|
|
|
+ 'createtime' => $nowtime,
|
|
|
+ ];
|
|
|
+ $log_id = Db::name('intro_log')->insertGetId($log);
|
|
|
+ if(!$log_id){
|
|
|
+ Db::rollback();
|
|
|
+ $this->error('操作失败');
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //提交
|
|
|
+ Db::commit();
|
|
|
+ echo '完成更新'.$user['id'];
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //推荐奖励
|
|
|
+ //订单支付回调之后的任务,每分钟运行
|
|
|
+ //烧伤
|
|
|
+ public function auto_order_paid(){
|
|
|
+
|
|
|
+ $map = [
|
|
|
+ 'status' => 1,
|
|
|
+ 'have_paid' => ['gt',0],
|
|
|
+ 'paidtasktime' => 0,
|
|
|
+ ];
|
|
|
+ $order_list = Db::name('unishop_order')->where($map)->order('id asc')->limit(10)->select();
|
|
|
+ if(empty($order_list)){
|
|
|
+ echo '没有数据';
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ Db::startTrans();
|
|
|
+ $walletmodel = new Wallet();
|
|
|
+
|
|
|
+ foreach($order_list as $key => $order){
|
|
|
+
|
|
|
+ //买家立刻得到积分
|
|
|
+ /*if($order['order_shouyi'] > 0){
|
|
|
+ $rs_wallet = $walletmodel->lockChangeAccountRemain($order['user_id'],'score',$order['order_shouyi'],5,'下单收益','unishop_order',$order['id'],$order['user_id']);
|
|
|
+ if($rs_wallet['status'] === false){
|
|
|
+ echo $rs_wallet['msg'];
|
|
|
+ Db::rollback();
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+ }*/
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //直推代理商获益
|
|
|
+ $intro_uid = Db::name('user')->where('id',$order['user_id'])->value('intro_uid');
|
|
|
+ if($intro_uid){
|
|
|
+
|
|
|
+ //直推的第一单金额,烧伤
|
|
|
+ $map = [
|
|
|
+ 'status' => 1,
|
|
|
+ 'have_paid' => ['gt',0],
|
|
|
+ 'user_id' => $intro_uid,
|
|
|
+ ];
|
|
|
+ $first_order = Db::name('unishop_order')->where($map)->order('have_paid asc')->value('order_price');
|
|
|
+ $first_order = $first_order ?: 0;
|
|
|
+
|
|
|
+ $jishu = $order['order_price'];
|
|
|
+ $remark_shaoshang = '';
|
|
|
+ if($first_order < $order['order_price']){
|
|
|
+ $jishu = $first_order;
|
|
|
+ $remark_shaoshang = '(烧伤)';
|
|
|
+ }
|
|
|
+
|
|
|
+ //奖励
|
|
|
+ $bili = config('site.orderpaid_zhitui_bili') ?: 5;
|
|
|
+ $score = bcdiv(bcmul($jishu,$bili,2),100,2);
|
|
|
+ if($score > 0){
|
|
|
+ $rs_wallet = $walletmodel->lockChangeAccountRemain($intro_uid,'score',$score,3,'直推代理奖励'.$remark_shaoshang,'unishop_order',$order['id'],$order['user_id']);
|
|
|
+ if($rs_wallet['status'] === false){
|
|
|
+ echo $rs_wallet['msg'];
|
|
|
+ Db::rollback();
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $score = 0;
|
|
|
+ //上上级
|
|
|
+ $top_uid = Db::name('user')->where('id',$intro_uid)->value('intro_uid');
|
|
|
+ if($top_uid){
|
|
|
+
|
|
|
+ //直推的第一单金额,烧伤
|
|
|
+ $map = [
|
|
|
+ 'status' => 1,
|
|
|
+ 'have_paid' => ['gt',0],
|
|
|
+ 'user_id' => $top_uid,
|
|
|
+ ];
|
|
|
+ $first_order = Db::name('unishop_order')->where($map)->order('have_paid asc')->value('order_price');
|
|
|
+ $first_order = $first_order ?: 0;
|
|
|
+
|
|
|
+ $jishu = $order['order_price'];
|
|
|
+ $remark_shaoshang = '';
|
|
|
+ if($first_order < $order['order_price']){
|
|
|
+ $jishu = $first_order;
|
|
|
+ $remark_shaoshang = '(烧伤)';
|
|
|
+ }
|
|
|
+
|
|
|
+ //奖励
|
|
|
+ $bili = config('site.orderpaid_jiantui_bili') ?: 1;
|
|
|
+ $score = bcdiv(bcmul($jishu,$bili,2),100,2);
|
|
|
+ if($score > 0){
|
|
|
+ $rs_wallet = $walletmodel->lockChangeAccountRemain($top_uid,'score',$score,4,'间推代理奖励'.$remark_shaoshang,'unishop_order',$order['id'],$order['user_id']);
|
|
|
+ if($rs_wallet['status'] === false){
|
|
|
+ echo $rs_wallet['msg'];
|
|
|
+ Db::rollback();
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //订单完成
|
|
|
+ $rs_order = Db::name('unishop_order')->where('id',$order['id'])->update(['paidtasktime'=>time()]);
|
|
|
+ if($rs_order === false){
|
|
|
+ echo '更新失败';
|
|
|
+ Db::rollback();
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ //循环结束
|
|
|
+ }
|
|
|
+
|
|
|
+ Db::commit();
|
|
|
+ echo '成功'.count($order_list);
|
|
|
+ }
|
|
|
+
|
|
|
+ //总代奖励
|
|
|
+ //自动结算10日前订单,每分钟运行
|
|
|
+ public function auto_jiesuan_order(){
|
|
|
+ $nowtime = time();
|
|
|
+ $toweek = date('w',$nowtime);
|
|
|
+ if($toweek == 0){
|
|
|
+ //周日不结算(自动到下周一结算)
|
|
|
+ echo '周日不结算';
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ $tendays_ago = jiesuan_tendays_ago();
|
|
|
+// echo $tendays_ago;exit;
|
|
|
+ //
|
|
|
+ Db::startTrans();
|
|
|
+ $order_map = [
|
|
|
+ 'status' => 1,
|
|
|
+ 'have_paid' => ['lt',$tendays_ago],
|
|
|
+ 'jiesuantime' => 0,
|
|
|
+ ];
|
|
|
+ $order = Db::name('unishop_order')->where($order_map)->where('have_paid','gt',0)->order('id asc')->lock(true)->find();
|
|
|
+ if(empty($order)){
|
|
|
+ echo '没有数据';
|
|
|
+ Db::rollback();
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+// dump($order);
|
|
|
+
|
|
|
+ //买家得到收益
|
|
|
+ if($order['order_shouyi'] > 0){
|
|
|
+ $rs_wallet = model('wallet')->lockChangeAccountRemain($order['user_id'],'score',$order['order_shouyi'],5,'下单收益','unishop_order',$order['id'],$order['user_id']);
|
|
|
+ if($rs_wallet['status'] === false){
|
|
|
+ echo $rs_wallet['msg'];
|
|
|
+ Db::rollback();
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //为上级做贡献,找到上级
|
|
|
+ $intro_uid = Db::name('user')->where('id',$order['user_id'])->value('intro_uid');
|
|
|
+ if(empty($intro_uid)){
|
|
|
+ echo '没有上级,结束';
|
|
|
+ Db::name('unishop_order')->where('id',$order['id'])->update(['jiesuantime'=>time()]);
|
|
|
+ Db::commit();
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取直推人数
|
|
|
+ $intro_count = Db::name('user')->where('intro_uid',$intro_uid)->count();
|
|
|
+// dump($intro_count);
|
|
|
+ //获取业绩
|
|
|
+ $yeji = $this->jiesuan_yeji($intro_uid);
|
|
|
+// dump($yeji);
|
|
|
+
|
|
|
+ //确定代理商等级,拿对应比例
|
|
|
+ $rule = $this->jiesuan_daili_level($intro_count,$yeji);
|
|
|
+ if($rule['bili'] == 0){
|
|
|
+ echo '达不到第一级,结束';
|
|
|
+ Db::name('unishop_order')->where('id',$order['id'])->update(['jiesuantime'=>time()]);
|
|
|
+ Db::commit();
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+// dump($rule);
|
|
|
+
|
|
|
+ //给直推
|
|
|
+ $score = bcdiv(bcmul($order['order_shouyi'],$rule['bili'],2),100,2);
|
|
|
+// dump($score);
|
|
|
+ if($score > 0){
|
|
|
+ $rs_wallet = model('wallet')->lockChangeAccountRemain($intro_uid,'score',$score,6,$rule['level'].'级代理','unishop_order',$order['id'],$order['user_id']);
|
|
|
+ if($rs_wallet['status'] === false){
|
|
|
+ echo $rs_wallet['msg'];
|
|
|
+ Db::rollback();
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //给间推
|
|
|
+ if($rule['level'] == 1){ //一级代理要有间推
|
|
|
+
|
|
|
+ $two_intro_uid = Db::name('user')->where('id',$intro_uid)->value('intro_uid');//上上级id
|
|
|
+ if($two_intro_uid > 0){
|
|
|
+ $two_intro_count = Db::name('user')->where('intro_uid',$two_intro_uid)->count();//上上级的直推
|
|
|
+// $two_yeji = $this->jiesuan_yeji($two_intro_uid);//上上级的业绩
|
|
|
+ if($two_intro_count >= $rule['intronum']){//>=5个才能拿。上上级的业绩肯定比上级高,如果大于等于五个,就同级了,因为极差,反而拿不到,这里很矛盾。除非重新计算上上级的等级
|
|
|
+ $score_2 = $score;//目前是一样的,不再次计算了
|
|
|
+ if($score_2 > 0){
|
|
|
+ $rs_wallet = model('wallet')->lockChangeAccountRemain($two_intro_uid,'score',$score_2,7,$rule['level'].'级代理(间推)','unishop_order',$order['id'],$order['user_id']);
|
|
|
+ if($rs_wallet['status'] === false){
|
|
|
+ echo $rs_wallet['msg'];
|
|
|
+ Db::rollback();
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //标记为结算
|
|
|
+ $jiesuan = Db::name('unishop_order')->where('id',$order['id'])->update(['jiesuantime'=>$nowtime]);
|
|
|
+ if($jiesuan === false){
|
|
|
+ echo '修改状态失败';
|
|
|
+ Db::rollback();
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+ //批发的都卖出
|
|
|
+ $pifa = Db::name('unishop_order_product')->where('order_id',$order['id'])->update(['pifa_status'=>1]);
|
|
|
+ if($pifa === false){
|
|
|
+ echo '修改状态失败2';
|
|
|
+ Db::rollback();
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ Db::commit();
|
|
|
+ echo '完成'.$order['id'];
|
|
|
+ }
|
|
|
+ //获取业绩
|
|
|
+ private function jiesuan_yeji($user_id){
|
|
|
+ //找到所有下级
|
|
|
+ //$user_ids = Db::name('user')->where('find_in_set(:intro_ids,intro_ids)', ['intro_ids' => $user_id])->column('id');
|
|
|
+ $commonuser = new \app\common\model\User();
|
|
|
+ $user_ids = $commonuser->my_down_all($user_id,[$user_id]);
|
|
|
+// dump($user_ids);
|
|
|
+
|
|
|
+ if(empty($user_ids)){
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ $map = [
|
|
|
+ 'status' => 1,
|
|
|
+ 'have_paid' => ['gt',0],
|
|
|
+ 'user_id' => ['IN',$user_ids],
|
|
|
+ ];
|
|
|
+ $yeji = Db::name('unishop_order')->where($map)->sum('order_price');
|
|
|
+ return $yeji;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //确认代理等级及规则
|
|
|
+ private function jiesuan_daili_level($intronum,$yeji){
|
|
|
+
|
|
|
+ $data = Db::name('zongdai')->order('id asc')->select();
|
|
|
+// dump($data);
|
|
|
+
|
|
|
+ $return = $data[0]; //默认第0个
|
|
|
+ foreach($data as $key => $rule){
|
|
|
+ if($intronum >= $rule['intronum'] && $yeji >= $rule['yeji']){
|
|
|
+ $return = $rule;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return $return;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|