<?php

namespace app\api\controller;

use app\common\controller\Api;
use app\common\library\Ems;
use app\common\library\Sms;
use fast\Random;
use think\Request;
use think\Validate;
use think\Db;
use EasyWeChat\Foundation\Application;
use think\response;

/**
 * 用户接口
 */
class User extends Api
{
    protected $noNeedLogin = ['*'];
    protected $noNeedRight = '*';

    public function _initialize()
    {
        parent::_initialize();
    }

    /**
     * 用户接口
     * @ApiTitle    (授权登录)
     * @ApiSummary  (授权登录)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/UserLogin)
     * @ApiParams   (name="vi", type="string", required=true, description="vi")
     * @ApiParams   (name="encryptData", type="string", required=true, description="encryptData")
     * @ApiParams   (name="code", type="string", required=true, description="code")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    })
     */
    public function UserLogin()
    {
        $params = Request::instance()->post(false);
        $options = [
            // ...
            'mini_program' => [
                'app_id' => appid,
                'secret' => secret,
                'token' => 'component-token',
                'aes_key' => 'component-aes-key'
            ],
            // ...
        ];
        $app = new Application($options);
        $miniProgram = $app->mini_program;
        $sessionKey = $miniProgram->sns->getSessionKey($params['code']);
        $Json = $miniProgram->encryptor->decryptData($sessionKey['session_key'], urldecode($params['iv']), urldecode($params['encryptData']));
        $is_open = Db::name('user')->where(['UnionID' => $Json['unionId']])->find();
        if (empty($is_open)) {
            /*新增会员到管易平台*/
            $GuanYiCloud = new GuanYiCloud();
            $GuanYiCloud->addVip($Json['unionId'], $Json['nickName']);
            $dataUser = [
                'UnionID' => $Json['unionId'],
                'updatetime' => time(),
                'createtime' => time(),
                'avatar' => $Json['avatarUrl'],
                'nickname' => $Json['nickName'],
                'num' => 0,
                'sex' => $Json['gender'],
                'is_new' => 1,
                'level' => 1,
                'invite_num' => 0,
                'money' => 0,
                'openid' => $Json['openId']
            ];
            Db::name('user')->insert($dataUser);
        }
        $token = $this->request->token();
        $arr = [
            'nickname' => $Json['nickName'],
            'avatar' => $Json['avatarUrl'],
            'token' => $token,
            'updatetime' => time(),
        ];
        $res = Db::name("user")->where(['UnionID' => $Json['unionId']])->update($arr);
        if (!$res) {
            $this->error('授权失败', 0);
            die;
        }
        $rult = Db::name("user")->where(['UnionID' => $Json['unionId']])->find();
        //判断用户是否有活动钱包
        $HuodongMoneyArray = Db::name('huodong_money')->where('user_id', $rult['id'])->find();
        if (empty($HuodongMoneyArray)) {
            $data = [
                'user_id' => $rult['id'],
                'count_money' => 0,
                'tixian_money' => 200,
                'befor_money' => 0,
                'type' => 0,
                'befor_tixian' => 0,
                'createtime' => time(),
                'updatetime' => time()
            ];
            Db::name('huodong_money')->insert($data);
        }
        $return = [
            'token' => $rult['token'],
        ];
        $this->success('成功', $return);
    }


    /**
     * 用户接口
     * @ApiTitle    (绑定手机号)
     * @ApiSummary  (绑定手机号)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/BindMobile)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="vi", type="string", required=true, description="vi")
     * @ApiParams   (name="encryptData", type="string", required=true, description="encryptData")
     * @ApiParams   (name="code", type="string", required=true, description="code")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    })
     */
    public function BindMobile()
    {
        $UserId = $this->is_token($this->request->header());
        $params = Request::instance()->post(false);
        $options = [
            // ...
            'mini_program' => [

                'app_id' => appid,
                'secret' => secret,
                'token' => 'component-token',
                'aes_key' => 'component-aes-key'
            ],
            // ...
        ];
        $app = new Application($options);
        $miniProgram = $app->mini_program;
        $sessionKey = $miniProgram->sns->getSessionKey($params['code']);
        $Json = $miniProgram->encryptor->decryptData($sessionKey['session_key'], urldecode($params['iv']), urldecode($params['encryptData']));
        $res = Db::name('user')->where('id', $UserId)->update(
            [
                'mobile' => $Json['phoneNumber'],
                'updatetime' => time()
            ]
        );
        $this->res($res);
    }


