Fenxiao.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\fenxiao\model;
  11. use addon\fenxiao\model\Config as ConfigModel;
  12. use app\model\BaseModel;
  13. use app\model\member\Member;
  14. use app\model\order\OrderCommon;
  15. use app\model\system\Stat;
  16. /**
  17. * 分销
  18. */
  19. class Fenxiao extends BaseModel
  20. {
  21. public $fenxiao_status_zh = [
  22. 1 => '正常',
  23. -1 => '冻结',
  24. ];
  25. /**
  26. * 添加分销商
  27. * @param $data
  28. * @return mixed
  29. */
  30. public function addFenxiao($data)
  31. {
  32. $fenxiao_info = model('fenxiao')->getInfo(
  33. [ [ 'member_id', '=', $data[ 'member_id' ] ], [ 'is_delete', '=', 0 ] ],
  34. 'fenxiao_id'
  35. );
  36. if (!empty($fenxiao_info)) return $this->error('', '已经是分销商了');
  37. $data[ 'fenxiao_no' ] = date('YmdHi') . rand(1000, 9999);
  38. $data[ 'create_time' ] = time();
  39. $data[ 'audit_time' ] = time();
  40. model('fenxiao')->startTrans();
  41. try {
  42. if (!empty($data[ 'parent' ])) {
  43. //添加上级分销商一级下线人数
  44. model('fenxiao')->setInc([ [ 'fenxiao_id', '=', $data[ 'parent' ] ], [ 'is_delete', '=', 0 ] ], 'one_child_fenxiao_num');
  45. //获取上上级分销商id
  46. $grand_parent_id = model('fenxiao')->getInfo([ [ 'fenxiao_id', '=', $data[ 'parent' ] ], [ 'is_delete', '=', 0 ] ], 'parent');
  47. if (!empty($grand_parent_id) && $grand_parent_id[ 'parent' ] != 0) {
  48. //添加上上级分销商二级下线人数
  49. model('fenxiao')->setInc([ [ 'fenxiao_id', '=', $grand_parent_id[ 'parent' ] ] ], 'two_child_fenxiao_num');
  50. $data[ 'grand_parent' ] = $grand_parent_id[ 'parent' ];
  51. }
  52. // 分销商检测升级
  53. event('FenxiaoUpgrade', $data[ 'parent' ]);
  54. }
  55. $res = model('fenxiao')->add($data);
  56. //修改会员信息
  57. model('member')->update([ 'fenxiao_id' => $res, 'is_fenxiao' => 1 ], [ [ 'member_id', '=', $data[ 'member_id' ] ] ]);
  58. $stat_model = new Stat();
  59. $stat_model->switchStat([ 'type' => 'add_fenxiao_member', 'data' => [ 'site_id' => $data[ 'site_id' ] ] ]);
  60. model('fenxiao')->commit();
  61. return $this->success($res);
  62. } catch (\Exception $e) {
  63. model('fenxiao')->rollback();
  64. return $this->error('', $e->getMessage());
  65. }
  66. }
  67. /**
  68. * 冻结
  69. * @param $fenxiao_id
  70. * @return array
  71. */
  72. public function frozen($fenxiao_id)
  73. {
  74. $data = [
  75. 'status' => -1,
  76. 'lock_time' => time()
  77. ];
  78. $res = model('fenxiao')->update($data, [ [ 'fenxiao_id', '=', $fenxiao_id ] ]);
  79. return $this->success($res);
  80. }
  81. /**
  82. * 解冻
  83. * @param $fenxiao_id
  84. * @return array
  85. */
  86. public function unfrozen($fenxiao_id)
  87. {
  88. $data = [
  89. 'status' => 1,
  90. 'lock_time' => time()
  91. ];
  92. $res = model('fenxiao')->update($data, [ [ 'fenxiao_id', '=', $fenxiao_id ] ]);
  93. return $this->success($res);
  94. }
  95. /**
  96. * 获取分销商详细信息
  97. * @param array $condition
  98. * @param string $field
  99. * @return array
  100. */
  101. public function getFenxiaoInfo($condition = [], $field = '*')
  102. {
  103. $condition[] = [ 'is_delete', '=', 0 ];
  104. $res = model('fenxiao')->getInfo($condition, $field);
  105. return $this->success($res);
  106. }
  107. /**
  108. * 获取分销商详细信息
  109. * @param array $condition
  110. * @param string $field
  111. * @return array
  112. */
  113. public function getFenxiaoDetailInfo($condition = [])
  114. {
  115. $condition[] = [ 'f.is_delete', '=', 0 ];
  116. $field = 'f.*,pf.fenxiao_name as parent_name,nm.username,nm.nickname,nm.headimg,nm.order_num,nm.order_money,fl.level_num';
  117. $alias = 'f';
  118. $join = [
  119. [
  120. 'fenxiao pf',
  121. 'pf.fenxiao_id = f.parent',
  122. 'left'
  123. ],
  124. [
  125. 'member nm',
  126. 'nm.member_id = f.member_id',
  127. 'left'
  128. ],
  129. [
  130. 'fenxiao_level fl',
  131. 'f.level_id = fl.level_id',
  132. 'left'
  133. ]
  134. ];
  135. $res = model('fenxiao')->getInfo($condition, $field, $alias, $join);
  136. return $this->success($res);
  137. }
  138. /**
  139. * 获取分销列表
  140. * @param array $condition
  141. * @param string $field
  142. * @param string $order
  143. * @param string $limit
  144. */
  145. public function getFenxiaoList($condition = [], $field = '*', $order = '', $limit = null)
  146. {
  147. $condition[] = [ 'is_delete', '=', 0 ];
  148. $list = model('fenxiao')->getList($condition, $field, $order, '', '', '', $limit);
  149. return $this->success($list);
  150. }
  151. /**
  152. * 获取分销分页列表
  153. * @param array $condition
  154. * @param number $page
  155. * @param string $page_size
  156. * @param string $order
  157. * @param string $field
  158. */
  159. public function getFenxiaoPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '')
  160. {
  161. $condition[] = [ 'f.is_delete', '=', 0 ];
  162. $field = 'f.*,pf.fenxiao_name as parent_name,m.username,m.nickname,m.mobile as member_mobile,m.headimg';
  163. $alias = 'f';
  164. $join = [
  165. [
  166. 'fenxiao pf',
  167. 'pf.fenxiao_id = f.parent',
  168. 'left'
  169. ],
  170. [
  171. 'member m',
  172. 'm.member_id = f.member_id',
  173. 'left'
  174. ]
  175. ];
  176. $list = model('fenxiao')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
  177. if (!empty($list[ 'list' ])) {
  178. foreach ($list[ 'list' ] as $k => $v) {
  179. $team_num = $this->getFenxiaoTeamNum($v[ 'fenxiao_id' ], $v[ 'site_id' ]);
  180. $list[ 'list' ][ $k ][ 'team_num' ] = $team_num[ 'data' ][ 'num' ];
  181. // if (empty($v['username'])) $list['list'][$k]['username'] = '--';
  182. // if (empty($v['nickname'])) $list['list'][$k]['nickname'] = '--';
  183. // if (empty($v['member_mobile'])) $list['list'][$k]['member_mobile'] = '--';
  184. }
  185. }
  186. return $this->success($list);
  187. }
  188. /**
  189. * 获取分销分页列表2
  190. * @param array $condition
  191. * @param int $page
  192. * @param int $page_size
  193. * @param string $order
  194. * @param string $field
  195. * @return array
  196. */
  197. public function getFenxiaoPageLists($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*', $alias = 'a', $join = null)
  198. {
  199. $list = model('fenxiao')->pageList($condition, $field, $order, $page, $page_size, $alias, $join, '');
  200. return $this->success($list);
  201. }
  202. /**
  203. * 获取分销商团队
  204. * @param $level
  205. * @param $fenxiao_id
  206. * @param int $page
  207. * @param int $page_size
  208. * @param int $is_pay
  209. * @return array
  210. */
  211. public function getFenxiaoTeam($level, $fenxiao_id, $page = 1, $page_size = PAGE_LIST_ROWS, $is_pay = 0)
  212. {
  213. $condition = '';
  214. // 下级分销商id集合
  215. $one_level_fenxiao = model('fenxiao')->getColumn([ [ 'parent', '=', $fenxiao_id ] ], 'fenxiao_id');
  216. switch ( $level ) {
  217. // 一级分销
  218. case 1:
  219. // 直属会员 + 直属下级分销商
  220. $or = " OR (f.parent = {$fenxiao_id}) ";
  221. $condition = "( (m.fenxiao_id = {$fenxiao_id} AND m.is_fenxiao = 0) " . $or . ") AND m.is_delete = 0";
  222. break;
  223. // 二级分销
  224. case 2:
  225. // 直属下级分销商的下级分销商 + 直属下级分销商的会员
  226. if (!empty($one_level_fenxiao)) {
  227. $or = " OR (f.parent in (" . implode($one_level_fenxiao) . ") ) ";
  228. $condition = "( (m.is_fenxiao = 0 AND m.fenxiao_id in (" . implode(',', $one_level_fenxiao) . ") )" . $or . ") AND m.is_delete = 0";
  229. }
  230. break;
  231. }
  232. if (empty($condition)) return $this->success([
  233. 'page_count' => 1,
  234. 'count' => 0,
  235. 'list' => []
  236. ]);
  237. if ($is_pay) $condition .= ' AND m.order_num > 0';
  238. $condition .= '';
  239. $field = 'm.member_id,m.nickname,m.headimg,m.is_fenxiao,m.reg_time,m.order_money,m.order_complete_money,m.order_num,m.order_complete_num,m.bind_fenxiao_time,f.fenxiao_id,f.fenxiao_no,f.fenxiao_name,f.audit_time,f.level_name,f.one_child_num,f.one_child_fenxiao_num';
  240. $alias = 'm';
  241. $join = [
  242. [ 'fenxiao f', 'm.member_id = f.member_id', 'left' ]
  243. ];
  244. $list = model('member')->pageList($condition, $field, 'm.bind_fenxiao_time desc', $page, $page_size, $alias, $join);
  245. return $this->success($list);
  246. }
  247. /**
  248. * 查询我的团队的数量
  249. * @param unknown $fenxiao_id
  250. * @return array
  251. */
  252. public function getFenxiaoTeamNum($fenxiao_id, $site_id)
  253. {
  254. // 查询分销基础配置
  255. $config_model = new Config();
  256. $fenxiao_basic_config = $config_model->getFenxiaoBasicsConfig($site_id)[ 'data' ][ 'value' ];
  257. $level = $fenxiao_basic_config[ 'level' ];
  258. $num = model('member')->getCount([ [ 'fenxiao_id', '=', $fenxiao_id ], [ 'is_fenxiao', '=', 0 ], [ 'is_delete', '=', 0 ] ]);
  259. // 下级分销商id集合
  260. $one_level_fenxiao = model('fenxiao')->getColumn([ [ 'parent', '=', $fenxiao_id ], [ 'is_delete', '=', 0 ] ], 'fenxiao_id');
  261. $return = [
  262. 'num' => $num, // 总人数
  263. 'member_num' => $num, // 会员人数
  264. 'fenxiao_num' => 0 // 分销商人数
  265. ];
  266. switch ( $level ) {
  267. case 1:
  268. $return[ 'num' ] += count($one_level_fenxiao);
  269. $return[ 'fenxiao_num' ] += count($one_level_fenxiao);
  270. break;
  271. case 2:
  272. if (!empty($one_level_fenxiao)) {
  273. $return[ 'num' ] += count($one_level_fenxiao);
  274. $return[ 'fenxiao_num' ] += count($one_level_fenxiao);
  275. $num = model('member')->getCount([ [ 'fenxiao_id', 'in', $one_level_fenxiao ], [ 'is_fenxiao', '=', 0 ], [ 'is_delete', '=', 0 ] ]);
  276. $return[ 'num' ] += $num;
  277. $return[ 'member_num' ] += $num;
  278. $num = model('fenxiao')->getCount([ [ 'parent', 'in', $one_level_fenxiao ], [ 'is_delete', '=', 0 ] ], 'fenxiao_id');
  279. $return[ 'num' ] += $num;
  280. $return[ 'fenxiao_num' ] += $num;
  281. }
  282. break;
  283. }
  284. return $this->success($return);
  285. }
  286. /**
  287. * 会员注册之后
  288. * @param unknown $member_id
  289. */
  290. public function memberRegister($member_id, $site_id)
  291. {
  292. //如果有推荐人则要修改分享关系
  293. $member_model = new Member();
  294. $member_info = $member_model->getMemberInfo([ [ 'member_id', '=', $member_id ] ], 'source_member')[ 'data' ];
  295. if (!empty($member_info[ 'source_member' ])) {
  296. $member_model->alterShareRelation($member_id, $member_info[ 'source_member' ], $site_id);
  297. }
  298. $this->autoBecomeFenxiao($member_id, $site_id);
  299. }
  300. /**
  301. * 自动成为分销商
  302. * @param unknown $member_id
  303. */
  304. public function autoBecomeFenxiao($member_id, $site_id)
  305. {
  306. $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ], [ 'site_id', '=', $site_id ], [ 'is_delete', '=', 0 ] ], 'order_num,order_complete_num,order_money,order_complete_money,is_fenxiao');
  307. if (empty($member_info)) return $this->error('', '未查询到会员信息');
  308. $fenxiao_info = $this->getFenxiaoDetailInfo([ [ 'f.member_id', '=', $member_id ] ])[ 'data' ];
  309. if (!empty($fenxiao_info) && $member_info[ 'is_fenxiao' ]) return $this->error('', '已经是分销商');
  310. try {
  311. $config = new Config();
  312. // 分销商基础设置
  313. $basics_config = $config->getFenxiaoBasicsConfig($site_id);
  314. $basics_config = $basics_config[ 'data' ][ 'value' ];
  315. if (!$basics_config[ 'level' ]) return $this->error('', '未开启分销');
  316. if ($basics_config[ 'is_apply' ] != 0) return $this->error('', '成为分销商需进行申请');
  317. // 成为分销商的资格
  318. $fenxiao_config = $config->getFenxiaoConfig($site_id);
  319. $fenxiao_config = $fenxiao_config[ 'data' ][ 'value' ];
  320. switch ( $fenxiao_config[ 'fenxiao_condition' ] ) {
  321. case 2:
  322. // 消费次数
  323. if ($fenxiao_config[ 'consume_condition' ] == 1 && $member_info[ 'order_num' ] < $fenxiao_config[ 'consume_count' ]) return $this->error('', '未满足成为分销商的条件');
  324. if ($fenxiao_config[ 'consume_condition' ] == 2 && $member_info[ 'order_complete_num' ] < $fenxiao_config[ 'consume_count' ]) return $this->error('', '未满足成为分销商的条件');
  325. break;
  326. case 3:
  327. // 消费金额
  328. if ($fenxiao_config[ 'consume_condition' ] == 1 && bccomp($member_info[ 'order_money' ], $fenxiao_config[ 'consume_money' ], 2) == -1) return $this->error('', '未满足成为分销商的条件');
  329. if ($fenxiao_config[ 'consume_condition' ] == 2 && bccomp($member_info[ 'order_complete_money' ], $fenxiao_config[ 'consume_money' ], 2) == -1) return $this->error('', '未满足成为分销商的条件');
  330. break;
  331. case 4:
  332. // 购买指定商品
  333. $condition = [
  334. [ 'goods_id', 'in', $fenxiao_config[ 'goods_ids' ] ],
  335. ];
  336. if ($fenxiao_config[ 'consume_condition' ] == 1) $condition[] = [ 'pay_status', '=', 1 ];
  337. if ($fenxiao_config[ 'consume_condition' ] == 2) $condition[] = [ 'order_status', '=', OrderCommon::ORDER_COMPLETE ];
  338. $count = model('order_goods')->getCount($condition, 'order_goods_id', 'og', [ [ 'order o', 'o.order_id = og.order_id', 'inner' ] ]);
  339. if (!$count) return $this->error('', '未满足成为分销商的条件');
  340. break;
  341. }
  342. return $this->directlyBecomeFenxiao($member_id);
  343. } catch (\Exception $e) {
  344. return $this->error();
  345. }
  346. }
  347. /**
  348. * 会员直接成为分销商
  349. */
  350. private function directlyBecomeFenxiao($member_id)
  351. {
  352. //获取用户信息
  353. $member_field = 'member_id,site_id,source_member,fenxiao_id,nickname,headimg,mobile,reg_time,order_money,order_complete_money,order_num,order_complete_num';
  354. $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ] ], $member_field);
  355. if (!empty($member_info)) {
  356. $parent = 0;
  357. if (!empty($member_info[ 'source_member' ])) {
  358. $fenxiao_info = model('fenxiao')->getInfo([ [ 'member_id', '=', $member_info[ 'source_member' ] ], [ 'is_delete', '=', 0 ] ], 'fenxiao_id');
  359. if (!empty($fenxiao_info)) $parent = $fenxiao_info[ 'fenxiao_id' ];
  360. }
  361. if(!empty($member_info[ 'fenxiao_id' ])){
  362. $fenxiao_info = model('fenxiao')->getInfo([ [ 'member_id', '=', $member_info[ 'source_member' ] ], [ 'is_delete', '=', 0 ] ], 'fenxiao_id');
  363. if (!empty($fenxiao_info)) $parent = $fenxiao_info[ 'fenxiao_id' ];
  364. }
  365. //获取分销等级信息
  366. $level_model = new FenxiaoLevel();
  367. $level_info = $level_model->getLevelInfo([ [ 'site_id', '=', $member_info[ 'site_id' ] ], [ 'is_default', '=', 1 ] ], 'level_id,level_name');
  368. $data = [
  369. 'site_id' => $member_info[ 'site_id' ],
  370. 'fenxiao_name' => $member_info[ 'nickname' ],
  371. 'mobile' => $member_info[ 'mobile' ],
  372. 'member_id' => $member_info[ 'member_id' ],
  373. 'parent' => $parent,
  374. 'level_id' => $level_info[ 'data' ][ 'level_id' ],
  375. 'level_name' => $level_info[ 'data' ][ 'level_name' ]
  376. ];
  377. $res = $this->addFenxiao($data);
  378. return $res;
  379. }
  380. }
  381. /**
  382. * 绑定上下线关系
  383. * TODO 订单创建对返回结果进行检测 不可返回失败
  384. * @param $param
  385. * @return array|void
  386. */
  387. public function bindRelation($param)
  388. {
  389. $site_id = $param[ 'site_id' ] ?? 0;
  390. $member_id = $param[ 'member_id' ] ?? 0;
  391. $action = $param[ 'action' ] ?? '';
  392. $config = [
  393. 'alter_share_relation' => 1,//对应 首次点击链接后绑定
  394. 'order_create' => 2,//对应 首次下单后绑定
  395. 'order_pay' => 3,//对应 首次付款后绑定
  396. ];
  397. if (!isset($config[ $action ])) return;
  398. //检测触发场景和设置是否匹配
  399. $config_model = new ConfigModel();
  400. $child_condition = $config_model->getFenxiaoRelationConfig($site_id)[ 'data' ][ 'value' ][ 'child_condition' ];
  401. if ($child_condition != $config[ $action ]) return;
  402. //检测用户
  403. $member_info = model('member')->getInfo([
  404. [ 'member_id', '=', $member_id ],
  405. ], 'share_member,fenxiao_id');
  406. if (empty($member_info)) return;
  407. //如果已经是分销商 不可以再修改关系
  408. if (!empty($member_info[ 'fenxiao_id' ])) return;
  409. // 查询推荐人是否是分销商
  410. $fenxiao_info = model('fenxiao')->getInfo([
  411. [ 'member_id', '=', $member_info[ 'share_member' ] ],
  412. [ 'is_delete', '=', 0 ],
  413. ], 'fenxiao_id');
  414. if (empty($fenxiao_info)) return;
  415. model('member')->startTrans();
  416. try {
  417. $member_data = [
  418. 'fenxiao_id' => $fenxiao_info[ 'fenxiao_id' ],
  419. 'bind_fenxiao_time' => time()
  420. ];
  421. model('member')->update($member_data, [ [ 'member_id', '=', $member_id ] ]);
  422. model('fenxiao')->setInc([ [ 'fenxiao_id', '=', $fenxiao_info[ 'fenxiao_id' ] ] ], 'one_child_num');
  423. // 分销商检测升级
  424. event('FenxiaoUpgrade', $fenxiao_info[ 'fenxiao_id' ]);
  425. model('member')->commit();
  426. return $this->success();
  427. } catch (\Exception $e) {
  428. model('member')->rollback();
  429. return;
  430. }
  431. }
  432. /**
  433. * 分销商检测升级
  434. * @param unknown $fenxiao_id
  435. */
  436. public function fenxiaoUpgrade($fenxiao_id)
  437. {
  438. $join = [
  439. [ 'member m', 'f.member_id = m.member_id', 'inner' ],
  440. [ 'fenxiao_level fl', 'f.level_id = fl.level_id', 'inner' ]
  441. ];
  442. $fenxiao_info = model('fenxiao')->getInfo([ [ 'f.fenxiao_id', '=', $fenxiao_id ], [ 'f.status', '=', 1 ], [ 'f.is_delete', '=', 0 ] ], 'f.level_id,m.order_num,m.order_money,f.one_fenxiao_order_num,f.one_fenxiao_order_money,f.one_fenxiao_total_order,f.one_child_num,f.one_child_fenxiao_num,fl.one_rate,fl.level_num,f.site_id', 'f', $join);
  443. if (!empty($fenxiao_info)) {
  444. $level_list = model('fenxiao_level')->getList([ [ 'site_id', '=', $fenxiao_info[ 'site_id' ] ], [ 'level_num', '>', $fenxiao_info[ 'level_num' ] ] ], '*', 'level_num asc,one_rate asc');
  445. if (!empty($level_list)) {
  446. $upgrade_level = null;
  447. foreach ($level_list as $item) {
  448. if ($item[ 'upgrade_type' ] == 2) {
  449. if ($fenxiao_info[ 'order_num' ] >= $item[ 'order_num' ] && $fenxiao_info[ 'order_money' ] >= $item[ 'order_money' ] && $fenxiao_info[ 'one_fenxiao_order_num' ] >= $item[ 'one_fenxiao_order_num' ] && $fenxiao_info[ 'one_fenxiao_total_order' ] >= $item[ 'one_fenxiao_total_order' ] && $fenxiao_info[ 'one_fenxiao_order_money' ] >= $item[ 'one_fenxiao_order_money' ] && $fenxiao_info[ 'one_child_num' ] >= $item[ 'one_child_num' ] && $fenxiao_info[ 'one_child_fenxiao_num' ] >= $item[ 'one_child_fenxiao_num' ]) {
  450. $upgrade_level = $item;
  451. break;
  452. }
  453. } else {
  454. if (( $fenxiao_info[ 'order_num' ] >= $item[ 'order_num' ] && $item[ 'order_num' ] > 0 ) || ( $fenxiao_info[ 'order_money' ] >= $item[ 'order_money' ] && $item[ 'order_money' ] > 0 ) || ( $fenxiao_info[ 'one_fenxiao_order_num' ] >= $item[ 'one_fenxiao_order_num' ] && $item[ 'one_fenxiao_order_num' ] > 0 ) || ( $fenxiao_info[ 'one_fenxiao_order_money' ] >= $item[ 'one_fenxiao_order_money' ] && $item[ 'one_fenxiao_order_money' ] > 0 ) || ( $fenxiao_info[ 'one_fenxiao_total_order' ] >= $item[ 'one_fenxiao_total_order' ] && $item[ 'one_fenxiao_total_order' ] > 0 ) || ( $fenxiao_info[ 'one_child_num' ] >= $item[ 'one_child_num' ] && $item[ 'one_child_num' ] > 0 ) || ( $fenxiao_info[ 'one_child_fenxiao_num' ] >= $item[ 'one_child_fenxiao_num' ] && $item[ 'one_child_fenxiao_num' ] > 0 )) {
  455. $upgrade_level = $item;
  456. break;
  457. }
  458. }
  459. }
  460. if ($upgrade_level) {
  461. model('fenxiao')->update([ 'level_id' => $upgrade_level[ 'level_id' ], 'level_name' => $upgrade_level[ 'level_name' ] ], [ [ 'fenxiao_id', '=', $fenxiao_id ] ]);
  462. }
  463. }
  464. }
  465. }
  466. /**
  467. * 获取下一个可升级的分销商等级 及当前分销商已达成的条件
  468. * @param $member_id
  469. * @param $site_id
  470. */
  471. public function geFenxiaoNextLevel($member_id, $site_id)
  472. {
  473. $array = [];
  474. $join = [
  475. [ 'member m', 'f.member_id = m.member_id', 'inner' ],
  476. [ 'fenxiao_level fl', 'f.level_id = fl.level_id', 'inner' ]
  477. ];
  478. $fenxiao_info = model('fenxiao')->getInfo(
  479. [ [ 'f.member_id', '=', $member_id ], [ 'f.site_id', '=', $site_id ], [ 'f.status', '=', 1 ], [ 'f.is_delete', '=', 0 ] ],
  480. 'f.level_id,m.order_num,m.order_money,f.one_fenxiao_order_num,f.one_fenxiao_order_money,f.one_child_num,f.one_child_fenxiao_num,fl.one_rate,fl.level_num', 'f', $join
  481. );
  482. $array[ 'fenxiao' ] = $fenxiao_info;
  483. $last_level = [];
  484. if (!empty($fenxiao_info)) {
  485. $last_level = model('fenxiao_level')->getFirstData([ [ 'site_id', '=', $site_id ], [ 'level_num', '>=', $fenxiao_info[ 'level_num' ] ], [ 'level_id', '<>', $fenxiao_info[ 'level_id' ] ] ], '*', 'level_num asc,one_rate asc');
  486. }
  487. $array[ 'last_level' ] = $last_level;
  488. return $this->success($array);
  489. }
  490. /**
  491. * 变更上下级关系
  492. * @param $member_id
  493. * @param $parent
  494. */
  495. public function changeParentFenxiao($member_id, $parent)
  496. {
  497. if ($member_id == '' || $member_id == 0) {
  498. return $this->error('', '参数member_id不能为空');
  499. }
  500. if ($parent == '' || $parent == 0) {
  501. return $this->error('', '上级分销商不能为空');
  502. }
  503. //获取上级分销商id
  504. $parent_info = model('fenxiao')->getInfo([ [ 'fenxiao_id', '=', $parent ], [ 'is_delete', '=', 0 ] ]);
  505. if (empty($parent_info)) {
  506. return $this->error('', '上级分销商不存在');
  507. }
  508. //用户信息
  509. $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ] ], 'fenxiao_id,is_fenxiao');
  510. if (empty($member_info)) {
  511. return $this->error('', '用户不存在');
  512. }
  513. model('fenxiao')->startTrans();
  514. try {
  515. if ($member_info[ 'is_fenxiao' ] == 1) {//是分销商
  516. $fenxiao_info = model('fenxiao')->getInfo([ [ 'fenxiao_id', '=', $member_info[ 'fenxiao_id' ] ], [ 'is_delete', '=', 0 ] ], 'parent');
  517. //修改原有上级分销商团队人数
  518. if ($fenxiao_info[ 'parent' ] > 0) {
  519. //获取原有上级分销商信息
  520. model('fenxiao')->setDec([ [ 'fenxiao_id', '=', $fenxiao_info[ 'parent' ] ] ], 'one_child_fenxiao_num');
  521. }
  522. //修改变更后的上级分销商团队人数
  523. model('fenxiao')->setInc([ [ 'fenxiao_id', '=', $parent ] ], 'one_child_fenxiao_num');
  524. //修改上级分销商
  525. model('fenxiao')->update([ 'parent' => $parent, 'grand_parent' => $parent_info[ 'parent' ] ], [ [ 'fenxiao_id', '=', $member_info[ 'fenxiao_id' ] ] ]);
  526. } else {//不是分销商
  527. //修改上级分销商
  528. model('member')->update([ 'fenxiao_id' => $parent ], [ [ 'member_id', '=', $member_id ] ]);
  529. //修改变更后的上级分销商团队人数
  530. model('fenxiao')->update([ 'one_child_num' => $parent_info[ 'one_child_num' ] + 1 ], [ [ 'fenxiao_id', '=', $parent ] ]);
  531. }
  532. model('fenxiao')->commit();
  533. return $this->success();
  534. } catch (\Exception $e) {
  535. model('fenxiao')->rollback();
  536. return $this->error('', $e->getMessage());
  537. }
  538. }
  539. /**
  540. * 取消上级分销商
  541. * @param $member_id
  542. * @param $parent
  543. */
  544. public function cancelParentFenxiao($member_id)
  545. {
  546. if ($member_id == '' || $member_id == 0) {
  547. return $this->error('', '参数member_id不能为空');
  548. }
  549. //用户信息
  550. $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ] ], 'fenxiao_id,is_fenxiao');
  551. if (empty($member_info)) {
  552. return $this->error('', '用户不存在');
  553. }
  554. model('fenxiao')->startTrans();
  555. try {
  556. if ($member_info[ 'is_fenxiao' ] == 1) {//是分销商
  557. $fenxiao_info = model('fenxiao')->getInfo(
  558. [ [ 'fenxiao_id', '=', $member_info[ 'fenxiao_id' ] ], [ 'is_delete', '=', 0 ] ],
  559. 'parent'
  560. );
  561. //修改原有上级分销商团队人数
  562. if ($fenxiao_info[ 'parent' ] > 0) {
  563. //获取原有上级分销商信息
  564. model('fenxiao')->setDec([ [ 'fenxiao_id', '=', $fenxiao_info[ 'parent' ] ] ], 'one_child_fenxiao_num');
  565. }
  566. //修改上级分销商
  567. model('fenxiao')->update([ 'parent' => '0' ], [ [ 'fenxiao_id', '=', $member_info[ 'fenxiao_id' ] ] ]);
  568. }
  569. model('fenxiao')->commit();
  570. return $this->success();
  571. } catch (\Exception $e) {
  572. model('fenxiao')->rollback();
  573. return $this->error('', $e->getMessage());
  574. }
  575. }
  576. /**
  577. * 获取上级分销商名称
  578. * @param $fenxiao_id
  579. * @param int $type 1-上级
  580. * @return mixed|string
  581. */
  582. public function getParentFenxiaoName($fenxiao_id, $type = 1)
  583. {
  584. if ($fenxiao_id == 0) {
  585. return '';
  586. }
  587. if ($type == 1) {
  588. $fenxiao_name = model('fenxiao')->getValue([ [ 'fenxiao_id', '=', $fenxiao_id ] ], 'fenxiao_name');
  589. return $fenxiao_name;
  590. } else {
  591. $parent = model('fenxiao')->getValue([ [ 'fenxiao_id', '=', $fenxiao_id ] ], 'parent');
  592. if ($parent == 0) {
  593. return '';
  594. } else {
  595. $fenxiao_name = model('fenxiao')->getValue([ [ 'fenxiao_id', '=', $parent ] ], 'fenxiao_name');
  596. return $fenxiao_name;
  597. }
  598. }
  599. }
  600. /**
  601. * 会员注销删除分销商
  602. * @param $member_id
  603. * @param $site_id
  604. * @return array
  605. */
  606. public function CronMemberCancel($member_id, $site_id)
  607. {
  608. $info = model('fenxiao')->getInfo([ [ 'member_id', '=', $member_id ], [ 'site_id', '=', $site_id ] ]);
  609. if (empty($info)) {
  610. return $this->success();
  611. }
  612. //冻结账户并删除
  613. $data = [
  614. 'status' => -1,
  615. 'lock_time' => time(),
  616. 'is_delete' => 1
  617. ];
  618. $res = model('fenxiao')->update($data, [ [ 'fenxiao_id', '=', $info[ 'fenxiao_id' ] ] ]);
  619. return $this->success($res);
  620. }
  621. /**
  622. * 变更分销商等级
  623. * @param array $condition
  624. * @param string $field
  625. * @param string $order
  626. * @param string $limit
  627. */
  628. public function changeFenxiaoLevel($data, $condition)
  629. {
  630. $result = model('fenxiao')->update($data, $condition);
  631. return $this->success($result);
  632. }
  633. /**
  634. * 获取分销等级分销商数量
  635. */
  636. public function getFenxiaoMemberCount($condition)
  637. {
  638. $condition[] = [ 'is_delete', '=', 0 ];
  639. $count = model('fenxiao')->getCount($condition);
  640. return $count;
  641. }
  642. /**
  643. * 获取分销商排名
  644. * @param $site_id
  645. * @param $fenxiao_id
  646. * @param $order
  647. * @return array
  648. */
  649. public function getFenxiaoRanking($site_id, $fenxiao_id, $order)
  650. {
  651. $prefix = config('database.connections.mysql.prefix');
  652. $version = model('fenxiao')->query('SELECT VERSION() as version')[ 0 ][ 'version' ];
  653. if (substr($version, 0, 1) == 8) {
  654. $query = "SELECT * FROM (select *,row_number() OVER(order by {$order} DESC) as rownum from {$prefix}fenxiao nf) AS f WHERE f.fenxiao_id = {$fenxiao_id}";
  655. } else {
  656. $query = "SELECT b.rownum FROM (SELECT t.*, @rownum := @rownum + 1 AS rownum FROM (SELECT @rownum := 0) r,(SELECT * FROM {$prefix}fenxiao WHERE site_id = {$site_id} ORDER BY {$order} DESC,fenxiao_id ASC) AS t) AS b WHERE b.fenxiao_id = {$fenxiao_id};";
  657. }
  658. $data = model('fenxiao')->query($query);
  659. $data = empty($data) ? 0 : $data[ 0 ][ 'rownum' ];
  660. return $this->success($data);
  661. }
  662. }