| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471 |
- <?php
- namespace api\modules\v1\controllers;
- header('Access-Control-Allow-Origin:*');
- use addons\AiCustomerService\common\services\SettingService;
- use api\controllers\OnAuthController;
- use api\services\MallService;
- use common\enums\AddonsEnum;
- use common\enums\AppEnum;
- use common\enums\DiyEnum;
- use common\enums\RabbitMqEnum;
- use common\enums\StatusEnum;
- use common\events\mall\GetAdsCfgEvent;
- use common\helpers\sms\Sms;
- use common\helpers\map\QqMapHelper;
- use common\listeners\mall\BuyPointListener;
- use common\models\common\BuyingPointDay;
- use common\models\diy\DiyPage;
- use common\models\mall\MallAddons;
- use common\models\user\UserActionRecord;
- use common\models\user\UserPartitionRelationship;
- use Exception;
- use Yii;
- use yii\helpers\Json;
- use common\helpers\StringHelper;
- use common\models\common\AppVersion;
- /**
- * 商城控制器
- *
- *
- * Class MallController
- * @package frontend\controllers
- */
- class MallController extends OnAuthController
- {
- public $enableCsrfValidation = false;
- public $modelClass = '';
- /**
- * 不用进行登录验证的方法
- *
- * 例如: ['index', 'update', 'create', 'view', 'delete']
- * 默认全部需要验证
- *
- * @var array
- */
- protected $authOptional = ['config','get-img-base64','get-install-addons','sms-code','get-user-config','get-download-url','get-setting-value', 'check-app-version', 'reverse-geocoder', 'geocoder', 'get-near'];
- /**
- * 获取公共配置
- * @return mixed|void
- */
- public function actionConfig()
- {
- $request = Yii::$app->request;
- if ($request->isPost) {
- $mallId = $this->mall_id;
- // 获取底部导航栏
- $navbar = Yii::$app->services->setting->mall->get($mallId, 'bottom_nav');
- $navbar['navs'] = Json::decode($navbar['navs'],true);
- if ($navbar['navs']) {
- // 保证首页id实时性,获取装修首页ID
- $home_page_id = DiyPage::find()->select('id')->where(['mall_id'=>$mallId,'is_home_page'=>StatusEnum::ENABLED,'status'=>StatusEnum::ENABLED])->scalar();
- $navbar['navs'][0]['url'] = DiyPage::PAGE_PATH_DIY . '?id=' . $home_page_id;
- $navbar['navs'][0]['params']['route'] = DiyPage::PAGE_PATH_DIY . '?id=' . $home_page_id;
- //判断是否安装了门店管家
- $install = MallAddons::isInstall($mallId, AddonsEnum::ADDONS_NAME_STORE_STEWARD);
- if ($install) {
- $config = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_STORE_STEWARD, 'basic');
- if ($config['index_type']) {
- $index_url = '/pages/AntTechnology/storeIndex/index';
- $navbar['navs'][0]['url'] = $index_url;
- $navbar['navs'][0]['params']['route'] = $index_url;
- }
- }
- }
- $data['navbar'] = $navbar;
- $data['service'] = Yii::$app->services->setting->mall->get($mallId, 'service');// 客服地址
- // 获取公共配置
- $basic = Yii::$app->services->setting->mall->get($mallId, 'basic');
- $data['basic'] = $basic;
- $data['share'] = ['share_title' => $basic['app_share_title'] ?? '', 'share_desc' => $basic['app_share_desc'] ?? '', 'share_pic' => $basic['app_share_pic'] ?? ''];
- $data['basic']['dollars_symbol'] = !empty($data['basic']['is_enable_dollars_symbol']) ? $data['basic']['dollars_symbol'] : '¥';
- // 获取用户配置
- $data['user_setting'] = Yii::$app->services->setting->mall->get($mallId, 'user');
- $data['user_setting']['allow_app_login'] = $data['user_setting']['allow_app_login'] ?: 1;// 默认开启APP登录
- // 获取版权配置
- $data['copyright'] = Yii::$app->services->setting->mall->get($mallId, 'copyright');
- // 获取sass平台的版权信息
- $system = Yii::$app->services->setting->platform->get('system');
- $data['copyright']['link_logo'] = $system['logo_url'] ?: '';
- $data['copyright']['link_text'] = $system['copyright'] ?: '';
- $data['copyright']['link_url'] = $system['copyright_url'] ?: '';
- $data['copyright']['link_status'] = $system['copyright_status'] ?: 0;
- $mall = $this->mall;
- if(empty($mall['is_show_copyright'])){
- $data['copyright']['link_status'] = 0;
- }
- $data['domain'] = [
- 'h5_url' => $system['h5_url'] ?: '',
- 'api_url' => $system['api_url'] ?: '',
- ];
- // 公共文字返回
- $data['global_text'] = [
- 'balance_name' => Yii::$app->services->setting->mall->get($mallId, 'balance.balance_name') ?? '余额',
- 'score_name' => Yii::$app->services->setting->mall->get($mallId, 'score.score_name') ?? '积分',
- ];
- // 用户设置
- $data['user_setting'] = Yii::$app->services->setting->mall->get($mallId, 'user');
- $data['user_setting']['check_sms_code'] = $data['user_setting']['check_sms_code'] ?? 1;// 默认开启验证码注册
- // 公众号设置
- $data['follow'] = Yii::$app->services->setting->mall->get($mallId, 'follow');
- $data['follow']['is_follw'] = 0;
- // 全局字体颜色
- $data['global_text_color'] = Yii::$app->services->setting->mall->get($mallId, 'decorate_setting.global_text_color');
- $data['global_goods_need'] = Yii::$app->services->setting->mall->get($mallId, 'decorate_setting.global_goods_need');
- $balance_pay_setting = Yii::$app->services->setting->mall->get($mallId, 'pay.balance');
- $balance_pay_setting = $balance_pay_setting ? json_decode($balance_pay_setting,'true') : [];
- $balance_pay_setting['is_setting_pay_password'] = 0;
- // 用户已登录
- if (!empty($this->user)) {
- if($this->user->transaction_password) $balance_pay_setting['is_setting_pay_password'] = 1;
- // 是否关注过公众号
- $follow = UserActionRecord::find()->select('follow')->where(['user_id' => $this->user_id])->scalar();
- $data['follow']['is_follw'] = $follow == 1 ? 1 : 0;
- }
- $data['balance_pay_setting'] = $balance_pay_setting;
- // 获取商城有效的插件
- $valid_addons = MallAddons::getValidAddons($this->mall_id);
- if (in_array('AiCustomerService', $valid_addons) && $this->user_id) {
- $data['ai_customer_service']['show_channel'] = (new SettingService(['mall_id' => $this->mall_id]))->getShowChannel();
- }
- if(in_array(AddonsEnum::ADDONS_NAME_STORE, $valid_addons)){
- $basic = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_STORE, 'basic');
- $data['is_show_location_store'] = $basic['is_show_location_store'] ?? 0;
- $data['store']['is_enable_dollars_symbol'] = $basic['is_enable_dollars_symbol'];
- $data['store']['dollars_symbol'] = !empty($basic['is_enable_dollars_symbol']) ? $basic['dollars_symbol'] : '¥';
- }
- $data['valid_addons'] = $valid_addons;
- $relation_setting = \Yii::$app->services->setting->mall->get($mallId, 'user_relation_setting.relation_setting');
- if (!empty($relation_setting)) $relation_setting = json_decode($relation_setting, true);
- $data['become_child_way'] = $relation_setting['become_child_way']??1;
- $data['cat'] = Yii::$app->services->setting->mall->get($mallId, 'cat');
- $data['mall_name'] = $this->mall['name'];
- $data['pay_success_page'] = Yii::$app->services->setting->mall->get($this->mall_id,'order.pay_after_link');// 支付成功后跳转的地址
- $data['is_bind_popups'] = UserPartitionRelationship::getIsNeedPopups($this->mall_id, $this->user_id ?? 0);
- $order_nav_options = [
- ['name' => '商城订单', 'type' => 'default', 'url' => '/plugins/pages/order/list?tabIndex=0', 'open_type' => 'navigate']
- ];
- if(in_array(AddonsEnum::ADDONS_NAME_RESERVATION_SERVICE, $valid_addons) ||
- in_array(AddonsEnum::ADDONS_NAME_HOME_MAKING, $valid_addons)) $order_nav_options[] = ['name' => '服务订单', 'type' => AddonsEnum::ADDONS_NAME_HOME_MAKING, 'url' => '/plugins4/Housekeeping/service_order/list?tabIndex=0', 'open_type' => 'navigate'];
- if(in_array(AddonsEnum::ADDONS_NAME_BAI_MI_MOVIE, $valid_addons)) $order_nav_options[] = ['name' => '电影订单', 'type' => AddonsEnum::ADDONS_NAME_BAI_MI_MOVIE, 'url' => '/plugins2/Movie/order/list?tabIndex=0', 'open_type' => 'navigate'];
- if(in_array(AddonsEnum::ADDONS_NAME_CAKE, $valid_addons)) $order_nav_options[] = ['name' => '蛋糕订单', 'type' => AddonsEnum::ADDONS_NAME_CAKE, 'url' => '/plugins2/Cake/order/list?tabIndex=0', 'open_type' => 'navigate'];
- if(in_array(AddonsEnum::ADDONS_QIAN_XI_SUPPLY_CHAIN, $valid_addons)) $order_nav_options[] = ['name' => '权益商品订单', 'type' => AddonsEnum::ADDONS_QIAN_XI_SUPPLY_CHAIN, 'url' => '/plugins5/QianxiSupplyChain/orderList?tabIndex=0', 'open_type' => 'navigate'];
- if(in_array(AddonsEnum::ADDONS_SCORE_GAME, $valid_addons)) $order_nav_options[] = ['name' => '实体店订单', 'type' => AddonsEnum::ADDONS_SCORE_GAME, 'url' => '/customAddons/ScoreGame/physicalStore/orderList', 'open_type' => 'navigate'];
- if(in_array(AddonsEnum::ADDONS_NAME_LAO_DA_FU, $valid_addons)) {
- $order_nav_options[] = ['name' => '看诊订单', 'type' => AddonsEnum::ADDONS_NAME_LAO_DA_FU, 'url' => '/customDesigns/LaoDaFu/clientSide/visitOrderList', 'open_type' => 'navigate'];
- $order_nav_options[] = ['name' => '我的挂号', 'type' => AddonsEnum::ADDONS_NAME_LAO_DA_FU, 'url' => '/customDesigns/LaoDaFu/clientSide/registerOrderList', 'open_type' => 'navigate'];
- }
- // 获取插件配置
- $event = new GetAdsCfgEvent($this->mall_id);
- Yii::$app->services->events->dispatch($event, ['user' => $this->user]);
- $data['addons_config'] = $event->getConfig();
- // 订单设置
- $order_setting = Yii::$app->services->setting->mall->get($this->mall_id, 'order');
- $data['order'] = [
- 'is_show_positioning' => $order_setting['is_show_positioning'] ?? 1, // 显示定位按钮
- ];
- // 版本号
- $varsion = $request->post('version', 0);
- $varsion && $data['is_review'] = (new MallService(['mall_id' => $this->mall_id]))->getVersionReview($varsion);
- //获取总商城地图配置
- $map_setting = Yii::$app->services->setting->platform->get('map');
- $data['real_time_map'] = $map_setting['is_location'] ? $map_setting['is_location'] : 0;
- $data['order_nav_options'] = $order_nav_options;
- // 登录时是否填写昵称
- $data['basic']['is_write_name'] = !isset($data['basic']['is_write_name']) ? 0 : $data['basic']['is_write_name'];
- $this->success('获取成功', $data);
- }
- }
- /**
- * 获取图片base64数据接口
- * @Author: lun
- * @DateTime: 2021/11/12 0012 14:07
- * @Copyright: copyright (c) 2021 广东七件事集团
- */
- public function actionGetImgBase64()
- {
- $url = Yii::$app->request->get('url','');
- // $this->redirect($url);
- if(!empty($url)){
- $option=array('ssl'=>array('verify_peer' => false,'verify_peer_name' => false));
- $image = file_get_contents($url,false,stream_context_create($option));
- header('Content-type: image/jpg');
- echo $image;
- exit;
- }
- }
- /**
- * 用户买点接口
- * @Author: lun
- * @DateTime: 2021/11/30 0030 14:20
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @return mixed|void
- */
- public function actionBuyingPoint()
- {
- $retuest = Yii::$app->request;
- if ($retuest->isPost) {
- try {
- $params = Yii::$app->request->post('form');
- $data = [
- 'mall_id' => $this->mall_id,
- 'user_id' => $this->user_id,
- 'card_id' => $this->card_id,
- 'list' => $params,
- ];
- Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $data, BuyPointListener::class, 'async_handle');
- $this->success('保存成功');
- } catch (\Exception $e) {
- $this->error('买点保存失败,mag=' . $e->getMessage());
- }
- }
- }
- /**
- * 发送验证码-公共方法
- * @Author: lun
- * @DateTime: 2023/5/12 0012 17:27
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @return mixed|void
- * @throws \Overtrue\EasySms\Exceptions\NoGatewayAvailableException
- */
- public function actionSmsCode()
- {
- $retuest = Yii::$app->request;
- if ($retuest->isPost) {
- $params = $retuest->post();
- $res = Yii::$app->services->validate->validate($params, [
- [['mobile'], 'required', 'message' => '请输入手机号码'],
- [['mobile','area_code'], 'integer'],
- [['sms_type'], 'string'],
- ]);
- if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $area_code = '';// 初始化区号
- $gateways = 'domestic';// 默认国内短信
- // 检测是登录并且区号不为空则使用国际短信
- if (!empty($this->user) && !empty($this->user->area_code)) {
- if ($this->user->area_code != 86) $gateways = 'international';
- $area_code = $this->user->area_code;
- }
- // 判断是否有区号
- if (!empty($params['area_code']) && $params['area_code'] != 86) {
- $gateways = 'international';
- $area_code = $params['area_code'];
- }
- $params['sms_type'] = $params['sms_type'] ?: '';
- $sms = new Sms($this->mall_id, $gateways);
- try {
- if ($sms->sendCaptcha($params['mobile'], $area_code,$params['sms_type']) === false) return $this->error('发送失败');
- }catch (Exception $e){
- return $this->error($e->getMessage());
- }
- return $this->success('发送成功');
- }
- }
- /**
- * 验证码校验
- *
- * @return void
- */
- public function actionCheckSmsCode()
- {
- $retuest = Yii::$app->request;
- if ($retuest->isPost) {
- $params = $retuest->post();
- $res = Yii::$app->services->validate->validate($params, [
- [['mobile'], 'required', 'message' => '请输入手机号码'],
- [['code'], 'required', 'message' => '请输入验证码'],
- [['mobile', 'area_code'], 'integer'],
- [['sms_type', 'code'], 'string'],
- ]);
- if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $gateways = 'domestic';// 默认国内短信
- // 检测是登录并且区号不为空则使用国际短信
- if (!empty($this->user) && !empty($this->user->area_code)) {
- if ($this->user->area_code != 86) $gateways = 'international';
- }
- // 判断是否有区号
- if (!empty($params['area_code']) && $params['area_code'] != 86) {
- $gateways = 'international';
- }
- $code = $params['code'];
- $sms = new Sms($this->mall_id, $gateways);
- try {
- if ($sms->checkValidateCode($params['mobile'], $code, $params['sms_type']) === false) return $this->error('验证失败');
- return $this->success('验证成功');
- } catch (Exception $e) {
- return $this->error($e->getMessage());
- }
- }
- }
- public function actionGetUserConfig(){
- $user_setting = Yii::$app->services->setting->mall->get($this->mall_id, 'user');
- $data['is_manual_verification_code'] = $user_setting['is_manual_verification_code'] ?: 0;
- return $this->success('成功', $data);
- }
- public function actionGetDownloadUrl(){
- try{
- $channel = Yii::$app->services->setting->mall->get($this->mall_id, 'channel');
- $conf = $channel['app'] ?? [];
- if ($conf) {
- $conf = json_decode($conf, true);
- }
- $app['ios_download_url'] = $conf['ios_download_url'] ?? '';
- $app['android_download_url'] = $conf['android_download_url'] ?? '';
- return $this->success('请求成功', compact('app'));
- }catch(Exception $e){
- return $this->error($e->getMessage());
- }
- }
- /**
- * 获取配置的文本信息通用接口
- * @Author:lun
- * @Date:2023-12-22 11:37
- * @Copyright:copyright(c)2023 广东七件事集团
- * @return mixed|void|null
- */
- public function actionGetSettingValue()
- {
- $request = Yii::$app->request;
- if ($request->isGet) {
- $params = Yii::$app->request->get();
- $res = Yii::$app->services->validate->validate($params, [
- [['group','keyword'], 'required']
- ]);
- $group = $params['group'];
- $keyword = $params['keyword'];
- if ($res === false) throw new \Exception(Yii::$app->services->validate->getErrorMessage());
- $data = Yii::$app->services->setting->mall->get($this->mall_id, "{$group}.{$keyword}");
- return $this->success('获取成功',$data ?? '');
- }
- }
- public function actionCheckAppVersion()
- {
- if (Yii::$app->request->isGet) {
- $params = Yii::$app->request->get();
- $res = Yii::$app->services->validate->validate($params, [
- [['app_type'], 'required'],
- [['app_type'], 'string'],
- ]);
- if ($res === false) throw new \Exception(Yii::$app->services->validate->getErrorMessage());
- // $version_num = StringHelper::getVersionNum($params['version']);
- $data = AppVersion::find()->where(['app_type' => $params['app_type'], 'mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])->orderBy('id desc')->asArray()->one();
- // var_dump($version_num < (int) $data['version_num']);exit;
- return $this->success('获取成功',['version' => $data['version'], 'version_num' => $data['version_num'], 'app_type' => $data['app_type'], 'download_url' => $data['download_url'], 'describe' => $data['content'], 'edition_force' => $data['edition_force'], 'package_type' => $data['package_type']]);
- // return $this->success('当前app为最新版本');
- }
- }
- /**
- * 地址解析(由文字地址到经纬度的转换能力,并同时提供结构化的省市区地址信息)
- * @Author: lun
- * @DateTime: 2023/7/20 0020 11:18
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @return mixed|void
- */
- public function actionGeocoder()
- {
- $request = Yii::$app->request;
- if ($request->isPost) {
- $params = Yii::$app->request->post();
- $res = Yii::$app->services->validate->validate($params, [
- [['address'], 'required', 'message' => '请输入查询的详细地址'],
- [['address'], 'string'],
- ]);
- if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $config = Yii::$app->services->setting->platform->get('map');
- if ($config['is_location'] == 0) {
- return $this->success('获取成功', []);
- }
- $data = QqMapHelper::Geocoder($params['address']);
- if ($data['status'] != 0) return $this->error($data['message']);
- return $this->success('获取成功', $data['result']);
- }
- }
- /**
- * 根据经纬度解析地址
- * @Author: lun
- * @DateTime: 2023/7/21 0021 14:33
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @return mixed|void
- *
- */
- public function actionReverseGeocoder()
- {
- $request = Yii::$app->request;
- if ($request->isPost) {
- $params = Yii::$app->request->post();
- $res = Yii::$app->services->validate->validate($params, [
- [['longitude','latitude'], 'required', 'message' => '需要解析的经纬度不能为空'],
- [['longitude','latitude'], 'safe'],
- ]);
- if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $config = Yii::$app->services->setting->platform->get('map');
- if ($config['is_location'] == 0) {
- return $this->success('获取成功', []);
- }
- $data = QqMapHelper::ReverseGeocoder($params['latitude'], $params['longitude']);
- if ($data['status'] != 0) return $this->error($data['message']);
- return $this->success('获取成功', $data['result']);
- }
- }
- /**
- * 根据当前经纬度获取附近的地点
- * @Author:lun
- * @Date:2025-01-15 09:22
- * @Copyright:copyright(c)2024 广东七件事集团
- * @return mixed|void|null
- */
- public function actionGetNear()
- {
- $request = Yii::$app->request;
- if ($request->isPost) {
- $params = Yii::$app->request->post();
- $res = Yii::$app->services->validate->validate($params, [
- [['longitude','latitude'], 'required', 'message' => '需要解析的经纬度不能为空'],
- [['longitude','latitude'], 'safe'],
- ]);
- if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $data = QqMapHelper::getNearPlace($params['latitude'], $params['longitude']);
- return $this->success('获取成功', $data);
- }
- }
- }
|