<?php

namespace app\api\controller;

use app\common\controller\Api;
use think\Db;
use app\utils\RedisUtil;
/**
 * 示例接口
 */
class Demo extends Api
{

    //如果$noNeedLogin为空表示所有接口都需要登录才能请求
    //如果$noNeedRight为空表示所有接口都需要验证权限才能请求
    //如果接口已经设置无需登录,那也就无需鉴权了
    //
    // 无需登录的接口,*表示全部
    protected $noNeedLogin = ['*'];
    // 无需鉴权的接口,*表示全部
    protected $noNeedRight = ['test2'];

    /**
     * 测试方法
     *
     * @ApiTitle    (测试名称)
     * @ApiSummary  (测试描述信息)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/demo/test/id/{id}/name/{name})
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="id", type="integer", required=true, description="会员ID")
     * @ApiParams   (name="name", type="string", required=true, description="用户名")
     * @ApiParams   (name="data", type="object", sample="{'user_id':'int','user_name':'string','profile':{'email':'string','age':'integer'}}", description="扩展数据")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", sample="{'user_id':'int','user_name':'string','profile':{'email':'string','age':'integer'}}", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function test()
    {
        $total_amount = 1000;  //消费额
        $back_rate = 10;            //商家比例
        $user_id = 1;             //消费者id
        $shop_id = 1;            //门店id
        $this->task_bill($total_amount,$back_rate,$user_id,$shop_id,'hotel_order');
    }

    /**
     * 40期限 数据模拟
     * @return void
     */
    public function fenhong40()
    {
        $jishu = !empty(input('js')) ? input('js') : rand(100,99999);// 最初基数
        $rlbl = !empty(input('rl')) ? input('rl') : rand(3,20);// 让利比例,3-20;单位 %
        $qi = !empty(input('qi')) ? input('qi') : 40;// 期数
        $mqzz = !empty(input('sz')) ? input('sz') : 1.15;// 每期上涨金额倍数


        echo "<style>table{border-collapse: collapse;border:1px solid #ccc;font-size: 14px;margin: 0 auto} tbody{font-size: 12px} th,td{padding: 2px} td{text-align: right} tr:hover{background: #ebf1e7} .bg{background: #e5f5dd}</style>";
        echo "<table border='1px'><thead>
            <tr>
                  <th width='50'>期数</th>
                  <th width='100'>消费(元)</th>
                  <th width='100'>让利比例(%)</th>
                  <th width='100'>让利(元)</th>
                  <th width='100'>商家5倍积分</th>
                  <th width='100'>用户5倍积分</th>
                  <th width='110'>发放40%(元)</th>
                  <th width='100'>商家得</th>
                  <th width='100'>用户得</th>
                  <th width='100'>累计总得</th>
            </tr>
        </thead><tbody>";

//        $arr = [];
        $z = 0;
        for ($i = 1; $i <= $qi; $i++) {
            $sj5b = bcmul($jishu, 5,2);
            $ff40 = bcmul($jishu,'0.01',2);
            $ff402 = bcdiv($ff40,'2',2);
            $xf = bcmul($jishu,$rlbl,2);
            $z = bcadd($z,$ff402,2);
            $class = $i%2 == 1 ? 'bg' : '';
            echo "<tr class='{$class}'><td style='text-align: center'>{$i}</td><td>{$xf}</td><td>{$rlbl}</td><td>{$jishu}</td><td>{$sj5b}</td><td>{$sj5b}</td><td>{$ff40}</td><td>{$ff402}</td><td>{$ff402}</td><td>{$z}</td></tr>";
            //$arr[] = "第{$i}期————消费:{$xf}元—————让利:{$jishu}元—————商家5倍积分:{$sj5b}—————用户5倍积分:{$sj5b}—————发放40%1期:{$ff40}—————商家得:{$ff402}—————用户得:{$ff402}————总得:{$z}";
            $jishu = bcmul($jishu,$mqzz,2);
        }
        echo "</tbody></table>";
    }


