BindForm.php 15 KB

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