    /**
     * 用户接口
     * @ApiTitle    (我的主页)
     * @ApiSummary  (我的主页)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/UserInfo)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    })
     */
    public function UserInfo()
    {
        $UserId = $this->is_token($this->request->header());
        //检查待入账收益 是否入账
        $this->UpdateMoney($UserId);
        //本月起止时间戳
        $start_time = mktime(0, 0, 0, date('m'), 1, date('Y'));
        $end_time = mktime(23, 59, 59, date('m'), date('t'), date('Y'));
        //用户信息
        $UserInfo = Db::name('user')->where('id', $UserId)->find();
        //累计总收入计算 $CountMoney
        $CountMoney = $this->CountMoney($UserId, [], []);
        //本月自购返现 $MonthMyMoney
        $MonthMyMoneyMap['createtime'] = ['between', [$start_time, $end_time]];
        $MonthMyMoneyType['type'] = ['EQ', 1];
        $MonthMyMoney = $this->CountMoney($UserId, $MonthMyMoneyType, $MonthMyMoneyMap);
        //本月分佣收入 $MonthDobueMoney
        $MonthDobueMoneyMap['createtime'] = ['between', [$start_time, $end_time]];
        $MonthDobueMoneyType['type'] = ['EQ', 2];
        $MonthDobueMoney = $this->CountMoney($UserId, $MonthDobueMoneyType, $MonthDobueMoneyMap);
        /*我的好友团*/
        $Level1 = 0; //普通会员
        $Level2 = 0; //中级会员
        $Level3 = 0; //VIP
        //查询一级下级
        $First = Db::name('group')->where('fuser_id', $UserId)->select();
        if (!empty($First)) {
            //如果一级不为空
            foreach ($First as $k => $v) {
                $FirstLevel = Db::name('user')->where('id', $v['user_id'])->value('level');
                //判断下级等级
                if (!empty($FirstLevel)) {
                    if ($FirstLevel == 1) {
                        $Level1++;
                    } elseif ($FirstLevel == 2) {
                        $Level2++;
                    } elseif ($FirstLevel == 3) {
                        $Level3++;
                    }
                    $Second = Db::name('group')->where('fuser_id', $v['user_id'])->select();
                    foreach ($Second as $key => $value) {
                        $SecondLevel = Db::name('user')->where('id', $value['user_id'])->value('level');
                        if (!empty($SecondLevel)) {
                            if ($SecondLevel == 1) {
                                $Level1++;
                            } elseif ($SecondLevel == 2) {
                                $Level2++;
                            } elseif ($SecondLevel == 3) {
                                $Level3++;
                            }
                        }
                    }
                }
            }
        }
        $Return = [
            'Avatar' => $UserInfo['avatar'],
            'Nickname' => $UserInfo['nickname'],
            'Level' => $UserInfo['level'],
            'Mobile' => $UserInfo['mobile'],
            'Num' => $UserInfo['num'],
            'Money' => $UserInfo['money'],
            //累计总收入
            'CountMoney' => $CountMoney,
            //本月自购收入
            'MonthMyMoney' => $MonthMyMoney,
            //本月分销收入
            'MonthDobueMoney' => $MonthDobueMoney,
            'Level1' => $Level1,
            'Level2' => $Level2,
            'Level3' => $Level3,
        ];
        $this->success('成功', $Return);
    }


    /**
     * 用户接口
     * @ApiTitle    (是否有默认地址)
     * @ApiSummary  (是否有默认地址)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/IsMAddress)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": 1=有,0=无
    })
     */
    public function IsMAddress()
    {
        $UserId = $this->is_token($this->request->header());
        $IfMAddress = Db::name('address')->where('user_id', $UserId)->where('type', 1)->find();
        if (!empty($IfMAddress)) {
            $Type = 1;
        } else {
            $Type = 0;
        }
        $this->success('成功', $Type);
    }