    /*
     * 订单额,返利比例
     * $total_amount : 订单金额 ,需要计算的订单金额
     * $back_rate : 各店铺设置的返佣比例 3-20%
     * $user_id : 下单用户id
     * $shop_id : 店铺id
     * $table_name : hotel_order , hotel_canteen_order , university_event_apply , offline_shop_order
     * */
    public function task_bill($total_amount,$back_rate,$user_id,$shop_id,$table_name)
    {
        //3-20%
        $amount = bcdiv(bcmul($total_amount,$back_rate,4),100,2);

        //5倍
//        $back_double = config('site.back_double');
//        $amount = bcmul($amount,$back_double,2);

        //商务 + 锁客 + 网体 + 省代 + 市代 + 区代 = 40% (大约40%,具体看多少看各级配置)

        //商务 发给门店的上级  收益
        $shangwu_rate = config('site.back_shangwu');
        $shangwu_amount = bcdiv(bcmul($amount,$shangwu_rate,4),100,2);

        $shop_info = (new \app\common\business\PaymentBusiness)->getShopInfo($table_name,$shop_id);
        if($shop_info && $shop_info['invite_id'] && $shangwu_amount > 0){
            //发钱给 $shop_info['invite_id']

        }

        //锁客 发给消费者的上级 收益
        $suoke_rate   = config('site.back_suoke');
        $suoke_amount = bcdiv(bcmul($amount,$suoke_rate,4),100,2);

        $suoke_invite_id = Db::name('user')->where('id',$user_id)->value('invite_id');
        if($suoke_invite_id && $suoke_amount > 0){
            //发钱给 $suoke_invite_id
        }

        //网体 业务员逻辑 按月发 收益


        //省代,市代,区代 三个代理 都按月发 收益, 放到代理月辅助表
        $map_agent = [
            'month_date'  => date('Ym'),
            'province_id' => $shop_info['province_id'],
            'city_id'     => $shop_info['city_id'],
            'district_id' => $shop_info['district_id'],
        ];
        $agent_month = Db::name('agent_month')->where($map_agent)->order('id asc')->find();
        if(empty($agent_month)){
            $map_agent['back_amount'] = $amount;
            $map_agent['updatetime']  = time();
            $map_agent['status']      = 0;

            Db::name('agent_month')->insertGetId($map_agent);
        }else{
            Db::name('agent_month')->where('id',$agent_month['id'])->update([
                'updatetime'  => time(),
                'back_amount' => bcadd($agent_month['back_amount'],$amount,2)
            ]);
        }

    }

    //业务员奖
    public function yewuyuan(){
        $user_id = 1;
        $last_month = date('Ym',strtotime(date('Y-m-01')) - 86400);

        //我直推线下商家的总数量。
        $invite_count     = Db::name('offline_shop')->where('invite_id',$user_id)->count();

        //我上个月直推线下商家的总数量
        $invite_count_mon = Db::name('offline_shop')->where('invite_id',$user_id)->whereTime('back_time','last month')->count();

        //我的个人业绩。我所有直推线下商家的3-20%的让利总额
        $invite_amount = Db::name('bill')->where('shop_invite_id',$user_id)->where('table_name','offline_shop_order')->where('back_status','neq',0)
            ->whereTime('back_time','last month')->sum('back_amount');

        //我团队业绩
        $invite_uids = $this->get_all_down_uids($user_id);
        $invite_amount_tuandui = Db::name('bill')->where('shop_invite_id','IN',$invite_uids)->where('table_name','offline_shop_order')->where('back_status','neq',0)
            ->whereTime('back_time','last month')->sum('back_amount');

        //dd($last_month,$invite_count,$invite_count_mon,$invite_amount,$invite_amount_tuandui);

        //补贴/提成
        $butie = 0;        //补贴
        $yeji = 0;      //个人业绩提成
        $yingxiao_level = 0;//用户的营销等级

        //各级的条件
        $level_list = Db::name('yingxiao_level')->order('id asc')->select();
        foreach($level_list as $level){
            if($level['type'] == 1 || 1==1){

                //营销经理
                if(1 == 1 || $invite_amount_tuandui >= $level['invite_amount_tuandui'] && $invite_amount >= $level['invite_amount'] && $invite_count >= $level['invite_count']){
                    $butie     = $level['butie'];
                    $ticheng_rate = $level['ticheng_rate'];

                    $yeji = bcdiv(bcmul($invite_amount,$ticheng_rate,4),100,2);

                    $yingxiao_level = $level['id'];

                    //公司分红(a%平分,b%业绩加权)
                    $redis_key_a = $last_month . '_yingxiao_' . $yingxiao_level . '_a';
                    RedisUtil::getInstance($redis_key_a)->lPush($user_id);

                    //redis左推入当前用户
                    $redis_key_b = $last_month . '_yingxiao_' . $yingxiao_level . '_b';
                    RedisUtil::getInstance($redis_key_b)->lPush(json_encode([
                        'user_id' => $user_id,'invite_amount_tuandui' => $invite_amount_tuandui,
                    ]));

                    break;
                }
            }else{
                //营销员
                if($invite_amount >= 60000 && $invite_count_mon >= 5){
                    $butie     = $level['butie'];
                    $ticheng_rate = $level['ticheng_rate'];

                    $yeji = bcdiv(bcmul($invite_amount,$ticheng_rate,4),100,2);

                    $yingxiao_level = $level['id'];

                    break;
                }
            }
        }

        //dd($butie,$yeji,$yingxiao_level);

        if($yingxiao_level != 0){
            if($butie > 0){
                //给 $user_id 发 补贴
            }
            if($yeji > 0){
                //给 $user_id 发 个人业绩
            }
        }

    }

