CourseController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. <?php
  2. namespace addons\Course\backend\controllers;
  3. use addons\Agent\common\models\AgentCommissionItemSetting;
  4. use addons\Agent\common\models\AgentLevel;
  5. use addons\Course\common\enums\CourseEnum;
  6. use addons\Course\common\models\AddonsCourse;
  7. use addons\Course\common\models\AddonsCourseChapter;
  8. use addons\Course\common\models\AddonsCourseDirectorys;
  9. use addons\Course\common\models\CourseCategory;
  10. use common\enums\AddonsEnum;
  11. use common\enums\StatusEnum;
  12. use common\helpers\ArrayHelper;
  13. use common\models\mall\MallAddons;
  14. use common\models\user\UserLevel;
  15. /**
  16. * 默认控制器
  17. *
  18. * Class DefaultController
  19. * @package addons\Course\backend\controllers
  20. */
  21. class CourseController extends BaseController
  22. {
  23. /**
  24. * @name:
  25. * @msg: 编辑/添加课程
  26. * @param {*}
  27. * @return {*}
  28. */
  29. public function actionCourseEdit()
  30. {
  31. if (\Yii::$app->request->isAjax) {
  32. if (\Yii::$app->request->isGet) {
  33. $course_id = \Yii::$app->request->get('id');
  34. if (!empty($course_id)) {
  35. // 编辑课程
  36. $course = AddonsCourse::getDetail($course_id, $this->mall_id, '*', true, [StatusEnum::DISABLED,StatusEnum::ENABLED]);
  37. if (false === $course) {
  38. return $this->error(AddonsCourse::getStaticError());
  39. }
  40. } else {
  41. $course_id = 0;
  42. $course = [];
  43. }
  44. //分类列表
  45. $categorys = CourseCategory::find()
  46. ->select('id,cname')
  47. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
  48. ->asArray()
  49. ->indexBy('id')
  50. ->all();
  51. $member_levels = UserLevel::find()
  52. ->select('id,name as level_name,level')
  53. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
  54. ->asArray()
  55. ->indexBy('level')
  56. ->orderBy(['level' => SORT_ASC])
  57. ->all();
  58. // dd($member_level_list);
  59. if (!empty($member_levels)) {
  60. foreach ($member_levels as &$mv) {
  61. $mv['discount_price'] = 0;
  62. }
  63. }
  64. // 经销配置
  65. $agent_config = AddonsCourse::getAgentConfig($this->mall_id, $course_id);
  66. // 分销配置
  67. $distribution_config = AddonsCourse::getDistributionConfig($this->mall_id, $course_id);
  68. // $agent_config = $distribution_config = null;
  69. // dd($distribution_config);
  70. return $this->success("成功", [
  71. 'cate_list' => $categorys,
  72. 'member_level_list' => array_values($member_levels),
  73. 'detail' => $course,
  74. 'agent_config' => ['item_setting' => $agent_config['item_setting']],
  75. 'agent_details' => $agent_config['agent_details'],
  76. 'agent_levels' => $agent_config['agent_levels'],
  77. 'agent_enable' => $agent_config['agent_enable'],
  78. 'distribution_config' => ['item_setting' => $distribution_config['item_setting'], 'level_names' => $distribution_config['level_names']],
  79. 'distribution_levels' => $distribution_config['distribution_levels'],
  80. 'distribution_details' => $distribution_config['distribution_details'],
  81. 'distribution_enable' => $distribution_config['distribution_enable'],
  82. ]);
  83. } else {
  84. $post = \Yii::$app->request->post();
  85. $rules = [
  86. [['name', 'cat_id', 'introduce', 'logo', 'introduce', 'price', 'line_off_price', 'sell_type'], 'required'],
  87. [['id', 'vm_likes', 'vm_shares', 'vm_downloads', 'vm_views', 'can_comment', 'is_open_vm', 'can_download', 'relays', 'relay_customize_text', 'detail','sort'], 'safe'],
  88. [['cat_id', 'price', 'line_off_price', 'sell_type'], 'number'],
  89. [['name', 'introduce', 'logo'], 'string'],
  90. ['price', 'required', 'when' => function ($model) {
  91. return CourseEnum::COURSE_SELL_TYPE_1 == $model->sell_type;
  92. }],
  93. ['line_off_price', 'required', 'when' => function ($model) {
  94. return CourseEnum::COURSE_SELL_TYPE_1 == $model->sell_type;
  95. }],
  96. ['allow_member_levels', 'required', 'when' => function ($model) {
  97. return CourseEnum::COURSE_SELL_TYPE_2 == $model->sell_type;
  98. }],
  99. ];
  100. $res = \Yii::$app->services->validate->validate($post, $rules);
  101. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  102. if (CourseEnum::COURSE_SELL_TYPE_4 == $post['sell_type']) {
  103. if (empty($post['relays'])) {
  104. $post['relays'] = 1;
  105. }
  106. if (empty($post['relay_customize_text'])) {
  107. $post['relay_customize_text'] = '转发视频可免费观看';
  108. }
  109. }
  110. if ($post['price'] > $post['line_off_price']) {
  111. return $this->error('售价不能大于划线价');
  112. }
  113. // dd($post);
  114. $res = AddonsCourse::setData($this->mall_id, $post);
  115. // dd(AddonsCourse::getStaticError());
  116. if (false === $res) {
  117. return $this->error('添加失败');
  118. } else {
  119. return $this->success('添加成功');
  120. }
  121. }
  122. } else {
  123. return $this->render('/course/edit');
  124. }
  125. }
  126. /**
  127. * @Author: guyu
  128. * @Date:2021-03-19
  129. * @Note:课程状态切换
  130. * @return Yii\web\Response
  131. */
  132. public function actionSwitchStatus()
  133. {
  134. if (!\Yii::$app->request->isPost) {
  135. return $this->error('请求方式错误');
  136. }
  137. $id = \Yii::$app->request->post('id');
  138. $status = \Yii::$app->request->post("status");
  139. if (empty($id) || !isset($status)) {
  140. return $this->error('参数错误');
  141. }
  142. $course = AddonsCourse::findOne(['mall_id' => $this->mall_id, 'id' => $id]);
  143. if (empty($course)) {
  144. return $this->error('该课程不存在或者已被删除');
  145. }
  146. if ($status == $course->status) {
  147. return $this->success('操作成功');
  148. }
  149. $params = [
  150. 'id' => $id,
  151. 'status' => $status,
  152. ];
  153. $res = AddonsCourse::setData($this->mall_id, $params);
  154. if (false === $res) return $this->error('操作失败');
  155. return $this->success('操作成功');
  156. }
  157. /**
  158. * @name:
  159. * @msg: 课程删除
  160. * @param {*}
  161. * @return {*}
  162. */
  163. public function actionDelete()
  164. {
  165. if (!\Yii::$app->request->isPost) {
  166. return $this->error('请求方式错误');
  167. }
  168. $id = \Yii::$app->request->post("id");
  169. $course = AddonsCourse::findOne(['id' => $id, 'mall_id' => $this->mall_id]);
  170. if (empty($course)) {
  171. return $this->error('课程不存在或者已被删除');
  172. }
  173. $count = AddonsCourseChapter::find()->where(["course_id" => $id, "status" => StatusEnum::ENABLED])->count();
  174. if ($count > 0) {
  175. return $this->error('此课程下还有章节未删除');
  176. }
  177. $params = [
  178. 'id' => $id,
  179. 'status' => StatusEnum::DELETE,
  180. ];
  181. $res = AddonsCourse::setData($this->mall_id, $params);
  182. if (false === $res) {
  183. return $this->error(AddonsCourse::getStaticError());
  184. }
  185. return $this->success('删除成功');
  186. }
  187. /**
  188. * @name:
  189. * @msg: 获取某一课程下的章节列表
  190. * @param {*}
  191. * @return {*}
  192. */
  193. public function actionChapterList()
  194. {
  195. if (!\Yii::$app->request->isAjax) {
  196. return $this->render('/course/chapter-list');
  197. }
  198. if (!\Yii::$app->request->isGet) {
  199. return $this->error('请求方式错误');
  200. }
  201. $limit = \Yii::$app->request->get('limit', $this->pageSize);
  202. $page = \Yii::$app->request->get('page', 1);
  203. $course_id = \Yii::$app->request->get('course_id');
  204. $course_name = \Yii::$app->request->get('course_name');
  205. if (empty($course_id)) {
  206. return $this->error('参数错误');
  207. }
  208. $wheres[] = ['course_id' => $course_id, 'mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED];
  209. if (!empty($course_name)) {
  210. $wheres[] = ['like', 'name', $course_name];
  211. }
  212. $params = [
  213. 'select' => 'id,course_id,dir_id,name as chapter_name,goods_list,views,can_see,sort,dir.name as dir_name',
  214. 'where' => $wheres,
  215. 'order' => 'sort asc,created_at desc',
  216. 'page' => $page,
  217. 'limit' => $limit,
  218. ];
  219. $list = AddonsCourseChapter::listPage($params);
  220. if (false === $list['list']) return $this->error(AddonsCourseChapter::getStaticError());
  221. // dd($list);
  222. $dir_ids = array_column($list['list'], 'dir_id');
  223. $directorys = AddonsCourseDirectorys::find()
  224. ->select('id,name as dir_name')
  225. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $dir_ids])
  226. ->asArray()
  227. ->indexBy('id')
  228. ->all();
  229. foreach ($list['list'] as $list) {
  230. $directory = $directorys[$list['dir_id']] ?? '';
  231. $list['dir_name'] = $directory['dir_name'] ?? '未分类';
  232. }
  233. // 获取课程相关信息
  234. $course_info = AddonsCourse::getDetail($course_id, 'id,price,logo,introduce,name,sales', true);
  235. $list['course_info'] = $course_info;
  236. // 获取该课程下的所有的目录列表
  237. $directory_info = AddonsCourseDirectorys::getDirTreeList($this->mall_id, $course_id, 'id,course_id,parent_id,level,name,sort');
  238. $list['directory_list'] = $directory_info['tree'];
  239. return $this->success('success', $list);
  240. }
  241. /**
  242. * @name:
  243. * @msg: 课程经销独立设置
  244. * @param {*}
  245. * @return {*}
  246. */
  247. public function actionAgentSetting()
  248. {
  249. if (!\Yii::$app->request->isPost) {
  250. return $this->error('请求方式错误');
  251. }
  252. $addons_name = AddonsEnum::ADDONS_NAME_AGENT;
  253. $is_install = MallAddons::isInstall($this->mall_id, $addons_name);
  254. if (!$is_install) {
  255. return $this->error('应用 ' . AddonsEnum::getAddonsNameMap(AddonsEnum::ADDONS_NAME_AGENT) . ' 未安装');
  256. }
  257. $course_id = \Yii::$app->request->get('course_id');
  258. if (empty($course_id)) {
  259. return $this->error('参数错误');
  260. }
  261. $course = AddonsCourse::find()->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $course_id])->one();
  262. if (empty($course)) {
  263. return $this->error('课程不存在');
  264. }
  265. $post = \Yii::$app->request->post();
  266. $post['course_id'] = $course_id;
  267. // dd($post);
  268. $res = AddonsCourse::AgentSetting($this->mall_id, $post);
  269. if (false === $res) {
  270. return $this->error(AddonsCourse::getStaticError());
  271. }
  272. return $this->success('保存成功');
  273. }
  274. /**
  275. * @name:
  276. * @msg: 课程分销独立设置
  277. * @param {*}
  278. * @return {*}
  279. */
  280. public function actionDistributionSetting()
  281. {
  282. if (!\Yii::$app->request->isPost) {
  283. return $this->error('请求方式错误');
  284. }
  285. $addons_name = AddonsEnum::ADDONS_NAME_DISTRIBUTION;
  286. $is_install = MallAddons::isInstall($this->mall_id, $addons_name);
  287. if (!$is_install) {
  288. return $this->error('应用 ' . AddonsEnum::getAddonsNameMap(AddonsEnum::ADDONS_NAME_DISTRIBUTION) . ' 未安装');
  289. }
  290. $course_id = \Yii::$app->request->get('course_id');
  291. if (empty($course_id)) {
  292. return $this->error('参数错误');
  293. }
  294. $course = AddonsCourse::find()->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $course_id])->one();
  295. if (empty($course)) {
  296. return $this->error('课程不存在');
  297. }
  298. $post = \Yii::$app->request->post();
  299. $post['course_id'] = $course_id;
  300. // dd($post);
  301. $res = AddonsCourse::distributionSetting($this->mall_id, $post);
  302. if (false === $res) {
  303. return $this->error(AddonsCourse::getStaticError());
  304. }
  305. return $this->success('保存成功');
  306. }
  307. public function actionUpdateSort()
  308. {
  309. if (!\Yii::$app->request->isPost) {
  310. return $this->error('请求方式错误');
  311. }
  312. $id = \Yii::$app->request->post('id');
  313. $sort = \Yii::$app->request->post("sort");
  314. if (empty($id) || !isset($sort)) {
  315. return $this->error('参数错误');
  316. }
  317. $course = AddonsCourse::findOne(['mall_id' => $this->mall_id, 'id' => $id]);
  318. if (empty($course)) {
  319. return $this->error('该课程不存在或者已被删除');
  320. }
  321. $params = [
  322. 'id' => $id,
  323. 'sort' => $sort,
  324. ];
  325. $res = AddonsCourse::setData($this->mall_id, $params);
  326. if (false === $res) return $this->error('操作失败');
  327. return $this->success('操作成功');
  328. }
  329. }