date('y', $time),
        '{Y}' => date('Y', $time),
        '{M}' => date('m', $time),
        '{D}' => date('d', $time),
        '{H}' => date('H', $time),
        '{I}' => date('i', $time),
        '{S}' => date('s', $time),
    ];
    $table = $config['table'];
    $data = $config['data'];
    $prefix = $config['prefix'];
    $length = $config['length'] > 0 ? $config['length'] : 4;
    $rule = empty($config['rule']) ? '{Y}{M}{D}' : $config['rule'];
    $bill_id = $config['bill_id'];
    // 生成序号调用插件
    $_data = App\Support\Hook::fire($table . '.onBillSeqNo', ['bill_id' => $bill_id, 'rule' => $rule]);
    extract($_data);
    if ($data) {
        $data = str_replace($prefix, '', $data);
        $new_rule = mb_substr($data, 0, mb_strlen($data) - $length);
    } else {
        $new_rule = str_replace(array_keys($items), array_values($items), $rule);
    }
    $no = DB::table('model_seq_no')
    ->where('bill_id', $bill_id)
    ->where('rule_code', $new_rule)
    ->first();
    if (empty($no)) {
        $new_sn = 1;
        if ($update == true) {
            DB::table('model_seq_no')
            ->insert([
                'bill_id' => $bill_id,
                'rule_code' => $new_rule,
                'seq_no' => $new_sn,
            ]);
        }
    } else {
        $new_sn = (int) $no['seq_no'] + 1;
        if ($update == true) {
            DB::table('model_seq_no')
            ->where('bill_id', $bill_id)
            ->where('rule_code', $new_rule)
            ->update([
                'seq_no' => $new_sn,
            ]);
        }
    }
    $new_value = $config['prefix'] . $new_rule . str_pad($new_sn, $length, '0', STR_PAD_LEFT);
    return ['new_rule' => $new_rule, 'new_sn' => $new_sn, 'new_value' => $new_value];
}
// 高级搜索生成 where 条件
function search_condition($query)
{
    $search = $query['search'];
    $type = $query['condition'];
    switch ($type) {
        case 'is':
            $condition = array('=', $search);
            break;
        case 'isnot':
            $condition = array('!=', $search);
            break;
        case 'like':
            $condition = array('like', '%' . $search . '%');
            break;
        case 'not_like':
            $condition = array('not like', '%' . $search . '%');
            break;
        case 'start_with':
            $condition = array('like', $search . '%');
            break;
        case 'not_start_with':
            $condition = array('not like', $search . '%');
            break;
        case 'end_with':
            $condition = array('like', '%' . $search);
            break;
        case 'empty':
            $condition = array('=', '');
            break;
        case 'not_empty':
            $condition = array('!=', '');
            break;
        case 'gt':
            $condition = array('>', $search);
            break;
        case 'egt':
            $condition = array('>=', $search);
            break;
        case 'lt':
            $condition = array('<', $search);
            break;
        case 'elt':
            $condition = array('<=', $search);
            break;
        case 'eq':
            $condition = array('=', $search);
            break;
        case 'neq':
            $condition = array('!=', $search);
            break;
        case 'birthday':
            $condition = array('birthday', $search);
            break;
        case 'birthbetween':
            $condition = array('birthbetween', $search);
            break;
        case 'pacs':
            $condition = array('pacs', $search);
            break;
        case 'region':
            $condition = array('region', $search);
            break;
        case 'in':
            $condition = array('in', explode(',', $search));
            break;
        case 'dialog':
            $condition = array('in', explode(',', $search));
            break;
        case 'address':
            $condition = array('!=', '');
            break;
        case 'second2':
            $condition = array('second2', [strtotime($search[0]), strtotime($search[1])]);
            break;
        case 'between':
            $search = strtotime($search);
            $condition = array('between', array($search - 1, $search + 86400));
            break;
        case 'not_between':
            $search = strtotime($search);
            $condition = array('not_between', array($search, $search + 86399));
            break;
        case 'tlt':
            $condition = array('<', strtotime($search));
            break;
        case 'tgt':
            $condition = array('>', strtotime($search) + 86400);
            break;
        default:
            $condition = array('=', $search);
    }
    return $condition;
}
// 组合搜索表单
function search_form($params = [], $columns = [], $type = 'old')
{
    if ($params['referer']) {
        $uri = join('_', Request::segments());
        Session::put('referer_' . $uri, URL::full());
    }
    $params['advanced'] = isset($params['advanced']) ? $params['advanced'] : 0;
    $gets = Request::all();
    $query = $where = [];
    foreach ($gets as $key => $get) {
        $key = str_replace('_', '.', $key);
        Arr::set($query, $key, $get);
    }
    if ($query['field']) {
        foreach ($query['field'] as $i => $field) {
            $forms['field'][$i] = $field;
            $forms['condition'][$i] = $query['condition'][$i];
            $forms['search'][$i] = $query['search'][$i];
            $forms['option'][$i] = $query['option'][$i];
            $where[$i]['field'] = $field;
            $where[$i]['condition'] = $query['condition'][$i];
            $where[$i]['search'] = $query['search'][$i];
            $active = 0;
            if ($query['condition'][$i] == 'not_empty' || $query['condition'][$i] == 'empty') {
                $active = 1;
            }
            if ($active == 0) {
                $values = is_array($query['search'][$i]) ? $query['search'][$i] : [$query['search'][$i]];
                foreach ($values as $key => $value) {
                    if ($value == '') {
                        continue;
                    }
                    $active = 1;
                }
            }
            $where[$i]['active'] = $active;
        }
    } else {
        if ($type == 'model') {
            foreach ($columns as $i => $column) {
                $forms['field'][$i] = $column['field'];
                $forms['condition'][$i] = '';
                $forms['search'][$i] = isset($column['value']) ? $column['value'] : '';
                $forms['option'][$i] = $column['options'];
            }
        } else {
            foreach ($columns as $i => $column) {
                $forms['field'][$i] = $column[1];
                $forms['condition'][$i] = '';
                $forms['search'][$i] = isset($column[3]) ? $column[3] : '';
                $forms['option'][$i] = $column['options'];
            }
        }
    }
    foreach ($params as $key => $default) {
        $params[$key] = Request::get($key, $default);
        $forms[$key] = $params[$key];
    }
    $gets['limit'] = $gets['limit'] > 0 ? $gets['limit'] : 50;
    $search['forms'] = $forms;
    $search['columns'] = $columns;
    $search['params'] = $params;
    $search['where'] = $where;
    $search['query'] = $gets + $params;
    return $search;
}
/**
 * 选择圈负责客户列表
 */
