DefaultController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <?php
  2. namespace addons\Pk\api\modules\v1\controllers;
  3. use addons\Pk\common\enums\PkEnum;
  4. use addons\Pk\common\models\PkActivityStatistic;
  5. use addons\Pk\common\models\PkActivity;
  6. use addons\Pk\common\models\PkInviteLog;
  7. use addons\Pk\common\models\PkOrder;
  8. use addons\Pk\common\models\PkPerformanceLog;
  9. use addons\Pk\common\models\PkPersonalMember;
  10. use addons\Pk\common\models\PkShareLog;
  11. use addons\Pk\common\models\PkShareVisitLog;
  12. use addons\QiJuhe\common\enums\OrderEnum;
  13. use common\enums\StatusEnum;
  14. use common\models\user\User;
  15. use Yii;
  16. use api\controllers\OnAuthController;
  17. use yii\base\Exception;
  18. /**
  19. * 默认控制器
  20. *
  21. * Class DefaultController
  22. * @package addons\Pk\api\modules\v1\controllers
  23. */
  24. class DefaultController extends OnAuthController
  25. {
  26. public $modelClass = '';
  27. /**
  28. * 不用进行登录验证的方法
  29. *
  30. * 例如: ['index', 'update', 'create', 'view', 'delete']
  31. * 默认全部需要验证
  32. *
  33. * @var array
  34. */
  35. protected $authOptional = ['index', 'pk-order-callback', 'count-visit-log'];
  36. /**
  37. * 个人PK排行
  38. *
  39. * @return string
  40. */
  41. public function actionIndex()
  42. {
  43. if (\Yii::$app->request->isGet) {
  44. $get_active = PkActivity::getCurrentPkActivity($this->mall_id);
  45. $get_active['activity_apply_status'] = PkActivity::getPersonalActivityApplyStatus($get_active['id'], $this->user_id, $this->mall_id);
  46. $data['activity'] = $get_active;
  47. $performance_type = $get_active['performance_type'] ?? 1;
  48. $new_where[] = ['=','status',StatusEnum::ENABLED];
  49. $new_where[] = ['=','mall_id',$this->mall_id];
  50. $new_where[] = ['=','activity_id',$get_active['id'] ?? 0];
  51. $new_where[] = $performance_type == PkEnum::NEW_ACTIVE ? ['>', 'new_user_num', 0] : ['>', 'order_money_num', 0];
  52. $params['where'] = $new_where;
  53. $params['order'] = $performance_type == PkEnum::NEW_ACTIVE ? 'new_user_num desc,id asc' : 'order_money_num desc,id asc';
  54. $params['with'] = 'user';
  55. $params['limit'] = Yii::$app->request->get('limit', 10);
  56. $list = PkActivityStatistic::listPage($params,false,true);
  57. unset($list['sql']);
  58. $data['pk_list'] = $list;
  59. $config = \Yii::$app->services->setting->addons->get($this->mall_id, PkEnum::ADDONS_NAME, 'basic');
  60. $data['bj_images'] = $config['bg_img'];
  61. $data['is_enable'] = $config['is_enable'];//活动未开始
  62. return $this->success('操作成功',$data);
  63. }
  64. }
  65. /**
  66. * 个人参加PK
  67. */
  68. public function actionPersonJoin()
  69. {
  70. $activity_id = \Yii::$app->request->post('activity_id', 0);
  71. $performance_goal = \Yii::$app->request->post('performance_goal', 0);
  72. return $this->success('操作成功', compact('activity_id', 'performance_goal'));
  73. }
  74. /**
  75. * 获取个人活动详情
  76. */
  77. public function actionDetailPersonActivity()
  78. {
  79. if (\Yii::$app->request->isGet) {
  80. $params = Yii::$app->request->get();
  81. // 检查提交的参数
  82. $res = Yii::$app->services->validate->validate($params, [
  83. [['activity_id'], 'integer'],
  84. ]);
  85. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  86. }
  87. $data = PkActivity::getOne([['mall_id'=>$this->mall_id,'id'=>$params['activity_id']]],true);
  88. if (!$data) {
  89. return $this->success("成功", null);
  90. }
  91. $data['prize'] = json_decode($data['prize'], true);
  92. $data['activity_apply_status'] = PkActivity::getPersonalActivityApplyStatus($data['id'], $this->user_id, $this->mall_id);
  93. return $this->success("成功", $data);
  94. }
  95. /**
  96. * 获取PK规则
  97. */
  98. public function actionGetRules()
  99. {
  100. $data = \Yii::$app->services->setting->addons->get($this->mall_id, PkEnum::ADDONS_NAME, 'basic');
  101. return $this->success('成功', $data['person']);
  102. }
  103. /**
  104. * 拉新明细 | 业绩明细
  105. */
  106. public function actionInviteList()
  107. {
  108. if (\Yii::$app->request->isGet) {
  109. $params = Yii::$app->request->get();
  110. // 检查提交的参数
  111. $res = Yii::$app->services->validate->validate($params, [
  112. [['activity_id', 'page', 'limit'], 'integer'],
  113. ]);
  114. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  115. $activity = PkActivity::getOne([['id'=> $params['activity_id']]],true);
  116. $number = PkActivityStatistic::getOne([['activity_id'=> $params['activity_id'],'user_id'=>$this->user_id]],true);
  117. $log_where[] = ['=','share_user_id',$this->user_id];
  118. $log_where[] = ['=','mall_id',$this->mall_id];
  119. $log_where[] = ['=','activity_id',$params['activity_id']];
  120. $with = 'user';
  121. if($activity['performance_type'] == PkEnum::NEW_ACTIVE){//拉新
  122. $pk_num = (float) $number['new_user_num'];
  123. $where_stitic[] = ['>','new_user_num',$number['new_user_num']];
  124. //获取列表
  125. $list = PkInviteLog::listPage(array('where' => $log_where,'with'=>$with, 'limit' => $params['limit']),false,true);
  126. }else{
  127. $pk_num = (float) $number['order_money_num'];
  128. $where_stitic[] = ['>','order_money_num',$number['order_money_num']];
  129. $list = PkPerformanceLog::listPage(array('where' => $log_where,'with'=>$with, 'limit' => $params['limit']),false,true);
  130. }
  131. $where_stitic[] = ['=','activity_id',$params['activity_id']];
  132. $where_stitic[] = ['=','mall_id',$this->mall_id];
  133. $rank = PkActivityStatistic::getOne($where_stitic,true,'','','count(id) as num');
  134. if($pk_num > 0){
  135. if($rank['num'] == 0){
  136. $rank['num'] = 1;
  137. }
  138. }else{
  139. $rank['num'] = '';
  140. }
  141. $data['rank'] = $rank;
  142. $data['number'] = $number;
  143. $data['activity'] = $activity;
  144. $data['list'] = $list;
  145. $data['share_user'] = User::getOne([['id'=>$this->user_id]],true,'','','id,mobile,nickname,avatar_url,parent_id,username');
  146. $this->success('成功', $data);
  147. }
  148. }
  149. /**
  150. * 加入PK操作
  151. */
  152. public function actionPersonPkJoin()
  153. {
  154. if (\Yii::$app->request->isPost) {
  155. $params = Yii::$app->request->post();
  156. // 检查提交的参数
  157. $res = Yii::$app->services->validate->validate($params,[
  158. [['activity_id','performance_type','performance_goal'], 'integer'],
  159. ]);
  160. if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  161. $is_join = PkActivityStatistic::findOne([
  162. 'activity_id' => $params['activity_id'],
  163. 'user_id' => $this->user_id,
  164. 'mall_id' => $this->mall_id,
  165. 'status' => PkEnum::IS_ENABLE
  166. ]);
  167. if ($is_join) {
  168. return $this->error('您已参与该活动');
  169. }
  170. if ($params['performance_goal'] <= 0) {
  171. return $this->error('我的目标必须为非负数');
  172. }
  173. $activity = PkActivity::getOne([['id'=>$params['activity_id']]],false);
  174. if (!$activity || $activity->is_enable !=1) {
  175. return $this->error('活动不存在或已结束或者暂停');
  176. }
  177. if (!in_array($activity->status, [PkEnum::STATUS_STARTED, PkEnum::STATUS_NOT_START])) {
  178. return $this->error("个人活动状态只有在未开始或进行中才可以加入", [], 1001);
  179. }
  180. if ($activity->people_max_amount != PkEnum::PEOPLE_NUM_NO_LIMIT) {
  181. if ($activity->member_num >= $activity->people_max_amount && $activity->performance_type == 1) {
  182. return $this->error("超出活动人数上限", [], 1003);
  183. }
  184. }
  185. if (strtotime($activity->begin_time) > time()) {
  186. return $this->error("活动未开始", [], 1004);
  187. }
  188. if (!PkActivity::isLegalApplyTime($activity) || strtotime($activity->end_time) <= time()) {
  189. return $this->error("已到禁止报名PK活动时间", [], 1005);
  190. }
  191. $where = [
  192. ['user_id' => $this->user_id],
  193. ['mall_id' => $this->mall_id],
  194. ['activity_id' => $params['activity_id']],
  195. ['=', 'status', StatusEnum::ENABLED]
  196. ];
  197. $is_personal_member = PkActivityStatistic::getOne($where, true);
  198. if ($is_personal_member) {
  199. return $this->error("已经加入了该活动", [], 1004);
  200. }
  201. $data = [];
  202. $add_data['mall_id'] = $this->mall_id;
  203. $add_data['is_pay'] = PkEnum::IS_NOT_PAY;
  204. $add_data['order_no'] = PkOrder::getOrderNo();
  205. $add_data['user_id'] = $this->user_id;
  206. $add_data['activity_id'] = $activity->id;
  207. $add_data['status'] = StatusEnum::ENABLED;
  208. $add_data['money'] = $activity['price'];
  209. $add_data['order_type'] = PkEnum::ORDER_TYPE_PERSON;
  210. $add_data['pay_type'] = "";
  211. $add_data['performance_goal'] = $params['performance_goal'];
  212. $add_order = PkOrder::setData($add_data);
  213. $data['trade'] = $add_order;
  214. $data['money'] = $activity['price'];
  215. if ($add_order === false) return $this->error(PkOrder::getStaticError());
  216. return $this->success("成功", $data);
  217. }
  218. }
  219. // 统计分享次数
  220. public function actionCountShareLog()
  221. {
  222. $request = Yii::$app->request;
  223. if ($request->isPost) {
  224. $activity_id = $request->post('activity_id', 0);
  225. $share_desc = $request->post('share_desc', '');
  226. $share_url = $request->post('share_url', '');
  227. $check = Yii::$app->services->validate->validate($params,[
  228. [['activity_id'], 'integer'],
  229. [['share_desc', 'share_url'], 'string'],
  230. ]);
  231. if($check === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  232. $tran = Yii::$app->db->beginTransaction();
  233. try {
  234. PkShareLog::addShareNum($this->mall_id, $activity_id, $this->user_id, $share_url, $share_desc);
  235. $tran->commit();
  236. } catch (\Exception $e) {
  237. $tran->rollBack();
  238. return $this->success("fail", []);
  239. }
  240. }
  241. return $this->success("success", []);
  242. }
  243. // 统计访问次数
  244. public function actionCountVisitLog()
  245. {
  246. $request = Yii::$app->request;
  247. if ($request->isPost) {
  248. $activity_id = $request->post('activity_id', 0);
  249. $share_user_id = (int) $request->post('pid', '');
  250. $visit_url = $request->post('visit_url', '');
  251. $user_id = (int) $this->user_id ?? 0;
  252. $check = Yii::$app->services->validate->validate($params,[
  253. [['activity_id', 'pid'], 'integer'],
  254. [['visit_url'], 'string'],
  255. ]);
  256. if($check === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  257. $tran = Yii::$app->db->beginTransaction();
  258. try {
  259. PkShareVisitLog::addVisitNum($this->mall_id, $activity_id, $share_user_id, $user_id, $visit_url);
  260. $tran->commit();
  261. } catch (\Exception $e) {
  262. $tran->rollBack();
  263. return $this->success("fail: " . $e->getMessage(), []);
  264. }
  265. }
  266. return $this->success("success", []);
  267. }
  268. }