    /**
     * 用户接口
     * @ApiTitle    (新增/更改地址)
     * @ApiSummary  (新增/更改地址)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/InsertAddress)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="status", type="integer", required=true, description="1=新增,2=更改")
     * @ApiParams   (name="id", type="integer", required=true, description="更改地址ID 新增为0 ")
     * @ApiParams   (name="name", type="integer", required=true, description="收货人")
     * @ApiParams   (name="mobile", type="integer", required=true, description="手机号")
     * @ApiParams   (name="city", type="integer", required=true, description="所在地区 省/市/区")
     * @ApiParams   (name="address", type="integer", required=true, description="详细地址")
     * @ApiParams   (name="address_con", type="integer", required=true, description="街道,门牌号等")
     * @ApiParams   (name="type", type="integer", required=true, description="状态:1=默认,0=否")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function InsertAddress()
    {
        $UserId = $this->is_token($this->request->header());
        $params = $this->request->param();
        if ($params['status'] == 1) {
            //新增
            //判断是否有默认地址
            $IfMAddress = Db::name('address')->where('user_id', $UserId)->where('type', 1)->find();
            if (!empty($IfMAddress)) {
                if ($params['type'] == 1) {
                    Db::name('address')->where('id', $IfMAddress['id'])->update(['type' => 0, 'updatetime' => time()]);
                }
            }
            $data = [
                'user_id' => $UserId,
                'name' => $params['name'],
                'mobile' => $params['mobile'],
                'city' => $params['city'],
                'address' => $params['address'],
                'address_con' => $params['address_con'],
                'type' => $params['type'],
                'createtime' => time(),
                'updatetime' => time(),
            ];
            $Res = Db::name('address')->insert($data);
        } else {
            //更改
            //判断是否有默认地址
            $IfMAddress = Db::name('address')->where('user_id', $UserId)->where('id', 'NEQ', $params['id'])->where('type', 1)->find();
            if ($params['type'] == 1) {
                if (!empty($IfMAddress)) {
                    Db::name('address')->where('id', $IfMAddress['id'])->update(['type' => 0, 'updatetime' => time()]);
                }
            } else {
                if (empty($IfMAddress)) {
                    $InsertMAddress = Db::name('address')->where('user_id', $UserId)->where('id', 'NEQ', $params['id'])->find();
                    if (!empty($InsertMAddress)) {
                        //随机设置默认地址
                        Db::name('address')->where('id', $InsertMAddress['id'])->update(['type' => 1, 'updatetime' => time()]);
                    } else {
                        $this->error('不能取消唯一地址默认', 0);
                        die;
                    }
                }
            }
            $data = [
                'name' => $params['name'],
                'mobile' => $params['mobile'],
                'city' => $params['city'],
                'address' => $params['address'],
                'address_con' => $params['address_con'],
                'type' => $params['type'],
                'updatetime' => time(),
            ];
            $Res = Db::name('address')->where('id', $params['id'])->update($data);
        }
        $this->res($Res);
    }


    /**
     * 用户接口
     * @ApiTitle    (地址详情)
     * @ApiSummary  (地址详情)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/AddressCon)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="id", type="integer", required=true, description="地址ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function AddressCon()
    {
        $UserId = $this->is_token($this->request->header());
        $params = $this->request->param();
        $Array = Db::name('address')->where('user_id', $UserId)->where('id', $params['id'])->find();
        if (empty($Array)) {
            $this->error('参数错误', 0);
            die;
        }
        $data = [
            'Name' => $Array['name'],
            'Mobile' => $Array['mobile'],
            'City' => $Array['city'],
            'Address' => $Array['address'],
            'AddressCon' => $Array['address_con'],
            'Type' => $Array['type'],
        ];
        $this->success('成功', $data);
    }

    /**
     * 用户接口
     * @ApiTitle    (删除地址)
     * @ApiSummary  (删除地址)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/DeleteAddress)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="id", type="integer", required=true, description="地址ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function DeleteAddress()
    {
        $UserId = $this->is_token($this->request->header());
        $params = $this->request->param();
        $AddressArray = Db::name('address')->where('user_id', $UserId)->where('id', 'NEQ', $params['id'])->find();
        $IsMo = Db::name('address')->where('user_id', $UserId)->where('id', $params['id'])->find();
        if ($IsMo['type'] == 1) {
            //是默认地址
            if (empty($AddressArray)) {
                $this->error('请先添加一个地址,在删除默认地址', 0);
            } else {
                Db::name('address')->where('user_id', $UserId)->where('id', $AddressArray['id'])->update(
                    ['type' => 1]
                );
            }
        }
        $res = Db::name('address')->where('user_id', $UserId)->where('id', $params['id'])->delete();
        $this->res($res);
    }


    /**
     * 用户接口
     * @ApiTitle    (地址列表)
     * @ApiSummary  (地址列表)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/AddressList)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="pages", type="integer", required=true, description="pages")
     * @ApiParams   (name="rows", type="integer", required=true, description="rows")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function AddressList()
    {
        $UserId = $this->is_token($this->request->header());
        $UserInfo = Db::name('user')->where('id', $UserId)->find();
        $params = $this->request->param();
        $Array = Db::name('address')->where('user_id', $UserId)->order('type desc,id desc')->select();
        if (empty($Array)) {
            $data = [
                'Count' => 0,
                'List' => []
            ];
        } else {
            foreach ($Array as $k => $v) {
                $List[$k]['Avatar'] = $UserInfo['avatar'];
                $List[$k]['Id'] = $v['id'];
                $List[$k]['Type'] = $v['type'];
                $List[$k]['Name'] = $v['name'];
                $List[$k]['Mobile'] = $v['mobile'];
                $List[$k]['City'] = $v['city'];
                $List[$k]['Address'] = $v['address'];
                $List[$k]['AddressCon'] = $v['address_con'];
            }
            $data = [
                'Count' => count($Array),
                'List' => $this->page_array($params['rows'], $params['pages'], $List, 0)
            ];
        }
        $this->success('成功', $data);
    }


    /**
     * 用户接口
     * @ApiTitle    (绑定上级)
     * @ApiSummary  (绑定上级)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/Invite)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="user_id", type="integer", required=true, description="邀请用户ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function Invite()
    {
        $UserId = $this->is_token($this->request->header());
        $params = $this->request->param();
        if ($UserId != $params['user_id']) {
            //添加绑定关系
            $IsInvite = Db::name('group')->where('user_id', $UserId)->where('fuser_id', $params['user_id'])->find();
            if (!empty($IsInvite)) {
                $this->error('重复邀请', 0);
                die;
            }
            //添加绑定渠道
            $QudaoId = Db::name('user')->where('id', $params['user_id'])->value('qudao_id');
            Db::name('user')->where('id', $UserId)->update(
                [
                    'qudao_id' => $QudaoId
                ]
            );
            $data = [
                'user_id' => $UserId,
                'fuser_id' => $params['user_id'],
                'createtime' => time()
            ];
            $Invite = Db::name('group')->insert($data);
            if (!$Invite) {
                $this->error('邀请失败', 0);
                die;
            }
            //增加邀请人数
            $InviteNum = Db::name('user')->where('id', $params['user_id'])->value('invite_num');
            $AddOneInvite = Db::name('user')->where('id', $params['user_id'])->update(['invite_num' => $InviteNum + 1]);
            if (!$AddOneInvite) {
                $this->error('增加邀请人数失败', 0);
                die;
            }
            $UserInfo = Db::name('user')->where('id', $params['user_id'])->find();
            //每邀请十个人 +500积分
            if ($UserInfo['invite_num'] % 10 == 0) {
                $AddNum = Db::name('user')->where('id', $params['user_id'])->update(['num' => $UserInfo['num'] + 500]);
                if (!$AddNum) {
                    $this->error('上级积分增加失败', 0);
                    die;
                }
                //添加积分记录
                $data = [
                    'user_id' => $params['user_id'],
                    'status' => 1,
                    'num' => 500,
                    'type' => 8,
                    'up_num' => $UserInfo['num'] + 500,
                    'createtime' => time()
                ];
                $IsNum = Db::name('num')->insert($data);
                if (!$IsNum) {
                    $this->error('积分记录增加失败', 0);
                    die;
                }
            }
        }
        $this->success('成功', 1);
    }


    /**
     * 用户接口
     * @ApiTitle    (会员晋升进度)
     * @ApiSummary  (会员晋升进度)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/InVipStree)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    })
     */
    public function InVipStree()
    {
        $UserId = $this->is_token($this->request->header());
        //是否解锁
        $Level = Db::name('user')->where('id', $UserId)->value('level');
        if ($Level == 1) {
            $FirstUnlock = 1;
            $SecondUnlock = 0;
            $ThirdUnlock = 0;
        } elseif ($Level == 2) {
            $FirstUnlock = 0;
            $SecondUnlock = 1;
            $ThirdUnlock = 0;
        } elseif ($Level == 3) {
            $FirstUnlock = 0;
            $SecondUnlock = 0;
            $ThirdUnlock = 1;
        }
        $OrderArray = Db::name('order')->where('user_id', $UserId)->where('status', 3)->select();
        if (empty($OrderArray)) {
            //已消费Consumed
            $Consumed = 0;
        } else {
            foreach ($OrderArray as $k => $v) {
                $ConsumedArray[] = $v['total'];
            }
            $Consumed = array_sum($ConsumedArray);
        }
        $SecondArray = Db::name('level')->where('type', 2)->find();
        $ThirdArray = Db::name('level')->where('type', 3)->find();
        $Return = [
            'First' => [
                'Unlock' => $FirstUnlock,
                'Door' => '完成测试即可开启',
                'Rights' => [
                    '0' => '享100天有效期1000积分',
                    '1' => '享100天产品分销权限'
                ],
                'Consumption' => 0
            ],
            'Second' => [
                'Unlock' => $SecondUnlock,
                'Door' => '消费累计¥' . $SecondArray['price'],
                'Rights' => [
                    '0' => '享' . $SecondArray['num'] . '可消费积分',
                    '1' => '自购产品享' . (100 - ($SecondArray['buycount'] * 100)) . '%返现'
                ],
                'Consumption' => $SecondArray['price'] - $Consumed
            ],
            'Third' => [
                'Unlock' => $ThirdUnlock,
                'Door' => '消费累计¥' . $ThirdArray['price'],
                'Rights' => [
                    '0' => '享' . $ThirdArray['num'] . '可消费积分',
                    '1' => '自购产品享' . (100 - ($ThirdArray['buycount'] * 100)) . '%返现'
                ],
                'Consumption' => $ThirdArray['price'] - $Consumed
            ]
        ];
        $this->success('成功', $Return);
    }