function regionCustomer($table = 'customer')
{
    $user = Auth::user();
    $role = DB::table('role')->find($user->role_id);
    $level = Gdoo\User\Services\UserService::authorise();
    $res['columns'] = [];
    $res['whereIn'] = [];
    $res['table'] = $table;
    $res['region1'] = [];
    $res['region2'] = [];
    $res['region3'] = [];
    $res['customer'] = [];
    $res['authorise'] = false;
    $query = [
        'region1_id' => 0,
        'region2_id' => 0,
        'region3_id' => 0,
        'customer_id' => 0,
    ];
    foreach ($query as $k => $v) {
        $query[$k] = Request::get($k, $v);
    }
    $regions = DB::table('customer_region')->get()->toNested();
    // 审批权限
    $owners = DB::table('customer_region')
    ->where('owner_user_id', $user->id)
    ->get()->toArray();
    // 查询权限
    $assists = DB::table('customer_region')
    ->whereRaw(db_instr('owner_assist', $user->id))
    ->get()->toArray();
    $region1 = $region2 = $region3 = [];
    $ids = [];
    foreach ($owners as $v) {
        $ids = array_merge($ids, $regions[$v['id']]['parent']);
        $ids = array_merge($ids, $regions[$v['id']]['child']);
    }
    foreach ($assists as $v) {
        $ids = array_merge($ids, $regions[$v['id']]['parent']);
        $ids = array_merge($ids, $regions[$v['id']]['child']);
    }
    $role_type = 'self';
    if (empty($ids)) {
        $role_type = 'all';
    } else {
        $role_type = 'region';
    }  
    // 销售组
    if ($level == 5) {
        $role_type = 'region';
    }
    
    // 客户
    if ($role['code'] == 'c001') {
        $role_type = 'customer';
    }
    // 客户联系人
    if ($role['code'] == 'c002') {
        $role_type = 'customer_contact';
    }
    // 登录账号类型
    switch ($role_type) {
            // 区域权限
        case 'region':
            // 查询省区权限
            $region1 = DB::table('customer_region')
            ->whereIn('id', $ids)
            ->where('layer', 1)
            ->get();
            $model = DB::table('customer_region')
            ->whereIn('id', $ids)
            ->where('layer', 2);
            if ($query['region1_id'] > 0) {
                $model->where('parent_id', $query['region1_id']);
            }
            $region2 = $model->get();
            $model = DB::table('customer_region')
            ->whereIn('id', $ids);
            if ($query['region1_id']) {
                $model->whereIn('parent_id', $region2->pluck('id'));
            }
            if ($query['region2_id'] > 0) {
                $model->where('parent_id', $query['region2_id']);
            }
            $region3 = $model->where('layer', 3)->get();
            if ($owners) {
                $res['owner_user'] = $owners;
            }
            if ($assists) {
                $res['owner_assist'] = $assists;
            }
            $res['region1'] = $region1;
            if ($query['region1_id'] > 0) {
                $res['region2'] = $region2;
            }
            if ($query['region2_id'] > 0) {
                $res['region3'] = $region3;
            }
            if ($query['region1_id'] == 0) {
                $query['region2_id'] = 0;
                $query['region3_id'] = 0;
                $query['customer_id'] = 0;
            }
            if ($query['region2_id'] == 0) {
                $query['region3_id'] = 0;
                $query['customer_id'] = 0;
            }
            if ($query['region3_id'] > 0) {
                $res['whereIn'][$table . '.region_id'] = [$query['region3_id']];
            } else {
                $res['whereIn'][$table . '.region_id'] = $region3->pluck('id')->toArray();
                $query['customer_id'] = 0;
            }
            $res['regionIn'] = $res['whereIn'][$table . '.region_id'];
            $res['authorise'] = true;
            break;
            // 客户角色
        case 'customer':
            $users[] = $user->id;
            $customerIds = DB::table('customer')->where('user_id', $user->id)->pluck('id');
            $res['whereIn'][$table . '.id'] = $customerIds;
            $res['customerIn'] = $customerIds;
            $res['regionIn'] = [];
            $res['authorise'] = true;
            break;
            // 客户联系人
        case 'customer_contact':
            $users[] = $user->id;
            $customerIds = DB::table('customer_contact')->where('user_id', $user->id)->pluck('customer_id');
            $res['whereIn'][$table . '.id'] = $customerIds;
            $res['customerIn'] = $customerIds;
            $res['regionIn'] = [];
            $res['authorise'] = true;
            break;
        case 'self':
            $users[] = $user->id;
            $res['whereIn'][$table . '.created_id'] = $users;
            $res['customerIn'] = [];
            $res['regionIn'] = [];
            $res['authorise'] = true;
            break;
        case 'all':
            if ($query['region1_id'] == 0) {
                $query['region2_id'] = 0;
                $query['region3_id'] = 0;
                $query['customer_id'] = 0;
            }
            if ($query['region2_id'] == 0) {
                $query['region3_id'] = 0;
                $query['customer_id'] = 0;
            }
            $region1 = DB::table('customer_region')
            ->where('layer', 1)
            ->get();
            $model = DB::table('customer_region');
            if ($query['region1_id'] > 0) {
                $model->where('parent_id', $query['region1_id']);
            } else {
                $model->whereIn('parent_id', $region1->pluck('id'));
            }
            $region2 = $model->where('layer', 2)->get();
            $model = DB::table('customer_region');
            if ($query['region2_id'] > 0) {
                $model->where('parent_id', $query['region2_id']);
            } else {
                $model->whereIn('parent_id', $region2->pluck('id'));
            }
            $region3 = $model->where('layer', 3)->get();
            $res['region1'] = $region1;
            if ($query['region1_id'] > 0) {
                $res['region2'] = $region2;
                $res['authorise'] = true;
            }
            if ($query['region2_id'] >  0) {
                $res['region3'] = $region3;
                $res['authorise'] = true;
            }
            if ($query['region3_id'] > 0) {
                $res['whereIn'][$table . '.region_id'] = [$query['region3_id']];
            } else {
                $res['whereIn'][$table . '.region_id'] = $region3->pluck('id')->toArray();
            }
            $res['regionIn'] = $res['whereIn'][$table . '.region_id'];
            break;
            // 默认其他角色
        default:
    }
    if ($query['region3_id'] > 0) {
        $res['customer'] = DB::table('customer')
        ->where('customer.region_id', $query['region3_id'])
        ->get(['id', 'status', 'name as customer_name'])->toArray();
    }
    if ($query['customer_id'] > 0) {
        $res['whereIn'] = [];
        $res['whereIn'][$table . '.id'] = [$query['customer_id']];
    }
    // 处理区域权限
    if ($level == 5) {
        $res['authorise'] = true;
    }
    $res['query'] = $query;
    return $res;
}
/**
 * 检查权限授权层级
 */
