request; if ($request->isPost) { $ext_type_list = CardEnums::getMaterialExtType(); $ext_type_list = array_merge(['' => '全部'], $ext_type_list); $where = [ ['=', 'mall_id', $this->mall_id], ['=', 'status', StatusEnum::ENABLED], ]; $order = 'order_sort desc,id desc'; $limit = 100; $select = 'id,name'; $cate_list = BusinessCardMaterialsCate::lists(compact('where', 'select', 'limit', 'order'), true); $is_install_materal = MallAddons::isInstall($this->mall_id, CardEnums::ADDONS_MATERIAL_NAME); return $this->success('素材列表Tabs', compact('ext_type_list', 'cate_list','is_install_materal')); } } // 素材列表 public function actionMaterialList() { $request = Yii::$app->request; if ($request->isPost) { $params = $request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['limit', 'cate_id'], 'integer'], [['keyword', 'ext_type'], 'string'], ]); if($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $where = [ ['=', 'mall_id', $this->mall_id], ['=', 'status', StatusEnum::ENABLED], ['=', 'is_show', CardEnums::IS_SHOW], ]; if ($params['keyword']) { $where[] = ['or', ['like', 'title', '%' . trim($params['keyword']) . '%', false], ['like', 'intro', '%' . trim($params['keyword']) . '%', false]]; } if ($params['cate_id']) { $where[] = ['=', 'cate_id', $params['cate_id']]; } if ($params['ext_type']) { $where[] = ['=', 'ext_type', $params['ext_type']]; } $order = 'id desc'; $limit = $params['limit'] ?? 10; $select = 'id,title,intro,cover_img,ext_type,share_title,share_desc'; $list = BusinessCardMaterials::listPage(compact('where','select', 'limit', 'order'), false, true); $list['list'] = is_array($list['list']) ? $list['list'] : []; $id_array = array_column($list['list'], 'id'); $statistics = BusinessCardMaterialsStatistics::find() ->andWhere(['=', 'mall_id', $this->mall_id]) ->andWhere(['=', 'status', StatusEnum::ENABLED]) ->andWhere(['in', 'material_id', $id_array]) ->select('material_id,view_seconds,view_times,view_numbers, share_times') ->asArray() ->all(); $statistics_data = array_column($statistics, null, 'material_id'); foreach ($list['list'] as $index => $item) { $item['ext_type_name'] = CardEnums::getMaterialExtType($item['ext_type']); $item['statistics'] = $statistics_data[$item['id']] ?? null; $list['list'][$index] = $item; } // 记录浏览素材列表 if (!empty($this->user_id)) { $card = BusinessCard::getOne([ ['mall_id' => $this->mall_id], ['user_id' => $this->user_id], ['status' => StatusEnum::ENABLED], ]); if (empty($card) || $card->id != $this->card_id) { Statistics::handler(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'item_id' => !empty($this->card_id) ? $this->card_id : -1, 'log_type' => CardEnums::LOG_TYPE_MATEREAL]); // if (!empty($this->card_id)) { // // 微信推送 // $card = BusinessCard::getOne([ // ['mall_id' => $this->mall_id], // ['user_id' => $this->parent_id], // ['status' => StatusEnum::ENABLED], // ]); // WechatNotice::handler(['to_user_id' => $card->user_id, 'user_id' => $this->user_id, // 'mall_id' => $this->mall_id, 'log_type' => CardEnums::LOG_TYPE_MATEREAL_DETAIL]); // } } } return $this->success('素材列表', $list); } } // 素材详情 public function actionMaterialDetail() { $request = Yii::$app->request; if ($request->isPost) { $params = $request->post(); $get = $request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['id', 'share_type'], 'integer'], ]); if($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $detail = BusinessCardMaterials::getOne([ ['=', 'mall_id', $this->mall_id], ['=', 'id', $params['id']], ['=', 'status', StatusEnum::ENABLED] ], true, '', '', 'user_id,title,intro,cover_img,ext_type,share_title,share_desc,material_link,material_cont' ); if ($detail) { $detail['ext_type_name'] = CardEnums::getMaterialExtType($detail['ext_type']); } $params['share_type'] = !empty($params['share_type']) ? $params['share_type'] : ($get['share_type'] ?? 0); if (!empty($params['share_type']) && $this->user_id != $this->parent_id) { // 分享素材 WechatNotice::handler(['to_user_id' => $this->parent_id, 'user_id' => $this->user_id, 'mall_id' => $this->mall_id, 'log_type' => CardEnums::LOG_TYPE_MATEREAL_DETAIL]); } return $this->success('素材详情', $detail); } } // 素材统计 public function actionMaterialStatistics() { $request = Yii::$app->request; if($this->user_id<0 || !$this->user_id){ return false; } if ($request->isPost) { $params = $request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['start_time', 'end_time', 'material_id', 'pid', 'unikey'], 'safe'], ]); if($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); if ($params['end_time'] <= $params['start_time']) { return $this->error('时间错误'); } if (!$params['material_id']) { return $this->error('素材ID缺失'); } $view_seconds = floor($params['end_time'] - $params['start_time']); $unikey = $params['unikey'] ?? ''; $is_marked = BusinessCardMaterialsBrowseLog::isMarked($this->mall_id, $this->user_id, $params['material_id'], $unikey); if ($is_marked) { $view_material = $view_numbers = $view_times = 0; $log_view_times = 0; } else { // 用户是否已看过改素材 $is_readed = BusinessCardMaterialsBrowseLog::isReaded($this->mall_id, $this->user_id, $params['material_id']); $view_material = $view_numbers = $is_readed ? 0 : 1; $view_times = 1; $log_view_times = $is_readed ? $is_readed['view_times'] + 1 : 1; } $share_user_id = intval($params['pid']) > 0 ? (int) $params['pid'] : 0; $share_user_type = 1; if (empty($share_user_id)) { // 如果没有PID那么就取当前用户上级 // 取上级 $share_user_id = User::find()->where(['id' => $this->user_id])->select('parent_id')->scalar(); if (!empty($share_user_id)) $share_user_type = 2; } $trans = Yii::$app->db->beginTransaction(); try { // 用户统计 $browse = [ 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'view_material' => $view_material, 'view_times' => $view_times, 'view_seconds' => $view_seconds, 'recent_time' => time(), 'status' => StatusEnum::ENABLED ]; $res = BusinessCardMaterialsBrowse::setData($browse); if ($res == false) { throw new Exception(BusinessCardMaterialsBrowse::getStaticError()); } $browse_log = [ 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'material_id' => $params['material_id'], 'share_user_id' => $share_user_id, 'share_user_type' => $share_user_type, 'view_seconds' => $view_seconds, 'unikey' => $unikey, 'status' => StatusEnum::ENABLED ]; if ($is_marked) { $browse_log['id'] = $is_marked['id']; } else { $browse_log['view_times'] = $log_view_times; } // 用户浏览记录 $card_id = $this->card_id; if (!empty($params['pid']) && $params['pid'] != $this->user_id) { $card_id = BusinessCard::find()->where(['mall_id' => $this->mall_id]) ->andWhere(['user_id' => $params['pid']])->select('id')->scalar(); } $log_res = BusinessCardMaterialsBrowseLog::setData($browse_log, $card_id); if ($log_res == false) { throw new Exception(BusinessCardMaterialsBrowseLog::getStaticError()); } // 素材统计 $res = BusinessCardMaterialsStatistics::setData([ 'mall_id' => $this->mall_id, 'material_id' => $params['material_id'], 'view_seconds' => $view_seconds, 'view_numbers' => $view_numbers, 'view_times' => $view_times, 'share_times' => 0, 'status' => StatusEnum::ENABLED ]); if ($res == false) { throw new Exception(BusinessCardMaterialsStatistics::getStaticError()); } $trans->commit(); } catch (Exception $e) { $trans->rollBack(); return $this->error($e->getMessage()); } return $this->success('已阅', []); } } // 统计分享次数 public function actionShareStatistics() { $request = Yii::$app->request; if ($request->isPost) { $params = $request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['material_id'], 'safe'], ]); if($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); if ($params['material_id'] <= 0) { return $this->error('素材ID不能为空'); } $trans = Yii::$app->db->beginTransaction(); try { // 素材统计增加一次分享记录 $res = BusinessCardMaterialsStatistics::setData([ 'mall_id' => $this->mall_id, 'material_id' => $params['material_id'], 'view_seconds' => 0, 'view_numbers' => 0, 'view_times' => 0, 'share_times' => 1, 'status' => StatusEnum::ENABLED ]); if ($res == false) { throw new Exception(BusinessCardMaterialsStatistics::getStaticError()); } // 增加一条用户分享记录统计 $res = BusinessCardMaterialsShare::setData([ 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'material_id' => $params['material_id'], 'share_times' => 1, 'recent_time' => time(), 'status' => StatusEnum::ENABLED ]); if ($res == false) { throw new Exception(BusinessCardMaterialsStatistics::getStaticError()); } $trans->commit(); } catch (Exception $e) { $trans->rollBack(); return $this->error($e->getMessage()); } return $this->success('分享成功', []); } } }