IndexController.php 11.3 KB
<?php

namespace api\home\controller;

use cmf\controller\RestBaseController;
use think\Db;
use wxapp\pay\WeixinPay;
/**
 * @title 达人广场
 * @description 达人广场相关接口
 */
class IndexController extends RestBaseController
{

    public function test(){
        echo cmf_api_url('portal/pay/notify','','',true);
//        echo "<br/>";
//        echo cmf_api_url('portal/pay/notify2','','',true);
    }

    /**
     * @title 首页
     * @description 达人广场首页
     * @author panhaowen
     * @url /home/index/index
     * @method POST
     * @header name:XX-Token require:1 default: desc:token
     * @param name:search type:varchar require:0  desc:搜索条件
     * @param name:category_id type:int require:0  desc:技能筛选
     * @param name:jing type:varchar require:0  desc:经度
     * @param name:wei type:varchar require:0  desc:纬度
     * @param name:distance type:int require:0  desc:附近的达人(1)
     * @return banner:banner图
     * @return skill:技能
     * @return data:发布列表
     */
    public function index()
    {
        $userId=$this->getUserId();
        $param = $this->request->param();
        if (!empty($param['jing']&&!empty($param['wei']))){
            Db::name('user')->where('id',$userId)->update(['jing'=>$param['jing'],'wei'=>$param['wei']]);
        }
        if (!empty($param['city'])){
            Db::name('user')->where('id',$userId)->update(['city'=>$param['city']]);
        }
        $config = Db::name('config')->where('id', 1)->find();
        $banner=[];
        if (!empty($config['banner1'])){
            $banner1=json_decode($config['banner1'], true);
            $banner[]=['banner'=>cmf_get_image_preview_url($banner1['url']),'id'=>$banner1['id']];
        }
        if (!empty($config['banner2'])){
            $banner2=json_decode($config['banner2'], true);
            $banner[]=['banner'=>cmf_get_image_preview_url($banner2['url']),'id'=>$banner2['id']];
        }
        if (!empty($config['banner3'])){
            $banner3=json_decode($config['banner3'], true);
            $banner[]=['banner'=>cmf_get_image_preview_url($banner3['url']),'id'=>$banner3['id']];
        }
        if (!empty($config['banner4'])){
            $banner4=json_decode($config['banner4'], true);
            $banner[]=['banner'=>cmf_get_image_preview_url($banner4['url']),'id'=>$banner4['id']];
        }
        if (!empty($config['banner5'])){
            $banner5=json_decode($config['banner5'], true);
            $banner[]=['banner'=>cmf_get_image_preview_url($banner5['url']),'id'=>$banner5['id']];
        }
        $skill = Db::name('category')->order('create_time','desc')->limit(3)->select()->toArray();
        foreach ($skill as $k=>$v){
            $skill[$k]['thumbnail']=cmf_get_image_preview_url($skill[$k]['thumbnail']);
        }

        $keywordComplex = [];
        if (!empty($param['search'])) {
            $keywordComplex['u.id|u.user_nickname'] = ['like', "%" . $param['search'] . "%"];
        }
        $data = Db::name('post')
            ->alias('p')
            ->join('user u', 'p.user_id=u.id')
            ->whereOr($keywordComplex)
            ->where('p.status', 2)
            ->where('u.id','neq',$userId)
            ->order('p.create_time', 'desc')
            ->field('p.*,u.user_nickname,u.avatar,u.jing,u.wei')
            ->select()->each(function ($item) {
                $item['skill'] = Db::name('skill')->alias('s')->join('category c', 's.category_id=c.id')->where('s.id', explode(',', $item['skill_id'])[0])->field('c.name,s.price')->find();

                return $item;
            })->toArray();
        //技能筛选
        if (!empty($param['category_id'])) {
            foreach ($data as $k => $v) {
                $re = Db::name('skill')->where(['id' => ['in', explode(',', $data[$k]['skill_id'])], 'category_id' => $param['category_id']])->find();
                if (!$re) {
                    unset($data[$k]);
                }
            }
        }

        //距离筛选
        if (!empty($param['distance'])&&$param['distance']==1) {
            $user=Db::name('user')->where('id', $userId)->find();
            $distance=[];

            foreach ($data as $k => $v) {
                $lng2 = $data[$k]['jing'];  //经度2
                $lat2 = $data[$k]['wei'];   //纬度2
                $distance[]=$lat2.','.$lng2;
            }
            $distance=implode(';',$distance);
            $from=$user['wei'].','.$user['jing'];
            $curl = curl_init();
//            var_dump($user['jing'].','.$user['wei']);
            $url='https://apis.map.qq.com/ws/distance/v1/?mode=driving&from='.$from.'&to='.$distance.'&key=OF2BZ-DBFHP-IUDDN-LDPDZ-IA7CJ-UEFBC';
            curl_setopt($curl, CURLOPT_URL, $url);
            $res = curl_exec($curl);
            $this->success($res);
            foreach ($data as $k => $v) {
                $data[$k]['distance']=($res['result'][$k]['distance']/1000);
            }
            $last_names = array_column($data,'distance');
            array_multisort($last_names,SORT_ASC,$data);
        }
        $this->success("获取数据成功", ['banner' => $banner, 'skill' => $skill, 'data' => $data]);
    }

    /**
     * @title 获取技能分类
     * @description 获取技能分类
     * @author panhaowen
     * @url /home/index/getCategory
     * @method POST
     * @header name:XX-Token require:1 default: desc:token
     * @return data:全部技能分类
     */
    public function getCategory(){
        $data=Db::name('category')->order('create_time','desc')->select()->each(function ($item) {
            $item['thumbnail'] = cmf_get_image_preview_url($item['thumbnail']);
            return $item;
        });
        $this->success('获取数据成功',$data);
    }