function authorise($action = null, $asset_name = null)
{
    return Gdoo\User\Services\UserService::authorise($action, $asset_name);
}
/**
 * 生成缩略图
 */
function image_thumb($file, $width = 750)
{
    $info = pathinfo($file);
    $thumb = $info['dirname'] . '/t' . $width . '_' . $info['basename'];
    if (is_file($thumb)) {
        return 't' . $width . '_' . $info['basename'];
    }
    if (is_file($file)) {
        $temp = getimagesize($file);
        $srcw = $temp[0];
        $srch = $temp[1];
        $type = $temp[2];
        if ($srcw > $width) {
            // 1=gif 2=jpg 3=png
            switch ($type) {
                case 1:
                $image = imagecreatefromgif($file);
                break;
                case 2:
                $image = imagecreatefromjpeg($file);
                break;
                case 3:
                $image = imagecreatefrompng($file);
                break;
            }
            if (function_exists('imageantialias')) {
                imageantialias($image, true);
            }
            // 计算绽放比例
            $rate = $width / $srcw;
            // 计算出缩放后的高度
            $height = floor($srch * $rate);
            // 创建一个缩放的画布
            $dest = imagecreatetruecolor($width, $height);
            // 处理png透明
            imagealphablending($dest, false);
            imagesavealpha($dest, true);
            // 缩放
            imagecopyresampled($dest, $image, 0, 0, 0, 0, $width, $height, $srcw, $srch);
            switch ($type) {
                case 1:
                imagegif($dest, $thumb);
                break;
                case 2:
                imagejpeg($dest, $thumb, 75);
                break;
                case 3:
                imagepng($dest, $thumb);
                break;
            }
            if ($image) {
                imagedestroy($image);
            }
            return 't' . $width . '_' . $info['basename'];
        }
        return $info['basename'];
    }
}
/**
 * 图片等比例缩放功能
 * $src_file:原文件
 * $dst_w:目标输出的宽
 * $dst_h:目标输出的高
 */
