DefaultController.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. <?php
  2. namespace addons\DoubleCopy\api\modules\v1\controllers;
  3. use addons\DoubleCopy\common\enums\DoubleCopyEnum;
  4. use addons\DoubleCopy\common\models\DoubleCopyCommission;
  5. use addons\DoubleCopy\common\models\DoubleCopyLevel;
  6. use addons\DoubleCopy\common\models\DoubleCopyLevelSetting;
  7. use addons\DoubleCopy\common\models\DoubleCopyUser;
  8. use common\enums\StatusEnum;
  9. use common\helpers\ArrayHelper;
  10. use common\models\common\CapitalLog;
  11. use common\models\mall\MallAddons;
  12. use common\models\statistics\UserTeamStatistics;
  13. use common\models\user\User;
  14. use common\models\user\UserPartitionRelationship;
  15. use Yii;
  16. use api\controllers\OnAuthController;
  17. use common\enums\AddonsEnum;
  18. use common\models\common\Addons;
  19. use common\models\goods\Goods;
  20. use yii\helpers\Json;
  21. /**
  22. * 默认控制器
  23. *
  24. * Class DefaultController
  25. * @package addons\DoubleCopy\api\modules\v1\controllers
  26. */
  27. class DefaultController extends OnAuthController
  28. {
  29. public $modelClass = '';
  30. /**
  31. * 不用进行登录验证的方法
  32. *
  33. * 例如: ['index', 'update', 'create', 'view', 'delete']
  34. * 默认全部需要验证
  35. *
  36. * @var array
  37. */
  38. protected $authOptional = ['index','upgrade-goods-list','get-user'];
  39. /**
  40. * 首页
  41. *
  42. * @return string
  43. */
  44. public function actionIndex()
  45. {
  46. return 'Hello world';
  47. }
  48. /**
  49. * 链动用户信息
  50. * @Author: lun
  51. * @DateTime: 2022/5/16 0016 16:48
  52. * @Copyright: copyright (c) 2021 广东七件事集团
  53. * @return mixed|void
  54. */
  55. public function actionInfo()
  56. {
  57. if (Yii::$app->request->isPost) {
  58. $data['user_id'] = $this->user_id;
  59. $data['nickname'] = $this->user->nickname ?? '';
  60. $data['avatar_url'] = $this->user->avatar_url ?? '';
  61. $addons = Addons::findOne(['name' => AddonsEnum::ADDONS_NAME_DOUBLE_COPY]);
  62. $addons_title = $addons ? $addons->title : '二二复制';
  63. $data['addons_title'] = $addons_title;
  64. // 查询用户信息
  65. $select = 'user_id,level,commission,frozen_commission,frozen_fund,is_thaw,thaw_percent';
  66. $user = DoubleCopyUser::find()->select($select)->where(['user_id' => $this->user_id])->asArray()->one();
  67. if (empty($user)) return $this->error('您并无参与该应用活动', compact('addons_title'));
  68. // 获取为结算佣金
  69. CapitalLog::$capitalType = 'commission_frozen';
  70. $frozen_commission = CapitalLog::find()->where(['user_id' => $this->user_id, 'from_type' => DoubleCopyEnum::ADDONS_NAME, 'status' => StatusEnum::DISABLED])->sum("change_num");
  71. if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_DOUBLE_COPY_COMMITMENT_AWARD)) {
  72. $frozen_commission = CapitalLog::find()->where([
  73. 'user_id' => $this->user_id,
  74. 'from_type' => [
  75. 'or',
  76. DoubleCopyEnum::ADDONS_NAME,
  77. AddonsEnum::ADDONS_NAME_DOUBLE_COPY_COMMITMENT_AWARD
  78. ],
  79. 'status' => StatusEnum::DISABLED
  80. ])->sum("change_num");
  81. }
  82. // 头部数据
  83. $data['level'] = $user['level'];// 用户等级
  84. $data['commission'] = $user['commission'];// 已结算佣金
  85. $data['frozen_commission'] = $frozen_commission ?: 0;// 未结算佣金
  86. $data['frozen_fund'] = $user['frozen_fund'];// 冻结基金
  87. $data['is_thaw'] = $user['is_thaw'];// 是否已达标[0:否,1:是]
  88. $data['is_show_target'] = $user['level'] == DoubleCopyEnum::LEVEL_AGENT ? 0 : 1;// 是否显示已达标[0:否,1:是]
  89. // 获取等级名称
  90. $level_arr = DoubleCopyLevel::find()->where(['mall_id' => $this->mall_id,'status' => StatusEnum::ENABLED])->indexBy('level')->asArray()->all();
  91. $data['level_name'] = $level_arr[$user['level']]['name'] ?: '默认等级';// 等级名称
  92. $data['open_ladder'] = $level_arr[$user['level']]['open_ladder'] ?? 0;
  93. // 获取资金分类
  94. $capital_arr = DoubleCopyEnum::getApiCapitalMap($this->mall_id);
  95. //需要安装二二复制贡献补贴奖插件
  96. if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_DOUBLE_COPY_COMMITMENT_AWARD)) {
  97. $is_enable = Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_DOUBLE_COPY_COMMITMENT_AWARD, 'basic.is_enable');
  98. if (!empty($is_enable)) {
  99. $capital_arr['capital_type'][] = [
  100. 'name' => 'contribution_price',
  101. 'title' => '贡献补贴奖',
  102. ];
  103. }
  104. }
  105. $data['capital_type'] = $capital_arr['capital_type'];
  106. $data['freeze_fund_name'] = $capital_arr['freeze_fund_name'] ?? '冻结基金';
  107. $agent_name = $level_arr[DoubleCopyEnum::LEVEL_AGENT]['name'];// 代理等级名称
  108. $boss_name = $level_arr[DoubleCopyEnum::LEVEL_BOSS]['name'];// 老板等级名称
  109. // 解冻条件
  110. $checked_condition_values = Json::decode($level_arr[DoubleCopyEnum::LEVEL_BOSS]['checked_condition_values'], true);
  111. $help_num = $checked_condition_values[0]['value']['val0'] ?? 0;// 缺多少个升级
  112. $help_num = intval($help_num);
  113. $level = DoubleCopyLevelSetting::find()->select("freeze_fund_prize,freeze_fund_num,is_thaw,first_level,push_num,second_level")->where(['mall_id' => $this->mall_id, 'level' => DoubleCopyEnum::LEVEL_BOSS, 'status' => StatusEnum::ENABLED])->asArray()->one();
  114. $text = "团队收益冻结".floatval($level['freeze_fund_prize'])."%,助力升级{$help_num}个{$agent_name}成为{$boss_name}并且团队{$agent_name}达到{$level['freeze_fund_num']}个";
  115. $user_level = DoubleCopyLevelSetting::find()->select("freeze_fund_prize,freeze_fund_num,is_thaw,first_level,push_num,second_level")->where(['mall_id' => $this->mall_id, 'level' => $user['level'], 'status' => StatusEnum::ENABLED])->asArray()->one();
  116. // 检查达标数据
  117. $title = '';
  118. $thaw_num = $help_count = 0;
  119. $extra = [
  120. 'is_thaw' => false,
  121. 'first_num' => false,
  122. 'second_num' => false,
  123. 'count' => 0,
  124. 'title' => '',
  125. 'text' => '1号,2号晋升大于等于'.$level_arr[$user_level['first_level']]['name'].',并且直接推荐了'.$user_level['push_num'].'个大于等于'.$level_arr[$user_level['second_level']]['name'].'即可解冻全部',
  126. ];
  127. if ($user['level'] > DoubleCopyEnum::LEVEL_AGENT) {
  128. $thaw_num = DoubleCopyLevelSetting::find()->select('freeze_fund_num')->where(['mall_id' => $this->mall_id, 'level' => $user['level'], 'status' => StatusEnum::ENABLED])->scalar();
  129. if ($thaw_num) {
  130. $thaw_data = DoubleCopyUser::getForzenUser($this->user_id, $thaw_num);
  131. if ($thaw_data['has_data']) {
  132. $title = '差'.$thaw_data['boss_num'].'个'.$boss_name.'差'.$thaw_data['agent_num'].'个'.$agent_name.'解冻';
  133. $help_count = $thaw_data['help_count'];
  134. } else {
  135. $title = '差'.$help_num.'个'.$boss_name.'差'.$level['freeze_fund_num'].'个'.$agent_name.'解冻';
  136. }
  137. }
  138. //是否勾选额外解冻资金条件
  139. if ($level['is_thaw'] == 1) {
  140. $extra['is_thaw'] = true;
  141. //获取直推用户数据
  142. $children_info = DoubleCopyUser::lists([
  143. 'where' => [
  144. ['mall_id' => $this->mall_id],
  145. ['pid' => $this->user_id],
  146. ['status' => StatusEnum::ENABLED],
  147. // ['>=', 'level', $level['first_level']],
  148. // ['pos' => [1,2]]
  149. ],
  150. 'select' => 'id,pos,status,level',
  151. ]);
  152. foreach ($children_info as $ck => $cv) {
  153. switch ($cv['pos']) {//判断一二号位是否符合达标
  154. case 1:
  155. if ($cv['level'] >= $user_level['first_level']) $extra['first_num'] = true;
  156. break;
  157. case 2:
  158. if ($cv['level'] >= $user_level['first_level']) $extra['second_num'] = true;
  159. break;
  160. }
  161. //累计直推符合条件人数
  162. if ($cv['level'] >= $user_level['second_level']) {
  163. $extra['count'] += 1;
  164. }
  165. }
  166. $num = $user_level['push_num'] - $extra['count'];
  167. if ($num < 0) $num = 0;
  168. $extra['count'] = $num;
  169. $extra['title'] = '还需数量'.$num.'个';
  170. }
  171. }
  172. // 基础配置
  173. $config = Yii::$app->services->setting->addons->get($this->mall_id, DoubleCopyEnum::ADDONS_NAME, 'basic');
  174. $data['is_send_second'] = empty($config['is_send_second']) ? 1 : $config['is_send_second'];// 是否显示平台补贴1=显示,2=隐藏
  175. $data['show_achievement'] = $config['show_achievement'] ?? 0;// 是否显示业绩0=不显示,1=显示
  176. $data['pool_name'] = $config['pool_name'] ?? '分红池';// 分红池名称设置
  177. // 获取1、2市场业绩
  178. $market = DoubleCopyUser::find()->select('pos,achievement')->where(['pid' => $this->user_id, 'status' => StatusEnum::ENABLED])->andWhere(['<=','pos',2])->indexBy('pos')->asArray()->all();
  179. $data['market1'] = $market[1]['achievement'] ?? 0;// 第一市场业绩
  180. $data['market2'] = $market[2]['achievement'] ?? 0;// 第二市场业绩
  181. if (!empty($level_arr[$user['level']]['open_ladder']) && $level_arr[$user['level']]['ladder_setting']) {
  182. $ladder_setting = ArrayHelper::arraySort(json_decode($level_arr[$user['level']]['ladder_setting'], true), 'thaw_percent', 'desc');
  183. foreach ($ladder_setting as $item) {
  184. if ($user['thaw_percent'] >= $item['thaw_percent']) {
  185. $thaw_show_contents = $item['show_contents'];
  186. break;
  187. }
  188. }
  189. }
  190. $data['thaw_show_contents'] = $thaw_show_contents ?? '';// 显示的内容
  191. $total_num = $thaw_num + $help_num;
  192. $data['frozen_info'] = [
  193. 'count' => $help_count,// 已助力总数
  194. 'freeze_fund_num' => $total_num,// 需解冻数量
  195. 'explain' => $text,// 说明
  196. 'title' => $title,
  197. 'extra' => $extra,
  198. ];
  199. //冻结资金清零时间是否显示
  200. $data['frozen_fund_clear_time_show'] = $config['frozen_fund_clear_time_show'] ?? 0;
  201. $data['frozen_fund_clear_time'] = '';
  202. if($data['frozen_fund_clear_time_show'] == 1){
  203. $frozen_fund_clear_date = $config['frozen_fund_clear_date'] ?? 0;
  204. $frozen_fund_clear_time = $config['frozen_fund_clear_time'] ?? '';
  205. if($frozen_fund_clear_date && $frozen_fund_clear_time){
  206. $data['frozen_fund_clear_time'] = '每月'.$frozen_fund_clear_date.'日'.$frozen_fund_clear_time;
  207. }
  208. }
  209. return $this->success('获取成功', $data);
  210. }
  211. }
  212. /**
  213. * 获取分佣列表
  214. * @Author: lun
  215. * @DateTime: 2022/5/16 0016 17:09
  216. * @Copyright: copyright (c) 2021 广东七件事集团
  217. * @return mixed|void
  218. */
  219. public function actionCommission()
  220. {
  221. if (Yii::$app->request->isGet) {
  222. $post = Yii::$app->request->get();
  223. // 检查提交的参数
  224. $res = Yii::$app->services->validate->validate($post,[
  225. [['page','limit'], 'integer'],
  226. [['capital_type'], 'required'],
  227. [['capital_type'], 'string'],
  228. ]);
  229. if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  230. // 查询推荐内容
  231. $where[] = ['=', 'mall_id', $this->mall_id];
  232. $where[] = ['=', 'user_id', $this->user_id];
  233. $where[] = ['=', 'capital_type', $post['capital_type']];
  234. $where[] = ['=', 'status', StatusEnum::ENABLED];
  235. $order = 'id desc,created_at desc';
  236. $select = 'user_id,buy_uid,goods_name,pic_url,price,order_no,money,capital_type,settlement_type,created_at,reward_currency';
  237. $with = ['buyuser'];
  238. $params = array('where' => $where, 'order' => $order, 'select' => $select, 'with' => $with);
  239. $list = DoubleCopyCommission::listPage($params);
  240. $configs = Yii::$app->services->setting->addons->get($this->mall_id, DoubleCopyEnum::ADDONS_NAME, 'basic');
  241. $is_hidden_mobile = $configs['is_hidden_mobile'] ?? 0;
  242. // 根据配置是否隐藏手机号
  243. $is_hidden_mobile && $list['list'] = array_map(function ($item) {
  244. $mobile = $item['buyuser']['mobile'] ?? '';
  245. $item['buyuser']['mobile'] = substr_replace($mobile, '****', 3, 4);
  246. return $item;
  247. }, $list['list']);
  248. $score_name = \Yii::$app->services->setting->mall->get($this->mall_id, 'score.score_name') ?? '积分';
  249. $money_msg = [
  250. 'commission' => '元',
  251. 'score' => $score_name
  252. ];
  253. foreach($list['list'] as $key => $value){
  254. $value['money_msg'] = $money_msg[$value['reward_currency']] ?? '元';
  255. $list['list'][$key] = $value;
  256. }
  257. return $this->success('获取成功', $list);
  258. }
  259. }
  260. /**
  261. * 我的客户
  262. * @Author: lun
  263. * @DateTime: 2022/5/16 0016 17:42
  264. * @Copyright: copyright (c) 2021 广东七件事集团
  265. */
  266. public function actionMyClient(){
  267. if (Yii::$app->request->isPost) {
  268. $post = Yii::$app->request->post();
  269. // 检查提交的参数
  270. $res = Yii::$app->services->validate->validate($post,[
  271. [['page','limit'], 'integer'],
  272. [['deep'], 'integer'],
  273. [['deep'], 'default', 'value' => 1],
  274. ]);
  275. if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  276. // 获取用户信息
  277. $user = [];
  278. if ($this->user->parent_id) {
  279. $user = User::find()->where(['id' => $this->user->parent_id])->asArray()->one();
  280. // 获取用户等级
  281. $dcuser = DoubleCopyUser::find()->select('level')->where(['user_id' => $user['id'], 'status' => StatusEnum::ENABLED])->asArray()->one();
  282. // 获取等级名称
  283. $level_name = DoubleCopyLevel::getLevelNameByLevel($this->mall_id, $dcuser['level']);
  284. }
  285. $data['user_id'] = !empty($user['id']) ? $user['id'] : 0;
  286. $data['nickname'] = !empty($user['nickname']) ? $user['nickname'] : '平台';
  287. $data['avatar_url'] = !empty($user['avatar_url']) ? $user['avatar_url'] : '';
  288. $data['level_name'] = !empty($level_name) ? $level_name : '-';
  289. $list = [];
  290. // 获取关系链用户
  291. list($tree, $parent_deep) = UserPartitionRelationship::getTree($this->user_id);
  292. $where[] = ['deep' => $post['deep'] + $parent_deep];
  293. $select = 'user_id';
  294. $limit = empty($post['limit']) ? 11 : $post['limit'] + 1;
  295. $relation = DoubleCopyUser::batchGetTeamData($post['page'], $limit, $tree, compact('where', 'select'));
  296. if (!empty($relation)) {
  297. $user_ids = array_slice(array_column($relation, 'user_id'), 0 , $limit - 1);// 获取用户id
  298. // 是否隐藏手机号码
  299. $configs = Yii::$app->services->setting->addons->get($this->mall_id, DoubleCopyEnum::ADDONS_NAME, 'basic');
  300. $is_hidden_mobile = $configs['is_hidden_mobile'] ?? 0;
  301. // 根据用户id批量获取用户信息
  302. $users = User::find()->select("id,nickname,mobile,avatar_url")->where(['id' => $user_ids])->indexBy('id')->asArray()->all();
  303. // 根据配置是否隐藏手机号
  304. $is_hidden_mobile && $users = array_map(function ($user) {
  305. $user['mobile'] = substr_replace($user['mobile'], '****', 3, 4);
  306. return $user;
  307. }, $users);
  308. // 获取用户等级
  309. $dcuser = DoubleCopyUser::find()->select('user_id,level')->where(['user_id' => $user_ids, 'status' => StatusEnum::ENABLED])->indexBy('user_id')->asArray()->all();
  310. // 获取等级
  311. $level = DoubleCopyLevel::getLevelMap($this->mall_id, 2);
  312. // 获取推荐用户数据
  313. $team = UserTeamStatistics::find()->select('user_id,user_direct_total,user_indirect_total')->where(['user_id' => $user_ids, 'status' => StatusEnum::ENABLED])->indexBy('user_id')->asArray()->all();
  314. foreach ($user_ids as $uid) {
  315. $list[] = [
  316. 'user' => $users[$uid],
  317. 'level_name' => empty($dcuser[$uid]) ? '-' : $level[$dcuser[$uid]['level']],// 等级名称
  318. 'direct_num' => $team[$uid]['user_direct_total'] ?: 0,// 我的客户
  319. 'indirect_num' => $team[$uid]['user_indirect_total'] ?: 0,// 我的粉丝
  320. ];
  321. }
  322. }
  323. $data['list'] = $list;
  324. $data['page'] = $post['page'];
  325. $data['page_count'] = count($relation) > ($limit - 1) ? $post['page'] + 1 : $post['page'];
  326. return $this->success('获取成功', $data);
  327. }
  328. }
  329. /**
  330. * 等级权益
  331. * @Author: lun
  332. * @DateTime: 2022/5/16 0016 17:35
  333. * @Copyright: copyright (c) 2021 广东七件事集团
  334. */
  335. public function actionRights()
  336. {
  337. if (Yii::$app->request->isGet) {
  338. // 获取用户信息
  339. $data = $this->getUserInfo($this->mall_id, $this->user);
  340. // 获取等级
  341. $where[] = ['=', 'mall_id', $this->mall_id];
  342. $where[] = ['=', 'status', StatusEnum::ENABLED];
  343. $order = 'level asc';
  344. $select = 'level,name,explain';
  345. $params = compact('where','order','select');
  346. $list = DoubleCopyLevel::lists($params);
  347. $data['list'] = $list;
  348. $this->success('获取成功', $data);
  349. }
  350. }
  351. /**
  352. * 获取用户基本信息
  353. * @Author: lun
  354. * @DateTime: 2022/5/16 0016 17:49
  355. * @Copyright: copyright (c) 2021 广东七件事集团
  356. * @param $mall_id
  357. * @param $user
  358. * @return mixed
  359. */
  360. private function getUserInfo($mall_id, $user)
  361. {
  362. $data['user_id'] = $user->id ?: 0;
  363. $data['nickname'] = $user->nickname ?: '平台';
  364. $data['avatar_url'] = $user->avatar_url ?: '';
  365. $data['parent_id'] = $user->parent_id ?: 0;
  366. if (!empty($user->id)) {
  367. // 获取用户等级
  368. $dcuser = DoubleCopyUser::find()->select('level')->where(['user_id' => $user->id])->asArray()->one();
  369. // 获取等级名称
  370. $level_name = DoubleCopyLevel::getLevelNameByLevel($mall_id, $dcuser['level']);
  371. }
  372. $data['level_name'] = $level_name ?: '默认等级';// 等级名称
  373. return $data;
  374. }
  375. public function actionUpgradeGoodsList(){
  376. $params = \Yii::$app->request->get();
  377. $res = \Yii::$app->services->validate->validate($params, [
  378. [['limit', 'page','keyword'], 'safe']
  379. ]);
  380. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  381. $where[] = ['g.mall_id' => $this->mall_id];
  382. $where[] = ['g.status' => [StatusEnum::ENABLED]];
  383. $where[] = ['g.is_on_sale' => 1];
  384. $where[] = ['g.is_show' => 1];
  385. if (isset($params['keyword'])) {
  386. $where[] = ['like', 'g.goods_name', trim($params['keyword'])];
  387. }
  388. $goods_ids = [];
  389. $level_list = DoubleCopyLevel::lists(['where'=>[['mall_id'=>$this->mall_id],['status'=>StatusEnum::ENABLED],['is_auto_upgrade'=>1],['upgrade_type_goods'=>1]]]);
  390. if(!empty($level_list)){
  391. foreach($level_list as $level){
  392. $goods_list = json_decode($level['goods_list'], true);
  393. if(!empty($goods_list)){
  394. $goods_ids = array_column($goods_list,'id');
  395. }
  396. }
  397. }
  398. $where[] = ['g.id'=>$goods_ids];
  399. $params['where'] = $where;
  400. $params['alias'] = 'g';
  401. $params['select'] = 'g.id,g.goods_name,g.cover_pic,g.price,g.original_price';
  402. $goods_list = Goods::listPage($params);
  403. return $this->success('操作成功', $goods_list);
  404. }
  405. /**
  406. * 获取用户
  407. * @Author: lun
  408. * @DateTime: 2022/5/16 0016 17:49
  409. * @Copyright: copyright (c) 2021 广东七件事集团
  410. * @param $mall_id
  411. * @param $user
  412. * @return mixed
  413. */
  414. public function actionGetUser()
  415. {
  416. // 基础配置
  417. $config = Yii::$app->services->setting->addons->get($this->mall_id, DoubleCopyEnum::ADDONS_NAME, 'basic');
  418. $data['is_enable_login'] = $config['is_enable_login'] ?? 0;
  419. $data['is_dcuser'] = 0;
  420. if(!empty($data['is_enable_login']) && !empty($this->user_id)){
  421. $dcuser = DoubleCopyUser::find()->where(['user_id' => $this->user_id])->select('id')->one();
  422. if(!empty($dcuser)){
  423. $data['is_dcuser'] = 1;
  424. }
  425. }
  426. return $this->success('操作成功', $data);
  427. }
  428. }