From 32a7752f8b4ec4104948b576084a0c97d27528f0 Mon Sep 17 00:00:00 2001 From: mzl Date: Tue, 2 Dec 2025 14:17:25 +0800 Subject: [PATCH] Merge branch 'develop' into feature/mzl_dev # Conflicts: # .gitignore # composer.lock --- .gitignore | 2 +- .../InquiryTransmitConfigController.php | 33 +++ .../controller/InquiryTransmitController.php | 280 ++++++++++++++++++ app/admin/service/BrandSeriesService.php | 72 +++-- .../logic/InquiryTransmitConfigLogic.php | 17 ++ app/common/logic/InquiryTransmitLogic.php | 17 ++ app/common/model/InquiryTransmit.php | 49 +++ app/common/model/InquiryTransmitConfig.php | 49 +++ app/common/service/CrawlService.php | 2 +- .../service/InquiryTransmitConfigService.php | 67 +++++ app/common/service/InquiryTransmitService.php | 92 ++++++ app/common/utils/email/Emails.php | 5 +- .../InquiryTransmitConfigValidate.php | 29 ++ .../validate/InquiryTransmitValidate.php | 29 ++ app/crm/controller/CustomerController.php | 6 + .../controller/CustomerController.php | 11 +- app/crmAdmin/logic/CustomerLogic.php | 3 +- app/crmAdmin/service/CustomerService.php | 2 +- composer.json | 3 +- composer.lock | 82 ++++- config/route.php | 23 ++ 21 files changed, 838 insertions(+), 35 deletions(-) create mode 100644 app/admin/controller/InquiryTransmitConfigController.php create mode 100644 app/admin/controller/InquiryTransmitController.php create mode 100644 app/common/logic/InquiryTransmitConfigLogic.php create mode 100644 app/common/logic/InquiryTransmitLogic.php create mode 100644 app/common/model/InquiryTransmit.php create mode 100644 app/common/model/InquiryTransmitConfig.php create mode 100644 app/common/service/InquiryTransmitConfigService.php create mode 100644 app/common/service/InquiryTransmitService.php create mode 100644 app/common/validate/InquiryTransmitConfigValidate.php create mode 100644 app/common/validate/InquiryTransmitValidate.php diff --git a/.gitignore b/.gitignore index b395ecd..92bf9b0 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,4 @@ /start.php /windows.php /bootstrap.php -/composer.lock \ No newline at end of file +/composer.lock diff --git a/app/admin/controller/InquiryTransmitConfigController.php b/app/admin/controller/InquiryTransmitConfigController.php new file mode 100644 index 0000000..87761bf --- /dev/null +++ b/app/admin/controller/InquiryTransmitConfigController.php @@ -0,0 +1,33 @@ +service = new InquiryTransmitConfigService(); + } + + /** + * 列表页数据格式化 + * + * @param array $data + * @return array + */ + // protected function indexFormat($data) + // { + // if (isset($data['created_at'])) + // $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); + // if (isset($data['updated_at'])) + // $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + // return $data; + // } +} \ No newline at end of file diff --git a/app/admin/controller/InquiryTransmitController.php b/app/admin/controller/InquiryTransmitController.php new file mode 100644 index 0000000..f4ac093 --- /dev/null +++ b/app/admin/controller/InquiryTransmitController.php @@ -0,0 +1,280 @@ +service = new InquiryTransmitService(); + } + + /** + * 列表页数据格式化 + * + * @param array $data + * @return array + */ + // protected function indexFormat($data) + // { + // if (isset($data['created_at'])) + // $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); + // if (isset($data['updated_at'])) + // $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + // return $data; + // } + + + // } + + public function form(Request $request) + { + try { + $params = $request->all(); + $url = $request->header('referer'); + $domain = parse_url($url, PHP_URL_HOST); + $transmitConfig = InquiryTransmitConfig::where('domain', $domain)->first(); + if ($transmitConfig) { + $mailto = $transmitConfig->mailto; + $fromDomain = $domain; + } else { + $mailto = '1696136552@qq.com'; + $fromDomain = 'referer Failed to obtain'; + } + + if ($request->method() == 'GET') { + $config = [ + 'iLang' => 'en', + 'Act' => 'Inquiry', + 'post_url' => getenv('MAIN_DOMAIN').'/inquiry/transmit/form'.'?m=Data&a=save', + 'mailto' => $mailto, + 'fromDomain' => $fromDomain, + 'fromPath' => parse_url($params['fromlink'], PHP_URL_PATH), + 'm' => $params['m'], + 'a' => $params['a'], + 'tid' => $params['tid'], + 'cid' => $params['cid'], + 'version' => $params['version'], + 'fromlink' => $params['fromlink'] + ]; + + $html = match ($params['tid']) { + 'en-5-LP-pnx' => $this->formHmtl($config), + 'en-3-P-vdx' => $this->formHmtl2($config) + }; + + return $this->success(['html' => $html], 'success'); +// return json([ +// 'code' => 200, +// 'data' => [ +// 'html' => $html +// ], +// 'message' => 'success' +// ]); + } + + if ($request->method() == 'POST') { + $ip = $request->getRealIp($safe_mode=true); + $edata = [ + 'mailto' => $params['mailto'], + + 'Date' => date('Y-m-d H:i:s', time()), + 'Email' => $params['userEMail'], + 'Name' => $params['userName'], + 'Tel' => $params['userTel'], + 'Company' => '', + 'Country' => $params['uCountry'], + 'Form Url' => $params['fromlink'], + 'Message' => $params['Message'], + 'Ip' => $ip, + 'IpLocation' => ip2region($ip).'(仅供参考)', + + 'iLang' => $params['iLang'], + 'mailto' => $params['mailto'], + 'navigator_language' => $params['navigator_language'], + 'navigator_platform' => $params['navigator_platform'], + 'screen_width' => $params['screen_width'], + 'screen_height' => $params['screen_height'], + 'uCountry' => $params['uCountry'] + ]; + + $this->service->serviceStore($request, $edata, $domain); + + $this->emailHtml($edata); + + return $this->success([], 'Thank you for your message! We will contact with you soon.'); +// return json([ +// 'code' => 200, +// 'data' => [], +// 'message' => 'Thank you for your message! We will contact with you soon.' +// ]); + } + } catch (\Throwable $th) { + Log::info('Data:'.date('Y-m-d H:i:s').':'.$th->getMessage().'|'.$th->getLine().'|'.$th->getFile()); + } + } + + public function formHmtl($config) + { + // https://v1.xzgoogle.com/form.php?m=Temp&a=getTpl&tid=en-5-LP-pnx&cid=760&version=v4&fromlink=https://magicbridgeauto.com/contact-us/ + $html = '
'; + return $html; + } + + public function formHmtl2($config) + { + // https://v1.xzgoogle.com/form.php?m=Temp&a=getTpl&tid=en-3-P-vdx&cid=760&version=v4&fromlink=https://magicbridgeauto.com/news/ + $html = '
'; + return $html; + } + + + public function emailHtml($data) + { + $html = ' + + + + Lead Preview + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ Preview +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Date:'.$data['Date'].'
Email: + '.$data['Email'].' +
Name:'.$data['Name'].'
Tel:'.$data['Tel'].'
Company:
Country:'.$data['Country'].'
Form Url: + '.$data['Form Url'].' +
Message:'.$data['Message'].'
Ip:'.$data['Ip'].'
IpLocation:'.$data['IpLocation'].'
+
+
 