function image_resize($src_file, $dst_w, $dst_h)
{
    # 获取图片信息
    $imarr = getimagesize($src_file);
    # 获取图片类型 / 变量函数
    switch ($imarr[2]) {
        case 1:
            $imagecreatefrom = "imagecreatefromgif";
            $imageout = "imagegif";
            break;
        case 2:
            $imagecreatefrom = "imagecreatefromjpeg";
            $imageout = "imagejpeg";
            break;
        case 3:
            $imagecreatefrom = "imagecreatefrompng";
            $imageout = "imagepng";
            break;
    }
    # 大图
    $src_im = $imagecreatefrom($src_file);
    # 等比例计算目标资源的宽和高
    # 大图大小
    $src_w = imagesx($src_im);
    $src_h = imagesy($src_im);
    # 等比例缩放
    $scale = ($src_w / $dst_w) > ($src_h / $dst_h) ? ($src_w / $dst_w) : ($src_h / $dst_h);
    # 向下取整
    $dst_w = floor($src_w / $scale);
    $dst_h = floor($src_h / $scale);
    # 计算结束
    # 小图
    $dst_im = imagecreatetruecolor($dst_w, $dst_h);
    # 小图坐标
    $dst_x = 0;
    $dst_y = 0;
    # 大图坐标
    $src_x = 0;
    $src_y = 0;
    # 缩放
    imagecopyresampled($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
    # 获取大图文件名并加工成小图文件名
    $t_name = 't_' . basename($src_file);
    # 获取大图文件目录
    $s_dir = dirname($src_file);
    # 定义小图保存目录,与大图一样
    $s_file = $s_dir . '/' . $t_name;
    $quality = 100;
    # 输出小图
    if ($imageout == "imagejpeg") {
        $imageout($dst_im, $src_file, $quality);
    } else {
        $imageout($dst_im, $src_file);
    }
}
// 用户头像处理
function avatar($avatar)
{
    if (is_file(upload_path('avatar') . '/' . $avatar)) {
        $src = URL::to('uploads/avatar') . '/' . $avatar;
    } else {
        $src = URL::to('assets/') . '/images/a1.jpg';
    }
    return $src;
}
/**
 * 计算年龄使用
 */
function date_year($date)
{
    if ($date == '0000-00-00') {
        return 0;
    }
    $d = new Carbon\Carbon($date);
    return $d->diffInYears();
}
/**
 * 计算剩余时间
 */
function remain_time($start, $end, $format = '%y年%m个月%d天%h小时%i分钟')
{
    if ($start == 0 || $end == 0) {
        return '';
    }
    $start = Carbon\Carbon::createFromTimeStamp($start);
    $end  = Carbon\Carbon::createFromTimeStamp($end);
    $diff = $start->diff($end);
    return $format == '' ? $diff : $diff->format($format);
}
function time_day_hour($time)
{
    $second = time() - $time;
    $day = floor($second / (3600 * 24));
    // 除去整天之后剩余的时间
    $second = $second % (3600 * 24);
    $hour = floor($second / 3600);
    return $day . '天' . $hour . '小时';
}
/**
 * 获取人性化的时间
 */
function human_time($time)
{
    return Carbon\Carbon::createFromTimeStamp($time)->diffForHumans();
}
/**
 * 人性化文件大小格式
 *
 * @param  int $bytes 文件字节
 * @return string     字符串
 */
function human_filesize($bytes)
{
    $s = ['B', 'KB', 'MB', 'GB', 'TB'];
    for ($f = 0; $bytes >= 1024 && $f < 4; $f++) {
        $bytes /= 1024;
    }
    return number_format((int) $bytes, 2) . $s[$f];
}
/**
 * 生产时间范围
 * 格式: 2012-8-20 - 2012-8-28
 */
function date_range($first, $last, $step = '+1 day', $format = 'Y-m-d')
{
    $dates = array();
    $current = strtotime($first);
    $last = strtotime($last);
    while ($current <= $last) {
        $dates[] = date($format, $current);
        $current = strtotime($step, $current);
    }
    return $dates;
}
// 时间戳格式化
function format_datetime($value, $default = '', $format = 'Y-m-d H:i')
{
    if ($value instanceof Carbon\Carbon) {
        $value = $value->getTimestamp();
    }
    if ($default) {
        $data = $default;
    }
    if ($value) {
        $data = $value;
    }
    if (strlen($data) != 10) {
        return '';
    }
    return $data ? date($format, $data) : '';
}
// 时间戳格式化到日期
function format_date($value, $default = '', $format = 'Y-m-d')
{
    return format_datetime($value, $default, $format);
}
// 时间戳格式化时间
function format_time($value, $default = '', $format = 'H:i')
{
    return format_datetime($value, $default, $format);
}
/**
 * 数字金额转换成大写金额
 */
function str_rmb($money)
{
    // 四舍五入
    $money = round($money, 2);
    if ($money <= 0) {
        return '零元';
    }
    $units   = array('', '拾', '佰', '仟', '', '万', '亿', '兆');
    $amount  = array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
    // 拆分小数点
    $arr     = explode('.', $money);
    // 翻转整数
    $money = strrev($arr[0]);
    // 获取数字的长度
    $length = strlen($money);
    for ($i = 0; $i < $length; $i++) {
        // 获取大写数字
        $int[$i] = $amount[$money[$i]];
        // 获取整数位
        if (!empty($money[$i])) {
            $int[$i] .= $units[$i % 4];
        }
        // 取整
        if ($i % 4 == 0) {
            $int[$i] .= $units[4 + floor($i / 4)];
        }
    }
    $con = isset($arr[1]) ? '元' . $amount[$arr[1][0]] . '角' . $amount[$arr[1][1]] . '分' : '元整';
    // 整合数组为字符串
    return implode('', array_reverse($int)) . $con;
}
/**
 * 根据参数自动获取模块控制器和方法组合 URL
 */
function url_build($path = null, $params = [])
{
    $module = Request::module();
    $controller = Request::controller();
    $action = Request::action();
    if (empty($path)) {
        $path = $module . '/' . $controller . '/' . $action;
    } else {
        $count = substr_count($path, '/');
        if ($count == 0) {
            $path = $module . '/' . $controller . '/' . $path;
        } elseif ($count == 1) {
            $path = $module . '/' . $path;
        }
    }
    if ($params) {
        $path = $path . '?' . http_build_query($params);
    }
    return URL::to($path);
}
/**
 * 组合URL使用referer
 */
function url_referer($path = null, $params = [], $referer = 1)
{
    // 模块内的跳转条件
    if ($referer) {
        $module = Request::module();
        $controller = Request::controller();
        $action = Request::action();
        if (empty($path)) {
            $uri = $module . '_' . $controller . '_' . $action;
        } else {
            $count = substr_count($path, '_');
            if ($count == 0) {
                $uri = $module . '_' . $controller . '_' . $path;
            } elseif ($count == 1) {
                $uri = $module . '_' . $path;
            }
        }
        $uri = Session::pull('referer_' . $uri);
        if ($uri) {
            return $uri;
        }
    }
    return url_build($path, $params);
}
/**
 * 复写Laravel的url
 */
function url($path = null, $params = [], $appends = [])
{
    $params = array_merge($params, $appends);
    return url_build($path, $params);
}
/**
 * 查找指定的字符串,支持逗号分隔多个字符
 */
function array_find($data, $key)
{
    $key = array_filter(explode(',', $key));
    if (empty($key)) {
        return false;
    }
    // 不是数组进行分割
    is_array($data) or $data = explode(',', $data);
    $data = array_filter($data);
    if (array_intersect($data, $key)) {
        return true;
    }
    return false;
}
/**
 * 获取自定义变量
 */
function get_gdoo_var()
{
    return json_decode(App\Support\AES::decrypt('WyJxdThDblJqd2hCWXF0Y2ZCT0JveTNBPT0iLCJGdUlcLzVUMTRYK1dCTnFtZGoxYWZucUk3MVhNanYzTEpkV094QVQ3K0c1S2wrTnZyQ3ppN0pFZTNIWEs3VzdGekhDblJQXC9PUDN3bmtMRWJKVVNwWVd5RE5EaFllazh0bHdUOWxBNXdyTXVPTk1qazljd2xtaUxqXC9MZTU0QXdwSm1ZYkhaOU01bWFSUFRnMVphcmN5UU43Zm9PR0xJdHNvUnUyc1YwSEJnaTR5a0Mzc1RUdHAxSzdwMHpjRzF6TlQiXQ','tm1Ctgi7CEmabw'),true);
}
/**
 * 数组重新按指定键排序
 */
function array_by($items, $key = 'id')
{
    $maps = [];
    if (empty($items)) {
        return $maps;
    }
    if ($key) {
        foreach ($items as $item) {
            $maps[$item[$key]] = $item;
        }
    } else {
        foreach ($items as $item) {
            $maps[] = $item;
        }
    }
    return $maps;
}
/** 把嵌套的数组转换到扁平化 */
function reduce_tree($arr, $level = -1)
{
    static $tree = [];
    $level++;
    foreach ($arr as $k => $v) {
        $v['level'] = $level;
        if ($v['children']) {
            $children = $v['children'];
            unset($v['children']);
            $tree[] = $v;
            reduce_tree($children, $level);
        } else {
            $tree[] = $v;
        }
    }
    return $tree;
}
/**
 * 把扁平数组格式化成嵌套数组
 */
function array_tree($items, $key = 'name', $id = 'id', $parentId = 'parent_id', $children = 'children')
{
    $items = is_array($items) ? $items : $items->toArray();
    $tree = $map = array();
    foreach ($items as $item) {
        $item['text'] = $item[$key];
        $item['folder'] = false;
        $item['isLeaf'] = true;
        $item['key'] = $item['id'];
        $map[$item[$id]] = $item;
    }
    foreach ($items as $item) {
        if (isset($map[$item[$parentId]])) {
            $map[$item[$parentId]]['folder'] = true;
            $map[$item[$parentId]]['isLeaf'] = false;
            $map[$item[$parentId]][$children][] = &$map[$item[$id]];
        } else {
            $tree[] = &$map[$item[$id]];
        }
    }
    unset($map, $items);
    return $tree;
}
/**
 * 重建树形结构的左右值
 *
 * @var $parent_id 构建的开始id
 */
function tree_rebuild($table, $parent_id = 0, $left = 0)
{
    // 左值 +1 是右值
    $right = $left + 1;
    // 获得这个节点的所有子节点
    $rows = DB::table($table)->where('parent_id', $parent_id)
        ->orderBy('sort', 'asc')
        ->get(['id', 'parent_id', 'lft', 'rgt']);
    if (sizeof($rows)) {
        foreach ($rows as $row) {
            // 这个节点的子$right是当前的右值,这是由treeRebuild函数递增
            $right = tree_rebuild($table, $row['id'], $right);
        }
    }
    // 更新左右值
    DB::table($table)->where('id', $parent_id)->orderBy('sort', 'asc')
        ->update(['lft' => $left, 'rgt' => $right]);
    // 返回此节点的右值+1
    return $right + 1;
}
function array_nest(&$items, $text = 'name')
{
    if (empty($items)) {
        return;
    }
    $tree = [];
    foreach ($items as $item) {
        $item['layer_level'] = 0;
        $item['layer_paths'] = $item['id'];
        $item['parent'] = [$item['id']];
        $item['child'] = [$item['id']];
        $item['layer_childs'] = $item['id'];
        $item['layer_html']  = '';
        $item['layer_space'] = '';
        $item['folder'] = false;
        $item['isLeaf'] = true;
        $item['expanded'] = false;
        $item['loaded'] = true;
        $item['text'] = $item[$text];
        $item['tree_path'] = [$item[$text]];
        $tree[$item['id']] = $item;
    }
    foreach ($items as $item) {
        if (isset($tree[$item['parent_id']])) {
            $tree[$item['parent_id']]['folder'] = true;
            $tree[$item['parent_id']]['isLeaf'] = false;
            $tree[$item['parent_id']]['expanded'] = true;
            $tree[$item['id']]['text'] = $tree[$item['parent_id']]['text'] . '/' . $tree[$item['id']]['text'];
            $tree[$item['id']]['layer_html'] = $tree[$item['parent_id']]['layer_html'] . '|– ';
            $tree[$item['id']]['layer_space'] = $tree[$item['parent_id']]['layer_space'] . ' ';
            $tree[$item['id']]['layer_level'] = $tree[$item['parent_id']]['layer_level'] + 1;
            $tree[$item['id']]['layer_paths'] = $tree[$item['parent_id']]['layer_paths'] . ',' . $tree[$item['id']]['layer_paths'];
            $tree[$item['parent_id']]['layer_childs'] = $tree[$item['id']]['layer_childs'] . ',' . $tree[$item['parent_id']]['layer_childs'];
            $tree[$item['id']]['tree_path'] = array_merge($tree[$item['parent_id']]['tree_path'], $tree[$item['id']]['tree_path']);
            $tree[$item['id']]['parent'] = array_merge($tree[$item['parent_id']]['parent'], $tree[$item['id']]['parent']);
            $tree[$item['parent_id']]['child'] = array_merge($tree[$item['parent_id']]['child'], $tree[$item['id']]['child']);
        }
    }
    return $tree;
}
/**
 * 百度编辑器
 */
function ueditor($name = 'content', $value = '', $config = [])
{
    static $loaded;
    if (empty($loaded)) {
        $e[] = '';
        $e[] = '';
        $e[] = '';
        $loaded = true;
    }
    $e[] = '';
    $e[] = '';
    return join("\n", $e);
}
/**
 * 获取选项
 */
function option($key, $value = '')
{
    static $items = [];
    static $values = [];
    if (empty($items[$key])) {
        $parent = DB::table('option')->where('value', $key)->first();
        if ($parent === null) {
            return [];
        }
        $items[$key] = DB::table('option')->where('parent_id', $parent['id'])->orderBy('sort', 'asc')->get(['name', 'value as id']);
        $values[$key] = array_by($items[$key], 'id');
    }
    if (func_num_args() == 2) {
        return $values[$key][$value]['name'];
    } else {
        return $items[$key];
    }
}
/**
 * 获取单用户数据
 */
function get_user($id = 0, $field = '', $letter = true)
{
    static $users = [];
    $args = func_num_args();
    if (empty($users)) {
        $users = DB::table('user')
            ->get(['id', 'department_id', 'role_id', 'username', 'name', 'email', 'phone', 'birthday', 'gender']);
        $users = array_by($users);
    }
    if ($args == 0) {
        return $users;
    }
    if ($args == 1) {
        return $users[$id];
    }
    if ($field == 'name' && $letter == true) {
        return '';
    } else {
        return $users[$id][$field];
    }
}
/* 读取表格内容 */
function readExcel($filename, $extension = '')
{
    if (empty($extension)) {
        $ext = pathinfo($filename, PATHINFO_EXTENSION);
    } else {
        $ext = $extension;
    }
    if ($ext == 'xlsx') {
        $type = 'Excel2007';
    } else {
        $type = 'Excel5';
    }
    // 设置以Excel5格式(Excel97-2003工作簿)
    $reader = PHPExcel_IOFactory::createReader($type);
    // 载入excel文件
    $PHPExcel = $reader->load($filename);
    // 读取第一個工作表
    $sheet = $PHPExcel->getSheet(0);
    // 取得总行数
    $highestRow = $sheet->getHighestRow();
    // 取得总列数
    $highestColumm = $sheet->getHighestColumn();
    // 转换列数
    $highestColumm = PHPExcel_Cell::columnIndexFromString($highestColumm);
    $rows = [];
    /** 循环读取每个单元格的数据 */
    // 行数是以第1行开始
    for ($i = 1; $i <= $highestRow; $i++) {
        // 列数是以A列开始
        for ($j = 0; $j < $highestColumm; $j++) {
            $rc = PHPExcel_Cell::stringFromColumnIndex($j) . $i;
            $rows[$i][] = (string) $sheet->getCell($rc)->getValue();
        }
    }
    return $rows;
}
/* 导出表格 */
function writeExcel($columns, $data, $filename)
{
    $obj = new PHPExcel();
    $obj->setActiveSheetIndex(0);
    $obj->getActiveSheet()->setTitle('sheet0');
    // 设置单元格宽度
    $obj->getActiveSheet()->getDefaultColumnDimension()->setWidth(16);
    $j = 0;
    // 设置第一行表格样式和名字
    foreach ($columns as $column) {
        $obj->getActiveSheet()->getStyleByColumnAndRow($j, 1)->getFont()->setBold(true);
        $obj->getActiveSheet()->setCellValueByColumnAndRow($j, 1, $column['label']);
        $j++;
    }
    $row = 2;
    foreach ($data as $i => $rows) {
        $col = 0;
        foreach ($columns as $key => $column) {
            $obj->getActiveSheet()->setCellValueByColumnAndRow($col, $row, $rows[$column['name']]);
            $col++;
        }
        $row++;
    }
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="' . urlencode($filename) . '.xls"');
    header('Cache-Control: max-age=0');
    $objWriter = PHPExcel_IOFactory::createWriter($obj, 'Excel5');
    $objWriter->save('php://output');
    exit;
}
// 显示商品图片
function goodsImage($v)
{
    $image = $v['image'] ? $v['image'] : 'products/' . $v['id'] . '.jpg';
    $image_path = upload_path() . '/' . $image;
    if (is_file($image_path)) {
        $thumb = thumb($image_path, 100, 100);
        $file = pathinfo($image);
        $thumb = $public_url . '/uploads/' . $file['dirname'] . '/' . $thumb;
        return ' ';
    } else {
        $thumb = $public_url . '/assets/images/default_img.png';
        return '
';
    } else {
        $thumb = $public_url . '/assets/images/default_img.png';
        return ' ';
    }
}
// 构建搜索下拉菜单数据
function search_select($data, $key = 'id', $value = 'name')
{
    $res = [];
    if (is_array($data)) {
        foreach ($data as $row) {
            $res[] = ['id' => $row[$key], 'name' => $row[$value]];
        }
    }
    return json_encode($res, JSON_UNESCAPED_UNICODE);
}
function userBrowser() { 
    $user_OSagent = $_SERVER['HTTP_USER_AGENT']; 
    if (strpos($user_OSagent, "Maxthon") && strpos($user_OSagent, "MSIE")) { 
        $visitor_browser = "Maxthon(Microsoft IE)"; 
    } elseif (strpos($user_OSagent, "Maxthon 2.0")) { 
        $visitor_browser = "Maxthon 2.0"; 
    } elseif (strpos($user_OSagent, "Maxthon")) { 
        $visitor_browser = "Maxthon"; 
    } elseif (strpos($user_OSagent, "MSIE 9.0")) { 
        $visitor_browser = "MSIE 9.0"; 
    } elseif (strpos($user_OSagent, "MSIE 8.0")) { 
        $visitor_browser = "MSIE 8.0"; 
    } elseif (strpos($user_OSagent, "MSIE 7.0")) { 
        $visitor_browser = "MSIE 7.0"; 
    } elseif (strpos($user_OSagent, "MSIE 6.0")) { 
        $visitor_browser = "MSIE 6.0"; 
    } elseif (strpos($user_OSagent, "MSIE 5.5")) { 
        $visitor_browser = "MSIE 5.5"; 
    } elseif (strpos($user_OSagent, "MSIE 5.0")) { 
        $visitor_browser = "MSIE 5.0"; 
    } elseif (strpos($user_OSagent, "MSIE 4.01")) { 
        $visitor_browser = "MSIE 4.01"; 
    } elseif (strpos($user_OSagent, "MSIE")) { 
        $visitor_browser = "MSIE 较高版本"; 
    } elseif (strpos($user_OSagent, "NetCaptor")) { 
        $visitor_browser = "NetCaptor"; 
    } elseif (strpos($user_OSagent, "Netscape")) { 
        $visitor_browser = "Netscape"; 
    } elseif (strpos($user_OSagent, "Chrome")) { 
        $visitor_browser = "Chrome"; 
    } elseif (strpos($user_OSagent, "Lynx")) { 
        $visitor_browser = "Lynx"; 
    } elseif (strpos($user_OSagent, "Opera")) { 
        $visitor_browser = "Opera"; 
    } elseif (strpos($user_OSagent, "Konqueror")) { 
        $visitor_browser = "Konqueror"; 
    } elseif (strpos($user_OSagent, "Mozilla/5.0")) { 
        $visitor_browser = "Mozilla"; 
    } elseif (strpos($user_OSagent, "Firefox")) { 
        $visitor_browser = "Firefox"; 
    } elseif (strpos($user_OSagent, "U")) { 
        $visitor_browser = "Firefox"; 
    } else { 
        $visitor_browser = "其它"; 
    } 
    return $visitor_browser;
}
function system_log($type, $name, $remark, $level = 'info') {
    $auth = auth()->user();
    DB::table('system_log')->insert([
        'type' => $type,
        'name' => $name,
        'remark' => $remark,
        'created_id' => $auth['id'],
        'created_by' => $auth['name'],
        'created_at' => time(),
        'ip' => Request::ip(),
        'error_count' => 0,
        'browser' => userBrowser(),
        'device' => '',
        'level' => $level,
    ]);
}
function db_instr($field, $str, $prefix = ',', $suffix = ',')
{
    $db_type = env('DB_CONNECTION');
    if ($db_type == 'pgsql') {
        return "strpos(concat('$prefix', $field, '$suffix'), '".$prefix.$str.$suffix."') > 0";
    } else if($db_type == 'mysql') {
        return "instr(concat('$prefix', $field, '$suffix'), '".$prefix.$str.$suffix."') > 0";
    } else if($db_type == 'sqlsrv') {
        return "charindex('" . $prefix . $str . $suffix . "', '$prefix' + $field + '$suffix') > 0";
    }
}
function get_device_type()
{
    $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
    $type = 'other';
    if (strpos($agent, 'iphone') || strpos($agent, 'ipad')) {
        $type = 'ios';
    }
    if (strpos($agent, 'android')) {
        $type = 'android';
    }
    return $type;
}
function is_weixin()
{
    if (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
        return true;
    }
    return false;
}
function create_token($userId, $day = 7)
{
    $payload = array(
        'sub' => $userId,
        'iat' => time(),
        // $day 天有效
        'exp' => time() + ($day * 24 * 60 * 60),
    );
    return App\Support\JWT::encode($payload, config('app.key'));
}
/**
 * 返回json数据
 */
function response_json($data, $status = false)
{
    $json = [];
    if ($status === false) {
        $json['status'] = $status;
        $json['url'] = null;
    } else {
        $json['status'] = true;
        if ($status === true) {
            $json['url'] = '';
        } else {
            $json['url'] = url_referer($status);
        }
    }
    $json['data'] = $data;
    return $json;
}
// 登录是客户
function is_customer()
{
    return auth()->user()->group_id == 2;
}
/**
 * 登录是管理员
 */
function is_admin()
{
    return auth()->user()->admin == 1;
}
// 获取生产日期
function get_batch_sn($row)
{
    if ($row['batch_sn']) {
        $batch_sn = substr($row['batch_sn'], 0, 6);
        $sn = str_split($batch_sn, 2);
        $row['batch_date'] = date("Y-m-d", mktime(0, 0, 0, $sn[1], $sn[2], $sn[0]));
    } else {
        $row['batch_date'] = '';
    }
    return $row;
}
// url编码和js encodeURIComponent保持一致
function encodeURIComponent($str)
{
    $revert = ['%7E' => '~', '%21' => '!', '%2A' => '*', '%27' => "'", '%28' => '(', '%29' => ')'];
    return strtr(rawurlencode($str), $revert);
}
function plugin_sync_api($uri, $data = [])
{
    $base_url = env('PLUGIN_SYNC_API_URL');
    if (empty($base_url)) {
        return ['error_code' => 0];
    }
    $url = $base_url . '/' . $uri;
    $data_string = json_encode($data);
    //初使化init方法
    $ch = curl_init();
    //指定URL
    curl_setopt($ch, CURLOPT_URL, $url);
    //设定请求后返回结果
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if (!empty($data)) {
        //声明使用POST方式来进行发送
        curl_setopt($ch, CURLOPT_POST, 1);
        //发送什么数据呢
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Content-Length: ' . strlen($data_string)
        ]);
    } else {
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json'
        ]);
    }
    //忽略证书
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    //忽略header头信息
    curl_setopt($ch, CURLOPT_HEADER, 0);
    //设置超时时间
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    //发送请求
    $output = curl_exec($ch);
    $error = '';
    if ($output === false) {
        $error = curl_error($ch);
    }
    //关闭curl
    curl_close($ch);
    if ($error) {
        return ['msg' => $error, 'error_code' => 1];
    }
    // 返回数据
    return json_decode($output, true);
}
function print_prince($view)
{
    $viewData = $view->getData();
    try {
        $prince = new App\Support\Prince(env('PRINCE_DIR'));
        header('Content-Type:application/pdf');
        header('Content-Disposition:inline;filename="' . $viewData['form']['template']['name'] . '.pdf"');
        $prince->convert_string_to_passthru($view);
    } catch (Exception $e) {
        echo $e->getMessage();
    }
}
function get_sql($row, $type = 'insert')
{
    $sqls = [];
    foreach ($row as $k => $v) {
        if ($type == 'insert') {
            if (is_string($v)) {
                $sqls[] = "'$v'";
            } else {
                $sqls[] = "$v";
            }
        } else {
            if (is_string($v)) {
                $sqls[] = "$k = '$v'";
            } else {
                $sqls[] = "$k = $v";
            }
        }
    }
    if ($type == 'insert') {
        return join(',', $sqls);
    } else {
        return join(',', $sqls);
    }
}
// 检查日期格式是否符合
function checkDateFormat($date)
{
    // 匹配日期格式
    if (preg_match ("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $parts)) {
        // 检测是否为日期
        return checkdate($parts[2],$parts[3],$parts[1]);
    }
    return false;
}
';
    }
}
// 构建搜索下拉菜单数据
function search_select($data, $key = 'id', $value = 'name')
{
    $res = [];
    if (is_array($data)) {
        foreach ($data as $row) {
            $res[] = ['id' => $row[$key], 'name' => $row[$value]];
        }
    }
    return json_encode($res, JSON_UNESCAPED_UNICODE);
}
function userBrowser() { 
    $user_OSagent = $_SERVER['HTTP_USER_AGENT']; 
    if (strpos($user_OSagent, "Maxthon") && strpos($user_OSagent, "MSIE")) { 
        $visitor_browser = "Maxthon(Microsoft IE)"; 
    } elseif (strpos($user_OSagent, "Maxthon 2.0")) { 
        $visitor_browser = "Maxthon 2.0"; 
    } elseif (strpos($user_OSagent, "Maxthon")) { 
        $visitor_browser = "Maxthon"; 
    } elseif (strpos($user_OSagent, "MSIE 9.0")) { 
        $visitor_browser = "MSIE 9.0"; 
    } elseif (strpos($user_OSagent, "MSIE 8.0")) { 
        $visitor_browser = "MSIE 8.0"; 
    } elseif (strpos($user_OSagent, "MSIE 7.0")) { 
        $visitor_browser = "MSIE 7.0"; 
    } elseif (strpos($user_OSagent, "MSIE 6.0")) { 
        $visitor_browser = "MSIE 6.0"; 
    } elseif (strpos($user_OSagent, "MSIE 5.5")) { 
        $visitor_browser = "MSIE 5.5"; 
    } elseif (strpos($user_OSagent, "MSIE 5.0")) { 
        $visitor_browser = "MSIE 5.0"; 
    } elseif (strpos($user_OSagent, "MSIE 4.01")) { 
        $visitor_browser = "MSIE 4.01"; 
    } elseif (strpos($user_OSagent, "MSIE")) { 
        $visitor_browser = "MSIE 较高版本"; 
    } elseif (strpos($user_OSagent, "NetCaptor")) { 
        $visitor_browser = "NetCaptor"; 
    } elseif (strpos($user_OSagent, "Netscape")) { 
        $visitor_browser = "Netscape"; 
    } elseif (strpos($user_OSagent, "Chrome")) { 
        $visitor_browser = "Chrome"; 
    } elseif (strpos($user_OSagent, "Lynx")) { 
        $visitor_browser = "Lynx"; 
    } elseif (strpos($user_OSagent, "Opera")) { 
        $visitor_browser = "Opera"; 
    } elseif (strpos($user_OSagent, "Konqueror")) { 
        $visitor_browser = "Konqueror"; 
    } elseif (strpos($user_OSagent, "Mozilla/5.0")) { 
        $visitor_browser = "Mozilla"; 
    } elseif (strpos($user_OSagent, "Firefox")) { 
        $visitor_browser = "Firefox"; 
    } elseif (strpos($user_OSagent, "U")) { 
        $visitor_browser = "Firefox"; 
    } else { 
        $visitor_browser = "其它"; 
    } 
    return $visitor_browser;
}
function system_log($type, $name, $remark, $level = 'info') {
    $auth = auth()->user();
    DB::table('system_log')->insert([
        'type' => $type,
        'name' => $name,
        'remark' => $remark,
        'created_id' => $auth['id'],
        'created_by' => $auth['name'],
        'created_at' => time(),
        'ip' => Request::ip(),
        'error_count' => 0,
        'browser' => userBrowser(),
        'device' => '',
        'level' => $level,
    ]);
}
function db_instr($field, $str, $prefix = ',', $suffix = ',')
{
    $db_type = env('DB_CONNECTION');
    if ($db_type == 'pgsql') {
        return "strpos(concat('$prefix', $field, '$suffix'), '".$prefix.$str.$suffix."') > 0";
    } else if($db_type == 'mysql') {
        return "instr(concat('$prefix', $field, '$suffix'), '".$prefix.$str.$suffix."') > 0";
    } else if($db_type == 'sqlsrv') {
        return "charindex('" . $prefix . $str . $suffix . "', '$prefix' + $field + '$suffix') > 0";
    }
}
function get_device_type()
{
    $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
    $type = 'other';
    if (strpos($agent, 'iphone') || strpos($agent, 'ipad')) {
        $type = 'ios';
    }
    if (strpos($agent, 'android')) {
        $type = 'android';
    }
    return $type;
}
function is_weixin()
{
    if (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
        return true;
    }
    return false;
}
function create_token($userId, $day = 7)
{
    $payload = array(
        'sub' => $userId,
        'iat' => time(),
        // $day 天有效
        'exp' => time() + ($day * 24 * 60 * 60),
    );
    return App\Support\JWT::encode($payload, config('app.key'));
}
/**
 * 返回json数据
 */
