Common.php 15.1 KB
<?php

namespace app\api\controller;

use app\common\controller\Algorithm;
use app\common\controller\Api;
use app\common\exception\UploadException;
use app\common\library\Upload;
use app\common\model\Area;
use app\common\model\Version;
use fast\Random;
use think\Config;
use think\Hook;
use think\Db;
use app\common\model\Attachment;
use Qiniu\Auth;

/**
 * 公共接口
 */
class Common extends Api
{
    protected $noNeedLogin = ['*'];
    protected $noNeedRight = '*';

    /**
     * 加载初始化
     *
     * @param string $version 版本号
     * @param string $lng 经度
     * @param string $lat 纬度
     */
    public function init()
    {
        if ($version = $this->request->request('version')) {
            $lng = $this->request->request('lng');
            $lat = $this->request->request('lat');

            //配置信息
            $upload = Config::get('upload');
            //如果非服务端中转模式需要修改为中转
            if ($upload['storage'] != 'local' && isset($upload['uploadmode']) && $upload['uploadmode'] != 'server') {
                //临时修改上传模式为服务端中转
                set_addon_config($upload['storage'], ["uploadmode" => "server"], false);

                $upload = \app\common\model\Config::upload();
                // 上传信息配置后
                Hook::listen("upload_config_init", $upload);

                $upload = Config::set('upload', array_merge(Config::get('upload'), $upload));
            }

            $upload['cdnurl'] = $upload['cdnurl'] ? $upload['cdnurl'] : cdnurl('', true);
            $upload['uploadurl'] = preg_match("/^((?:[a-z]+:)?\/\/)(.*)/i", $upload['uploadurl']) ? $upload['uploadurl'] : url($upload['storage'] == 'local' ? '/api/common/upload' : $upload['uploadurl'], '', false, true);

            $content = [
                'citydata' => Area::getCityFromLngLat($lng, $lat),
                'versiondata' => Version::check($version),
                'uploaddata' => $upload,
                'coverdata' => Config::get("cover"),
            ];
            $this->success('', $content);
        } else {
            $this->error(__('Invalid parameters'));
        }
    }

    /**
     * 上传文件-七牛
     *
     * @ApiTitle    (上传文件-七牛)
     * @ApiSummary  (测试描述信息)
     * @ApiMethod   (POST)
     * @ApiParams   (name="file", type="file", required=true, description="用户名")
     */
    public function uploadQiniu()
    {
        $config = get_addon_config('qiniu');
        $file = $this->request->file('file');
        if (!$file || !$file->isValid()) {
            $this->error("请上传有效的文件");
        }
        $fileInfo = $file->getInfo();
        $filePath = $file->getRealPath() ?: $file->getPathname();
        preg_match('/(\d+)(\w+)/', $config['maxsize'], $matches);
        $type = strtolower($matches[2]);
        $typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3];
        $size = (int)$config['maxsize'] * pow(1024000, isset($typeDict[$type]) ? $typeDict[$type] : 0);