+
More
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
iLang:'.$data['iLang'].'
mailto: + '.$data['mailto'].' +
navigator_language:'.$data['navigator_language'].'
navigator_platform:'.$data['navigator_platform'].'
screen_width:'.$data['screen_width'].'
screen_height:'.$data['screen_height'].'
uCountry:'.$data['uCountry'].'
+
+ +
+ + '; + +// $email = new Email(); + //return $email->send($data['mailto'], 'Inquiry_Of_'.$data['Name'], $html); + return \app\common\utils\email\MailSend::send($data['mailto'], 'Inquiry_Of_'.$data['Name'], $html); + } +} \ No newline at end of file diff --git a/app/admin/service/BrandSeriesService.php b/app/admin/service/BrandSeriesService.php index 594605b..9542378 100644 --- a/app/admin/service/BrandSeriesService.php +++ b/app/admin/service/BrandSeriesService.php @@ -328,38 +328,64 @@ class BrandSeriesService // 执行抓取 $crawlService = new CrawlService(); - //懂车帝模糊搜索返回车系地址 + //懂车帝模糊搜索返回车系地址|单个车系id抓取 $href = $crawlService->modelSearch($keyword); - $seriesId = $this->extractSeriesId($href); + $seriesId = $this->extractSeriesId($href); //懂车帝车系id - if (empty($seriesId)) { +// if (empty($seriesId)) { //没有抓取到懂车帝系列id时,按关键词为品牌名抓取所有的系列名 +// $crawlSeries = $crawlService->brandSeries($keyword); +// } + //按关键词为品牌名抓取所有的系列名 + $crawlSeries = $crawlService->brandSeries($keyword); + + if (empty($seriesId) && empty($crawlSeries)) { throw new \Exception('抓取失败,未找到该系列车型'); } - //抓取品牌与系列 - $brandSeries = $crawlService->crawlBrandSeries($seriesId); - - - // 验证品牌是否存在 - $brand = Brand::where('brand_name', $brandSeries['brand'])->first(); - // 获取品牌信息 - $series = BrandSeries::where('series_name', $brandSeries['series'])->first(); - $result['brand'] = ['brand_name' => $brandSeries['brand'], 'exists' => $brand?1:0]; - if($brand){ - $result['brand']['id'] = $brand['id']; - } - $result['series'] = ['series_name' => $brandSeries['series'], 'exists' => $series?1:0]; - if($series){ - $result['series']['id'] = $series['id']; - if(empty($result['brand']['id'])){ - $result['brand']['id'] = $series['brand_id']; + $brandSerieses = []; + if(empty($seriesId) && !empty($crawlSeries) || count($crawlSeries)>1){ //关键词为品牌名时抓取所有车系的懂车帝id + $href = $crawlService->modelSearch($crawlSeries[0]); + $seriesId = $this->extractSeriesId($href); //懂车帝车系id + //抓取品牌与系列 + $brandSeries = $crawlService->crawlBrandSeries($seriesId); + foreach ($crawlSeries as $item) { +// $brandSerieses[] = $crawlService->brandSeries($keyword); + $brandSerieses[] = ['brand' => $brandSeries['brand'], 'series' => $item]; } + }elseif (!empty($seriesId) && empty($crawlSeries)){ + //抓取品牌与系列 + $brandSerieses[] = $crawlService->crawlBrandSeries($seriesId); } + $result = []; try { - //获取车型数据 - $result['model'] = $this->crawlSeriesModel($seriesId); - return $result; + foreach ($brandSerieses as $brandSeries) { + $item = []; + // 验证品牌是否存在 + $brand = Brand::where('brand_name', $brandSeries['brand'])->first(); + // 获取品牌信息 + $series = BrandSeries::where('series_name', $brandSeries['series'])->first(); + $item['brand'] = ['brand_name' => $brandSeries['brand'], 'exists' => $brand ? 1 : 0]; + if ($brand) { + $item['brand']['id'] = $brand['id']; + } + $item['series'] = ['series_name' => $brandSeries['series'], 'exists' => $series ? 1 : 0]; + if ($series) { + $item['series']['id'] = $series['id']; + if (empty($item['brand']['id'])) { + $item['brand']['id'] = $series['brand_id']; + } + } + + //获取车型数据 + $item['model'] = []; + if (count($brandSerieses)<2) { + $item['model'] = $this->crawlSeriesModel($seriesId); + } + $result[] = $item; + } + + return ['is_series' => (count($brandSerieses)<2)?1:0, 'data' => $result]; } catch (\Exception $e) { throw new \Exception($e->getMessage()); } diff --git a/app/common/logic/InquiryTransmitConfigLogic.php b/app/common/logic/InquiryTransmitConfigLogic.php new file mode 100644 index 0000000..3c6782d --- /dev/null +++ b/app/common/logic/InquiryTransmitConfigLogic.php @@ -0,0 +1,17 @@ +find('div.card-name')->texts()->map(function($item) use(&$series) { diff --git a/app/common/service/InquiryTransmitConfigService.php b/app/common/service/InquiryTransmitConfigService.php new file mode 100644 index 0000000..930124a --- /dev/null +++ b/app/common/service/InquiryTransmitConfigService.php @@ -0,0 +1,67 @@ +validator; + } + + /** + * 构造 CrudUtil 查询配置 + */ + protected function buildQueryConfig(Request $request, string $scene = 'default'): array + { + $p = $request->all(); + + $config = []; + $config['model'] = $this->modelClass; + switch ($scene) { + case 'default': + $config['where']['status'] = 1; + $config['order']['id'] = 'desc'; + break; + case 'index': + $config['where']['status'] = 1; + $config['order']['id'] = 'desc'; + break; + case 'show': + $config['where']['id'] = $p['id']; + $config['where']['status'] = 1; + break; + case 'store': + break; + case 'update': + $config['where']['id'] = $p['id']; + break; + case 'destroy': + $config['where']['id'] = $p['id']; + break; + } + + return $config; + } +} \ No newline at end of file diff --git a/app/common/service/InquiryTransmitService.php b/app/common/service/InquiryTransmitService.php new file mode 100644 index 0000000..7b0fed4 --- /dev/null +++ b/app/common/service/InquiryTransmitService.php @@ -0,0 +1,92 @@ +validator; + } + + /** 创建 */ + public function serviceStore(Request $request, array $data = [], string $domain = '') + { + $data['email'] = $data['Email']; + $data['name'] = $data['Name']; + $data['tel'] = $data['Tel']; + $data['company'] = $data['Company']; + $data['country'] = $data['Country']; + $data['form_Url'] = $data['Form Url']; + $data['message'] = $data['Message']; + $data['ip_location'] = $data['IpLocation']; + $data['ip'] = $data['Ip']; + $data['domain'] = $domain; + + return InquiryTransmit::create($data); + } + + /** + * 构造 CrudUtil 查询配置 + */ + protected function buildQueryConfig(Request $request, string $scene = 'default'): array + { + $p = $request->all(); + + $config = []; + $config['model'] = $this->modelClass; + switch ($scene) { + case 'default': + $config['order']['id'] = 'desc'; + break; + case 'index': + // 域名 + if (isset($p['domain']) && !empty($p['domain'])) { + $config['where']['domain'] = $p['domain']; + } + // 关键字 + if (isset($p['keyword']) && $p['keyword']) { + $k = '%' . $p['keyword'] . '%'; + foreach (['email', 'name', 'tel', 'country', 'message', 'form_url'] as $col) { + $config['orWhere'][] = [$col, 'like', $k]; + } + } + $config['order']['id'] = 'desc'; + break; + case 'show': + $config['where']['id'] = $p['id']; + break; + case 'store': + break; + case 'update': + $config['where']['id'] = $p['id']; + break; + case 'destroy': + $config['where']['id'] = $p['id']; + break; + } + + return $config; + } +} \ No newline at end of file diff --git a/app/common/utils/email/Emails.php b/app/common/utils/email/Emails.php index 0742274..b3caca8 100644 --- a/app/common/utils/email/Emails.php +++ b/app/common/utils/email/Emails.php @@ -434,9 +434,12 @@ class Emails $channel = 12; $channelInfo = InquiryChannel::where('id', $channel)->first(); + // 从库实时获取 + $users = \app\common\model\User::where('corp_id', 3)->where('status', 1)->orderBy('id')->pluck('id')->toArray(); + // 初始化 UID 轮询器 $uidRotator = new \app\common\utils\RedisUidRotator('email_parsed_result_20250804'); - $uidRotator->setUids([64, 63, 93, 108, 132, 145, 150, 143, 156, 157, 158], false); + $uidRotator->setUids($users, false); EmailParsedResult::where('status', 0) ->chunkById($batchSize, function ($records) use ($delaySeconds, $throttleAfter, $throttleSeconds, $enterUser, $channelInfo, $uidRotator) { diff --git a/app/common/validate/InquiryTransmitConfigValidate.php b/app/common/validate/InquiryTransmitConfigValidate.php new file mode 100644 index 0000000..f80ec8d --- /dev/null +++ b/app/common/validate/InquiryTransmitConfigValidate.php @@ -0,0 +1,29 @@ + [ + + ], + + 'update' => [ + + ] + ]; +} \ No newline at end of file diff --git a/app/common/validate/InquiryTransmitValidate.php b/app/common/validate/InquiryTransmitValidate.php new file mode 100644 index 0000000..58c120a --- /dev/null +++ b/app/common/validate/InquiryTransmitValidate.php @@ -0,0 +1,29 @@ + [ + + ], + + 'update' => [ + + ] + ]; +} \ No newline at end of file diff --git a/app/crm/controller/CustomerController.php b/app/crm/controller/CustomerController.php index 25b186e..13dad20 100644 --- a/app/crm/controller/CustomerController.php +++ b/app/crm/controller/CustomerController.php @@ -435,6 +435,11 @@ class CustomerController extends BaseController { $id = Util::getParam($request, 'id'); $scene = Util::getParam($request, 'scene',''); + $status_desc = Util::getParam($request, 'status_desc',''); + + if($scene == 'force' && empty($status_desc)){ + return $this->error( '移除原因不能为空'); + } $userId = $request->user->uid; $where = [ @@ -450,6 +455,7 @@ class CustomerController extends BaseController if ($scene == 'force') { //status=5:业务员自己删除 $customer->status = 5; + $customer->status_desc = $status_desc; $res = $customer->save(); }else{ $customer->user_id = 0; diff --git a/app/crmAdmin/controller/CustomerController.php b/app/crmAdmin/controller/CustomerController.php index 6104fcd..161c4f7 100644 --- a/app/crmAdmin/controller/CustomerController.php +++ b/app/crmAdmin/controller/CustomerController.php @@ -144,6 +144,12 @@ class CustomerController extends BaseController { try { $param = $request->all(); + $scene = $param['scene'] ?? ''; + $status_desc = $param['status_desc'] ?? ''; + + if($scene != 'force' && empty($param['status_desc'])){ + return $this->error( '移除原因不能为空'); + } if (empty($param['customer_id'])) { return $this->error('customer_id'.trans('not_null')); } @@ -153,13 +159,12 @@ class CustomerController extends BaseController if(!$query->exists()){ return $this->error( trans('fail')); } - $scene = $param['scene'] ?? ''; if ($scene === 'list') { //管理端客户列表移除 - $res = $query->update(['status' => 4, 'deleted_at' => time()]); + $res = $query->update(['status' => 4, 'status_desc' => $status_desc, 'deleted_at' => time()]); } elseif ($scene === 'force') { //强删除 $res = $query->forceDelete(); } else { //公海软删除 - $res = $query->update(['status' => 3, 'deleted_at' => time()]); + $res = $query->update(['status' => 3, 'status_desc' => $status_desc, 'deleted_at' => time()]); } return $this->success($res); diff --git a/app/crmAdmin/logic/CustomerLogic.php b/app/crmAdmin/logic/CustomerLogic.php index 13efe9c..5c4192a 100644 --- a/app/crmAdmin/logic/CustomerLogic.php +++ b/app/crmAdmin/logic/CustomerLogic.php @@ -21,12 +21,13 @@ class CustomerLogic return $res; } - public function forceDelete(int $id) + public function forceDelete(int $id ,string $status_desc = '') { $customer = Customer::withTrashed()->find($id); //强制删除 // $res = $customer->forceDelete(); $customer->status = 3; + $customer->status_desc = $status_desc; $res = $customer->save(); return $res; } diff --git a/app/crmAdmin/service/CustomerService.php b/app/crmAdmin/service/CustomerService.php index 6b5573a..ecd2a17 100644 --- a/app/crmAdmin/service/CustomerService.php +++ b/app/crmAdmin/service/CustomerService.php @@ -325,7 +325,7 @@ class CustomerService $audit->status = 3; $audit->save(); } - return $logic->forceDelete($params['id']); + return $logic->forceDelete($params['id'],$audit->remark); } else { if(!empty($audit)){ $audit->status = 2; diff --git a/composer.json b/composer.json index 7ff8ace..693315e 100644 --- a/composer.json +++ b/composer.json @@ -47,7 +47,8 @@ "phpmailer/phpmailer": "^6.10", "webman/gateway-worker": "^1.0", "mpdf/mpdf": "^8.2", - "jaeger/querylist": "^4.4" + "jaeger/querylist": "^4.4", + "zoujingli/ip2region": "3.0" }, "suggest": { "ext-event": "For better performance. " diff --git a/composer.lock b/composer.lock index 1dbd689..2bf0ca9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "865e38bae84e7de0c95098cc87135440", + "content-hash": "ac2fa5a625069729975d072614509e1f", "packages": [ { "name": "aliyuncs/oss-sdk-php", @@ -18,7 +18,13 @@ "type": "zip", "url": "https://api.github.com/repos/aliyun/aliyun-oss-php-sdk/zipball/483dd0b8bff5d47f0e4ffc99f6077a295c5ccbb5", "reference": "483dd0b8bff5d47f0e4ffc99f6077a295c5ccbb5", - "shasum": "" + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] }, "require": { "php": ">=5.3" @@ -7129,7 +7135,77 @@ "type": "patreon" } ], - "time": "2025-11-12T01:36:20+00:00" + "time": "2025-06-12T13:34:04+00:00" + }, + { + "name": "zoujingli/ip2region", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/zoujingli/ip2region.git", + "reference": "fd31d7a023f28f4e2f3e63f46f1fd51f8b2672f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zoujingli/ip2region/zipball/fd31d7a023f28f4e2f3e63f46f1fd51f8b2672f6", + "reference": "fd31d7a023f28f4e2f3e63f46f1fd51f8b2672f6", + "shasum": "" + }, + "require": { + "php": ">=5.4" + }, + "suggest": { + "ext-opcache": "启用 OPcache 以获得更好的性能" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "files": [ + "ip2region.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Anyon", + "email": "zoujingli@qq.com", + "homepage": "https://thinkadmin.top" + } + ], + "description": "Ip2Region v3.0 for PHP - 企业级 IP 地理位置查询库,支持 IPv4/IPv6,分片文件管理,智能缓存,零依赖", + "homepage": "https://github.com/zoujingli/Ip2Region", + "keywords": [ + "IP", + "IP定位", + "Ip2Region", + "geoip", + "geolocation", + "ipv4", + "ipv6", + "location", + "企业级", + "分片数据库", + "压缩", + "地理位置", + "地理位置查询", + "缓存", + "高性能" + ], + "support": { + "issues": "https://github.com/zoujingli/ip2region/issues", + "source": "https://github.com/zoujingli/ip2region/tree/v3.0.0" + }, + "time": "2025-09-15T12:27:22+00:00" } ], "packages-dev": [], diff --git a/config/route.php b/config/route.php index c49f9dc..7b092f3 100644 --- a/config/route.php +++ b/config/route.php @@ -39,6 +39,11 @@ Route::any('/upload', [app\common\controller\UploadController::class, 'uploadFil Route::any('/upload/image', [app\common\controller\UploadController::class, 'uploadImage']); Route::any('/upload/delete', [app\common\controller\UploadController::class, 'deleteFile']); +// 询单转发 +Route::group('/inquiry/transmit', function () { + Route::any('/form', [app\admin\controller\InquiryTransmitController::class, 'form']); +}); + // 公共 Route::group('/common', function () { Route::group('/auth', function () { @@ -215,6 +220,24 @@ Route::group('/admin', function () { }); }); + // 询单转发 + Route::group('/inquiry', function () { + Route::group('/transmit', function () { + Route::any('/list', [app\admin\controller\InquiryTransmitController::class, 'index']); + Route::any('/show', [app\admin\controller\InquiryTransmitController::class, 'show']); + Route::any('/store', [app\admin\controller\InquiryTransmitController::class, 'store']); + Route::any('/update', [app\admin\controller\InquiryTransmitController::class, 'update']); + Route::any('/destroy', [app\admin\controller\InquiryTransmitController::class, 'destroy']); + }); + Route::group('/config', function () { + Route::any('/list', [app\admin\controller\InquiryTransmitConfigController::class, 'index']); + Route::any('/show', [app\admin\controller\InquiryTransmitConfigController::class, 'show']); + Route::any('/store', [app\admin\controller\InquiryTransmitConfigController::class, 'store']); + Route::any('/update', [app\admin\controller\InquiryTransmitConfigController::class, 'update']); + Route::any('/destroy', [app\admin\controller\InquiryTransmitConfigController::class, 'destroy']); + }); + }); + // crm Route::group('/crm', function () { Route::group('/customer', function () {