GoodsTemplateController.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. <?php
  2. namespace backend\modules\mall\controllers;
  3. use common\enums\DiyEnum;
  4. use common\enums\StatusEnum;
  5. use common\models\diy\DiyComponents;
  6. use backend\controllers\MallController;
  7. use common\models\diy\DiyPage;
  8. use common\models\goods\Goods;
  9. use common\models\mall\MallAddons;
  10. use common\models\user\UserLevel;
  11. use common\models\goods\template\GoodsDecorationTemplate;
  12. use common\models\goods\template\GoodsDecorationTemplateContent;
  13. use common\models\goods\template\GoodsTemplateRelation;
  14. use Yii;
  15. use yii\db\Exception;
  16. use yii\helpers\Json;
  17. class GoodsTemplateController extends MallController
  18. {
  19. public function actionIndex()
  20. {
  21. if (Yii::$app->request->isAjax) {
  22. if (Yii::$app->request->isGet) {
  23. $params = Yii::$app->request->get();
  24. // 检查提交的参数
  25. $res = Yii::$app->services->validate->validate($params, [
  26. [['name'], 'string'],
  27. [['id', 'status'], 'integer'],
  28. [['page', 'limit'], 'safe'],
  29. ]);
  30. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  31. $where = [];
  32. $where[] = ['=', 'mall_id', $this->mall_id];
  33. $where[] = ['in', 'status', [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  34. // 根据名称搜索
  35. if (!empty($params['name'])) {
  36. $where[] = ['like', 'name', $params['name']];
  37. }
  38. if (!empty($params['id'])) {
  39. $where[] = ['=', 'id', $params['id']];
  40. }
  41. if ($params['status'] != '') {
  42. $where[] = ['=', 'status', $params['status']];
  43. }
  44. $order = 'id desc';
  45. $select = ['id', 'name', 'mall_id', 'is_default', 'status', 'created_at'];
  46. $params = ['select' => $select, 'where' => $where, 'order' => $order, 'limit' => $params['limit']];
  47. $data = GoodsDecorationTemplate::listPage($params, false, true);
  48. if (empty($data)) return $this->success('获取成功');
  49. $this->success('获取成功', $data);
  50. }
  51. } else {
  52. return $this->render($this->action->id);
  53. }
  54. }
  55. public function actionDiy()
  56. {
  57. $request = Yii::$app->request;
  58. if ($request->isAjax) {
  59. if ($request->isPost) {
  60. $params = $request->post();
  61. $res = Yii::$app->services->validate->validate($params, [
  62. [['id'], 'integer'],
  63. [['content'], 'string'],
  64. [['content', 'title'], 'required'],
  65. [['id'], 'safe'],
  66. ]);
  67. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  68. try {
  69. // 将数组转为json字符串
  70. if (is_array($params['content'])) $params['content'] = Json::encode($params['content'], JSON_UNESCAPED_SLASHES);
  71. $params['mall_id'] = $this->mall_id;
  72. // 保存数据
  73. $res = GoodsDecorationTemplateContent::setData($params);
  74. if ($res == false) throw new Exception(GoodsDecorationTemplateContent::getStaticError());
  75. return $this->success('保存成功', ['id' => $res->id]);
  76. } catch (\Exception $e) {
  77. \Yii::error(self::class . '->' . __FUNCTION__ . ', error:' . $e->getMessage());
  78. return $this->error('编辑失败,msg:' . $e->getMessage());
  79. }
  80. } else {
  81. $params = $request->get();
  82. $res = Yii::$app->services->validate->validate($params, [
  83. [['id'], 'integer'],
  84. [['id'], 'safe']
  85. ]);
  86. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  87. try {
  88. $diypage = (object)[];
  89. $template = DiyEnum::GOODS_TEMPLATE;
  90. if (isset($params['id'])) {
  91. // 查询页面
  92. $diypage = GoodsDecorationTemplateContent::find()->where(['id' => $params['id'], 'mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])->select(['id', 'title', 'content', 'created_at'])->asArray()->one();
  93. if (empty($diypage)) throw new \Exception("页面不存在");
  94. } else {
  95. // 查询页面
  96. $diypage = DiyPage::find()->where(['template' => DiyEnum::GOODS_DETAIL, 'mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])->select(['title', 'template', 'content'])->asArray()->one();
  97. if (empty($diypage)) throw new \Exception("页面不存在");
  98. }
  99. // 获取商城有效的插件
  100. $valid_addons = MallAddons::getValidAddons($this->mall_id);
  101. // 根据分组获取组件
  102. $components = DiyComponents::getComponent(DiyEnum::getGroup($template), [], $valid_addons, $this->mall_id);
  103. foreach ($components as $key => &$component) {
  104. if ($component['title'] == '商品组件') unset($components[$key]);
  105. if ($component['title'] == '图文类') {
  106. foreach ($component['list'] as $k => $v) {
  107. if (!in_array($v['type'], ['carousel-img', 'title-block'])) {
  108. unset($component['list'][$k]);
  109. }
  110. }
  111. $component['list'] = array_values($component['list']);
  112. }
  113. }
  114. unset($component);
  115. $components = array_values($components);
  116. // 获取会员等级
  117. $default_level_list[] = ['level' => 0, 'name' => '普通用户'];
  118. $member_level_list = UserLevel::getUserLevel([['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]], [], 1, 'level,name');
  119. $auth[] = [
  120. 'name' => 'member',
  121. 'title' => '会员等级',
  122. 'list' => array_merge($default_level_list, $member_level_list)
  123. ];
  124. return $this->success('获取成功', compact('diypage', 'components', 'auth', 'capital', 'valid_addons'));
  125. } catch (\Exception $e) {
  126. return $this->error('获取失败,msg:' . $e->getMessage());
  127. }
  128. }
  129. } else {
  130. // 获取所有插件组件
  131. $addons_components = DiyComponents::find()->select('code,title,group,source')->where(['status' => StatusEnum::ENABLED])->andWhere(['not', ['source' => '']])->asArray()->all();
  132. return $this->render($this->action->id, ['addons_components' => $addons_components]);
  133. }
  134. }
  135. /**
  136. * @Description: 保存模板
  137. * @Author: zhngsan
  138. * @DateTime 2023-01-17 17:09:32
  139. * @return mixed
  140. */
  141. public function actionEdit()
  142. {
  143. $request = Yii::$app->request;
  144. if ($request->isAjax) {
  145. if ($request->isPost) {
  146. $params = $request->post();
  147. $res = Yii::$app->services->validate->validate($params, [
  148. [['id', 'template_id', 'is_default', 'status'], 'integer'],
  149. [['name'], 'string'],
  150. [['name'], 'required'],
  151. ]);
  152. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  153. $params['mall_id'] = $this->mall_id;
  154. // 保存数据
  155. $res = GoodsDecorationTemplate::setData($params);
  156. if ($res == false) return $this->error(GoodsDecorationTemplate::getStaticError());
  157. return $this->success('保存成功');
  158. } else {
  159. $params = $request->get();
  160. $res = Yii::$app->services->validate->validate($params, [
  161. [['id'], 'integer'],
  162. [['id'], 'safe']
  163. ]);
  164. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  165. $data = GoodsDecorationTemplate::getOne([['id' => $params['id']], ['mall_id' => $this->mall_id]], true);
  166. return $this->success('获取成功', $data ?? []);
  167. }
  168. } else {
  169. return $this->render($this->action->id);
  170. }
  171. }
  172. /**
  173. * 复制页面
  174. * @return mixed|void
  175. */
  176. public function actionCopyTemplate()
  177. {
  178. $request = Yii::$app->request;
  179. if ($request->isPost) {
  180. $trans = Yii::$app->db->beginTransaction();
  181. try {
  182. $params = $request->post();
  183. $res = Yii::$app->services->validate->validate($params, [
  184. [['id'], 'required'],
  185. ]);
  186. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  187. $detail = GoodsDecorationTemplate::findOne(['id' => $params['id'], 'mall_id' => $this->mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  188. if (empty($detail)) throw new \Exception("广告模板不存在");
  189. $template = GoodsDecorationTemplateContent::findOne(['id' => $detail->template_id, 'mall_id' => $this->mall_id]);
  190. if (!$template) throw new \Exception("模板样式不存在");
  191. $new_template = new GoodsDecorationTemplateContent();
  192. $new_template->attributes = $template->attributes;
  193. if (!$new_template->save()) throw new \Exception("复制失败:" . $new_template->getErrorMessage());
  194. $name = $detail->name;
  195. $detail->name = $name . '-copy';
  196. $diy = new GoodsDecorationTemplate();
  197. $diy->attributes = $detail->attributes;
  198. $diy->template_id = $new_template->id;
  199. if (!$diy->save()) throw new \Exception("复制失败:" . $diy->getErrorMessage());
  200. if ($detail->is_default == StatusEnum::ENABLED) {
  201. $detail->name = $name;
  202. $detail->is_default = StatusEnum::DISABLED;
  203. if (!$detail->save()) throw new \Exception("复制失败:" . $detail->getErrorMessage());
  204. }
  205. $trans->commit();
  206. return $this->success('复制成功');
  207. } catch (\Exception $e) {
  208. $trans->rollBack();
  209. return $this->error($e->getMessage());
  210. }
  211. }
  212. }
  213. /**
  214. * 装修删除
  215. * @return mixed|void
  216. */
  217. public function actionDelete()
  218. {
  219. $request = Yii::$app->request;
  220. if ($request->isPost) {
  221. $trans = Yii::$app->db->beginTransaction();
  222. try {
  223. $params = $request->post();
  224. $res = Yii::$app->services->validate->validate($params, [
  225. [['id'], 'required'],
  226. ]);
  227. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  228. $detail = GoodsDecorationTemplate::findOne(['id' => $params['id'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  229. if (empty($detail)) throw new \Exception("广告模板不存在");
  230. $template = GoodsDecorationTemplateContent::findOne(['id' => $detail->template_id, 'mall_id' => $this->mall_id]);
  231. if (!$template) throw new \Exception("模板样式不存在");
  232. $detail->status = StatusEnum::DELETE;
  233. if (!$detail->save()) throw new \Exception($detail->getErrorMessage());
  234. $template->status = StatusEnum::DELETE;
  235. if (!$template->save()) throw new \Exception($template->getErrorMessage());
  236. $relations = GoodsTemplateRelation::findAll(['mall_id' => $this->mall_id, 'template_id' => $detail->id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  237. foreach ($relations as $relation) {
  238. $relation->status = StatusEnum::DELETE;
  239. $relation->save();
  240. }
  241. $trans->commit();
  242. return $this->success('删除成功');
  243. } catch (\Exception $e) {
  244. $trans->rollBack();
  245. return $this->error($e->getMessage());
  246. }
  247. }
  248. }
  249. /**
  250. *
  251. * @return mixed|void
  252. */
  253. public function actionSwitch()
  254. {
  255. $request = Yii::$app->request;
  256. if ($request->isPost) {
  257. try {
  258. $params = $request->post();
  259. $res = Yii::$app->services->validate->validate($params, [
  260. [['id'], 'required'],
  261. ]);
  262. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  263. $detail = GoodsDecorationTemplate::findOne(['id' => $params['id'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  264. if (empty($detail)) throw new \Exception("模板不存在");
  265. $detail->status = $detail->status == StatusEnum::ENABLED ? StatusEnum::DISABLED : StatusEnum::ENABLED;
  266. if (!$detail->save()) throw new \Exception("操作失败");
  267. if ($detail->status == StatusEnum::DISABLED) {
  268. $relations = GoodsTemplateRelation::findAll(['mall_id' => $this->mall_id, 'template_id' => $detail->id, 'status' => StatusEnum::ENABLED]);
  269. foreach ($relations as $relation) {
  270. $relation->status = StatusEnum::DISABLED;
  271. $relation->save();
  272. }
  273. }
  274. return $this->success('操作成功');
  275. } catch (\Exception $e) {
  276. return $this->error($e->getMessage());
  277. }
  278. }
  279. }
  280. /**
  281. * 根据标识获取对应组件的内容
  282. * @Author: lun
  283. * @DateTime: 2021/11/11 0011 14:52
  284. * @Copyright: copyright (c) 2021 广东七件事集团
  285. * @return mixed|void
  286. */
  287. public function actionGetComponentsData()
  288. {
  289. $params = Yii::$app->request->post('form');
  290. $list = Json::decode($params, true);
  291. if (empty($list)) return $this->error('请求数据为空');
  292. $data = GoodsDecorationTemplate::getGoodsListByStrategy($this->mall_id, $list);
  293. return $this->success('操作成功', $data);
  294. }
  295. public function actionBatchSet()
  296. {
  297. $request = Yii::$app->request;
  298. if ($request->isPost) {
  299. try {
  300. $params = $request->post();
  301. $res = Yii::$app->services->validate->validate($params, [
  302. [['chooseList'], 'safe'],
  303. [['template_id'], 'integer'],
  304. [['template_id'], 'required'],
  305. ]);
  306. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  307. $goods_list = Goods::findAll(['mall_id' => $this->mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED], 'id' => $params['chooseList']]);
  308. foreach ($goods_list as $goods) {
  309. $res = GoodsTemplateRelation::setData(['mall_id' => $this->mall_id, 'template_id' => $params['template_id'], 'goods_id' => $goods->id, 'status' => StatusEnum::ENABLED]);
  310. if ($res === false) throw new Exception('goods_id: ' . $goods->id . ' 广告模板设置失败:' . GoodsTemplateRelation::getStaticError());
  311. }
  312. return $this->success('操作成功');
  313. } catch (\Exception $e) {
  314. return $this->error($e->getMessage());
  315. }
  316. }
  317. }
  318. }