BindForm.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\client\models\v1;
  8. use app\models\AccountLog;
  9. use app\models\Option;
  10. // use app\models\Register;
  11. use app\models\Share;
  12. use app\models\User;
  13. use app\models\UserBindLog;
  14. use app\models\UserGrowthValueLog;
  15. use app\models\UserShareLog;
  16. use yii\base\Model;
  17. use yii\helpers\Json;
  18. use app\models\SaasUser;
  19. use app\models\Store;
  20. use app\models\ShareHolder;
  21. use app\models\ShareHolderParentOutLog;
  22. use app\utils\Notice\NoticeSend;
  23. class BindForm extends Model
  24. {
  25. public $store_id;
  26. public $user_id;
  27. public $parent_id;
  28. public $condition;
  29. public $page_type;
  30. public $old_parent_id;
  31. public $isLogin;
  32. public $isNew = 0; // 是否新注册
  33. public function rules()
  34. {
  35. return [
  36. [['parent_id', 'user_id', 'store_id', 'condition', 'old_parent_id', 'isLogin', 'isNew'], 'integer'],
  37. [['page_type'], 'safe'],
  38. ];
  39. }
  40. /**
  41. * 平台Saas用户绑定上下级关系
  42. */
  43. public function saasSave()
  44. {
  45. $user = User::findOne(['id' => $this->user_id, 'is_delete' => 0]);
  46. $parent = User::findOne(['id' => $this->parent_id, 'is_delete' => 0]);
  47. if (!$user || !$parent) {
  48. \Yii::error('saasuser用户未找到1');
  49. return [
  50. 'code' => 1,
  51. 'msg' => '用户未找到',
  52. ];
  53. }
  54. if (empty($user->binding) || empty($parent->binding)) {
  55. // 手机号不存在,直接返回,一般不会出现此情况
  56. \Yii::error('saasuser用户未找到2');
  57. return [
  58. 'code' => 1,
  59. 'msg' => '用户未找到',
  60. ];
  61. }
  62. if ($user->binding == $parent->binding) {
  63. \Yii::error('saasuser不能绑定自己为上级');
  64. return [
  65. 'code' => 1,
  66. 'msg' => '不能绑定自己为上级',
  67. ];
  68. }
  69. // 查找对应的平台id
  70. $saasUser = SaasUser::find()
  71. ->where(['mobile' => $user->binding, 'is_delete' => SaasUser::DELETE_STATUS_FALSE])
  72. ->one();
  73. $parentSaasUser = SaasUser::find()
  74. ->where(['mobile' => $parent->binding, 'is_delete' => SaasUser::DELETE_STATUS_FALSE])
  75. ->one();
  76. if (!$saasUser || !$parentSaasUser) {
  77. \Yii::error('saasuser用户未找到3');
  78. return [
  79. 'code' => 1,
  80. 'msg' => '用户未找到',
  81. ];
  82. }
  83. if ($saasUser->parent_id > 0) {
  84. // 已经绑定过父级
  85. \Yii::error('saasuser用户存在父级');
  86. return [
  87. 'code' => 1,
  88. 'msg' => '用户存在父级',
  89. ];
  90. }
  91. // 如果父级id比当前用户小,说明该用户早就注册,也不绑定
  92. // if ($parentSaasUser->id < $saasUser->id) {
  93. // \Yii::error('saasuser父级id比用户id大');
  94. // return [
  95. // 'code' => 1,
  96. // 'msg' => '父级id比用户id大',
  97. // ];
  98. // }
  99. //判断父级id是否在三级分销链中
  100. // \Yii::error($saasUser->id . ' => ' . $parentSaasUser->id);
  101. $res = self::saasCheck($saasUser->id, $parentSaasUser->id, 0);
  102. if ($res['code'] == 1) {
  103. \Yii::error('saasuser父级id是否在三级分销链中');
  104. return [
  105. 'code' => 1,
  106. 'msg' => '父级id是否在三级分销链中'
  107. ];
  108. }
  109. if ($parentSaasUser->parent_id == $saasUser->id) {
  110. return [
  111. 'code' => 1,
  112. 'msg' => '绑定失败, 不能绑定自己的下级',
  113. ];
  114. }
  115. $saasUser->parent_id = $parentSaasUser->id;
  116. if ($saasUser->save()) {
  117. \Yii::error('saasuser绑定成功');
  118. return [
  119. 'code' => 0,
  120. 'msg' => '绑定成功'
  121. ];
  122. } else {
  123. \Yii::error('saasuser绑定失败');
  124. return [
  125. 'code' => 0,
  126. 'msg' => '绑定失败'
  127. ];
  128. }
  129. }
  130. // 绑定商城之间上下级
  131. public function storeSave()
  132. {
  133. $user = User::findOne(['id' => $this->user_id, 'is_delete' => 0]);
  134. $parent = User::findOne(['id' => $this->parent_id, 'is_delete' => 0]);
  135. if (!$user || !$parent) {
  136. \Yii::error('saasStore用户未找到1');
  137. return [
  138. 'code' => 1,
  139. 'msg' => '用户未找到',
  140. ];
  141. }
  142. if (empty($user->binding) || empty($parent->binding)) {
  143. // 手机号不存在,直接返回,一般不会出现此情况
  144. \Yii::error('saasStore用户未找到2');
  145. return [
  146. 'code' => 1,
  147. 'msg' => '用户未找到',
  148. ];
  149. }
  150. // 查找对应的平台id
  151. $saasUser = SaasUser::find()
  152. ->where(['mobile' => $user->binding, 'is_delete' => SaasUser::DELETE_STATUS_FALSE])
  153. ->one();
  154. $parentSaasUser = SaasUser::find()
  155. ->where(['mobile' => $parent->binding, 'is_delete' => SaasUser::DELETE_STATUS_FALSE])
  156. ->one();
  157. if (!$saasUser || !$parentSaasUser) {
  158. \Yii::error('saasStore用户未找到3');
  159. return [
  160. 'code' => 1,
  161. 'msg' => '用户未找到',
  162. ];
  163. }
  164. // 如果两个store_id相同,就跳过
  165. if ($saasUser->store_id == $parentSaasUser->store_id) {
  166. \Yii::error('saasStore不能绑定自己为上级商城');
  167. return [
  168. 'code' => 1,
  169. 'msg' => '不能绑定自己为上级商城',
  170. ];
  171. }
  172. $store = Store::findOne(['id' => $saasUser->store_id, 'is_delete' => 0]);
  173. $parentStore = Store::findOne(['id' => $parentSaasUser->store_id, 'is_delete' => 0]);
  174. if (!$store || !$parentStore) {
  175. \Yii::error('saasStore商城不存在');
  176. return [
  177. 'code' => 1,
  178. 'msg' => '商城不存在',
  179. ];
  180. }
  181. if ($store->parent_id > 0) {
  182. \Yii::error('saasStore商城已经存在父级');
  183. return [
  184. 'code' => 1,
  185. 'msg' => '商城已经存在父级',
  186. ];
  187. }
  188. $res = self::storeCheck($store->id, $parentStore->id, 0);
  189. if ($res['code'] == 1) {
  190. \Yii::error('saasstore父级id是否在三级分销链中');
  191. return [
  192. 'code' => 1,
  193. 'msg' => '父级id是否在三级分销链中'
  194. ];
  195. }
  196. $store->parent_id = $parentStore->id;
  197. if ($store->save()) {
  198. \Yii::error('saasStore绑定成功');
  199. return [
  200. 'code' => 0,
  201. 'msg' => '绑定成功'
  202. ];
  203. } else {
  204. \Yii::error('saasStore绑定失败');
  205. return [
  206. 'code' => 0,
  207. 'msg' => '绑定失败'
  208. ];
  209. }
  210. }
  211. // 绑定分享人上下级
  212. public function shareSave() {
  213. $user = User::findOne(['id' => $this->user_id, 'is_delete' => 0]);
  214. $parent = User::findOne(['id' => $this->parent_id, 'is_delete' => 0]);
  215. if (!$user || !$parent) {
  216. return [
  217. 'code' => 1,
  218. 'msg' => '用户未找到',
  219. ];
  220. }
  221. $model = new UserShareLog();
  222. $model->user_id = $this->user_id;
  223. $model->parent_id = $this->parent_id;
  224. $model->created_at = time();
  225. if($model->save()) {
  226. return [
  227. 'code' => 0,
  228. 'msg' => '绑定成功'
  229. ];
  230. }
  231. return [
  232. 'code' => 0,
  233. 'msg' => '绑定失败'
  234. ];
  235. }
  236. //临时绑定
  237. public function temporarySave(){
  238. $user = User::findOne(['id' => $this->user_id, 'is_delete' => 0]);
  239. $parent = User::findOne(['id' => $this->parent_id, 'is_delete' => 0]);
  240. if (!$user || !$parent) {
  241. return [
  242. 'code' => 1,
  243. 'msg' => '用户未找到',
  244. ];
  245. }
  246. $model = new UserBindLog();
  247. $model->user_id = $this->user_id;
  248. $model->parent_id = $this->parent_id;
  249. $model->bind_time = time();
  250. if($model->save()) {
  251. return [
  252. 'code' => 0,
  253. 'msg' => '绑定成功'
  254. ];
  255. }
  256. return [
  257. 'code' => 0,
  258. 'msg' => '绑定失败'
  259. ];
  260. }
  261. /**
  262. * @return array
  263. * 绑定上下级关系
  264. */
  265. public function save()
  266. {
  267. try {
  268. $this->storeSave(); // 绑定商城之间上下级
  269. $this->saasSave(); // 绑定平台用户上下级
  270. $this->shareSave(); // 获取分享绑定的上下级
  271. $this->temporarySave();//临时绑定上下级
  272. } catch (\Exception $e) {
  273. // Todo
  274. }
  275. $store_id = $this->store_id ? $this->store_id : get_store_id();
  276. $setting = Option::get('share_basic_setting', $store_id);
  277. $setting = $setting ? Json::decode($setting['value']) : [];
  278. //店铺未开启分销
  279. // 暂不做判断
  280. // if (!empty($setting) && $setting['level']['value'] == 0) {
  281. // \Yii::warning('未开启分销');
  282. // return [
  283. // 'code' => 1,
  284. // 'msg' => '未开启分销'
  285. // ];
  286. // }
  287. // 成为下线条件 0--首次点击分享链接 1--首次下单 2--首次付款
  288. //找出不满足当前行为成为下级的条件但是 可能会成为上级的用户
  289. if (!$this->isLogin && !empty($setting) && $setting['condition']['value'] !== $this->condition) {
  290. $user = User::findOne(['id' => $this->user_id, 'is_delete' => 0]);
  291. if ($user && !$user->parent_id > 0) {
  292. $user->parent_user_id = $this->parent_id;
  293. $user->save();
  294. }
  295. \Yii::warning('未满足成为下线条件');
  296. return [
  297. 'code' => 0,
  298. 'msg' => '未满足成为下线条件'
  299. ];
  300. }
  301. // 条件为首次点击,并且是新用户的情况下才可以绑定
  302. if ($setting['condition']['value'] == 0 && $this->isNew == 0) {
  303. return [
  304. 'code' => 0,
  305. 'msg' => '不是新用户'
  306. ];
  307. }
  308. //自身分享的页面
  309. if ($this->user_id == $this->parent_id) {
  310. \Yii::warning('自身分销的页面');
  311. return [
  312. 'code' => 0,
  313. 'msg' => '自身分销的页面'
  314. ];
  315. }
  316. //父级id是否是分销商
  317. $exit = Share::find()->andWhere(['user_id' => $this->parent_id, 'store_id' => $this->store_id, 'is_delete' => 0,
  318. 'status' => 1])->exists();
  319. $share_exit = ShareHolder::find()->andWhere(['user_id' => $this->parent_id, 'store_id' => $this->store_id, 'is_delete' => 0])->exists();
  320. if (!$exit && !$share_exit) {
  321. \Yii::warning('不是分销商');
  322. return [
  323. 'code' => 0,
  324. 'msg' => '不是分销商'
  325. ];
  326. }
  327. //判断父级id是否在三级分销链中
  328. $res = self::check($this->user_id, $this->parent_id, 0);
  329. if ($res['code'] == 1) {
  330. \Yii::warning('父级id不存在三级分销链中');
  331. return [
  332. 'code' => 0,
  333. 'msg' => '父级id是否在三级分销链中'
  334. ];
  335. }
  336. $user = User::findOne(['id' => $this->user_id, 'is_delete' => 0]);
  337. $parent = User::findOne(['id' => $this->parent_id, 'is_delete' => 0]);
  338. // if ($parent->is_distributor != 1) {
  339. // \Yii::warning('父级不是分销商');
  340. // return [
  341. // 'code' => 1,
  342. // 'msg' => '父级不是分销商'
  343. // ];
  344. // }
  345. //用户是否是分销商
  346. // if ($user->is_distributor == 1) {
  347. // \Yii::warning('用户是分销商');
  348. // return [
  349. // 'code' => 0,
  350. // 'msg' => '用户是分销商'
  351. // ];
  352. // }
  353. //用户是否存在父级
  354. if ($user->parent_id != 0 || $user->old_parent_id != 0) {
  355. //当不存在父级时可以继续绑定
  356. if($parent){
  357. \Yii::warning('用户存在父级');
  358. return [
  359. 'code' => 0,
  360. 'msg' => '用户存在父级'
  361. ];
  362. }
  363. }
  364. $parentChange = 0;
  365. $beforeParentId = $user->parent_id;
  366. if($user->parent_id != $this->parent_id){
  367. $parentChange = 1;
  368. }
  369. $oldParentChange = 0;
  370. $beforeOldParentId = $user->old_parent_id;
  371. if($user->old_parent_id != $this->parent_id){
  372. $oldParentChange = 1;
  373. }
  374. $user->parent_id = $this->parent_id;
  375. $user->old_parent_id = $this->parent_id;
  376. if ($user->save()) {
  377. if($user->old_parent_id > 0) {
  378. NoticeSend::registerTellParent($parent->binding, $user->nickname);
  379. }
  380. $desc = ShareHolderParentOutLog::getConditionName($this->condition) . ShareHolderParentOutLog::getPageTypeName($this->page_type);
  381. $oldParentChange && \app\utils\Share\BonusPool::addShareHolderParentOutLog($user, $beforeOldParentId, $desc, 1);
  382. $parentChange && \app\utils\Share\BonusPool::addShareHolderParentOutLog($user, $beforeParentId, $desc);
  383. // 推荐送积分
  384. if ($setting['d_rec_member_integral']['value'] > 0) {
  385. //$user = User::findOne($user->id);
  386. //TODO 重复增加了积分数据
  387. // $user->integral += $setting['d_rec_member_integral']['value'];
  388. $user->save();
  389. AccountLog::saveLog($user->id,$setting['d_rec_member_integral']['value'],1,1,0,
  390. 0,'被推荐会员赠送积分');
  391. }
  392. if ($setting['rec_member_integral']['value'] > 0) {
  393. $parent_info = User::findOne($this->parent_id);
  394. //TODO 重复增加了积分数据
  395. // $parent_info->integral += $setting['rec_member_integral']['value'];
  396. $parent_info->save();
  397. // $register_print = new Register();
  398. AccountLog::saveLog($parent_info->id, $setting['rec_member_integral']['value'],1,1,
  399. 0,0,'推荐会员赠送积分');
  400. // $register_print->save();
  401. }
  402. // 是推荐的新用户注册的
  403. $optionSetting = Option::get('growth_setting',$this->store_id,'level','')['value'];
  404. $optionSetting = json_decode($optionSetting, true);
  405. if($this->isNew == 1 && ($optionSetting && $optionSetting['share_give'] > 0)){
  406. $amount = $optionSetting['share_give'];
  407. UserGrowthValueLog::setLog($this->store_id,$this->parent_id,UserGrowthValueLog::LOG_TYPE_ADD,$amount,UserGrowthValueLog::TYPE_SHARE,"推荐注册{$amount}成长值");
  408. }
  409. return [
  410. 'code' => 0,
  411. 'msg' => '成功',
  412. 'data' => $parent->nickname
  413. ];
  414. } else {
  415. return [
  416. 'code' => 1,
  417. 'msg' => '网络异常'
  418. ];
  419. }
  420. }
  421. public static function check($user_id, $parent_id, $root = 0)
  422. {
  423. if ($root == 3) {
  424. return [
  425. 'code' => 0,
  426. 'msg' => '可以绑定'
  427. ];
  428. }
  429. if ($parent_id == 0) {
  430. return [
  431. 'code' => 0,
  432. 'msg' => '可以绑定'
  433. ];
  434. }
  435. $user = User::findOne(['id' => $parent_id, 'is_delete' => 0]);
  436. if (!$user) {
  437. return [
  438. 'code' => 1,
  439. 'msg' => '不能'
  440. ];
  441. }
  442. if ($user_id == $user->parent_id) {
  443. return [
  444. 'code' => 1,
  445. 'msg' => '不能'
  446. ];
  447. }
  448. return self::check($user_id, $user->parent_id, $root + 1);
  449. }
  450. public static function saasCheck($user_id, $parent_id, $root = 0)
  451. {
  452. if ($root == 3) {
  453. return [
  454. 'code' => 0,
  455. 'msg' => '可以绑定'
  456. ];
  457. }
  458. if ($parent_id == 0) {
  459. return [
  460. 'code' => 0,
  461. 'msg' => '可以绑定'
  462. ];
  463. }
  464. $user = SaasUser::findOne(['id' => $parent_id, 'is_delete' => 0]);
  465. if ($user_id == $user->parent_id) {
  466. return [
  467. 'code' => 1,
  468. 'msg' => '不能'
  469. ];
  470. }
  471. return self::saasCheck($user_id, $user->parent_id, $root + 1);
  472. }
  473. public static function storeCheck($store_id, $parent_id, $root = 0)
  474. {
  475. if ($root == 3) {
  476. return [
  477. 'code' => 0,
  478. 'msg' => '可以绑定'
  479. ];
  480. }
  481. if ($parent_id == 0) {
  482. return [
  483. 'code' => 0,
  484. 'msg' => '可以绑定'
  485. ];
  486. }
  487. $store = Store::findOne(['id' => $parent_id, 'is_delete' => 0]);
  488. if ($store_id == $store->parent_id) {
  489. return [
  490. 'code' => 1,
  491. 'msg' => '不能'
  492. ];
  493. }
  494. return self::saasCheck($store_id, $store->parent_id, $root + 1);
  495. }
  496. }