<?php
//权限控制
\think\Hook::add('check_auth','app\\common\\behavior\\AuthenticateBehavior');
use think\Db;

function structureList($structid,$str){
    $str .= $structid.',';
    if(Db::name('AdminStructure')->where('pid ='.$structid)->find() ){
        $list = Db::name('AdminStructure')->field('id,name,pid')->where('pid ='.$structid)->select();
        foreach($list as $value){
            $str = structureList($value['id'],$str);
        }
    }
    return $str;
}

/**
 * cookies加密函数
 * @param string 加密后字符串
 */
function encrypt($data, $key = '5k-72crm') 
{ 
    $cryptdes = new com\Cryptdes($key);
    return $cryptdes->encrypt($data);
    // $prep_code = serialize($data); 
    // $block = mcrypt_get_block_size('des', 'ecb'); 
    // if (($pad = $block - (strlen($prep_code) % $block)) < $block) { 
    //     $prep_code .= str_repeat(chr($pad), $pad); 
    // } 
    // $encrypt = mcrypt_encrypt(MCRYPT_DES, $key, trim($prep_code), MCRYPT_MODE_ECB); 
    // return base64_encode($encrypt); 
} 

/**
 * cookies 解密密函数
 * @param array 解密后数组
 */
function decrypt($data, $key = '5k-72crm') 
{ 
    $cryptdes = new com\Cryptdes($key);
    return $cryptdes->decrypt($data);
    // $str = base64_decode($str); 
    // $str = mcrypt_decrypt(MCRYPT_DES, $key, $str, MCRYPT_MODE_ECB); 
    // $block = mcrypt_get_block_size('des', 'ecb'); 
    // $pad = ord($str[($len = strlen($str)) - 1]); 
    // if ($pad && $pad < $block && preg_match('/' . chr($pad) . '{' . $pad . '}$/', $str)) { 
    //     $str = substr($str, 0, strlen($str) - $pad); 
    // } 
    // return unserialize($str); 
}

/**
 * 部门树形数组
 * @param type 0 下属数组, 1包含自己
 */
function getSubObj($id, $objList, $separate, $is_first = 0) {
    $array = array(); 
    foreach ($objList as $key => $value) {
        if ($key == 0 && $is_first == 1) {
            if ($value['id'] == 1) {
                $id = 0;
            } else {
                $id = $value['pid'];
            }
        }
        if ($id == $value['pid']) {
            $array[] = array('id' => $value['id'], 'name' => $separate.$value['name']);
            $array = array_merge($array, getSubObj($value['id'], $objList, $separate.'--'));
        }
    }
    return $array;
}

/**
 * 解析sql语句
 * @param  string $content sql内容
 * @param  int $limit  如果为1,则只返回一条sql语句,默认返回所有
 * @param  array $prefix 替换表前缀
 * @return array|string 除去注释之后的sql语句数组或一条语句
 */
function parse_sql($sql = '', $limit = 0, $prefix = []) {
    // 被替换的前缀
    $from = '';
    // 要替换的前缀
    $to = '';
    // 替换表前缀
    if (!empty($prefix)) {
        $to   = current($prefix);
        $from = current(array_flip($prefix));
    }
    if ($sql != '') {
        // 纯sql内容
        $pure_sql = [];
        // 多行注释标记
        $comment = false;
        // 按行分割,兼容多个平台
        $sql = str_replace(["\r\n", "\r"], "\n", $sql);
        $sql = explode("\n", trim($sql));
        // 循环处理每一行
        foreach ($sql as $key => $line) {
            // 跳过空行
            if ($line == '') {
                continue;
            }
            // 跳过以#或者--开头的单行注释
            if (preg_match("/^(#|--)/", $line)) {
                continue;
            }
            // 跳过以/**/包裹起来的单行注释
            if (preg_match("/^\/\*(.*?)\*\//", $line)) {
                continue;
            }
            // 多行注释开始
            if (substr($line, 0, 2) == '/*') {
                $comment = true;
                continue;
            }
            // 多行注释结束
            if (substr($line, -2) == '*/') {
                $comment = false;
                continue;
            }
            // 多行注释没有结束,继续跳过
            if ($comment) {
                continue;
            }
            // 替换表前缀
            if ($from != '') {
                $line = str_replace('`'.$from, '`'.$to, $line);
            }
            if ($line == 'BEGIN;' || $line =='COMMIT;') {
                continue;
            }
            // sql语句
            array_push($pure_sql, $line);
        }
        // 只返回一条语句
        if ($limit == 1) {
            return implode($pure_sql, "");
        }
        // 以数组形式返回sql语句
        $pure_sql = implode($pure_sql, "\n");
        $pure_sql = explode(";\n", $pure_sql);
        return $pure_sql;
    } else {
        return $limit == 1 ? '' : [];
    }
}

function sendRequest($url, $params = array() , $headers = array()) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    if (!empty($params)) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    }
    if (!empty($headers)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }
    $res = curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $value = curl_exec($ch);
    if (curl_errno($ch)) {
        $return = array(0, '连接服务器出错', -1);
    } else {
        if (!$value) {
            $return = array(0, '服务器返回数据异常', -1);
        }
        $return = $value;
    }
    curl_close($ch);
    return $return;
}

/**
 * 验证序列号
 * @param 
 * @return
 */        
function checkWkCode($wkcode) {
    $pub = formatPubKey(config('public_key'));
    $openssl_pub = openssl_pkey_get_public($pub);
    // 验签
    $resArr = openssl_public_decrypt(Hex2String($wkcode), $decrypted, $pub);
    if(!$resArr) return false;
    return $decrypted;
}

function Hex2String($hex){
    $string = '';
    for ($i=0; $i < strlen($hex); $i+=2){
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}

//公钥格式处理
function formatPubKey($pubKey) {
    $fKey = "-----BEGIN PUBLIC KEY-----\n";
    $len = strlen($pubKey);
    for($i = 0; $i < $len; ) {
        $fKey = $fKey . substr($pubKey, $i, 64) . "\n";
        $i += 64;
    }
    $fKey .= "-----END PUBLIC KEY-----";
    return $fKey;
}

/**
 * foreach循环内查询数据
 * @param string $types
 * @param $data
 *
 * @author      alvin guogaobo
 * @version     1.0 版本号
 * @since       2021/4/15 0015 14:39
 */
function foreachData($types='',$data)
{
    switch ($types) {
        case 'admin_structure' :
            $res=Db::name('AdminUser')->where('id',$data)->value('realname');
            break;
        case '' :
            $res=Db::name('AdminUser')->where('id',$data['id'])->update(['structure_id'=>$data['structure_id']]);
            break;
        case 'market':
            $res=Db::name('MarketData')->whereIn('id',$data)->select();
            break;
    }
    return $res;
}