| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- <?php
- namespace addons\BusinessCard\api\modules\v1\controllers;
- use addons\BusinessCard\common\logic\Statistics;
- use addons\BusinessCard\common\logic\WechatNotice;
- use addons\BusinessCard\common\models\BusinessCard;
- use addons\BusinessCard\common\models\BusinessCardMaterials;
- use addons\BusinessCard\common\models\BusinessCardMaterialsBrowse;
- use addons\BusinessCard\common\models\BusinessCardMaterialsBrowseLog;
- use addons\BusinessCard\common\models\BusinessCardMaterialsCate;
- use addons\BusinessCard\common\models\BusinessCardMaterialsShare;
- use addons\BusinessCard\common\models\BusinessCardMaterialsStatistics;
- use common\enums\StatusEnum;
- use addons\BusinessCard\common\enums\CardEnums;
- use api\controllers\OnAuthController;
- use common\models\mall\MallAddons;
- use common\models\user\User;
- use common\models\user\UserPartitionRelationship;
- use Yii;
- use Exception;
- use yii\helpers\Json;
- class MaterialController extends OnAuthController
- {
- public $modelClass = '';
- public $card = '';
- protected $authOptional = ['material-tabs', 'material-list','material-statistics'];
- // 素材tabs
- public function actionMaterialTabs()
- {
- $request = Yii::$app->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('分享成功', []);
- }
- }
- }
|