        $suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION));
        $suffix = $suffix ? $suffix : 'file';

        $md5 = md5_file($filePath);
        $search = ['$(year)', '$(mon)', '$(day)', '$(etag)', '$(ext)'];
        $replace = [date("Y"), date("m"), date("d"), $md5, '.' . $suffix];
        $object = ltrim(str_replace($search, $replace, $config['savekey']), '/');

        $mimetypeArr = explode(',', strtolower($config['mimetype']));
        $typeArr = explode('/', $fileInfo['type']);

        //检查文件大小
        if (!$file->checkSize($size)) {
            $this->error("起过最大可上传文件限制");
        }

        //验证文件后缀
        if ($config['mimetype'] !== '*' &&
            (
                !in_array($suffix, $mimetypeArr)
                || (stripos($typeArr[0] . '/', $config['mimetype']) !== false && (!in_array($fileInfo['type'], $mimetypeArr) && !in_array($typeArr[0] . '/*', $mimetypeArr)))
            )
        ) {
            $this->error(__('上传格式限制'));
        }

        $savekey = '/' . $object;

        $uploadDir = substr($savekey, 0, strripos($savekey, '/') + 1);
        $fileName = substr($savekey, strripos($savekey, '/') + 1);
        //先上传到本地
        $splInfo = $file->move(ROOT_PATH . '/public' . $uploadDir, $fileName);
        if ($splInfo) {
            $extparam = $this->request->post();
            $filePath = $splInfo->getRealPath() ?: $splInfo->getPathname();

            $sha1 = sha1_file($filePath);
            $imagewidth = $imageheight = 0;
            if (in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf', 'pdf'])) {
                $imgInfo = getimagesize($splInfo->getPathname());
                $imagewidth = isset($imgInfo[0]) ? $imgInfo[0] : $imagewidth;
                $imageheight = isset($imgInfo[1]) ? $imgInfo[1] : $imageheight;
            }
            $params = array(
                'admin_id' => session('admin.id'),
                'user_id' => $this->auth->id,
                'filesize' => $fileInfo['size'],
                'imagewidth' => $imagewidth,
                'imageheight' => $imageheight,
                'imagetype' => $suffix,
                'imageframes' => 0,
                'mimetype' => $fileInfo['type'],
                'url' => $uploadDir . $splInfo->getSaveName(),
                'uploadtime' => time(),
                'storage' => 'local',
                'sha1' => $sha1,
                'extparam' => json_encode($extparam),
            );
            $attachment = Attachment::create(array_filter($params), true);
            $policy = array(
                'saveKey' => ltrim($savekey, '/'),
            );
            $auth = new Auth($config['accessKey'], $config['secretKey']);
            $token = $auth->uploadToken($config['bucket'], null, $config['expire'], $policy);
            $multipart = [
                ['name' => 'token', 'contents' => $token],
                [
                    'name' => 'file',
                    'contents' => fopen($filePath, 'r'),
                    'filename' => $fileName,
                ]
            ];
            try {
                $client = new \GuzzleHttp\Client();
                $res = $client->request('POST', $config['uploadurl'], [
                    'multipart' => $multipart
                ]);
                $code = $res->getStatusCode();
                //成功不做任何操作
            } catch (\GuzzleHttp\Exception\ClientException $e) {
                $attachment->delete();
                unlink($filePath);
                $this->error("上传失败");
            }

            $url = '/' . $object;

            //上传成功后将存储变更为qiniu
            $attachment->storage = 'qiniu';
            $attachment->save();
            $this->success("上传成功", $url);
        } else {
            $this->error('上传失败');
        }
        return;
    }


    //清除Sleep表
    public function DeleteSllep()
    {
        $Arr = Db::name('sleep')->select();
        if (!empty($Arr)) {
            foreach ($Arr as $k => $v) {
                Db::name('sleep')->where('id', $v['id'])->delete();
            }
        }
    }


    //拉取新订单
    public function PullOrder()
    {
        $GuanYiCloud = new GuanYiCloud();
        //查询所有待发货订单
        $OrderInfoArray = Db::name('order')->where('status', 1)->select();
        if (!empty($OrderInfoArray)) {
            foreach ($OrderInfoArray as $k => $v) {
                $Josn = json_decode($GuanYiCloud->getOrders($v['OrderSn']));
                if ($Josn['delivery_state'] == 2) {
                    //已发货
                    $res = Db::name('order')->where('OrderSn', $v['OrderSn'])->update(
                        [
                            'status' => 2,
                            'ems_order' => $Josn['mail_no'],
                            'ems_company' => $Josn['express_name'],
                            'updatetime' => time()
                        ]
                    );
                    if (!$res) {
                        $this->error('物流信息更新失败,订单编号:' . $v['OrderSn']);
                    }
                }
            }
        } else {
            $this->success('无更新');
        }
    }

    public function CurrentInnateEnergyTendency()
    {
        $Api = new Algorithm();
        //取出风水火能量
        $CurrentInnateEnergyTendencyArray = Db::name('sleep')->where('id', 1)->find();
        if (empty($CurrentInnateEnergyTendencyArray)) {
            $this->error('天生能量倾向取出失败', 0);
        }
        //$InnateEnergyTendency 定义一维数组
        $CurrentInnateEnergyTendency[0] = $CurrentInnateEnergyTendencyArray['current_wind'];
        $CurrentInnateEnergyTendency[1] = $CurrentInnateEnergyTendencyArray['current_water'];
        $CurrentInnateEnergyTendency[2] = $CurrentInnateEnergyTendencyArray['current_fire'];
        //rsort排序
        rsort($CurrentInnateEnergyTendency);
        //判断用户近期能量倾向 $Innate 能量标签
        //单一体质:A >=7或B >=7分,且C >=14
        //双能体质:A >=7或B >=7分,且C <14
        //三能体质:A <7分且B <7分
        dump($CurrentInnateEnergyTendency);
        $A = $CurrentInnateEnergyTendency[0] - $CurrentInnateEnergyTendency[2];
        $B = $CurrentInnateEnergyTendency[1] - $CurrentInnateEnergyTendency[2];
        $C = $CurrentInnateEnergyTendency[0] - $CurrentInnateEnergyTendency[1];
        dump($A);
        dump($B);
        dump($C);
        //出现两个相同分值的特殊情况,判断方法如下:
        //出现两个相同的最高分值,为“排名1能量+排名2能量 主导”
        //出现两个相同的最低分值,为“排名1能量 主导”
//        if ($CurrentInnateEnergyTendency[0] == $CurrentInnateEnergyTendency[1]) {
//            //两个相同的最高分值,为“排名1能量+排名2能量 主导”
//            $CurrentInnate = $this->CurrentInnateName($CurrentInnateEnergyTendency[0], $CurrentInnateEnergyTendencyArray) . '+' . $this->CurrentInnateName($CurrentInnateEnergyTendency[1], $CurrentInnateEnergyTendencyArray) . '能主导';

        if ($CurrentInnateEnergyTendency[0] == $CurrentInnateEnergyTendency[1] || $CurrentInnateEnergyTendency[1] == $CurrentInnateEnergyTendency[2]) {
            //出现两个相同分值的特殊情况
            if ($CurrentInnateEnergyTendency[0] == $CurrentInnateEnergyTendency[1]) {
                //出现两个相同的最高分值,为“排名1能量($First)+排名2($Second)能量 主导”
                $First = $Api->CurrentInnateName2($CurrentInnateEnergyTendency[0], $CurrentInnateEnergyTendencyArray, 0, '');
                $Second = $Api->CurrentInnateName2($CurrentInnateEnergyTendency[1], $CurrentInnateEnergyTendencyArray, 1, $First);
                $CurrentInnate = $First . '+' . $Second . '能主导';
            }
            if ($CurrentInnateEnergyTendency[1] == $CurrentInnateEnergyTendency[2]) {
                //出现两个相同的最低分值,为“排名1能量 主导”
                $First = $Api->CurrentInnateName2($CurrentInnateEnergyTendency[0], $CurrentInnateEnergyTendencyArray, 0, '');
                $CurrentInnate = $First . '能主导';
            }

        } elseif (($A >= 7 && $C >= 14) || ($B >= 7 && $C >= 14)) {
            //两个相同的最低分值,为“排名1能量 主导”
            $CurrentInnate = $Api->CurrentInnateName($CurrentInnateEnergyTendency[0], $CurrentInnateEnergyTendencyArray) . '能主导';
        } elseif (($A >= 7 && $C < 14) || ($B >= 7 && $C < 14)) {
            //双能体质
            $CurrentInnate = $Api->CurrentInnateName($CurrentInnateEnergyTendency[0], $CurrentInnateEnergyTendencyArray) . '+' . $Api->CurrentInnateName($CurrentInnateEnergyTendency[1], $CurrentInnateEnergyTendencyArray) . '能主导';
        } elseif ($CurrentInnateEnergyTendency[0] < 7 && $CurrentInnateEnergyTendency[1] < 7) {
            //三能体质
            $CurrentInnate = '三能量平衡';
        }
        if (empty($CurrentInnate) || $CurrentInnate == '' || $CurrentInnate == "" || $CurrentInnate == null) {
            $this->error('天生能量倾向获取失败', 0);
        }
        dump($CurrentInnate);
    }


    public function IsNew()
    {
        $UserId = $this->is_token($this->request->header());
        $is_new = Db::name('user')->where('id', $UserId)->value('is_new');
        $this->success('成功', $is_new);
    }

    //活动排名
    public function InviteLevel()
    {
//        $GroupInfo = Db::name('group')->alias('g')->join('user u', 'u.id=g.user_id')->field('g.id,g.fuser_id,u.nickname,u.avatar')->select();
//        $List = [];
//        if (!empty($GroupInfo)) {
//            $GroupInfo = array_values($this->second_array_unique_bykey($GroupInfo, 'fuser_id'));
//            foreach ($GroupInfo as $k => $v) {
//                $GroupInfo[$k]['Num'] = count(Db::name('group')->where('fuser_id', $v['fuser_id'])->select());
//            }
//            $InviteDesc = $this->InviteDesc($GroupInfo);
//            foreach ($InviteDesc as $k => $v) {
//                if ($k == 20) {
//                    break;
//                }
//                if ($v['Num'] > 3 || $v['Num'] == 3) {
//                    $List[$k] = $v;
//                }
//            }
//        }
//        $this->success('成功', $List);
        $db = Db::name('user')->field('id,nickname,avatar,invite_num as Num')
            ->where('invite_num', '>=', 3)->order('invite_num desc')->limit(50)->select();
        $UserId = $this->is_token($this->request->header());
        $me = Db::query("SELECT b.id,b.nickname,b.avatar,b.invite_num as Num,b.rownum FROM (SELECT t.*, @rownum := @rownum + 1 AS rownum FROM (SELECT @rownum := 0) r,(SELECT * FROM fa_user ORDER BY invite_num DESC) AS t) AS b WHERE b.id={$UserId};");
        $this->success('ok', ['list' => $db, 'me' => $me[0]]);
    }


    //省
    public function BroCity()
    {
        $Info = Db::name('area')->where('pid', 0)->select();
        $this->success('成功', $Info);
    }

    //市
    public function BroAddress()
    {
        $Pid = input('pid');
        $Info = Db::name('area')->where('pid', $Pid)->select();
        $this->success('成功', $Info);
    }

    //区
    public function BroStree()
    {
        $Pid = input('pid');
        $Info = Db::name('area')->where('pid', $Pid)->select();
        $this->success('成功', $Info);
    }

    //活动定时任务
    public function Controb()
    {
        $Bool = Db::name('huodong_money')->where('id', 'NEQ', 0)->update(['tixian_money' => 200, 'type' => 0]);
        return $Bool;
    }

    //定时任务
    public function OverTime()
    {
        $Info = Db::name('clock_user')->where('exp_time', '<', time())->select();
        foreach ($Info as $k => $v) {
//            $Count = Db::name('clock_help')->where('clock_id', $v['id'])->select();
            if ($v['num']!= 3) {
                Db::name('clock_help')->where('clock_id', $v['id'])->update(['status'=>1]);
                Db::name('clock_user')->where('id', $v['id'])->update(['exp_time' => time() + 60 * 60 * 2]);
            }
        }
    }
}