request->server("HTTP_SID")); } parent::_initialize(); } /** * 加载初始化 * * @ApiParams (name="version", type="string", required=true, description="版本号") */ public function init() { if ($version = $this->request->request('version')) { //配置信息 $upload = Config::get('upload'); $uploaddata = []; $uploaddata['cdnurl'] = $upload['cdnurl'] ?: cdnurl('', true); $uploaddata['uploadurl'] = url('/api/common/upload', '', false, true); $content = [ 'versiondata' => Version::check($version), 'uploaddata' => $uploaddata, ]; $this->success('', $content); } else { $this->error(__('Invalid parameters')); } } /** * 上传文件 * @ApiMethod (POST) * @ApiParams (name="file", type="file", required=true, description="文件流") */ public function upload() { Config::set('default_return_type', 'json'); //必须设定cdnurl为空,否则cdnurl函数计算错误 Config::set('upload.cdnurl', ''); $chunkid = $this->request->post("chunkid"); if ($chunkid) { if (!Config::get('upload.chunking')) { $this->error(__('Chunk file disabled')); } $action = $this->request->post("action"); $chunkindex = $this->request->post("chunkindex/d"); $chunkcount = $this->request->post("chunkcount/d"); $filename = $this->request->post("filename"); $method = $this->request->method(true); if ($action == 'merge') { $attachment = null; //合并分片文件 try { $upload = new Upload(); $attachment = $upload->merge($chunkid, $chunkcount, $filename); } catch (UploadException $e) { $this->error($e->getMessage()); } $this->success(__('Uploaded successful'), ['url' => $attachment->url, 'fullurl' => cdnurl($attachment->url, true)]); } elseif ($method == 'clean') { //删除冗余的分片文件 try { $upload = new Upload(); $upload->clean($chunkid); } catch (UploadException $e) { $this->error($e->getMessage()); } $this->success(); } else { //上传分片文件 //默认普通上传文件 $file = $this->request->file('file'); try { $upload = new Upload($file); $upload->chunk($chunkid, $chunkindex, $chunkcount); } catch (UploadException $e) { $this->error($e->getMessage()); } $this->success(); } } else { $attachment = null; //默认普通上传文件 $file = $this->request->file('file'); try { $upload = new Upload($file); $attachment = $upload->upload(); } catch (UploadException $e) { $this->error($e->getMessage()); } catch (\Exception $e) { $this->error($e->getMessage()); } $this->success(__('Uploaded successful'), ['url' => $attachment->url, 'fullurl' => cdnurl($attachment->url, true)]); } } /** * 验证码 * @ApiParams (name="id", type="string", required=true, description="要生成验证码的标识") * @return \think\Response */ public function captcha($id = "") { \think\Config::set([ 'captcha' => array_merge(config('captcha'), [ 'fontSize' => 44, 'imageH' => 150, 'imageW' => 350, ]) ]); $captcha = new Captcha((array)Config::get('captcha')); return $captcha->entry($id); } /** * 行政区划真实数据库查询接口(源自 fa_area) * - mode=tree: 返回完整省-市-区三级联树 * - pid: 按父级ID逐级查询下级行政区 */ public function areas() { $mode = trim((string)$this->request->param('mode', '')); if ($mode === 'tree') { $rows = Db::name('area') ->field('id,pid,name,shortname,level') ->where('level', 'in', [1, 2, 3]) ->order('id asc') ->select(); if (empty($rows)) { $this->error('行政区划基础数据尚未初始化'); } $provinces = []; $citiesByPid = []; $districtsByPid = []; foreach ($rows as $row) { $lvl = (int)$row['level']; $pid = (int)$row['pid']; $id = (int)$row['id']; if ($lvl === 1) { $provinces[] = [ 'id' => $id, 'name' => (string)$row['name'], 'cities' => [], ]; } elseif ($lvl === 2) { if (!isset($citiesByPid[$pid])) { $citiesByPid[$pid] = []; } $citiesByPid[$pid][] = [ 'id' => $id, 'name' => (string)$row['name'], 'districts' => [], ]; } elseif ($lvl === 3) { if (!isset($districtsByPid[$pid])) { $districtsByPid[$pid] = []; } $districtsByPid[$pid][] = (string)$row['name']; } } foreach ($provinces as &$prov) { $cities = isset($citiesByPid[$prov['id']]) ? $citiesByPid[$prov['id']] : []; foreach ($cities as &$city) { $city['districts'] = isset($districtsByPid[$city['id']]) ? $districtsByPid[$city['id']] : []; } unset($city); $prov['cities'] = $cities; } unset($prov); $this->success('', ['tree' => $provinces]); } $pid = (int)$this->request->param('pid', 0); $list = Db::name('area') ->field('id,pid,name,shortname,mergename,level') ->where('pid', $pid) ->order('id asc') ->select(); $this->success('', ['list' => $list]); } /** * 物流公司真实字典(源自 fa_express_company,按首字母分组) */ public function expressCompanies() { $rows = Db::name('express_company') ->field('id,code,name,initial') ->where('status', 'normal') ->order('initial asc, weigh desc, id asc') ->select(); $groupMap = []; foreach ($rows as $r) { $letter = strtoupper(trim((string)$r['initial'])) ?: 'Q'; if (!isset($groupMap[$letter])) { $groupMap[$letter] = []; } $groupMap[$letter][] = (string)$r['name']; } $groups = []; foreach ($groupMap as $letter => $items) { $groups[] = [ 'letter' => $letter, 'items' => $items, ]; } // 将“Q 其它”组调整到末尾 usort($groups, function ($a, $b) { $isQa = ($a['letter'] === 'Q'); $isQb = ($b['letter'] === 'Q'); if ($isQa !== $isQb) { return $isQa ? 1 : -1; } return strcmp($a['letter'], $b['letter']); }); $this->success('', [ 'groups' => $groups, 'list' => $rows, ]); } /** * 平台通用业务字典接口(真实表与系统配置驱动) */ public function dicts() { $parseCsv = static function ($name) { $val = Db::name('config')->where('name', $name)->value('value'); if ($val === null || trim((string)$val) === '') { $val = Config::get('site.' . $name); } if (!$val) { return []; } return array_values(array_filter(array_map('trim', explode(',', (string)$val)))); }; $reviewTags = $parseCsv('review_tags'); $orderSources = $parseCsv('order_source_options'); $rawQuoteHours = $parseCsv('auto_quote_hours_options'); $autoQuoteHours = []; foreach ($rawQuoteHours as $h) { $hi = (int)$h; if ($hi > 0) { $autoQuoteHours[] = $hi; } } // 师傅资质要求列表直接读取真实证书字典表 fa_cert_dict $certRows = Db::name('cert_dict') ->field('id,cert_code,cert_name,sample_type') ->where('status', 'normal') ->where('cert_code', '<>', 'other') ->order('weigh desc, id asc') ->select(); $qualReqs = []; foreach ($certRows as $cr) { if (!empty($cr['cert_name'])) { $qualReqs[] = (string)$cr['cert_name']; } } $this->success('', [ 'review_tags' => $reviewTags, 'order_sources' => $orderSources, 'auto_quote_hours' => $autoQuoteHours, 'qual_reqs' => $qualReqs, 'cert_dict' => $certRows, ]); } }