    //获取我的团队用户ids
    private function get_all_down_uids($user_id){
         return $user_id;
    }

    //业务员 a%评分,b%业绩加权
    public function yewuyuan_ab(){

        //上个月的公司分红1% 。酒店,餐厅,老年大学活动,线下,商城,所有让利总额,作为基数
        $back_amount_sum = Db::name('bill')->whereTime('back_time','last month')->where('back_status','neq',0)->sum('back_amount');
        if($back_amount_sum <= 0){
            echo '基数为0结束';exit;
            return true;
        }
        dump('总基数'.$back_amount_sum);

        $yingxiao_level = Db::name('yingxiao_level')->where('id','IN','1,2')->column('id,fenhong,pingfen,jiaquan');

        //百分之一
        $base_1 = bcdiv(bcmul($back_amount_sum,$yingxiao_level[1]['fenhong'],4),100,4);
        $base_2 = bcdiv(bcmul($back_amount_sum,$yingxiao_level[2]['fenhong'],4),100,4);
        dump('百分之一'.$base_1);
        dump('百分之一'.$base_2);
        //两个ab基数
        $back_amount_1_a = bcdiv(bcmul($base_1,$yingxiao_level[1]['pingfen'],4),100,4);
        $back_amount_1_b = bcdiv(bcmul($base_1,$yingxiao_level[1]['jiaquan'],4),100,4);

        $back_amount_2_a = bcdiv(bcmul($base_2,$yingxiao_level[2]['pingfen'],4),100,4);
        $back_amount_2_b = bcdiv(bcmul($base_2,$yingxiao_level[2]['jiaquan'],4),100,4);

        dd($base_1,$base_2,$back_amount_1_a,$back_amount_1_b,$back_amount_2_a,$back_amount_2_b);

        //两个ab奖
        $last_month = date('Ym',strtotime(date('Y-m-01')) - 86400);

        $redis_key_1_a = $last_month . '_yingxiao_1_a';
        $redis_key_1_b = $last_month . '_yingxiao_1_b';

        $redis_key_2_a = $last_month . '_yingxiao_2_a';
        $redis_key_2_b = $last_month . '_yingxiao_2_b';

        $list_1_a = RedisUtil::getInstance($redis_key_1_a)->LRANGE();
        $list_1_b = RedisUtil::getInstance($redis_key_1_b)->LRANGE();

        $list_2_a = RedisUtil::getInstance($redis_key_2_a)->LRANGE();
        $list_2_b = RedisUtil::getInstance($redis_key_2_b)->LRANGE();


        if(!empty($list_1_a)){
            $price_1_a = bcdiv($back_amount_1_a,count($list_1_a),2);
            foreach($list_1_a as $item_1_a){
                dump($item_1_a);
                dump($price_1_a);
                //给用户id:$a1发钱
//
            }
        }
        dump($list_1_b);
        if(!empty($list_1_b)){
            //总额
            foreach($list_1_b as $k_1_b => $v_1_b){
                $list_1_b[$k_1_b] = json_decode($v_1_b,true);
            }
            $total_1_b = array_sum(array_column($list_1_b,'invite_amount_tuandui'));
            dump($total_1_b);
            foreach($list_1_b as $v_1_b){
                dump($v_1_b['user_id']);
                $price_1_b = bcmul($back_amount_1_b,bcdiv($v_1_b['invite_amount_tuandui'],$total_1_b,4),2);
                dump($price_1_b);
            }
        }

        if(!empty($list_2_a)){
            $price_2_a = bcdiv($back_amount_2_a,count($list_2_a),2);
            foreach($list_2_a as $item_2_a){
                dump($item_2_a);
                dump($price_2_a);
                //给用户id:$a2发钱
//
            }
        }

        dump($list_2_b);
        if(!empty($list_2_b)){
            //总额
            foreach($list_2_b as $k_2_b => $v_2_b){
                $list_2_b[$k_2_b] = json_decode($v_2_b,true);
            }
            $total_2_b = array_sum(array_column($list_2_b,'invite_amount_tuandui'));
            dump($total_2_b);
            foreach($list_2_b as $v_2_b){
                dump($v_2_b['user_id']);
                $price_2_b = bcmul($back_amount_2_b,bcdiv($v_2_b['invite_amount_tuandui'],$total_2_b,4),2);
                dump($price_2_b);
            }
        }

    }