    /**
     * @title 用户详情
     * @description 用户详情
     * @author panhaowen
     * @url /home/index/post
     * @method POST
     * @header name:XX-Token require:1 default: desc:token
     * @param name:id type:int require:1  desc:用户发布id
     * @return data:用户发布详情
     */
    public function post()
    {
        $userId = $this->getUserId();
        $param = $this->request->param();
        $data = Db::name('post')
            ->alias('p')
            ->join('user u', 'p.user_id=u.id')
            ->where('p.id', $param['id'])
            ->field('p.*,u.user_nickname,u.avatar')
            ->find();
//        $this->success('获取数据成功', $data);
        $data['avatar'] = cmf_get_image_preview_url($data['avatar']);
        $data['wx'] = cmf_get_image_preview_url($data['wx']);
        $data['skill_id'] = explode(',', $data['skill_id']);
        $data['skill'] = Db::name('skill')->alias('s')->join('category c', 's.category_id=c.id')->where('s.id', 'in', $data['skill_id'])->field('c.name,s.price')->select();
        $data['thumbnail'] = json_decode($data['thumbnail'], true);
        if (!empty($data['thumbnail'])) {
            foreach ($data['thumbnail'] as $k => $v) {
                $data['thumbnail'][$k] = cmf_get_image_preview_url($data['thumbnail'][$k]);
            }
        }
        //是否允许通过电话联系
        $re1 = Db::name('contact_order')->where(['user_id' => $userId, 'post_id' => $param['id'], 'status' => 2])->find();
        $re2 = Db::name('order')->where(['user_id' => $userId, 'post_id' => $param['id']])->whereNotIn('to_user_status',[1,5,3])->find();
        if ((!$re1 && !$re2) || $data['is_mobile'] == 0) {
            unset($data['mobile']);
        }
        if (!$re1 && !$re2) {
            unset($data['wx']);
        }
        $this->success('获取数据成功', $data);
    }

    /**
     * @title 立即联系
     * @description 立即联系
     * @author panhaowen
     * @url /home/index/contact
     * @method POST
     * @header name:XX-Token require:1 default: desc:token
     * @param name:id type:int require:1  desc:用户发布id
     */
    public function contact()
    {
        $userId = $this->getUserId();
        $openid = Db::name('third_party_user')->where('user_id', $userId)->find()['openid'];
        $param = $this->request->param();
        $order_sn = cmf_get_order_sn();
        $post = Db::name('post')->where('id', $param['id'])->find();
        if ($post['is_contact'] == 0) {
            $this->error('该用户暂不提供下单以外获取联系方式');
        }
        Db::name('contact_order')->insert(['create_time' => time(), 'user_id' => $userId, 'post_id' => $param['id'], 'order_sn' => $order_sn, 'money' => $post['contact_price']]);
        $pay = new WeixinPay();
        $re=$pay->pay($openid, $order_sn, '获取联系方式', $post['contact_price']*100, cmf_api_url('portal/pay/notify','','',true));
        $prepay_id=trim(strrchr($re['package'], '='),'=');
        Db::name('contact_order')->where('order_sn',$order_sn)->update(['prepayId'=>$prepay_id]);
        $this->success('唤起支付',$re);
    }

    /**
     * @title 确认订单
     * @description 确认订单
     * @author panhaowen
     * @url /home/index/order
     * @method POST
     * @header name:XX-Token require:1 default: desc:token
     * @param name:id type:int require:1  desc:用户发布id
     */
    public function order()
    {
        $param = $this->request->param();
        $data = Db::name('post')
            ->where('id', $param['id'])
            ->find();
        $data['skill_id'] = explode(',', $data['skill_id']);
        $data['skill'] = Db::name('skill')->alias('s')->join('category c', 's.category_id=c.id')->where('s.id', 'in', $data['skill_id'])->field('s.id,c.name,s.price')->select();
        $this->success('获取信息成功', $data['skill']);
    }

    /**
     * @title 订单提交
     * @description 订单提交
     * @author panhaowen
     * @url /home/index/orderPost
     * @method POST
     * @header name:XX-Token require:1 default: desc:token
     * @param name:post_id type:int require:1  desc:用户发布id
     * @param name:last type:int require:1  desc:陪玩时长
     * @param name:skill_id type:int require:1  desc:选择技能id
     * @param name:wx type:varchar require:1  desc:wx二维码
     * @param name:start_time type:int require:1  desc:陪玩开始时间
     * @param name:mobile type:int require:1  desc:用户联系电话
     */
    public function orderPost()
    {
        $param = $this->request->param();
        //获取当前用户id
        $userId = $this->getUserId();
        $openid = Db::name('third_party_user')->where('user_id', $userId)->find()['openid'];
        $skill = Db::name('skill')->where('id', $param['skill_id'])->find();
        $order_sn = cmf_get_order_sn();
        Db::name('order')->insert(
            [
                'create_time' => time(),
                'skill_id'=>$param['skill_id'],
                'user_id' => $userId,
                'post_id' => $param['post_id'],
                'last' => $param['last'],
                'total_price' => $param['last'] * $skill['price'],
                'order_sn' => $order_sn,
                'wx' => $param['wx'],
                'start_time' => strtotime($param['start_time']),
                'mobile' => $param['mobile']
            ]);
        $pay = new WeixinPay();
        $re=$pay->pay($openid, $order_sn, '下单支付', $param['last']*$skill['price']*100, cmf_api_url('portal/pay/notify2','','',true));
        $prepay_id=trim(strrchr($re['package'], '='),'=');
        Db::name('order')->where('order_sn',$order_sn)->update(['prepayId'=>$prepay_id]);
        $this->success('唤起支付',$re);
    }
}