| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599 |
- <?php
- namespace backend\modules\mall\controllers;
- use backend\modules\common\logic\DiyTemplateLogic;
- use common\enums\AddonsEnum;
- use common\enums\CurrencyEnum;
- use common\enums\DiyEnum;
- use common\enums\LevelEnum;
- use common\enums\StatusEnum;
- use common\models\common\Addons;
- use common\models\diy\DiyComponents;
- use common\models\diy\DiyComponentsData;
- use common\models\diy\DiyMallTemplate;
- use common\models\diy\DiyPage;
- use backend\controllers\MallController;
- use backend\modules\mall\services\TemplateService;
- use common\models\diy\DiyTemplate;
- use common\models\mall\MallAddons;
- use common\models\mall\MallHost;
- use common\models\user\UserLevel;
- use common\globals\GlobalInvoke;
- use common\models\goods\GoodsExtra;
- use \Yii;
- use yii\db\Exception;
- use yii\helpers\Json;
- class DiyController extends MallController
- {
- /**
- *
- * 自定义装修列表页
- * @return mixed|string|void
- */
- public function actionIndex()
- {
- if (Yii::$app->request->isAjax && Yii::$app->request->isGet) {
- $params = Yii::$app->request->get();
- // 检查提交的参数
- $res = Yii::$app->services->validate->validate($params,[
- [['title'], 'string'],
- [['title', 'page', 'limit'], 'safe'],
- ]);
- if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $where = [];
- $where[] = ['=', 'mall_id', $this->mall_id];
- $where[] = ['=', 'status', StatusEnum::ENABLED];
- // 根据名称搜索
- if (!empty($params['title'])) {
- $where[] = ['like', 'title', $params['title']];
- }
- $order = 'is_home_page desc,type desc,sort asc,id desc';
- $select = ['id', 'title', 'mall_id', 'template', 'is_home_page', 'type', 'created_at', 'is_show_bottom_nav'];
- $params = array('select' => $select, 'where' => $where, 'order' => $order, 'limit' => $params['limit']);
- $data = DiyPage::listPage($params, false, true);
- if (empty($data)) return $this->success('获取成功');
- // 获取模板
- $data['template'] = DiyEnum::template();
- // h5地址
- $h5_url = MallHost::getHost($this->mall_id, 'h5_url');
- $sign = $this->mall['mall_sign'];
- // 支付宝二维码链接
- $data['alipay_mini_app_id'] = null;
- if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_ALIPAY_MCH_COUPON)) {
- $data['alipay_mini_app_id'] = \Yii::$app->services->setting->mall->get($this->mall_id, 'alipay_mini.app_id');
- }
- foreach ($data['list'] as $k => &$v){
- $tmp_url = '';
- if ($h5_url) {
- if ($v['is_home_page'] == 1) {
- $v['web_url'] = $h5_url .'/#'. DiyEnum::HOME_PAGE_PATH . '?sign=' . $sign;
- } elseif ($v['template'] == DiyEnum::USER_CENTER) {
- $v['web_url'] = $h5_url .'/#'. DiyEnum::USER_CENTER_PATH . '?sign=' . $sign;
- } else {
- $v['web_url'] = $h5_url .'/#'. DiyEnum::CUSTOM_PAGE_PATH . '?sign=' . $sign . '&id=' . $v['id'];
- }
- } else {
- $v['web_url'] = '';
- }
- if (!empty($data['alipay_mini_app_id']) && empty($v['alipay_mini_link']) && !empty($v['web_url'])) {
- $question_mark_index = strpos($v['web_url'], '?');
- if ($question_mark_index !== false) {
- // 有可能需要去掉&符号?
- $tmp_url = str_replace("sign={$sign}", '', $v['web_url']); // 去掉签名,不然生成的二维码太复杂导致低端手机无法识别二维码
- $tmp_url = str_replace("sign={$sign}&", '', $tmp_url); // 去掉签名,不然生成的二维码太复杂导致低端手机无法识别二维码
- $query_params = substr($tmp_url, $question_mark_index+1);
- if (!empty($query_params)) { // 如果只有sign一个参数的时候那么去掉后就有可能没有参数了
- $tmp_url = str_replace("?{$query_params}", "&query=" . urlencode($query_params), $tmp_url);
- }
- }
- $v['alipay_mini_link'] = str_replace("$h5_url/#", "alipays://platformapi/startapp?appId={$data['alipay_mini_app_id']}&page=", $tmp_url);
- }
- }
- $this->success('获取成功', $data);
- } else {
- return $this->render($this->action->id);
- }
- }
- // public function backups()
- // {
- // $groups = ['mall','common'];
- // $components = DiyComponents::getComponent($groups,$filter=['img-text']);
- // $components = DiyComponents::makeUpGroup($components,['other'=>['mall_common']]);
- // $components = DiyComponents::Components(['other'=>['banner','picture_box']]);
- // $my_components_name_arr = ['other'=>'其他'];
- // $components_name_arr = [
- // array_merge(DiyComponents::$components_name_arr,$my_components_name_arr)
- // ];
- // }
- /**
- * 编辑自定义装修
- * @return mixed|void
- */
- public function actionEdit()
- {
- $request = Yii::$app->request;
- if ($request->isAjax) {
- if ($request->isPost) {
- $params = $request->post();
- $res = Yii::$app->services->validate->validate($params,[
- [['id'], 'integer'],
- [['content'], 'string'],
- [['content'], 'required'],
- ['title', 'required', 'message' => '标题文字必须填写'],
- [['id', 'cover'], 'safe'],
- ]);
- if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $trans = Yii::$app->db->beginTransaction();
- try {
- // 将数组转为json字符串
- if (is_array($params['content'])) $params['content'] = Json::encode($params['content'],JSON_UNESCAPED_SLASHES);
- $params['mall_id'] = $this->mall_id;
- // 保存数据
- $res = DiyPage::setData($params);
- if ($res == false) throw new Exception(DiyPage::getStaticError());
- # 重置所有表单
- GlobalInvoke::exec(GlobalInvoke::DIY_EDIT_FORM, $this->mall_id,$res);
- # end
- $trans->commit();
- $this->success('保存成功');
- } catch (\Exception $e) {
- $trans->rollBack();
- \Yii::error('edit DiyController error:' . $e->getMessage());
- $this->error('编辑失败,msg:' . $e->getMessage());
- }
- } else {
- $params = $request->get();
- $res = Yii::$app->services->validate->validate($params,[
- [['id'], 'integer'],
- [['id'], 'safe']
- ]);
- if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- try{
- $diypage = (object)[];$template = DiyEnum::CUSTOM_PAGE;
- if (isset($params['id'])) {
- // 查询页面
- $diypage = DiyPage::find()->where(['id' => $params['id'], 'mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])->select(['id','title', 'is_home_page','template','content','type','created_at'])->asArray()->one();
- if (empty($diypage))throw new \Exception("页面不存在");
- $template = $diypage['template'];// 获取该页面模板
- }
- // 获取商城有效的插件
- $valid_addons = MallAddons::getValidAddons($this->mall_id);
- // 根据分组获取组件
- $components = DiyComponents::getComponent(DiyEnum::getGroup($template), [], $valid_addons, $this->mall_id);
- // 获取会员等级
- $default_level_list[] = ['level' => 0, 'name' => '普通用户'];
- $member_level_list = UserLevel::getUserLevel([['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]], [], 1,'level,name');
- $auth[] = [
- 'name' => 'member',
- 'title' => '会员等级',
- 'list' => array_merge($default_level_list, $member_level_list)
- ];
- // 获取币种
- if ($template == DiyEnum::USER_CENTER) {
- $capital = CurrencyEnum::getMap($this->mall_id);
- // $capital = [
- // ['code' => 'balance', 'title' => Yii::$app->services->setting->mall->get($this->mall_id, 'balance.balance_name') ?? '余额', 'route' => '/plugins/pages/assets/balance/index'],
- // ['code' => 'score', 'title' => Yii::$app->services->setting->mall->get($this->mall_id, 'score.score_name') ?? '积分', 'route' => '/plugins/pages/assets/currency/index'],
- // ];
- // // 判断是否开启优惠券插件
- // $coupon = MallAddons::getOne([['mall_id' => $this->mall_id, 'addons_name' => 'Coupon', 'status' => StatusEnum::ENABLED]]);
- // if ($coupon) $capital[] = ['code' => 'coupon', 'title' => '优惠券', 'route' => '/plugins/pages/coupon/index'];
- $level_sel = LevelEnum::getMap($this->mall_id);
- }
- $this->success('获取成功', compact('diypage', 'components', 'auth', 'capital','level_sel', 'valid_addons'));
- } catch (\Exception $e) {
- $this->error($e->getMessage());
- $this->error('获取失败,msg:' . $e->getMessage());
- }
- }
- } else {
- // 获取所有插件组件
- $addons_components = DiyComponents::find()->select('code,title,group,source')->where(['status' => StatusEnum::ENABLED])->andWhere(['not', ['source' => '']])->asArray()->all();
- return $this->render($this->action->id, ['addons_components' => $addons_components]);
- }
- }
- /**
- * 设为首页
- * @return mixed|void
- */
- public function actionSetHome()
- {
- $request = Yii::$app->request;
- if ($request->isAjax) {
- if ($request->isPost) {
- $params = $request->post();
- $res = Yii::$app->services->validate->validate($params,[
- [['id'], 'required'],
- [['id'], 'integer'],
- ]);
- if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $trans = Yii::$app->db->beginTransaction();
- try {
- // 将其他页面变成非首页
- DiyPage::updateAll(['is_home_page' => 0, 'template' => DiyEnum::CUSTOM_PAGE], ['mall_id' => $this->mall_id, 'type' => 1, 'status' => StatusEnum::ENABLED]);
- // 默认首页修改
- Yii::$app->db->createCommand()->update(DiyPage::tableName(), ['is_home_page' => 0], ['mall_id' => $this->mall_id, 'type' => 2])->execute();
- $params['is_home_page'] = 1;
- $params['mall_id'] = $this->mall_id;
- $params['template'] = DiyEnum::HOME_PAGE;
- // 保存数据
- $res = DiyPage::setData($params);
- if ($res == false) throw new Exception(DiyPage::getStaticError());
- $trans->commit();
- $this->success('设置成功');
- } catch (\Exception $e) {
- $trans->rollBack();
- \Yii::error('edit DiyController error:' . $e->getMessage());
- $this->error('设置失败' . $e->getMessage());
- }
- }
- }
- }
- /**
- * 设为首页
- * @return mixed|void
- */
- public function actionSetShowNav()
- {
- $request = Yii::$app->request;
- if ($request->isAjax) {
- if ($request->isPost) {
- $params = $request->post();
- $res = Yii::$app->services->validate->validate($params,[
- [['id'], 'required'],
- [['id'], 'integer'],
- ]);
- if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $page = DiyPage::findOne(['id' => $params['id'], 'mall_id' => $this->mall_id]);
- if (empty($page)) return $this->error('页面不存在');
- $page->is_show_bottom_nav = empty($page->is_show_bottom_nav) ? StatusEnum::ENABLED : StatusEnum::DISABLED;
- if (!$page->save()) return $this->error($page->getErrorMessage());
- return $this->success('操作成功');
- }
- }
- }
- /**
- * 复制页面
- * @return mixed|void
- */
- public function actionCopyPage()
- {
- $request = Yii::$app->request;
- if ($request->isPost) {
- $trans = Yii::$app->db->beginTransaction();
- try{
- $params = $request->post();
- $res = Yii::$app->services->validate->validate($params,[
- [['id'], 'required'],
- ]);
- if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $detail = DiyPage::findOne(['id' => $params['id'], 'mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]);
- if (empty($detail)) throw new \Exception("页面不存在");
- $detail->title = $detail->title . '-copy';
- $detail->is_home_page = 0;
- $detail->type = 1;
- $detail->template = DiyEnum::CUSTOM_PAGE;
- $diy = new DiyPage();
- $diy->attributes = $detail->attributes;
- if (!$diy->save()) throw new \Exception("复制失败:" . $diy->getErrorMessage());
- GlobalInvoke::exec(GlobalInvoke::DIY_COPY_FORM, $this->mall_id, $diy->toArray());
- // print_r($diy->toArray());exit;
- $trans->commit();
- $this->success('复制成功');
- } catch (\Exception $e) {
- $trans->rollBack();
- $this->error($e->getMessage());
- }
- }
- }
- /**
- * 装修删除
- * @return mixed|void
- */
- public function actionDelete()
- {
- $request = Yii::$app->request;
- if ($request->isPost) {
- try{
- $params = $request->post();
- $res = Yii::$app->services->validate->validate($params,[
- [['id'], 'required'],
- ]);
- if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $detail = DiyPage::findOne(['id' => $params['id'], 'status' => StatusEnum::ENABLED]);
- if (empty($detail)) throw new \Exception("页面不存在");
- if ($detail->is_home_page == 1) throw new \Exception("该页面是首页,暂不可删除");
- $detail->status = StatusEnum::DELETE;
- if (!$detail->save()) throw new \Exception("删除失败");
- GlobalInvoke::exec(GlobalInvoke::DIY_DELETE_FORM, $this->mall_id,$params);
- $this->success('删除成功');
- } catch (\Exception $e) {
- $this->error($e->getMessage());
- }
- }
- }
- /**
- * 根据标识获取对应组件的内容
- * @Author: lun
- * @DateTime: 2021/11/11 0011 14:52
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @return mixed|void
- */
- public function actionGetComponentsData()
- {
- $params = Yii::$app->request->get('form');
- $list = Json::decode($params, true);
- if (empty($list)) return $this->error('请求数据为空');
- // 获取数据
- $data = DiyComponentsData::getCompentsData($this->mall_id, $list);
- return $this->success('操作成功',$data);
- }
- /**
- * 模板市场列表
- * @Author: lun
- * @DateTime: 2021/12/14 0014 17:47
- * @Copyright: copyright (c) 2021 广东七件事集团
- */
- public function actionTemplateMarket()
- {
- if(Yii::$app->request->isAjax){
- if (Yii::$app->request->isGet) {
- $params = Yii::$app->request->get();
- // 检查提交的参数
- $res = Yii::$app->services->validate->validate($params,[
- [['route_type'], 'required'],
- [['title','template','route_type'], 'string'],
- [['title', 'page', 'limit'], 'safe'],
- [['cate_id','mid'], 'integer'],
- ]);
- if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $data = DiyTemplateLogic::TemplateMarket($params);
- $this->success('获取成功', $data);
- }
- } else {
- return $this->render("@backend/modules/admin/views/template/mall.php", ['mid' => $this->mall_id]);
- }
- }
- /**
- * 我的模板列表
- * @Author: lun
- * @DateTime: 2021/12/14 0014 17:47
- * @Copyright: copyright (c) 2021 广东七件事集团
- */
- public function actionMyTemplate()
- {
- $request = Yii::$app->request;
- if ($request->isAjax && $request->isGet) {
- $params = $request->get();
- // 检查提交的参数
- $res = Yii::$app->services->validate->validate($params,[
- [['route_type'], 'required'],
- [['title','template','route_type'], 'string'],
- [['title', 'page', 'limit'], 'safe'],
- [['cate_id'], 'integer'],
- ]);
- if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- // 条件组合
- $where = [];
- $where[] = ['=', 'mall_id', $this->mall_id];
- !empty($params['cate_id']) && $where[] = ['=', 'cate_id', $params['cate_id']];
- !empty($params['template']) && $where[] = ['=', 'template', $params['template']];
- !empty($params['title']) && $where[] = ['like', 'title', $params['title']];
- $where[] = ['=', 'status', [StatusEnum::ENABLED, 2]];
- $order = 'created_at desc';
- $select = ['id','title','cate_id','template','created_at','cover','status','expire_time'];
- $list_params = array('select' => $select,'where' => $where, 'order' => $order, 'limit' => $params['limit'] ?? 20);
- $list = DiyMallTemplate::listPage($list_params, false, true);
- if (empty($list)) return $this->success('获取成功');
- $data['list'] = $list;
- // 获取模板
- $data['cate_arr'] = DiyEnum::getTemplateCate();
- $data['template_type'] = DiyEnum::template();
- return $this->success('获取成功', $data);
- }
- return $this->render("@backend/modules/admin/views/template/mall.php");
- }
- /**
- * 购买模板
- * @Author: lun
- * @DateTime: 2021/12/14 0014 18:05
- * @Copyright: copyright (c) 2021 广东七件事集团
- */
- public function actionBuyTemplate()
- {
- $request = Yii::$app->request;
- if ($request->isAjax && $request->isPost) {
- try{
- $params = $request->post();
- $res = Yii::$app->services->validate->validate($params,[
- [['template_id','duration'], 'required'],
- [['template_id','duration'], 'integer'],
- ]);
- if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $detail = DiyTemplate::findOne(['id' => $params['template_id'], 'is_on_sale' => StatusEnum::ENABLED,'status' => StatusEnum::ENABLED]);
- if (empty($detail)) throw new \Exception("模板不存在");
- // 设置过期时间
- $expire_time = $params['duration'] == -1 ? -1 : strtotime("+{$params['duration']} month");
- $data['mall_id'] = $this->mall_id;
- $data['title'] = $detail->title;
- $data['cate_id'] = $detail->cate_id;
- $data['template_id'] = $detail->id;
- $data['template'] = $detail->template;
- $data['cover'] = $detail->cover;
- $data['content'] = $detail->content;
- $data['expire_time'] = $expire_time;// TODO 后期改为可购买
- // 保存数据
- $res = DiyMallTemplate::setData($data);
- if ($res == false) throw new Exception(DiyMallTemplate::getStaticError());
- $this->success('购买成功');
- } catch (\Exception $e) {
- $this->error('购买失败:' . $e->getMessage());
- }
- }
- }
- /**
- * 使用该模板
- * @Author: lun
- * @DateTime: 2021/12/14 0014 18:05
- * @Copyright: copyright (c) 2021 广东七件事集团
- */
- public function actionUseTemplate()
- {
- $request = Yii::$app->request;
- if ($request->isAjax && $request->isPost) {
- try{
- $params = $request->post();
- $res = Yii::$app->services->validate->validate($params,[
- [['id'], 'required'],[['id'], 'integer']
- ]);
- if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
- $detail = DiyMallTemplate::findOne(['id' => $params['id'], 'mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]);
- if (empty($detail)) throw new \Exception("模板不存在");
- if ($detail->expire_time != StatusEnum::DELETE && $detail->expire_time < time()) throw new \Exception("模板已过期");
- $data['mall_id'] = $this->mall_id;
- $data['title'] = $detail->title;
- $data['mall_template_id'] = $detail->id;
- $data['template_id'] = $detail->template_id;
- $data['cover'] = $detail->cover;
- $data['content'] = $detail->content;
- // 保存数据
- $res = DiyPage::setData($data);
- if ($res == false) throw new Exception(DiyPage::getStaticError());
- $this->success('使用成功', $res['id']);
- } catch (\Exception $e) {
- $this->error('使用模板失败:' . $e->getMessage());
- }
- }
- }
- public function actionGetAddonsFields()
- {
- $request = Yii::$app->request;
- if ($request->isAjax) {
- if ($request->isGet) {
- $type = $request->get('type');
- $fields = GoodsExtra::getExtraFields($this->mall_id, $type);
- return $this->success('success', $fields);
- }
- }
- }
- /**
- * 创建订单
- *
- * @param int $id
- * @param int $index
- * @return string
- */
- public function actionCreateOrder(int $id, int $index)
- {
- $service = new TemplateService(['mall_id' => $this->mall_id]);
- $id = $service->createOrder($id, $index);
- return $id
- ? $this->success('ok', ['id' => $id])
- : $this->error($service->getError());
- }
- /**
- * 支付
- *
- * @param integer $id
- * @return string
- */
- public function actionPay(int $id)
- {
- $service = new TemplateService(['mall_id' => $this->mall_id]);
- $data = $service->getPayData($id);
- return $data
- ? $this->success('ok', $data)
- : $this->error($service->getError());
- }
- /**
- * 支付完成
- *
- * @return string
- */
- public function actionPaid()
- {
-
- return $this->render($this->action->id);
- }
- }
|