    //每月初执行,跑代理辅助表,把上个月的数据全部推送到 代理队列
    public function task_agent(){
        $last_month =  date('Ym',strtotime(date('Y-m-01')) - 86400); //上个月一号,202502

        $agent_month = Db::name('agent_month')->where('month_date',$last_month)->where('status',0)->column('id');

        //推送到代理job

        //修改状态
        Db::name('agent_month')->where('id','IN',$agent_month)->update([
            'status'     => 1,
            'updatetime' => time(),
        ]);
    }

    //代理job,跑完代理队列里的每一条
    public function job_agent($agent_month_id){

        $agent_month = Db::name('agent_month')->where('id',$agent_month_id)->find();
        if($agent_month['status'] != 1){
            //结束
            return;
        }

        $area = Db::name('shopro_data_area')
            ->where('id','IN',[$agent_month['province_id'],$agent_month['city_id'],$agent_month['district_id']])
            ->where('user_id','>',0)
            ->where('back_rate','>',0)
            ->select();

        if(empty($area)){
            //结束
            return;
        }

        //省市县执行三次
        foreach($area as $key => $agent){

            $agent_money = bcdiv(bcmul($agent_month['back_amount'],$agent['back_rate'],2),100,2);

            //发钱
            if($agent_money > 0){
                $agent['user_id'];
            }
        }

        //状态改为已发放
        Db::name('agent_month')->where('id',$agent_month_id)->update([
            'status' => '2',
            'exec_time' => time(),
        ]);


    }

    //注册时设置推荐人,顺带修改网体
    //已经放到注册里了
    public function set_invite($invite_id = 13){

        $intro = Db::name('user')->where('id',$invite_id)->field('id,invite_id,intro_level,intro_ids')->find();
        if(!$intro) {
            echo '无效推荐人';
        }

        $data_reg['invite_id'] = $intro['id']; //推荐人id
        $data_reg['intro_ids'] = $intro['intro_ids'] ? ($intro['intro_ids'].','.$intro['id']) : $intro['id']; //所有上级
        if(!empty($data_reg['intro_ids'])) {
            $data_reg['intro_ids_new'] = ','.$data_reg['intro_ids'].','; //便于查询所有下级
        }
        $data_reg['intro_level'] = $intro['intro_level'] + 1; //推荐网层数

        //修改用户
        Db::name('user')->where('id',$this->auth->id)->update($data_reg);

        //更新直推数和团队数
        model('Intro')->addIntroNum($intro['id'], 1, 1);

        echo '结束';
    }

    /**
     * 1000为起点,循环40次15%累加,入库
     *
     */
    public function test2()
    {
        echo 111;exit;
        $amount = 1000;
        $rate = 15;
        $data = [];

        for($i=1;$i<=40;$i++){


            $data[] = [
                'amount' => $amount,
            ];

            $amount = bcdiv(bcmul($amount,$rate,2),100,2);
        }

        dump($data);
//        Db::name('back_base')->insertAll($data);

    }

    /**
     * 需要登录且需要验证有相应组的权限
     *
     */
    public function test3()
    {
        //$this->success('返回成功', ['action' => 'test3']);
        $data = [
            'order_paidnum'      => ['inc',1],
            'order_total_amount' => ['inc',11.25],
            'goods_sales'        => ['inc',5],
        ];
        Db::name('live_room_log')->where('id',23)->update($data);
    }

}