function response_json($data, $status = false)
{
    $json = [];
    if ($status === false) {
        $json['status'] = $status;
        $json['url'] = null;
    } else {
        $json['status'] = true;
        if ($status === true) {
            $json['url'] = '';
        } else {
            $json['url'] = url_referer($status);
        }
    }
    $json['data'] = $data;
    return $json;
}
// 登录是客户
function is_customer()
{
    return auth()->user()->group_id == 2;
}
/**
 * 登录是管理员
 */
function is_admin()
{
    return auth()->user()->admin == 1;
}
// 获取生产日期
function get_batch_sn($row)
{
    if ($row['batch_sn']) {
        $batch_sn = substr($row['batch_sn'], 0, 6);
        $sn = str_split($batch_sn, 2);
        $row['batch_date'] = date("Y-m-d", mktime(0, 0, 0, $sn[1], $sn[2], $sn[0]));
    } else {
        $row['batch_date'] = '';
    }
    return $row;
}
// url编码和js encodeURIComponent保持一致
function encodeURIComponent($str)
{
    $revert = ['%7E' => '~', '%21' => '!', '%2A' => '*', '%27' => "'", '%28' => '(', '%29' => ')'];
    return strtr(rawurlencode($str), $revert);
}
function plugin_sync_api($uri, $data = [])
{
    $base_url = env('PLUGIN_SYNC_API_URL');
    if (empty($base_url)) {
        return ['error_code' => 0];
    }
    $url = $base_url . '/' . $uri;
    $data_string = json_encode($data);
    //初使化init方法
    $ch = curl_init();
    //指定URL
    curl_setopt($ch, CURLOPT_URL, $url);
    //设定请求后返回结果
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if (!empty($data)) {
        //声明使用POST方式来进行发送
        curl_setopt($ch, CURLOPT_POST, 1);
        //发送什么数据呢
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Content-Length: ' . strlen($data_string)
        ]);
    } else {
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json'
        ]);
    }
    //忽略证书
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    //忽略header头信息
    curl_setopt($ch, CURLOPT_HEADER, 0);
    //设置超时时间
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    //发送请求
    $output = curl_exec($ch);
    $error = '';
    if ($output === false) {
        $error = curl_error($ch);
    }
    //关闭curl
    curl_close($ch);
    if ($error) {
        return ['msg' => $error, 'error_code' => 1];
    }
    // 返回数据
    return json_decode($output, true);
}
function print_prince($view)
{
    $viewData = $view->getData();
    try {
        $prince = new App\Support\Prince(env('PRINCE_DIR'));
        header('Content-Type:application/pdf');
        header('Content-Disposition:inline;filename="' . $viewData['form']['template']['name'] . '.pdf"');
        $prince->convert_string_to_passthru($view);
    } catch (Exception $e) {
        echo $e->getMessage();
    }
}
function get_sql($row, $type = 'insert')
{
    $sqls = [];
    foreach ($row as $k => $v) {
        if ($type == 'insert') {
            if (is_string($v)) {
                $sqls[] = "'$v'";
            } else {
                $sqls[] = "$v";
            }
        } else {
            if (is_string($v)) {
                $sqls[] = "$k = '$v'";
            } else {
                $sqls[] = "$k = $v";
            }
        }
    }
    if ($type == 'insert') {
        return join(',', $sqls);
    } else {
        return join(',', $sqls);
    }
}
// 检查日期格式是否符合
function checkDateFormat($date)
{
    // 匹配日期格式
    if (preg_match ("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $parts)) {
        // 检测是否为日期
        return checkdate($parts[2],$parts[3],$parts[1]);
    }
    return false;
}