    /**
     * 用户接口
     * @ApiTitle    (个人资料)
     * @ApiSummary  (个人资料)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/UserCon)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function UserCon()
    {
        $UserId = $this->is_token($this->request->header());
        $UserInfo = Db::name('user')->where('id', $UserId)->find();
        $FUserId = Db::name('group')->where('user_id', $UserId)->value('fuser_id');
        if (!empty($FUserId)) {
            $InviteNickname = Db::name('user')->where('id', $FUserId)->value('nickname');
        } else {
            $InviteNickname = '';
        }
        //测试人数
        $SleepCount = Db::name('user')
            ->alias('u')
            ->join('sleep s', 's.user_id=u.id')
            ->where('s.type', 1)
            ->select();
        /*刷新用户登陆时间*/
        Db::name('user')->where('id', $UserId)->update(
            [
                'updatetime' => time()
            ]
        );
        $MyUpInvitePeopleNum = $this->MyUpInvitePeopleNum($UserId);
        $Return = [
            'Num' => $UserInfo['num'],
            'Money' => $UserInfo['money'],
            'QudaoId' => $UserInfo['qudao_id'],
            'ID' => $UserInfo['id'],
            'SleepCount' => count($SleepCount),
            'Avatar' => $UserInfo['avatar'],
            'Nickname' => $UserInfo['nickname'],
            'Sex' => $UserInfo['sex'],
            'Mobile' => $UserInfo['mobile'],
            'Level' => $UserInfo['level'],
            'MyUpInvitePeopleNum' => $MyUpInvitePeopleNum,
            'InviteNickname' => $InviteNickname,
            'Createtime' => date('Y-m-d', $UserInfo['createtime'])
        ];
        $this->success('成功', $Return);
    }


    /**
     * 用户接口
     * @ApiTitle    (我的积分页面)
     * @ApiSummary  (我的积分页面)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/UserNum)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="Y", type="integer", required=true, description="年")
     * @ApiParams   (name="M", type="integer", required=true, description="月")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    'Status':0=减少,1=增加,
    'Type':分类:1=首次测试奖励,2=邀请好友奖励,3=分销佣金扣除,4=自购返现扣除,5=首单奖励,6=升级奖励,7=关注奖励,8=绑定奖励,9=好友下单奖励
    }
    })
     */
    public function UserNum()
    {
        $UserId = $this->is_token($this->request->header());
        $params = $this->request->param();
        $UserInfo = Db::name('user')->where('id', $UserId)->find();
        $TimeArray = $this->mFristAndLast($params['Y'], $params['M']);
        $Map['createtime'] = ['between', [$TimeArray['start'], $TimeArray['end']]];
        $Array = Db::name('num')->where('user_id', $UserId)->where($Map)->order('id desc')->select();
        if (empty($Array)) {
            $data = [
                'CountNum' => $UserInfo['num'],
                'AddNum' => 0,
                'DeleteNum' => 0,
                'List' => []
            ];
        } else {
            foreach ($Array as $k => $v) {
                $List[$k]['Id'] = $v['id'];
                $List[$k]['Status'] = $v['status'];
                $List[$k]['Type'] = $v['type'];
                $List[$k]['Num'] = $v['num'];
                $List[$k]['UpNum'] = $v['up_num'];
                $List[$k]['Createtime'] = date('Y-m-d', $v['createtime']);
                if ($v['status'] == 1) {
                    $AddNumArray[] = $v['num'];
                } elseif ($v['status'] == 0) {
                    $DeleteNumArray[] = $v['num'];
                }
            }
            if (empty($AddNumArray)) {
                $AddNum = 0;
            } else {
                $AddNum = array_sum($AddNumArray);
            }
            if (empty($DeleteNumArray)) {
                $DeleteNum = 0;
            } else {
                $DeleteNum = array_sum($DeleteNumArray);
            }
            $data = [
                'CountNum' => $UserInfo['num'],
                'AddNum' => $AddNum,
                'DeleteNum' => $DeleteNum,
                'List' => $List
            ];
        }
        $this->success('成功', $data);
    }


    /**
     * 用户接口
     * @ApiTitle    (可提现余额查询)
     * @ApiSummary  (可提现余额查询)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/KeTixianMoney)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function KeTixianMoney()
    {
        $UserId = $this->is_token($this->request->header());
        $Money = Db::name('user')->where('id', $UserId)->value('money');
        $this->success('成功', $Money);
    }


    /**
     * 用户接口
     * @ApiTitle    (提现)
     * @ApiSummary  (提现)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/Tixian)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="money", type="integer", required=true, description="提现金额")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function Tixian()
    {
        $UserId = $this->is_token($this->request->header());
        $params = $this->request->param();
        $Money = Db::name('user')->where('id', $UserId)->value('money');
        if ($params['money'] > $Money) {
            $this->error('超过可提现余额', 0);
            die;
        }
        $data = [
            'user_id' => $UserId,
            'money' => $params['money'] * 0.99,
            'status' => 0,
            'createtime' => time(),
            'updatetime' => time()
        ];
        $res = Db::name('tixian')->insert($data);
        if (!$res) {
            $this->error('提现失败', 0);
            die;
        }
        $Res = Db::name('user')->where('id', $UserId)->update(['money' => $Money - $params['money']]);
        $this->res($Res);
    }


    /**
     * 用户接口
     * @ApiTitle    (我的草籽)
     * @ApiSummary  (我的草籽)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/MyTree)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="Y", type="integer", required=true, description="年")
     * @ApiParams   (name="M", type="integer", required=true, description="月")
     * @ApiParams   (name="type", type="integer", required=true, description="0=不不调用1=普通会员,2=中级会员,3=Vip")
     * @ApiParams   (name="status", type="integer", required=true, description="贡献金额 0=不调用,1=升序降序,2=降序排序")
     * @ApiParams   (name="pages", type="integer", required=true, description="pages")
     * @ApiParams   (name="rows", type="integer", required=true, description="rows")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function MyTree()
    {
        $UserId = $this->is_token($this->request->header());
        $params = $this->request->param();
        $Map = [];
        $Map3 = [];
        if ($params['Y'] != 0 && $params['M'] != 0) {
            $TimeArray = $this->mFristAndLast($params['Y'], $params['M']);
            $Map['g.createtime'] = ['between', [$TimeArray['start'], $TimeArray['end']]];
            $Map3['createtime'] = ['between', [$TimeArray['start'], $TimeArray['end']]];
        }
        $map2 = [];
        if ($params['type'] != 0) {
            $map2['u.level'] = ['EQ', $params['type']];
        }
        $Array = Db::name('group')
            ->alias('g')
            ->where('g.fuser_id', $UserId)
            ->where($Map)
            ->join('user u', 'u.id=g.user_id')
            ->where($map2)
            ->order('id desc')
            ->field('g.id,g.user_id,u.avatar,u.nickname,u.level,g.createtime')
            ->select();
        if (empty($Array)) {
            $data = [
                'Count' => 0,
                'List' => []
            ];
        } else {
            //数组去重
            $SonArray = $this->second_array_unique_bykey($Array, 'user_id');
            foreach ($SonArray as $k => $v) {
                $OldList[$k]['Id'] = $v['id'];
                $OldList[$k]['Avatar'] = $v['avatar'];
                $OldList[$k]['Nickname'] = $v['nickname'];
                $OldList[$k]['Level'] = $v['level'];
                $OldList[$k]['Createtime'] = date('Y-m-d', $v['createtime']);
                $CountNum = Db::name('money')->where('touser_id', $v['user_id'])->select();
                if (!empty($CountNum)) {
                    foreach ($CountNum as $key => $value) {
                        $Count[] = $value['money'];
                    }
                    $OldList[$k]['CountMoney'] = array_sum($Count);
                } else {
                    $OldList[$k]['CountMoney'] = 0;
                }
            }
            if ($params['status'] == 1) {
                $List = $this->MyTreeAsc($OldList);
            } elseif ($params['status'] == 2) {
                $List = $this->MyTreeDesc($OldList);
            } else {
                $List = $OldList;
            }
            $data = [
                'Count' => count($List),
                'List' => $this->page_array($params['rows'], $params['pages'], $List, 0)
            ];
        }
        $this->success('成功', $data);
    }


    /**
     * 用户接口
     * @ApiTitle    (我的收入)
     * @ApiSummary  (我的收入)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/MyPrice)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="Y", type="integer", required=true, description="年")
     * @ApiParams   (name="M", type="integer", required=true, description="月")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function MyPrice()
    {
        $UserId = $this->is_token($this->request->header());
        $params = $this->request->param();
        $UserInfo = Db::name('user')->where('id', $UserId)->find();
        $TimeArray = $this->mFristAndLast($params['Y'], $params['M']);
        $Map['m.createtime'] = ['between', [$TimeArray['start'], $TimeArray['end']]];
        //累计总收入计算 $CountMoney
        $CountMoney = $this->CountMoney($UserId, [], []);
        //待入账收入 $Recorded
        $RecordedArray = Db::name('money')->where('status', 0)->select();
        if (empty($RecordedArray)) {
            $Recorded = 0;
        } else {
            foreach ($RecordedArray as $k => $v) {
                $RecordedKong[] = $v['money'];
            }
            $Recorded = array_sum($RecordedKong);
        }
        $ArrayList = Db::name('money')
            ->alias('m')
            ->where($Map)
            ->where('m.user_id', $UserId)
            ->join('user u', 'u.id=m.touser_id')
            ->order('m.createtime desc')
            ->field('m.id,m.createtime,u.nickname,m.type,m.money,m.status')
            ->select();
        $List = [];
        if (!empty($ArrayList)) {
            foreach ($ArrayList as $k => $v) {
                $List[$k]['Id'] = $v['id'];
                $List[$k]['Createtime'] = date('Y-m-d', $v['createtime']);
                $List[$k]['Nickname'] = $v['nickname'];
                $List[$k]['Type'] = $v['type'];
                $List[$k]['Money'] = $v['money'];
                $List[$k]['Status'] = $v['status'];
            }
        }
        $data = [
            'CountMoney' => $CountMoney,
            'Money' => $UserInfo['money'],
            'Recorded' => $Recorded,
            'List' => $List
        ];
        $this->success('成功', $data);
    }


    /**
     * 用户接口
     * @ApiTitle    (活动页面)
     * @ApiSummary  (活动页面)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/PartHtml)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="status", type="integer", required=true, description="1=未测试,2=未下单,3=已下单,4=已完成")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function PartHtml()
    {
        $UserId = $this->is_token($this->request->header());
        $params = $this->request->param();
        //检查活动是否进行中
        $Part = Db::name('huodong')->find();
        $i = 0;
        if ($Part['start_time'] < time() && time() < $Part['end_time']) {
            $i++;
        }
        if ($i == 0) {
            $this->error('活动未开放', 0);
            die;
        }
        //查询活动钱包
        $HuodongArray = Db::name('huodong_money')->where('user_id', $UserId)->find();
        if (empty($HuodongArray)) {
            $this->error('活动钱包不存在', 0);
            die;
        }
        //查询所有下级
        $List = [];
        $SonUserArray = Db::name('group')->where('fuser_id', $UserId)->order('createtime desc')->select();
        if (!empty($SonUserArray)) {
            $UserArray = [];
            if ($params['status'] == 1) {
                //未测试
                foreach ($SonUserArray as $k => $v) {
                    $Weiceshi = Db::name('sleep')->where('user_id', $v['user_id'])->find();
                    if (empty($Weiceshi)) {
                        $UserArray[] = $v['user_id'];
                    }
                }
            }
            if ($params['status'] == 2) {
                //未下单
                foreach ($SonUserArray as $k => $v) {
                    $WeiOrder = Db::name('order')->where('user_id', $v['user_id'])->find();
                    if (empty($WeiOrder)) {
                        $UserArray[] = $v['user_id'];
                    }
                }
            }
            if ($params['status'] == 3) {
                //已下单
                foreach ($SonUserArray as $k => $v) {
                    $UpOrder = Db::name('order')->where('user_id', $v['user_id'])->where('status', 'NEQ', 0)->find();
                    if (!empty($UpOrder)) {
                        $UserArray[] = $v['user_id'];
                    }
                }
            }
            if ($params['status'] == 4) {
                //已完成
                foreach ($SonUserArray as $k => $v) {
                    $OnOrder = Db::name('order')->where('user_id', $v['user_id'])->where('status', 3)->find();
                    if (!empty($OnOrder)) {
                        $UserArray[] = $v['user_id'];
                    }
                }
            }
            if (!empty($UserArray)) {
                foreach ($UserArray as $k => $v) {
                    $userINFO = Db::name('user')->where('id', $v)->find();
                    if (!empty($userINFO)) {
                        $List[$k]['Id'] = $v;
                        $List[$k]['Avatar'] = $userINFO['avatar'];
                        $List[$k]['Nickname'] = $userINFO['nickname'];
                    }
                }
            }
        }
        $Return = [
            'CountMoney' => $HuodongArray['count_money'],
            'BeforMoney' => $HuodongArray['befor_money'],
            'BeforTixian' => $HuodongArray['befor_tixian'],
            'List' => $List
        ];
        $this->success('成功', $Return);
    }


    /**
     * 用户接口
     * @ApiTitle    (活动提现)
     * @ApiSummary  (活动提现)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/HuodongTixian)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="money", type="integer", required=true, description="提现金额")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function HuodongTixian()
    {
        $UserId = $this->is_token($this->request->header());
        $params = $this->request->param();
        $HuoodngMoneyArray = Db::name('huodong_money')->where('user_id', $UserId)->find();
        if ($params['money'] > $HuoodngMoneyArray['tixian_money']) {
            $this->error('当日提现额度不足', 0);
            die;
        }
        if ($params['money'] > $HuoodngMoneyArray['befor_tixian']) {
            $this->error('可提现不足', 0);
            die;
        }
        $data = [
            'user_id' => $UserId,
            'money' => $params['money'],
            'status' => 0,
            'createtime' => time(),
            'updatetime' => time()
        ];
        $res = Db::name('huodong_tixian')->insert($data);
        if (!$res) {
            $this->error('提现失败', 0);
            die;
        }
        $RES2 = Db::name('huodong_money')->where('user_id', $UserId)->update(
            [
                'befor_tixian' => $HuoodngMoneyArray['befor_tixian'] - $params['money'],
                'tixian_money' => $HuoodngMoneyArray['tixian_money'] - $params['money'],
            ]
        );
        $this->res($RES2);
    }


    /**
     * 用户接口
     * @ApiTitle    (客服)
     * @ApiSummary  (客服)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/Kefu)
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data":
    })
     */
    public function Kefu()
    {
        $Array = Db::name('kefu')->where('id', 1)->find();
        $this->success('成功', $Array['web']);
    }


    /**
     * 用户接口
     * @ApiTitle    (绑定渠道)
     * @ApiSummary  (绑定渠道)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/BindQudao)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="qudao_id", type="integer", required=true, description="渠道ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function BindQudao()
    {
        $UserId = $this->is_token($this->request->header());
        $params = $this->request->param();
        $res = Db::name('user')->where('id', $UserId)->update(
            [
                'qudao_id' => $params['qudao_id']
            ]
        );
        $this->res($res);
    }


    /**
     * 用户接口
     * @ApiTitle    (根据渠道渲染首页)
     * @ApiSummary  (根据渠道渲染首页)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/User/IndexImage)
     * @ApiParams   (name="qudao_id", type="integer", required=true, description="渠道ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    "data": {
    }
    })
     */
    public function IndexImage()
    {
        $QudaoId = input('qudao_id');
        $Image = Db::name('qudao_qcode')->where('qudao_id', $QudaoId)->value('image');
        //测试人数
        $SleepCount = Db::name('sleep')->where('type', 1)->select();
        $data = [
            'SleepCount' => count($SleepCount),
            'image' => cdnurl($Image)
        ];
        $this->success('成功', $data);
    }
}