<?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\Config;
use think\Validate;
use think\Db;
use wxpay;

/**
 * 会员接口
 */
class User extends Api
{
    protected $noNeedLogin = ['login', 'mobilelogin', 'register', 'registercheck', 'resetpwd', 'changeemail', 'changemobile', 'third', 'getopenid', 'getagreement', 'wxlogin'];
    protected $noNeedRight = '*';

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

        if (!Config::get('fastadmin.usercenter')) {
            $this->error(__('User center already closed'));
        }

    }

    /**
     * 会员中心
     */
    public function index()
    {
        $this->success('', ['welcome' => $this->auth->nickname]);
    }

    /**
     * 会员登录
     *
     * @ApiMethod (POST)
     * @param string $account  账号
     * @param string $password 密码
     */
    public function login()
    {
        $account = $this->request->post('account');
        $password = $this->request->post('password');
        if (!$account || !$password) {
            $this->error(__('Invalid parameters'));
        }
        $ret = $this->auth->login($account, $password);
        if ($ret) {
            $data = ['userinfo' => $this->auth->getUserinfo()];
            $this->success(__('Logged in successful'), $data);
        } else {
            $this->error($this->auth->getError());
        }
    }

    /**
     * 手机验证码登录
     *
     * @ApiMethod (POST)
     * @param string $mobile  手机号
     * @param string $captcha 验证码
     */
    public function mobilelogin()
    {
        $mobile = $this->request->post('mobile');
        $captcha = $this->request->post('captcha');
        if (!$mobile || !$captcha) {
            $this->error(__('Invalid parameters'));
        }
        if (!Validate::regex($mobile, "^1\d{10}$")) {
            $this->error(__('Mobile is incorrect'));
        }
        if (!Sms::check($mobile, $captcha, 'mobilelogin')) {
            $this->error(__('Captcha is incorrect'));
        }
        $user = \app\common\model\User::getByMobile($mobile);
        if (!$user) {
            $this->error('用户尚未注册');
        }
        if ($user['status'] != 1) {
            $this->error(__('Account is locked'));
        }
//        if ($user) {
//            if ($user->status != 'normal') {
//                $this->error(__('Account is locked'));
//            }
//            //如果已经有账号则直接登录
//            $ret = $this->auth->direct($user->id);
//        } else {
//            $ret = $this->auth->register($mobile, Random::alnum(), '', $mobile, []);
//        }
        $ret = $this->auth->direct($user->id);
        if ($ret) {
            Sms::flush($mobile, 'mobilelogin');
            $data = ['userinfo' => $this->auth->getUserinfo()];
            $this->success(__('Logged in successful'), $data);
        } else {
            $this->error($this->auth->getError());
        }
    }

    /**
     * 注册会员
     *
     * @ApiMethod (POST)
     * @param string $username 用户名
     * @param string $password 密码
     * @param string $email    邮箱
     * @param string $mobile   手机号
     * @param string $code     验证码
     */
    /*public function register()
    {
        $mobile = $this->request->post('mobile', '', 'trim'); //手机号
        $code = $this->request->post('code', '', 'trim'); //验证码
        $password = $this->request->post('password', '' , 'trim'); //密码
        $repassword = $this->request->post('repassword', '' , 'trim'); //确认密码
        $nickname = $this->request->post('nickname', '', 'trim'); //姓名
        $idcard = $this->request->post('idcard', '', 'trim,strip_tags,htmlspecialchars'); //身份证号
        $province = $this->request->post('province', '', 'trim'); //省
        $city = $this->request->post('city', '', 'trim'); //市
        $area = $this->request->post('area', '', 'trim'); //区
        $address = $this->request->post('address', '', 'trim'); //详细地址
        $recommender = $this->request->post('recommender', '', 'trim'); //推荐人姓名
        $recommender_mobile = $this->request->post('recommender_mobile', '', 'trim'); //推荐人手机号
        $zimage = $this->request->post('zimage', '', 'trim,strip_tags,htmlspecialchars'); //身份证正面照
        $fimage = $this->request->post('fimage', '', 'trim,strip_tags,htmlspecialchars'); //身份证反面照

        if (!Validate::regex($mobile, "^1\d{10}$")) {
            $this->error(__('Mobile is incorrect'));
        }
        $count = Db::name('user')->where(['mobile' => $mobile])->count('id');
        if ($count) {
            $this->error('手机号已被注册');
        }
        if (iconv_strlen($code, 'utf-8') != config('alisms.length')) {
            $this->error(__('Captcha is incorrect'));
        }
        $ret = Sms::check($mobile, $code, 'register');
        if (!$ret) {
            $this->error(__('Captcha is incorrect'));
        }
        if (!$password) {
            $this->error('请输入新密码');
        }
        //验证新密码
        if (!Validate::make()->check(['newpassword' => $password], ['newpassword' => 'require|regex:\S{6,30}'])) {
            $this->error(__('Password must be 6 to 30 characters'));
        }
        if (!$repassword) {
            $this->error('请再次输入密码');
        }
        if ($repassword != $password) {
            $this->error('两次密码不一致');
        }
        if (!$nickname) {
            $this->error('请输入姓名');
        }
        if (iconv_strlen($nickname, 'utf-8') > 30) {
            $this->error('姓名最多30位');
        }
        if (!$idcard) {
            $this->error('请输入身份证号');
        }
        if (iconv_strlen($idcard, 'utf-8') != 18) {
            $this->error('身份证号错误');
        }
        if (!$province || !$city || !$area) {
            $this->error('请选择养殖场地址');
        }
        if (!$address) {
            $this->error('请输入详细地址');
        }
        if (iconv_strlen($address, 'utf-8') > 255) {
            $this->error('详细地址最多255位');
        }
        if (!$recommender) {
            $this->error('请输入推荐人姓名');
        }
        if (iconv_strlen($recommender, 'utf-8') > 30) {
            $this->error('推荐人姓名最多30位');
        }
        if (!$recommender_mobile || !is_mobile($recommender_mobile)) {
            $this->error('请输入正确推荐人手机号');
        }
        if (!$zimage || !$fimage) {
            $this->error('请上传身份证相关照片');
        }

        $ip = request()->ip();
        $time = time();

        $data = [
            'nickname'  => $nickname,
            'province' => $province,
            'city' => $city,
            'area' => $area,
            'address' => $address,
            'createtime'    => $time
        ];
        $params = array_merge($data, [
            'mobile'   => $mobile,
            'password' => $password,
            'avatar'   => '/assets/img/avatar.png',
            'salt'      => Random::alnum(),
            'jointime'  => $time,
            'joinip'    => $ip,
            'logintime' => $time,
            'loginip'   => $ip,
            'prevtime'  => $time,
            'is_auth' => 1
        ]);
        $params['password'] = md5(md5($password) . $params['salt']);

        //开启事务
        Db::startTrans();

        $rs = Db::name('user')->insertGetId($params);
        if (!$rs) {
            Db::rollback();
            $this->error('注册失败');
        }

        $data['user_id'] = $rs;
        $data['idcard'] = $idcard;
        $data['zimage'] = $zimage;
        $data['fimage'] = $fimage;
        $data['recommender'] = $recommender;
        $data['recommender_mobile'] = $recommender_mobile;

        $rt = Db::name('user_auth')->insertGetId($data);
        if (!$rt) {
            Db::rollback();
            $this->error('注册失败');
        }
        Db::commit();

        $ret = $this->auth->login($mobile, $password);
        if ($ret) {
            $data = ['userinfo' => $this->auth->getUserinfo()];
            $this->success(__('Sign up successful'), $data);
        } else {
            $this->error($this->auth->getError());
        }
    }*/

    //注册第一步验证
    public function registercheck()
    {
        $mobile = $this->request->post('mobile'); //手机号
        $code = $this->request->post('code'); //验证码
        $password = $this->request->post('password'); //密码
        $repassword = $this->request->post('repassword', '' , 'trim'); //确认密码

        if (!Validate::regex($mobile, "^1\d{10}$")) {
            $this->error(__('Mobile is incorrect'));
        }
        $count = Db::name('user')->where(['mobile' => $mobile])->count('id');
        if (!$count) {
            $this->error('手机号已被注册');
        }
        if (iconv_strlen($code, 'utf-8') != config('alisms.length')) {
            $this->error(__('Captcha is incorrect'));
        }
        $ret = Sms::check($mobile, $code, 'register');
        if (!$ret) {
            $this->error(__('Captcha is incorrect'));
        }
        if (!$password) {
            $this->error('请输入新密码');
        }
        //验证新密码
        if (!Validate::make()->check(['newpassword' => $password], ['newpassword' => 'require|regex:\S{6,30}'])) {
            $this->error(__('Password must be 6 to 30 characters'));
        }
        if (!$repassword) {
            $this->error('请再次输入密码');
        }
        if ($repassword != $password) {
            $this->error('两次密码不一致');
        }

        $this->success('验证通过');
    }

    /**
     * 退出登录
     * @ApiMethod (POST)
     */
    public function logout()
    {
        if (!$this->request->isPost()) {
            $this->error(__('Invalid parameters'));
        }
        $this->auth->logout();
        $this->success(__('Logout successful'));
    }

    //查询会员信息
    public function getinfo()
    {
        //检查今日是否登录赠送过成长值
        $this->checklogingrowth($this->auth->id);
        //检查会员等级
        $this->checkviplevel($this->auth->id);

        $user = Db::name('user')->find($this->auth->id);

        $data['nickname'] = $user['nickname']; //姓名
        $data['username'] = $user['username']; //UID
        $data['avatar'] = cdnurl($user['avatar']); //头像
        $data['mobile'] = $user['mobile']; //手机号
        $data['money'] = $user['money']; //余额
        $data['realname'] = $user['realname']; //真实姓名
        $data['gender'] = $user['gender']; //性别:1=男,2=女
        $data['birthday'] = date('Y-m-d', $user['birthday']); //生日
        $data['idcard'] = $user['idcard']; //身份证号
        $data['passport'] = $user['passport']; //护照号
        $data['emergencycontact'] = $user['emergencycontact']; //紧急联系人
        $data['contactmobile'] = $user['contactmobile']; //紧急联系方式
        $data['outdoorduration'] = $user['outdoorduration']; //户外时长
        $data['maxlevel'] = $user['maxlevel']; //实际有效会员ID
        $data['viplevel'] = Db::name('vip')->where(['id' => $user['maxlevel']])->value('level'); //会员等级
        $data['active_count'] = Db::name('active_order')->where(['user_id' => $this->auth->id, 'status' => 2])->count('id'); //完成活动数量
        $data['freenumber'] = $user['freenumber']; //会员免费参加活动次数

        $this->success('会员信息', $data);
    }

    /**
     * 修改会员个人信息
     *
     * @ApiMethod (POST)
     * @param string $avatar   头像地址
     * @param string $username 用户名
     * @param string $nickname 昵称
     * @param string $bio      个人简介
     */
    public function profile()
    {
        $avatar = $this->request->post('avatar', '', 'trim,strip_tags,htmlspecialchars'); //头像
        $nickname = $this->request->post('nickname', '', 'trim'); //昵称
        $realname = $this->request->post('realname', '', 'trim'); //真实姓名
        $idcard = $this->request->post('idcard', '', 'trim,strip_tags,htmlspecialchars'); //身份证号
        $passport = $this->request->post('passport', '', 'trim,strip_tags,htmlspecialchars'); //护照号
        $emergencycontact = $this->request->post('emergencycontact', '', 'trim'); //紧急联系人
        $contactmobile = $this->request->post('contactmobile', '', 'trim'); //紧急联系方式
        $outdoorduration = $this->request->post('outdoorduration', '', 'trim'); //户外时长
        $birthday = $this->request->post('birthday', '', 'strtotime'); //生日
        $gender = $this->request->post('gender', 0, 'intval'); //性别

        $data = [];
        if ($avatar) {
            if (iconv_strlen($avatar, 'utf-8') > 255) {
                $this->error('图片超出范围');
            }
            $data['avatar'] = $avatar;
        }
        if ($nickname) {
            if (iconv_strlen($nickname, 'utf-8') > 30) {
                $this->error('昵称最多30字');
            }
            $data['nickname'] = $nickname;
        }
        if ($realname) {
            if(iconv_strlen($realname, 'utf-8') > 30) {
                $this->error('真实姓名最多30字');
            }
            $data['realname'] = $realname;
        }
        if ($idcard) {
            if (iconv_strlen($idcard, 'utf-8') != 18) {
                $this->error('身份证号错误');
            }
            $data['idcard'] = $idcard;
        }
        if ($passport) {
            if (iconv_strlen($passport, 'utf-8') > 30) {
                $this->error('护照号错误');
            }
            $data['passport'] = $passport;
        }
        if ($emergencycontact) {
            if(iconv_strlen($emergencycontact, 'utf-8') > 30) {
                $this->error('紧急联系人最多30字');
            }
            $data['emergencycontact'] = $emergencycontact;
        }
        if ($contactmobile) {
            if(!is_mobile($contactmobile)) {
                $this->error('请输入正确紧急联系方式');
            }
            $data['contactmobile'] = $contactmobile;
        }
        if ($outdoorduration) {
            if(iconv_strlen($outdoorduration, 'utf-8') > 50) {
                $this->error('户外时长最多50字');
            }
            $data['outdoorduration'] = $outdoorduration;
        }

        if ($birthday) {
            $data['birthday'] = $birthday;
        }
        if (in_array($gender, [1, 2])) {
            $data['gender'] = $gender;
        }

//        $avatar = $this->request->post('avatar', '', 'trim,strip_tags,htmlspecialchars');
//        if ($username) {
//            $exists = \app\common\model\User::where('username', $username)->where('id', '<>', $this->auth->id)->find();
//            if ($exists) {
//                $this->error(__('Username already exists'));
//            }
//            $user->username = $username;
//        }
//        if ($nickname) {
//            $exists = \app\common\model\User::where('nickname', $nickname)->where('id', '<>', $this->auth->id)->find();
//            if ($exists) {
//                $this->error(__('Nickname already exists'));
//            }
//            $user->nickname = $nickname;
//        }
//        $user->avatar = $avatar;

        if (!$data) {
            $this->error('暂无修改内容');
        }
        //修改用户表
        $rt = Db::name('user')->where(['id' => $this->auth->id])->setField($data);
        if ($rt === false) {
            $this->error('修改失败');
        }

        $this->success('修改成功');
    }
    
    //修改头像
    public function changeavatar()
    {
        $avatar = input('avatar', '', 'trim'); //头像
        if (!$avatar) {
            $this->error('请上传头像');
        }
        if (iconv_strlen($avatar, 'utf-8') > 255) {
            $this->error('头像长度超出限制');
        }

        $rs = Db::name('user')->where(['id' => $this->auth->id])->setField('avatar', $avatar);
        if (!$rs) {
            $this->error('修改失败');
        }

        $this->success('修改成功');
    }

    /**
     * 修改邮箱
     *
     * @ApiMethod (POST)
     * @param string $email   邮箱
     * @param string $captcha 验证码
     */
    public function changeemail()
    {
        $user = $this->auth->getUser();
        $email = $this->request->post('email');
        $captcha = $this->request->post('captcha');
        if (!$email || !$captcha) {
            $this->error(__('Invalid parameters'));
        }
        if (!Validate::is($email, "email")) {
            $this->error(__('Email is incorrect'));
        }
        if (\app\common\model\User::where('email', $email)->where('id', '<>', $user->id)->find()) {
            $this->error(__('Email already exists'));
        }
        $result = Ems::check($email, $captcha, 'changeemail');
        if (!$result) {
            $this->error(__('Captcha is incorrect'));
        }
        $verification = $user->verification;
        $verification->email = 1;
        $user->verification = $verification;
        $user->email = $email;
        $user->save();

        Ems::flush($email, 'changeemail');
        $this->success();
    }

    /**
     * 修改手机号
     *
     * @ApiMethod (POST)
     * @param string $mobile  手机号
     * @param string $captcha 验证码
     */
    public function changemobile()
    {
        $user = $this->auth->getUser();
        $code = $this->request->post('code');
        $mobile = $this->request->post('mobile');
        $captcha = $this->request->post('captcha');
        if (!$code || !$mobile || !$captcha) {
            $this->error(__('Invalid parameters'));
        }
        if ($mobile == $user->mobile) {
            $this->error('手机号没有改变');
        }
        $result = Sms::check($user->mobile, $code, 'changeyuanmobile');
        if (!$result) {
            $this->error(__('Captcha is incorrect'));
        }
        if (!Validate::regex($mobile, "^1\d{10}$")) {
            $this->error(__('Mobile is incorrect'));
        }
        if (\app\common\model\User::where('mobile', $mobile)->where('id', '<>', $user->id)->find()) {
            $this->error(__('手机号已存在'));
        }
        $result = Sms::check($mobile, $captcha, 'changemobile');
        if (!$result) {
            $this->error(__('Captcha is incorrect'));
        }
        $verification = $user->verification;
        $verification->mobile = 1;
        $user->verification = $verification;
        $user->mobile = $mobile;
        $user->save();

        Sms::flush($user->mobile, 'changemobile');
        Sms::flush($mobile, 'changemobile');
        $this->success('修改成功');
    }

    /**
     * 第三方登录
     *
     * @ApiMethod (POST)
     * @param string $platform 平台名称
     * @param string $code     Code码
     */
    public function third()
    {
        $url = url('user/index');
        $platform = $this->request->post("platform");
        $code = $this->request->post("code");
        $config = get_addon_config('third');
        if (!$config || !isset($config[$platform])) {
            $this->error(__('Invalid parameters'));
        }
        $app = new \addons\third\library\Application($config);
        //通过code换access_token和绑定会员
        $result = $app->{$platform}->getUserInfo(['code' => $code]);
        if ($result) {
            $loginret = \addons\third\library\Service::connect($platform, $result);
            if ($loginret) {
                $data = [
                    'userinfo'  => $this->auth->getUserinfo(),
                    'thirdinfo' => $result
                ];
                $this->success(__('Logged in successful'), $data);
            }
        }
        $this->error(__('Operation failed'), $url);
    }

    /**
     * 重置密码
     *
     * @ApiMethod (POST)
     * @param string $mobile      手机号
     * @param string $newpassword 新密码
     * @param string $captcha     验证码
     */
    public function resetpwd()
    {
        $type = 'mobile';//$this->request->post("type");
        $mobile = $this->request->post("mobile");
        $email = $this->request->post("email");
        $newpassword = $this->request->post("newpassword");
        $repassword = $this->request->post('repassword', '' , 'trim'); //确认密码
        $captcha = $this->request->post("captcha");
        if (!$newpassword || !$captcha || !$repassword) {
            $this->error(__('Invalid parameters'));
        }
        //验证Token
        if (!Validate::make()->check(['newpassword' => $newpassword], ['newpassword' => 'require|regex:\S{6,30}'])) {
            $this->error(__('Password must be 6 to 30 characters'));
        }
        if ($repassword != $newpassword) {
            $this->error('两次密码不一致');
        }
        if ($type == 'mobile') {
            if (!Validate::regex($mobile, "^1\d{10}$")) {
                $this->error(__('Mobile is incorrect'));
            }
            $user = \app\common\model\User::getByMobile($mobile);
            if (!$user) {
                $this->error(__('User not found'));
            }
            $ret = Sms::check($mobile, $captcha, 'resetpwd');
            if (!$ret) {
                $this->error(__('Captcha is incorrect'));
            }
            Sms::flush($mobile, 'resetpwd');
        } else {
            if (!Validate::is($email, "email")) {
                $this->error(__('Email is incorrect'));
            }
            $user = \app\common\model\User::getByEmail($email);
            if (!$user) {
                $this->error(__('User not found'));
            }
            $ret = Ems::check($email, $captcha, 'resetpwd');
            if (!$ret) {
                $this->error(__('Captcha is incorrect'));
            }
            Ems::flush($email, 'resetpwd');
        }
        //模拟一次登录
        $this->auth->direct($user->id);
        $ret = $this->auth->changepwd($newpassword, '', true);
        if ($ret) {
            $this->success(__('Reset password successful'));
        } else {
            $this->error($this->auth->getError());
        }
    }

    /**
     * 修改密码
     *
     * @ApiMethod (POST)
     * @param string $captcha     验证码
     * @param string $newpassword 新密码
     * @param string $repassword 确认密码
     */
    public function editpwd()
    {
        $captcha = $this->request->post("captcha", '', 'trim'); //验证码
        $newpassword = $this->request->post("newpassword", '' , 'trim'); //新密码
        $repassword = $this->request->post('repassword', '' , 'trim'); //确认密码

        if (iconv_strlen($captcha, 'utf-8') != config('alisms.length')) {
            $this->error(__('Captcha is incorrect'));
        }
        if (!$newpassword) {
            $this->error('请输入新密码');
        }
        //验证新密码
        if (!Validate::make()->check(['newpassword' => $newpassword], ['newpassword' => 'require|regex:\S{6,30}'])) {
            $this->error(__('Password must be 6 to 30 characters'));
        }
        if (!$repassword) {
            $this->error('请再次输入密码');
        }
        if ($repassword != $newpassword) {
            $this->error('两次密码不一致');
        }

//        $user = \app\common\model\User::getById($this->auth->id);
//        if (!$user) {
//            $this->error(__('User not found'));
//        }
        $ret = Sms::check($this->auth->mobile, $captcha, 'changepwd');
        if (!$ret) {
            $this->error(__('Captcha is incorrect'));
        }

        //模拟一次登录
        $this->auth->direct($this->auth->id);
        $ret = $this->auth->changepwd($newpassword, '', true);
        if ($ret) {
            Sms::flush($this->auth->mobile, 'changepwd');

            $this->success(__('Reset password successful'));
        } else {
            $this->error($this->auth->getError());
        }
    }
    
    //查询经营信息
    public function get_businessinfo()
    {
        $data = Db::name('user_business_info')->field('manage, mobile, province, city, area, distribution_channel')
            ->where(['user_id' => $this->auth->id])->find();

        $this->success('经营信息', $data);
    }

    //修改经营信息
    public function editbusinessinfo()
    {
        $manage = $this->request->post('manage', '', 'trim'); //采购负责人
        $mobile = $this->request->post('mobile', '', 'trim'); //联系方式
        $province = $this->request->post('province', '', 'trim'); //省
        $city = $this->request->post('city', '', 'trim'); //市
        $area = $this->request->post('area', '', 'trim'); //区
        $distribution_channel = $this->request->post('distribution_channel', '', 'trim'); //销售渠道

        $data = [];
        if ($manage) {
            if (iconv_strlen($manage, 'utf-8') > 50) {
                $this->error('采购负责人最多50字');
            }

            $data['manage'] = $manage;
        }
        if ($mobile) {
            if (!Validate::regex($mobile, "^1\d{10}$")) {
                $this->error(__('Mobile is incorrect'));
            }

            $data['mobile'] = $mobile;
        }
        if ($province && $city && $area) {
            $data['province'] = $province;
            $data['city'] = $city;
            $data['area'] = $area;
        }
        if ($distribution_channel) {
            if (iconv_strlen($distribution_channel, 'utf-8') > 255) {
                $this->error('销售渠道说明最多50字');
            }

            $data['distribution_channel'] = $distribution_channel;
        }

        if (!$data) {
            $this->error('暂无修改内容');
        }

        $count = Db::name('user_business_info')->where(['user_id' => $this->auth->id])->count();
        if ($count) {
            $data['updatetime'] = time();

            $rs = Db::name('user_business_info')->where(['user_id' => $this->auth->id])->setField($data);
        } else {
            $data['user_id'] = $this->auth->id;
            $data['createtime'] = time();

            $rs = Db::name('user_business_info')->insertGetId($data);
        }

        if (!$rs) {
            $this->error('修改失败');
        }

        $this->success('修改成功');
    }

    //查询猪车信息
    public function getpigcar()
    {
        $data = Db::name('user_pig_car')->where(['user_id' => $this->auth->id])->select();

        $data = list_domain_image($data, ['images']);

        $this->success('查询猪车信息', $data);
    }

    /**
     * 添加猪车信息
     *
     *$data = [
        [
        'carnumber' => '123',
        'carframenumber' => '344',
        'images' => '123.jpg,234.jpg,345.jpg'
        ],
        [
        'carnumber' => '123',
        'carframenumber' => '344',
        'images' => '123.jpg,234.jpg,345.jpg'
        ],
        [
        'carnumber' => '123',
        'carframenumber' => '344',
        'images' => '123.jpg,234.jpg,345.jpg'
        ]
       ];
     *
     */
    public function addpigcar()
    {
        $pig_car = input('pig_car', '', 'trim'); //猪车信息json串: carnumber车牌号  carframenumber车架号  images车辆照片
        if (!$pig_car) {
            $this->error('请添加猪车信息');
        }

        $pig_car = json_decode($pig_car, true);
        if (!$pig_car) {
            $this->error('请添加猪车信息');
        }
        if (count($pig_car) > 9) {
            $this->error('一次最多添加9条记录');
        }

        $_data = [];
        foreach ($pig_car as &$v) {
            $data = [];
            if (!$v['carnumber']) {
                $this->error('请输入车牌号');
                break;
            }
            if (iconv_strlen($v['carnumber'], 'utf-8') > 50) {
                $this->error('车牌号最多50字');
                break;
            }
            if (!$v['carframenumber']) {
                $this->error('请输入车架号');
                break;
            }
            if (iconv_strlen($v['carframenumber'], 'utf-8') > 50) {
                $this->error('车架号最多50字');
                break;
            }
            if ($v['images']) {
                $image_arr = explode(',', $v['images']);
                if (count($image_arr) > 9) {
                    $this->error('每辆车照片最多9张');
                    break;
                }

                $data['images'] = $v['images'];
            }

            $data['user_id'] = $this->auth->id;
            $data['carnumber'] = $v['carnumber'];
            $data['carframenumber'] = $v['carframenumber'];
            $data['createtime'] = time();

            array_push($_data, $data);
        }

        $rs = Db::name('user_pig_car')->insertAll($_data);
        if (!$rs) {
            $this->error('添加失败');
        }

        $this->success('添加成功');
    }

    //删除猪车信息
    public function delpigcar()
    {
        $id = input('id', 0, 'intval'); //猪车id
        if (!$id) {
            $this->error('请选择要删除的猪车');
        }

        $info = Db::name('user_pig_car')->where(['id' => $id, 'user_id' => $this->auth->id])->find();
        if (!$info) {
            $this->error('这不是您的车');
        }

        $rs = Db::name('user_pig_car')->where(['id' => $id, 'user_id' => $this->auth->id])->delete();
        if (!$rs) {
            $this->error('删除失败');
        }

        $this->success('删除成功');
    }

    //平台介绍
    public function getabout()
    {
        $info = Db::name('platform_info')->field('title, content')->where(['type' => 1])->find();

        $this->success('平台介绍', $info);
    }

    //常见问题
    public function problem()
    {
        $list = Db::name('problem')->field('id, title, content')
            ->page($this->page, config('paginate.list_rows'))->order('weigh', 'desc')->select();

        $this->success('常见问题', $list);
    }

    //投诉举报类型
    public function complainttype()
    {
        $list = Db::name('complaint_type')->field('id, name')->where(['pid' => 0])->order('weigh', 'desc')->select();

        $list = $this->getchildtype($list);
        $this->success('常见问题', $list);
    }

    //无限级投诉举报类型
    public function getchildtype($list = [])
    {
        $complaint_type = Db::name('complaint_type');
        foreach ($list as &$v) {
            $child = $complaint_type->field('id, name')->where(['pid' => $v['id']])->order('weigh', 'desc')->select();
            if ($child) {
                $child = $this->getchildtype($child);
            }

            $v['child'] = $child;
        }

        return $list;
    }

    //投诉举报
    public function complaint()
    {
        $complaint_type = input('complaint_type', '', 'trim'); //投诉类型
        $order_sn = input('order_sn', '', 'trim'); //订单号
        $be_complaint_user = input('be_complaint_user', '', 'trim'); //被投诉人/单位
        $complaint_user = input('complaint_user', '', 'trim'); //投诉人
        $mobile = input('mobile', '', 'trim'); //联系电话
        $code = input('code', '', 'trim'); //验证码
        $content = input('content', '', 'trim'); //情况说明
        $images = input('images', '', 'trim'); //附件材料

        $data = [];

        if (!$complaint_type) {
            $this->error('请选择投诉类型');
        }
        if ($order_sn) {
            if (iconv_strlen($order_sn, 'utf-8') > 255) {
                $this->error('订单号最多255位');
            }
            //查询订单
            $count = Db::name('mark_bid')->where(['user_id' => $this->auth->id, 'order_sn' => $order_sn, 'status' => 1])->count();
            if (!$count) {
                $this->error('请输入正确中标订单号');
            }
        }
        if (!$be_complaint_user) {
            $this->error('请输入被投诉人/单位');
        }
        if (iconv_strlen($be_complaint_user, 'utf-8') > 50) {
            $this->error('被投诉人/单位最多50字');
        }
        if (!$complaint_user) {
            $this->error('请输入投诉人');
        }
        if (iconv_strlen($complaint_user, 'utf-8') > 50) {
            $this->error('投诉人最多50字');
        }
        if (!is_mobile($mobile)) {
            $this->error('请输入正确联系电话');
        }
        if (iconv_strlen($code, 'utf-8') != config('alisms.length')) {
            $this->error(__('Captcha is incorrect'));
        }
        $ret = Sms::check($mobile, $code, 'complaint');
        if (!$ret) {
            $this->error(__('Captcha is incorrect'));
        }
        if (!$content) {
            $this->error('请输入情况说明');
        }
        if (iconv_strlen($content, 'utf-8') > 3000) {
            $this->error('情况说明最多3000字');
        }
        if ($images) {
            $image_arr = explode(',', $images);
            if (count($image_arr) > 9) {
                $this->error('附件照片最多9张');
            }

            $data['images'] = $images;
        }

        $data['user_id'] = $this->auth->id;
        $data['complaint_type'] = $complaint_type;
        $data['order_sn'] = $order_sn;
        $data['be_complaint_user'] = $be_complaint_user;
        $data['complaint_user'] = $complaint_user;
        $data['mobile'] = $mobile;
        $data['content'] = $content;
        $data['images'] = $images;
        $data['createtime'] = time();

        $rs = Db::name('complaint')->insertGetId($data);
        if (!$rs) {
            $this->error('投诉失败');
        }

        Sms::flush($this->auth->mobile, 'complaint');

        $this->success('投诉成功');
    }

    //评价列表
    public function getmarkcomment()
    {
        $list = Db::name('mark_bid_comment')->where(['user_id' => $this->auth->id])
            ->page($this->page, config('paginate.list_rows'))->order('createtime', 'desc')->select();

        $list = list_domain_image($list, ['images']);

        $mark = Db::name('mark');
        $mark_bid = Db::name('mark_bid');
        foreach ($list as &$v) {
            $v['mark'] = $mark->find($v['mark_id']);
            $v['mark'] = info_domain_image($v['mark'], ['image', 'video', 'defective_images', 'road_images', 'pig_out_images']);
            $v['order_sn'] = $mark_bid->where(['id' => $v['mark_bid_id']])->value('order_sn');
        }

        $this->success('评论列表', $list);
    }

    //评价
    public function markcomment()
    {
        $mark_id = input('mark_id', 0, 'intval'); //招标id
        $content = input('content', '', 'trim'); //情况说明
        $images = input('images', '', 'trim'); //附件材料

        $data = [];

        if (!$mark_id) {
            $this->error('请选择要评价的数据');
        }
        $info = Db::name('mark')->find($mark_id);
        if (!$info) {
            $this->error('招标信息不存在');
        }
        $bid_id = Db::name('mark_bid')->where(['user_id' => $this->auth->id, 'mark_id' => $mark_id, 'status' => 1])->value('id');
        if (!$bid_id) {
            $this->error('您未中标,暂不能评价');
        }
        if (!$content) {
            $this->error('请输入评价内容');
        }
        if (iconv_strlen($content, 'utf-8') > 3000) {
            $this->error('评价内容最多3000字');
        }
        if ($images) {
            $image_arr = explode(',', $images);
            if (count($image_arr) > 9) {
                $this->error('照片最多9张');
            }

            $data['images'] = $images;
        }

        $data['user_id'] = $this->auth->id;
        $data['mark_id'] = $mark_id;
        $data['mark_bid_id'] = $bid_id;
        $data['content'] = $content;
        $data['images'] = $images;
        $data['createtime'] = time();

        $rs = Db::name('mark_bid_comment')->insertGetId($data);
        if (!$rs) {
            $this->error('评价失败');
        }

        $this->success('评价成功');
    }

    //个人账单列表
    public function getcompanymoney()
    {
        $list = Db::name('company')->field('id, name')->page($this->page, config('paginate.list_rows'))->select();

        $company_money_log = Db::name('company_money_log');
        foreach ($list as &$v) {
            $log = $company_money_log->where(['company_id' => $v['id'], 'user_id' => $this->auth->id])->order('id', 'desc')->find();
            if ($log) {
                $v['money'] = $log['after'];
                $v['can_money'] = $log['after'];
            } else {
                $v['money'] = '0';
                $v['can_money'] = '0';
            }
        }

        $this->success('个人账单列表', $list);
    }

    //个人账单明细
    public function getcompanymoneydetail()
    {
        $company_id = input('company_id', 0, 'intval'); //公司id
        $start_time = input('start_time', 0, 'strtotime'); //开始时间
        $end_time = input('end_time', 0, 'strtotime'); //结束时间

        if (!$company_id) {
            $this->error('参数缺失');
        }

        $where['company_id'] = $company_id;
        $where['user_id'] = $this->auth->id;
        if ($start_time && $end_time) {
            $where['createtime'] = ['between', [$start_time, $end_time]];
        }

        $list = Db::name('company_money_log')->field('id, money, memo, createtime')
            ->where($where)->page($this->page, config('paginate.list_rows'))->order('id', 'desc')->select();

        foreach ($list as &$v) {
            $v['createtime'] = date('Y-m-d H:i:s', $v['createtime']);
        }

        $data['income'] = Db::name('company_money_log')->where($where)->where(['money' => ['gt', 0]])->sum('money');
        $data['expend'] = Db::name('company_money_log')->where($where)->where(['money' => ['lt', 0]])->sum('money');
        $data['list'] = $list;

        $this->success('个人账单明细', $data);
    }

    //关于我们/免责协议/用户协议/隐私政策
    public function getagreement()
    {
        $type = input('type', 0, 'intval');
        if (!in_array($type, [1, 2, 3, 4])) {
            $this->error('参数错误');
        }

        $info = Db::name('platform_info')->field('title, content')->where(['type' => $type])->find();

        $this->success('协议', $info);
    }

    //获取openid
    public function getopenid() {
        //code
        $code = $this->request->param('code', '', 'trim');// code值
        if (!$code) {
            $this->error(__('Invalid parameters'));
        }

        $config = config('wxchatpay');
        $getopenid_url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$config['app_id'].'&secret='.$config['app_secret'].'&js_code='.$code.'&grant_type=authorization_code';

        $openidInfo = httpRequest($getopenid_url, 'GET');//$this->getJson($getopenid_url);
        $openidInfo = json_decode($openidInfo,true);

        if(!isset($openidInfo['openid'])) {
            $this->error('用户openid获取失败', $openidInfo);
        }

        $this->success('success', $openidInfo);
    }

    //微信登录
    public function wxlogin() {
        $openid = input('openid', '', 'trim');
        if (!$openid) {
            $this->error('参数缺失');
        }

        $user = \app\common\model\User::getByOpenid($openid);
        if (!$user) {
            $this->success('用户尚未注册', ['code' => 5]);
        }
        if ($user['status'] != 1) {
            $this->error(__('Account is locked'));
        }
        $ret = $this->auth->direct($user->id);
        if ($ret) {
            $data = ['userinfo' => $this->auth->getUserinfo()];
            $this->success(__('Logged in successful'), $data);
        } else {
            $this->error($this->auth->getError());
        }
    }

    //注册
    public function register()
    {
        $mobile = $this->request->post('mobile', '', 'trim'); //手机号
        $code = $this->request->post('code', '', 'trim'); //验证码
        $birthday = $this->request->post('birthday', '', 'strtotime'); //生日
        $gender = $this->request->post('gender', 0, 'intval'); //性别:1=男,2=女
        $invite_no = $this->request->post('invite_no', '', 'trim'); //邀请码
        $openid = $this->request->post('openid', '', 'trim'); //微信openid
        $nickname = $this->request->post('nickname', '', 'trim'); //微信昵称
        $avatar = $this->request->post('avatar', '', 'trim,strip_tags,htmlspecialchars'); //微信头像

        $openidcount = Db::name('user')->where(['openid' => $openid])->count('id');
        if ($openidcount) {
            $this->error('微信已经注册,请直接登录');
        }
        if (!Validate::regex($mobile, "^1\d{10}$")) {
            $this->error(__('Mobile is incorrect'));
        }
        $count = Db::name('user')->where(['mobile' => $mobile])->count('id');
        if ($count) {
            $this->error('手机号已被注册');
        }
        if (iconv_strlen($code, 'utf-8') != config('alisms.length')) {
            $this->error(__('Captcha is incorrect'));
        }
        $ret = Sms::check($mobile, $code, 'register');
        if (!$ret) {
            $this->error(__('Captcha is incorrect'));
        }
        if (!$birthday || $birthday >= time()) {
            $this->error('请选择正确生日');
        }
        if (!in_array($gender, [1, 2])) {
            $this->error('请选择性别');
        }
        if ($invite_no) {
            $invite_info = Db::name('user')->where(['invite_no' => $invite_no])->find();
            if (!$invite_info) {
                $this->error('邀请码不存在');
            }
        }
        if (!$nickname || !$avatar) {
            $this->error('参数缺失');
        }
        if (iconv_strlen($nickname, 'utf-8') > 30 || iconv_strlen($avatar, 'utf-8') > 255) {
            $this->error('参数错误');
        }

        $ip = request()->ip();
        $time = time();

        $data = [
            'nickname'  => $nickname,
            'salt'      => Random::alnum(),
            'mobile' => $mobile,
            'avatar'   => $avatar,
            'joinip'    => $ip,
            'jointime'  => $time,
            'logintime' => $time,
            'loginip'   => $ip,
            'prevtime'  => $time,
            'createtime'    => $time,
            'gender' => $gender,
            'birthday' => $birthday,
            'openid' => $openid,
            'invite_no' => $this->myinvite(),
            'pre_user_id' => isset($invite_info) ? $invite_info['id'] : 0,
            'invite_time' => $time,
        ];

        //开启事务
        Db::startTrans();
        $rs = Db::name('user')->insertGetId($data);
        if (!$rs) {
            Db::rollback();
            $this->error('注册失败');
        }
        //生成uid
        $username = $this->myuid($rs);
        $rt = Db::name('user')->where(['id' => $rs])->setField('username', $username);
        if (!$rt) {
            Db::rollback();
            $this->error('注册失败');
        }
        //给用户发放注册优惠券
        $register_coupon = Db::name('coupon')->where(['purpose' => 1, 'status' => 1])->order('weigh desc, id desc')->find();
        if ($register_coupon) {
            $register_coupon_data = [
                'user_id' => $rs,
                'coupon_id' => $register_coupon['id'],
                'title' => $register_coupon['title'],
                'desc' => $register_coupon['desc'],
                'type' => $register_coupon['type'],
                'money' => $register_coupon['money'],
                'minmoney' => $register_coupon['minmoney'],
                'purpose' => $register_coupon['purpose'],
                'starttime' => time(),
                'endtime' => time() + $register_coupon['effectiveday'] * 86400,
                'createtime' => time()
            ];

            $register_coupon_rs = Db::name('user_coupon')->insertGetId($register_coupon_data);
            if (!$register_coupon_rs) {
                Db::rollback();
                $this->error('注册失败');
            }
        }
        //查询是否需要给上级发放优惠券
        if (isset($invite_info)) {
            //查询上一次获得推广优惠券时间
            $last_coupon = Db::name('user_coupon')->where(['user_id' => $invite_info['id'], 'purpose' => 2])->order('id', 'desc')->find();
            $last_coupon_time = $last_coupon ? $last_coupon['createtime'] : 0;
            //获取后台配置推广获得优惠券指定人数
            $invitepersonnum = (int)config('site.invitepersonnum');
            //查询最新推广任务
            $invite_count = Db::name('user')->where(['pre_user_id' => $invite_info['id'], 'createtime' => ['gt', $last_coupon_time]])->count();
            if ($invite_count >= $invitepersonnum && $invitepersonnum > 0) {
                //每邀请10人发放一次优惠券
                //查询推广优惠券
                $invite_coupon = Db::name('coupon')->where(['purpose' => 2, 'status' => 1])->order('weigh desc, id desc')->find();
                if ($invite_coupon) {
                    $invite_coupon_data = [
                        'user_id' => $invite_info['id'],
                        'coupon_id' => $invite_coupon['id'],
                        'title' => $invite_coupon['title'],
                        'desc' => $invite_coupon['desc'],
                        'type' => $invite_coupon['type'],
                        'money' => $invite_coupon['money'],
                        'minmoney' => $invite_coupon['minmoney'],
                        'purpose' => $invite_coupon['purpose'],
                        'starttime' => time(),
                        'endtime' => time() + $invite_coupon['effectiveday'] * 86400,
                        'createtime' => time()
                    ];

                    $invite_coupon_rs = Db::name('user_coupon')->insertGetId($invite_coupon_data);
                    if (!$invite_coupon_rs) {
                        Db::rollback();
                        $this->error('注册失败');
                    }
                }
            }
        }

        Db::commit();

        $ret = $this->auth->direct($rs);
        if ($ret) {
            $data = ['userinfo' => $this->auth->getUserinfo()];
            $this->success(__('Sign up successful'), $data);
        } else {
            $this->error($this->auth->getError());
        }
    }

    //生成邀请码
    public function myinvite() {
        $invite = Random::alnum(7);
        $count = Db::name('user')->where(['invite_no' => $invite])->count('id');
        if ($count) {
            $this->myinvite();
        }

        return $invite;
    }

    //生成uid
    public function myuid($id = 0) {
        if (strlen($id) < 8) {
            $username_len = 8 - strlen($id);
            $username = $id . Random::numeric($username_len);
        } else {
            $username = $id;
        }

        $count = Db::name('user')->where(['username' => $username])->count('id');
        if ($count) {
            $this->myuid($id);
        }

        return $username;
    }

    //查询是否有未读消息
    public function getreadsysmsg() {
        $count = Db::name('sys_msg')->where(['user_id' => $this->auth->id, 'is_read' => 0])->count('id');

        $this->success('查询是否有未读消息', $count);
    }

    //消息列表
    public function sysmsg() {
        $list = Db::name('sys_msg')->field('id, title, content, createtime')->where(['user_id' => $this->auth->id])
            ->page($this->page, $this->pagenum)->order('id desc')->select();

        foreach ($list as &$v) {
            $v['createtime'] = date('Y-m-d H:i', $v['createtime']);
        }

        //更改消息状态
        Db::name('sys_msg')->where(['user_id' => $this->auth->id, 'is_read' => 0])->setField('is_read', 1);

        $this->success('消息列表', $list);
    }

    //查询当前会员等级信息
    public function uservip() {
        //更新会员等级
        $this->checkviplevel($this->auth->id);
        //用户信息
        $user = Db::name('user')->find($this->auth->id);
        //会员信息
        $vip_info = Db::name('vip')->find($user['maxlevel']);
        //下一级所需成长值
        $next_vip = Db::name('vip')->where(['id' => ['gt', $user['maxlevel']]])->find();
        if (!$next_vip) {
            //顶部信息
            $vip_info['vip_desc'] = '已是最高会员';
            //成长值百分比0-100
            $vip_info['growthvalue_percentage'] = 100;
        } else {
            //顶部信息
            $need_growthvalue = $next_vip['growthvalue'] - $user['growthvalue'];
            $vip_info['vip_desc'] = $vip_info['title'] . '还需' . $need_growthvalue . '成长值成为' . $next_vip['title'];
            //成长值百分比0-100
            $vip_info['growthvalue_percentage'] = ceil($user['growthvalue'] / $next_vip['growthvalue'] * 100);
        }
        //体验会员到期时间
        $vip_info['experiencetime'] = $user['experiencetime'] > time() ? date('Y-m-d', $user['experiencetime']) : '';
        //判断是不是生日 1是  0否
        $vip_info['is_birth'] = date('md', time()) == date('md', strtotime($this->auth->birthday)) ? 1: 0;

        $this->success('查询当前会员等级信息', $vip_info);
    }

    //查询所有会员
    public function vip() {
        //更新会员等级
        $this->checkviplevel($this->auth->id);
        //用户信息
        $user = Db::name('user')->find($this->auth->id);
        //会员信息
        $vip_info = Db::name('vip')->find($user['growthlevel']);
        //下一级所需成长值
        $next_vip = Db::name('vip')->where(['id' => ['gt', $user['growthlevel']]])->find();
        if (!$next_vip) {
            //顶部信息
            $vip_info['vip_desc'] = '已是最高会员';
            //成长值百分比0-100
            $vip_info['growthvalue_percentage'] = 100;
        } else {
            //顶部信息
            $need_growthvalue = $next_vip['growthvalue'] - $user['growthvalue'];
            $vip_info['vip_desc'] = $vip_info['title'] . '还需' . $need_growthvalue . '成长值成为' . $next_vip['title'];
            //成长值百分比0-100
            $vip_info['growthvalue_percentage'] = ceil($user['growthvalue'] / $next_vip['growthvalue'] * 100);
        }
        //所有会员列表
        $list = Db::name('vip')->select();

        $vip_privilege = Db::name('vip_privilege');
        foreach ($list as $k => &$v) {
            $v['vip_desc'] = '';  //顶部信息
            $v['growthvalue_percentage'] = 0; //成长值百分比0-100
            $v['experiencetime'] = ''; //体验会员到期时间

            if ($v['id'] == $user['maxlevel']) {
                $v['now_level'] = 1; //是否是当前等级 1是  0否
                if ($user['maxlevel'] == $user['experiencelevel'] && $user['experiencetime'] > time()) {
                    //实际有效会员ID是体验会员id时, 展示体验会员到期时间
                    $v['experiencetime'] = '有效期至' . date('Y-m-d', $user['experiencetime']);
                }
            } else {
                $v['now_level'] = 0;
            }
            if ($v['id'] == $user['growthlevel']) {
                $v = array_merge($v, $vip_info);
            }

            $v['vip_privilege'] = $vip_privilege->field('id, title, desc')
                ->where(['vip_id' => $v['id']])->order('weigh desc')->select();
        }

        $this->success('查询所有会员', $list);
    }

    //意见反馈
    public function feedback() {
        $content = input('content', '', 'trim'); //问题描述
        $images = input('images', '', 'trim'); //反馈图片,最多9张用,拼接
        $mobile = input('mobile', '', 'trim'); //联系电话

        $data = [];

        if (!$content) {
            $this->error('请输入情况说明');
        }
        if (iconv_strlen($content, 'utf-8') > 3000) {
            $this->error('情况说明最多3000字');
        }
        if ($images) {
            $image_arr = explode(',', $images);
            if (count($image_arr) > 9) {
                $this->error('附件照片最多9张');
            }

            $data['images'] = $images;
        }
        if (!is_mobile($mobile)) {
            $this->error('请输入正确联系电话');
        }

        $data['user_id'] = $this->auth->id;
        $data['content'] = $content;
        $data['images'] = $images;
        $data['mobile'] = $mobile;
        $data['createtime'] = time();

        $rs = Db::name('feedback')->insertGetId($data);
        if (!$rs) {
            $this->error('反馈失败');
        }

        $this->success('反馈成功');
    }

    //我的优惠券
    public function mycoupon() {
        $type = input('type', 0, 'intval'); //类型:1未使用 2已使用 3已过期
        if (!in_array($type, [1, 2, 3])) {
            $this->error('参数错误');
        }

        $where['user_id'] = $this->auth->id;
        if ($type == 1) {
            $where['endtime'] = ['egt', time()];
            $where['status'] = 0;
        } elseif ($type == 2) {
            $where['status'] = 1;
        } elseif ($type == 3) {
            $where['endtime'] = ['lt', time()];
            $where['status'] = 0;
        }

        $list = Db::name('user_coupon')->field('id, title, desc, type, money, minmoney, endtime')->where($where)->page($this->page, $this->pagenum)->select();
        foreach ($list as &$v) {
            $v['endtime'] = date('Y-m-d', $v['endtime']);
        }

        $this->success('我的优惠券', $list);
    }

    //充值列表
    public function rechargelist() {
        $list = Db::name('recharge')->field('id, title, price, coupon_id, couponnum')->order('weigh desc')->select();

        $coupon = Db::name('coupon');
        foreach ($list as &$v) {
            $coupon_info = $coupon->find($v['coupon_id']);
            if ($coupon_info) {
                if ($coupon_info['type'] == 1) {
                    $v['coupon_title'] = $coupon_info['money'] . '折';
                } else {
                    $v['coupon_title'] = $coupon_info['money'] . '元';
                }
            } else {
                $v['coupon_title'] = '';
            }
        }

        $this->success('充值列表', $list);
    }
    
    //资金明细
    public function usermoneylog() {
        $list = Db::name('user_money_log')->field('id, money, memo, createtime')
            ->where(['user_id' => $this->auth->id])
            ->page($this->page, $this->pagenum)
            ->order('id desc')->select();

        foreach ($list as &$v) {
            $v['createtime'] = date('Y-m-d H:i:s', $v['createtime']);
        }

        $this->success('资金明细', $list);
    }

    //充值
    public function recharge() {
        $id = input('id', 0, 'intval');
        if (!$id) {
            $this->error('参数缺失');
        }

        $info = Db::name('recharge')->where(['id' => $id])->find();
        if (!$info) {
            $this->error('充值金额不存在');
        }
        if ($info['price'] <= 0) {
            $this->error('充值价格异常');
        }

        //生成支付订单记录
        $rechar_order['user_id'] = $this->auth->id;
        $rechar_order['order_no'] = date('YmdHis', time()) . rand(10000000, 99999999); //微信订单编号
        $rechar_order['money'] = $info['price'];
        $rechar_order['purpose'] = 2; //充值用途:1=支付订单,2=充值,3=开通会员
        $rechar_order['pay_type'] = 'wechat';
        $rechar_order['relation_id'] = $id;
        $rechar_order['createtime'] = time();

        //开始事务
        $result = Db::name('rechar_order')->insertGetId($rechar_order);
        if (!$result) {
            $this->error('网络延迟,请稍后再试');
        }

        //构建支付链接数据
        $wxData['body'] = '充值';
        $wxData['out_trade_no'] = $rechar_order['order_no'];
        $wxData['total_fee'] = $info['price'];
//        $wxData['total_fee'] = 0.01;
        $wxData['openid'] = $this->auth->openid;

//            require_once($_SERVER['DOCUMENT_ROOT'] . '/Plugins/Weixin/WxPay/WxPay.php');
        $wxPay = new wxpay\WxPay(config('wxchatpay'));
        $doResult = $wxPay->WxPayJs($wxData);

        $this->success('微信支付参数返回成功', $doResult);
    }

    //邀请好友顶部信息
    public function invitetop() {
        $data['invite_no'] = $this->auth->invite_no; //邀请码
        $data['invite_count'] = Db::name('user')->where(['pre_user_id' => $this->auth->id])->count('id'); //邀请人数
        $data['coupon_count'] = Db::name('user_coupon')->where(['user_id' => $this->auth->id, 'purpose' => ['in', [2, 5]]])->count('id');

        $this->success('邀请好友顶部信息', $data);
    }

    //邀请好友底部列表
    public function invitebottom() {
        $type = input('type', 0, 'intval'); //1邀请的好友 2报名的好友
        if (!in_array($type, [1, 2])) {
            $this->error('参数错误');
        }

        if ($type == 1) {
            $list = Db::name('user')->field('id, avatar, nickname, invite_time')
                ->where(['pre_user_id' => $this->auth->id])->page($this->page, $this->pagenum)->order('id desc')->select();
        } else {
            $invite_ids = Db::name('user')->where(['pre_user_id' => $this->auth->id])->column('id');
            if (!$invite_ids) {
                $this->success('报名好友列表', []);
            }

            $list = Db::name('active_order')->alias('a')
                ->join('hu_user b', 'a.user_id = b.id', 'left')
                ->field('b.id, b.avatar, b.nickname, b.invite_time')
                ->where(['a.user_id' => ['in', $invite_ids]])
                ->page($this->page, $this->pagenum)
                ->order('a.id desc')->select();
        }

        $list = list_domain_image($list, ['avatar']);
        foreach ($list as &$v) {
            $v['invite_time'] = date('Y-m-d', $v['invite_time']);
        }

        $this->success('邀请好友底部列表', $list);
    }

    //我的订单
    public function myorder() {
        $type = input('type', 0, 'intval'); //状态:0=待付款,1=待出行,2=已完成,3=已取消
        if (!in_array($type, [0, 1, 2, 3])) {
            $this->error('参数错误');
        }

        $list = Db::name('active_order')->where(['user_id' => $this->auth->id, 'status' => $type])->page($this->page, $this->pagenum)->order('id desc')->select();

        $active = Db::name('active');
        foreach ($list as &$v) {
            $v['button_status'] = 0;//待出行按钮: 0不展示  1退款  2修改联系人

            $v['active'] = $active->find($v['active_id']);
            $v['active'] = info_domain_image($v['active'], ['image']);
            if ($v['status'] == 1) {
                if ($v['active']['refundendtime'] >= time()) {
                    $v['button_status'] = 1;
                } elseif ($v['active']['refundendtime'] < time() && $v['active']['starttime'] >= time()) {
                    $v['button_status'] = 2;
                }
            }
            if ($v['active']['maxperson'] <= $v['active']['currentperson']) {
                $v['is_full'] = 1; //已报满
            } else {
                $v['is_full'] = 0; //未报满
            }
        }

        $this->success('我的订单', $list);
    }

    //我的订单详情
    public function myorderinfo() {
        $id = input('id', 0, 'intval'); //订单id
        if (!$id) {
            $this->error('参数缺失');
        }
        $info = Db::name('active_order')->where(['id' => $id, 'user_id' => $this->auth->id])->find();
        if (!$info) {
            $this->error('数据不存在');
        }

        $info['createtime'] = date('Y-m-d H:i:s', $info['createtime']);
        //查询活动信息
        $active = Db::name('active')->find($info['active_id']);

        //待出行按钮: 0不展示  1退款  2修改联系人
        $info['button_status'] = 0;
        if ($info['status'] == 1) {
            if ($active['refundendtime'] >= time()) {
                $info['button_status'] = 1;
            } elseif ($active['refundendtime'] < time() && $active['starttime'] >= time()) {
                $info['button_status'] = 2;
            }
        }

        $active = info_domain_image($active, ['image']);
        $active['starttime'] = date('Y-m-d H:i', $active['starttime']);
        $active['endtime'] = date('Y-m-d H:i', $active['endtime']);
        $active['collectiontime'] = date('Y-m-d H:i', $active['collectiontime']);
        $active['signupendtime'] = date('Y-m-d H:i', $active['signupendtime']);
        $active['refundendtime'] = date('Y-m-d H:i', $active['refundendtime']);

        //查询报名人员
        $active_people = Db::name('active_people')->where(['order_id' => $id])->field('id, name, mobile')->select();

        $info['active'] = $active;
        $info['active_people'] = $active_people;

        $this->success('我的订单详情', $info);
    }
    
    //查看报名人信息
    public function activepeople() {
        $id = input('id', 0, 'intval'); //报名人员id
        if (!$id) {
            $this->error('参数缺失');
        }
        $info = Db::name('active_people')->where(['id' => $id, 'user_id' => $this->auth->id])->find();
        if (!$info) {
            $this->error('数据不存在');
        }

        $this->success('查看报名人信息', $info);
    }

    //修改报名人信息
    public function modifyactivepeople() {
        $id = input('id', 0, 'intval'); //报名人员id
        $name = input('name', '', 'trim'); //姓名
        $idcard = input('idcard', '', 'trim'); //身份证号
        $mobile = input('mobile', '', 'trim'); //手机号
        $emergencycontact = input('emergencycontact', '', 'trim'); //紧急联系人
        $contactmobile = input('contactmobile', '', 'trim'); //紧急联系方式

        if (!$id) {
            $this->error('参数缺失');
        }
        $info = Db::name('active_people')->where(['id' => $id, 'user_id' => $this->auth->id])->find();
        if (!$info) {
            $this->error('数据不存在');
        }
        if ($info['status'] == 2) {
            $this->success('订单已经结束');
        }
        if ($info['status'] == 3) {
            $this->success('订单已经取消');
        }
        if ($info['modifystatus'] == 1) {
            $this->error('报名信息正在修改中,请等待后台审核');
        }
        //查询活动状态
        $active = Db::name('active')->find($info['active_id']);
        if (!$active) {
            $this->success('活动不存在或已取消');
        }
        if ($active['status'] == 1) {
            $this->error('活动已成行,不能修改信息');
        }
        if (time() <= $active['refundendtime'] || time() > $active['starttime']) {
            $this->error('当前时间段暂不可修改信息');
        }
        //查询是否申请过退款
        $active_refund = Db::name('active_refund')->where(['order_id' => $info['active_id'], 'status' => 0])->count('id');
        if ($active_refund) {
            $this->error('您正在申请退款,暂不可修改信息');
        }
        //检查信息
        if (!$name || iconv_strlen($name, 'utf-8') > 50) {
            $this->error('请输入正确姓名');
        }
        if (iconv_strlen($idcard, 'utf-8') != 18) {
            $this->error('请输入正确身份证号');
        }
        if (!is_mobile($mobile)) {
            $this->error('请输入正确手机号');
        }
        if (!$emergencycontact || iconv_strlen($emergencycontact, 'utf-8') > 50) {
            $this->error('请输入紧急联系人');
        }
        if (!is_mobile($contactmobile)) {
            $this->error('请输入正确紧急联系人方式');
        }
        //判断是否报名过
        $count = Db::name('active_people')->where(['active_id' => $info['active_id'], 'idcard' => $idcard, 'status' => ['neq', 3]])->count('id');
        if ($count) {
            $this->error('该信息已报名过活动');
        }
        $count2 = Db::name('active_people_modify')->where(['active_id' => $info['active_id'], 'idcard' => $idcard, 'status' => 0])->count('id');
        if ($count2) {
            $this->error('该信息已提交过修改,请等待审核');
        }
        //构建修改数据
        $data = [
            'active_id' => $info['active_id'],
            'order_id' => $info['order_id'],
            'people_id' => $id,
            'user_id' => $info['user_id'],
            'name' => $name,
            'credtype' => $info['credtype'],
            'idcard' => $idcard,
            'mobile' => $mobile,
            'emergencycontact' => $emergencycontact,
            'contactmobile' => $contactmobile,
            'insurance' => $info['insurance'],
            'originalprice' => $info['originalprice'],
            'vipprice' => $info['vipprice'],
            'coupon_id' => $info['coupon_id'],
            'coupontype' => $info['coupontype'],
            'couponprice' => $info['couponprice'],
            'is_free' => $info['is_free'],
            'price' => $info['price'],
            'is_self' => $info['is_self'],
            'createtime' => time()
        ];

        //开启事务
        Db::startTrans();
        //添加记录
        $rs = Db::name('active_people_modify')->insertGetId($data);
        if (!$rs) {
            Db::rollback();
            $this->error('修改失败');
        }
        //修改原记录状态
        $rt = Db::name('active_people')->where(['id' => $id, 'modifystatus' => 0])->setField('modifystatus', 1);
        if (!$rt) {
            Db::rollback();
            $this->error('修改失败');
        }

        Db::commit();
        $this->success('修改成功,请等待审核');
    }

    //取消订单
    public function cancelorder() {
        $id = input('id', 0, 'intval'); //订单id
        if (!$id) {
            $this->error('参数缺失');
        }
        $info = Db::name('active_order')->where(['id' => $id, 'user_id' => $this->auth->id])->find();
        if (!$info) {
            $this->error('数据不存在');
        }
        if ($info['status'] != 0) {
            $this->error('网络延迟,请刷新重试');
        }
        if ($info['createtime'] + 1800 < time()) {
            $this->error('订单超时,系统将自动取消');
        }
        //查询活动是否存在
        $active_info = Db::name('active')->find($info['active_id']);
        if (!$active_info) {
            $this->error('活动不存在');
        }

        //开启事务
        Db::startTrans();
        //修改订单信息
        $rs = Db::name('active_order')->where(['id' => $id, 'status' => 0])->setField('status', 3);
        if (!$rs) {
            Db::rollback();
            $this->error('网络延迟,请稍后再试');
        }
        //修改活动人员
        $rt = Db::name('active_people')->where(['order_id' => $id, 'status' => 0])->setField(['status' => 3, 'modifystatus' => 0]);
        if (!$rt) {
            Db::rollback();
            $this->error('网络延迟,请稍后再试');
        }
        //修改活动人员修改记录
        $res = Db::name('active_people_modify')->where(['order_id' => $id, 'status' => 0])->setField('status', 2);
        if ($res === false) {
            Db::rollback();
            $this->error('网络延迟,请稍后再试');
        }
        //减少活动已报名人数
        $currentperson = $active_info['currentperson'] - $info['number'];
        $active_rs = Db::name('active')->where(['id' => $info['active_id'], 'currentperson' => $active_info['currentperson']])->setField('currentperson', $currentperson);
        if (!$active_rs) {
            Db::rollback();
            $this->error('网络延迟,请稍后再试');
        }

        Db::commit();
        $this->success('修改成功');
    }

    //支付订单
    public function payorder() {
        $id = input('id', 0, 'intval'); //订单id
        if (!$id) {
            $this->error('参数缺失');
        }
        $info = Db::name('active_order')->where(['id' => $id, 'user_id' => $this->auth->id])->find();
        if (!$info) {
            $this->error('数据不存在');
        }
        if ($info['status'] != 0) {
            $this->error('当前订单状态不能支付');
        }
        if ($info['createtime'] + 1800 < time()) {
            $this->error('订单支付超时,请重新报名');
        }
        //查询活动是否存在
        $active_info = Db::name('active')->find($info['active_id']);
        if (!$active_info) {
            $this->error('活动不存在');
        }
        if ($active_info['status'] == 2) {
            $this->error('活动已经结束');
        }
        if ($active_info['status'] == 3) {
            $this->error('活动已取消');
        }

        $pay_count = Db::name('rechar_order')->where(['user_id' => $this->auth->id, 'purpose' => 1, 'pay_type' => 'wechat', 'relation_id' => $id, 'status' => 1])->count('id');
        if ($pay_count) {
            $this->error('您已成功支付过,请勿重复支付');
        }

        //生成支付订单记录
        $rechar_order['user_id'] = $this->auth->id;
        $rechar_order['order_no'] = date('YmdHis', time()) . rand(10000000, 99999999); //微信订单编号
        $rechar_order['money'] = $info['price'];
        $rechar_order['purpose'] = 1; //充值用途:1=支付订单,2=充值,3=开通会员
        $rechar_order['pay_type'] = 'wechat';
        $rechar_order['relation_id'] = $id;
        $rechar_order['createtime'] = time();

        $result = Db::name('rechar_order')->insertGetId($rechar_order);
        if (!$result) {
            $this->error('网络延迟,请稍后再试');
        }

        //构建支付链接数据
        $wxData['body'] = '报名活动支付';
        $wxData['out_trade_no'] = $rechar_order['order_no'];
        $wxData['total_fee'] = $info['price'];
//        $wxData['total_fee'] = 0.01;
        $wxData['openid'] = $this->auth->openid;

//            require_once($_SERVER['DOCUMENT_ROOT'] . '/Plugins/Weixin/WxPay/WxPay.php');
        $wxPay = new wxpay\WxPay(config('wxchatpay'));
        $doResult = $wxPay->WxPayJs($wxData);

        $this->success('微信支付参数返回成功', $doResult);
    }

    //申请退款
    public function applyrefund() {
        $id = input('id', 0, 'intval'); //订单id
        if (!$id) {
            $this->error('参数缺失');
        }
        $info = Db::name('active_order')->where(['id' => $id, 'user_id' => $this->auth->id])->find();
        if (!$info) {
            $this->error('数据不存在');
        }
        if ($info['status'] != 1) {
            $this->error('当前订单状态不能退款');
        }
        //查询是否已经申请过
        $count = Db::name('active_refund')->where(['order_id' => $id, 'status' => 0])->count('id');
        if ($count) {
            $this->error('您已申请过退款,请等待后台审核');
        }

        //查询活动是否存在
        $active_info = Db::name('active')->find($info['active_id']);
        if (!$active_info) {
            $this->error('活动不存在');
        }
        if (time() > $active_info['refundendtime']) {
            $this->error('已超过退款截止时间,暂不能退款');
        }

        //用户取消订单每人扣费金额(元)
        $cancelorder_price = config('site.cancelorder');
        if ($cancelorder_price < 0) {
            $this->error('退款手续费异常,请联系管理员');
        }
        //退款金额
        $refundprice = number_format($info['price'] - $cancelorder_price * $info['number'], 2, '.', '');
        $refundprice = $refundprice > 0 ? $refundprice : 0;

        //构建申请数据
        $data = [
            'active_id' => $info['active_id'],
            'order_id' => $id,
            'user_id' => $this->auth->id,
            'paytype' => $info['paytype'],
            'price' => $info['price'],
            'number' => $info['number'],
            'transaction_id' => $info['transaction_id'],
            'refund_no' => $info['paytype'] ? date('YmdHis', time()) . rand(10000000, 99999999) : '', //退款单号
            'refundprice' => $refundprice,
            'createtime' => time()
        ];

        $rs = Db::name('active_refund')->insertGetId($data);
        if (!$rs) {
            $this->error('申请退款失败');
        }

        $this->success('申请退款成功,请等待审核');
    }


}