MaterialController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. <?php
  2. namespace addons\BusinessCard\api\modules\v1\controllers;
  3. use addons\BusinessCard\common\logic\Statistics;
  4. use addons\BusinessCard\common\logic\WechatNotice;
  5. use addons\BusinessCard\common\models\BusinessCard;
  6. use addons\BusinessCard\common\models\BusinessCardMaterials;
  7. use addons\BusinessCard\common\models\BusinessCardMaterialsBrowse;
  8. use addons\BusinessCard\common\models\BusinessCardMaterialsBrowseLog;
  9. use addons\BusinessCard\common\models\BusinessCardMaterialsCate;
  10. use addons\BusinessCard\common\models\BusinessCardMaterialsShare;
  11. use addons\BusinessCard\common\models\BusinessCardMaterialsStatistics;
  12. use common\enums\StatusEnum;
  13. use addons\BusinessCard\common\enums\CardEnums;
  14. use api\controllers\OnAuthController;
  15. use common\models\mall\MallAddons;
  16. use common\models\user\User;
  17. use common\models\user\UserPartitionRelationship;
  18. use Yii;
  19. use Exception;
  20. use yii\helpers\Json;
  21. class MaterialController extends OnAuthController
  22. {
  23. public $modelClass = '';
  24. public $card = '';
  25. protected $authOptional = ['material-tabs', 'material-list','material-statistics'];
  26. // 素材tabs
  27. public function actionMaterialTabs()
  28. {
  29. $request = Yii::$app->request;
  30. if ($request->isPost) {
  31. $ext_type_list = CardEnums::getMaterialExtType();
  32. $ext_type_list = array_merge(['' => '全部'], $ext_type_list);
  33. $where = [
  34. ['=', 'mall_id', $this->mall_id],
  35. ['=', 'status', StatusEnum::ENABLED],
  36. ];
  37. $order = 'order_sort desc,id desc';
  38. $limit = 100;
  39. $select = 'id,name';
  40. $cate_list = BusinessCardMaterialsCate::lists(compact('where', 'select', 'limit', 'order'), true);
  41. $is_install_materal = MallAddons::isInstall($this->mall_id, CardEnums::ADDONS_MATERIAL_NAME);
  42. return $this->success('素材列表Tabs', compact('ext_type_list', 'cate_list','is_install_materal'));
  43. }
  44. }
  45. // 素材列表
  46. public function actionMaterialList()
  47. {
  48. $request = Yii::$app->request;
  49. if ($request->isPost) {
  50. $params = $request->post();
  51. $res = \Yii::$app->services->validate->validate($params, [
  52. [['limit', 'cate_id'], 'integer'],
  53. [['keyword', 'ext_type'], 'string'],
  54. ]);
  55. if($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  56. $where = [
  57. ['=', 'mall_id', $this->mall_id],
  58. ['=', 'status', StatusEnum::ENABLED],
  59. ['=', 'is_show', CardEnums::IS_SHOW],
  60. ];
  61. if ($params['keyword']) {
  62. $where[] = ['or', ['like', 'title', '%' . trim($params['keyword']) . '%', false], ['like', 'intro', '%' . trim($params['keyword']) . '%', false]];
  63. }
  64. if ($params['cate_id']) {
  65. $where[] = ['=', 'cate_id', $params['cate_id']];
  66. }
  67. if ($params['ext_type']) {
  68. $where[] = ['=', 'ext_type', $params['ext_type']];
  69. }
  70. $order = 'id desc';
  71. $limit = $params['limit'] ?? 10;
  72. $select = 'id,title,intro,cover_img,ext_type,share_title,share_desc';
  73. $list = BusinessCardMaterials::listPage(compact('where','select', 'limit', 'order'), false, true);
  74. $list['list'] = is_array($list['list']) ? $list['list'] : [];
  75. $id_array = array_column($list['list'], 'id');
  76. $statistics = BusinessCardMaterialsStatistics::find()
  77. ->andWhere(['=', 'mall_id', $this->mall_id])
  78. ->andWhere(['=', 'status', StatusEnum::ENABLED])
  79. ->andWhere(['in', 'material_id', $id_array])
  80. ->select('material_id,view_seconds,view_times,view_numbers, share_times')
  81. ->asArray()
  82. ->all();
  83. $statistics_data = array_column($statistics, null, 'material_id');
  84. foreach ($list['list'] as $index => $item) {
  85. $item['ext_type_name'] = CardEnums::getMaterialExtType($item['ext_type']);
  86. $item['statistics'] = $statistics_data[$item['id']] ?? null;
  87. $list['list'][$index] = $item;
  88. }
  89. // 记录浏览素材列表
  90. if (!empty($this->user_id)) {
  91. $card = BusinessCard::getOne([
  92. ['mall_id' => $this->mall_id],
  93. ['user_id' => $this->user_id],
  94. ['status' => StatusEnum::ENABLED],
  95. ]);
  96. if (empty($card) || $card->id != $this->card_id) {
  97. Statistics::handler(['mall_id' => $this->mall_id, 'user_id' => $this->user_id,
  98. 'item_id' => !empty($this->card_id) ? $this->card_id : -1, 'log_type' => CardEnums::LOG_TYPE_MATEREAL]);
  99. // if (!empty($this->card_id)) {
  100. // // 微信推送
  101. // $card = BusinessCard::getOne([
  102. // ['mall_id' => $this->mall_id],
  103. // ['user_id' => $this->parent_id],
  104. // ['status' => StatusEnum::ENABLED],
  105. // ]);
  106. // WechatNotice::handler(['to_user_id' => $card->user_id, 'user_id' => $this->user_id,
  107. // 'mall_id' => $this->mall_id, 'log_type' => CardEnums::LOG_TYPE_MATEREAL_DETAIL]);
  108. // }
  109. }
  110. }
  111. return $this->success('素材列表', $list);
  112. }
  113. }
  114. // 素材详情
  115. public function actionMaterialDetail()
  116. {
  117. $request = Yii::$app->request;
  118. if ($request->isPost) {
  119. $params = $request->post();
  120. $get = $request->get();
  121. $res = \Yii::$app->services->validate->validate($params, [
  122. [['id', 'share_type'], 'integer'],
  123. ]);
  124. if($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  125. $detail = BusinessCardMaterials::getOne([
  126. ['=', 'mall_id', $this->mall_id],
  127. ['=', 'id', $params['id']],
  128. ['=', 'status', StatusEnum::ENABLED]
  129. ], true, '', '',
  130. 'user_id,title,intro,cover_img,ext_type,share_title,share_desc,material_link,material_cont'
  131. );
  132. if ($detail) {
  133. $detail['ext_type_name'] = CardEnums::getMaterialExtType($detail['ext_type']);
  134. }
  135. $params['share_type'] = !empty($params['share_type']) ? $params['share_type'] : ($get['share_type'] ?? 0);
  136. if (!empty($params['share_type']) && $this->user_id != $this->parent_id) {
  137. // 分享素材
  138. WechatNotice::handler(['to_user_id' => $this->parent_id, 'user_id' => $this->user_id,
  139. 'mall_id' => $this->mall_id, 'log_type' => CardEnums::LOG_TYPE_MATEREAL_DETAIL]);
  140. }
  141. return $this->success('素材详情', $detail);
  142. }
  143. }
  144. // 素材统计
  145. public function actionMaterialStatistics()
  146. {
  147. $request = Yii::$app->request;
  148. if($this->user_id<0 || !$this->user_id){
  149. return false;
  150. }
  151. if ($request->isPost) {
  152. $params = $request->post();
  153. $res = \Yii::$app->services->validate->validate($params, [
  154. [['start_time', 'end_time', 'material_id', 'pid', 'unikey'], 'safe'],
  155. ]);
  156. if($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  157. if ($params['end_time'] <= $params['start_time']) {
  158. return $this->error('时间错误');
  159. }
  160. if (!$params['material_id']) {
  161. return $this->error('素材ID缺失');
  162. }
  163. $view_seconds = floor($params['end_time'] - $params['start_time']);
  164. $unikey = $params['unikey'] ?? '';
  165. $is_marked = BusinessCardMaterialsBrowseLog::isMarked($this->mall_id, $this->user_id, $params['material_id'], $unikey);
  166. if ($is_marked) {
  167. $view_material = $view_numbers = $view_times = 0;
  168. $log_view_times = 0;
  169. } else {
  170. // 用户是否已看过改素材
  171. $is_readed = BusinessCardMaterialsBrowseLog::isReaded($this->mall_id, $this->user_id, $params['material_id']);
  172. $view_material = $view_numbers = $is_readed ? 0 : 1;
  173. $view_times = 1;
  174. $log_view_times = $is_readed ? $is_readed['view_times'] + 1 : 1;
  175. }
  176. $share_user_id = intval($params['pid']) > 0 ? (int) $params['pid'] : 0;
  177. $share_user_type = 1;
  178. if (empty($share_user_id)) { // 如果没有PID那么就取当前用户上级
  179. // 取上级
  180. $share_user_id = User::find()->where(['id' => $this->user_id])->select('parent_id')->scalar();
  181. if (!empty($share_user_id)) $share_user_type = 2;
  182. }
  183. $trans = Yii::$app->db->beginTransaction();
  184. try {
  185. // 用户统计
  186. $browse = [
  187. 'mall_id' => $this->mall_id,
  188. 'user_id' => $this->user_id,
  189. 'view_material' => $view_material,
  190. 'view_times' => $view_times,
  191. 'view_seconds' => $view_seconds,
  192. 'recent_time' => time(),
  193. 'status' => StatusEnum::ENABLED
  194. ];
  195. $res = BusinessCardMaterialsBrowse::setData($browse);
  196. if ($res == false) {
  197. throw new Exception(BusinessCardMaterialsBrowse::getStaticError());
  198. }
  199. $browse_log = [
  200. 'mall_id' => $this->mall_id,
  201. 'user_id' => $this->user_id,
  202. 'material_id' => $params['material_id'],
  203. 'share_user_id' => $share_user_id,
  204. 'share_user_type' => $share_user_type,
  205. 'view_seconds' => $view_seconds,
  206. 'unikey' => $unikey,
  207. 'status' => StatusEnum::ENABLED
  208. ];
  209. if ($is_marked) {
  210. $browse_log['id'] = $is_marked['id'];
  211. } else {
  212. $browse_log['view_times'] = $log_view_times;
  213. }
  214. // 用户浏览记录
  215. $card_id = $this->card_id;
  216. if (!empty($params['pid']) && $params['pid'] != $this->user_id) {
  217. $card_id = BusinessCard::find()->where(['mall_id' => $this->mall_id])
  218. ->andWhere(['user_id' => $params['pid']])->select('id')->scalar();
  219. }
  220. $log_res = BusinessCardMaterialsBrowseLog::setData($browse_log, $card_id);
  221. if ($log_res == false) {
  222. throw new Exception(BusinessCardMaterialsBrowseLog::getStaticError());
  223. }
  224. // 素材统计
  225. $res = BusinessCardMaterialsStatistics::setData([
  226. 'mall_id' => $this->mall_id,
  227. 'material_id' => $params['material_id'],
  228. 'view_seconds' => $view_seconds,
  229. 'view_numbers' => $view_numbers,
  230. 'view_times' => $view_times,
  231. 'share_times' => 0,
  232. 'status' => StatusEnum::ENABLED
  233. ]);
  234. if ($res == false) {
  235. throw new Exception(BusinessCardMaterialsStatistics::getStaticError());
  236. }
  237. $trans->commit();
  238. } catch (Exception $e) {
  239. $trans->rollBack();
  240. return $this->error($e->getMessage());
  241. }
  242. return $this->success('已阅', []);
  243. }
  244. }
  245. // 统计分享次数
  246. public function actionShareStatistics()
  247. {
  248. $request = Yii::$app->request;
  249. if ($request->isPost) {
  250. $params = $request->post();
  251. $res = \Yii::$app->services->validate->validate($params, [
  252. [['material_id'], 'safe'],
  253. ]);
  254. if($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  255. if ($params['material_id'] <= 0) {
  256. return $this->error('素材ID不能为空');
  257. }
  258. $trans = Yii::$app->db->beginTransaction();
  259. try {
  260. // 素材统计增加一次分享记录
  261. $res = BusinessCardMaterialsStatistics::setData([
  262. 'mall_id' => $this->mall_id,
  263. 'material_id' => $params['material_id'],
  264. 'view_seconds' => 0,
  265. 'view_numbers' => 0,
  266. 'view_times' => 0,
  267. 'share_times' => 1,
  268. 'status' => StatusEnum::ENABLED
  269. ]);
  270. if ($res == false) {
  271. throw new Exception(BusinessCardMaterialsStatistics::getStaticError());
  272. }
  273. // 增加一条用户分享记录统计
  274. $res = BusinessCardMaterialsShare::setData([
  275. 'mall_id' => $this->mall_id,
  276. 'user_id' => $this->user_id,
  277. 'material_id' => $params['material_id'],
  278. 'share_times' => 1,
  279. 'recent_time' => time(),
  280. 'status' => StatusEnum::ENABLED
  281. ]);
  282. if ($res == false) {
  283. throw new Exception(BusinessCardMaterialsStatistics::getStaticError());
  284. }
  285. $trans->commit();
  286. } catch (Exception $e) {
  287. $trans->rollBack();
  288. return $this->error($e->getMessage());
  289. }
  290. return $this->success('分享成功', []);
  291. }
  292. }
  293. }