LmtLevel.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. <?php
  2. namespace addons\shopro\controller;
  3. use addons\shopro\model\LmtUserQuota;
  4. use think\Db;
  5. use addons\shopro\model\LmtUserLevel;
  6. use addons\shopro\model\Order;
  7. use addons\shopro\model\User;
  8. use addons\shopro\model\OrderItem;
  9. use addons\shopro\model\LmtUserLevelLog;
  10. use app\common\model\MoneyLog;
  11. /**
  12. * 亮幕堂等级管理
  13. * @author qc
  14. * Class LmtLevel
  15. * @package addons\shopro\controller
  16. * http://lmt.hdlkeji.com/addons/shopro/Lmt_level/index
  17. */
  18. class LmtLevel extends Base
  19. {
  20. protected $noNeedLogin = ['*'];
  21. protected $noNeedRight = ['*'];
  22. protected $upgrade = [0,10,3,3,3,3,3];// 升级条件
  23. protected $lev_set = [];
  24. protected $special_goods = [1,2];// 特殊商品id
  25. function _initialize(){
  26. // 等级升级条件以及折扣设置
  27. $lev_set = LmtUserLevel::getLevSet();
  28. $this->lev_set = array_column($lev_set,null,'id');
  29. $this->lev_set[0] = ['discount'=>10,'name'=>'游客','price'=>'399.00'];
  30. }
  31. /**
  32. * 测试方法
  33. */
  34. public function index(){
  35. }
  36. /**
  37. *订单回调接口调用
  38. */
  39. function orderNotify($order_id,$order_info = []){
  40. // 订单详情
  41. if(!$order_info) $order_info =Order::get($order_id)->toArray();
  42. // 会员详情
  43. $user_info = User::find( $order_info['user_id'])->toArray();
  44. // 订单商品列表
  45. $goods_arr = OrderItem::getOrderGoods($order_id);
  46. // 特殊商品赠送名额 start
  47. $quota = [];
  48. $special_goods = 0;
  49. foreach ($goods_arr as $gv) {
  50. // 购买身份商品
  51. if(in_array($gv['goods_id'],$this->special_goods)) {
  52. $q_num = $gv['goods_id'] == $this->special_goods[0] ? 1:10;
  53. $special_goods = $this->special_goods[0] ? 1:10;
  54. $q_num = $q_num * $gv['goods_num'];// 赠送数量
  55. $quota[]=[
  56. 'user_id' => $order_info['user_id'],
  57. 'order_id' => $order_info['id'],
  58. 'goods_id' => $gv['goods_id'],
  59. 'num' => $q_num ,
  60. 'base_num' => $q_num,
  61. 'create_time' => date('Y-m-d H:i:s'),
  62. 'desc' => '购买'
  63. ];
  64. $clevel = $gv['goods_id'] == $this->special_goods[0] ? 1 : 2 ;// 购买等级身份
  65. // 购买v1身份
  66. if($clevel == 1) {
  67. if($user_info['level'] == 0) {
  68. // 更新身份
  69. User::update(['level'=>$clevel,'level_update'=>time()],['id'=>$user_info['id']]);
  70. $user_info['level'] = $clevel;
  71. LmtUserLevelLog::createLevelLog($user_info['id'],1,1,'恭喜亲晋级'.$this->lev_set[$clevel]['name'],$user_info['id']);
  72. $this->userLevelChange($user_info['id']);
  73. }
  74. }else {
  75. if($clevel > $user_info['level']) {
  76. if($gv['lmt_type'] == 1){//名额
  77. // 更新身份 && 名额
  78. User::update(['level'=>$clevel,'level_update'=>time(),'quota_num'=>$user_info['quota_num']+$q_num],['id'=>$user_info['id']]);
  79. OrderItem::update(['dispatch_status'=>2],['id'=>$gv['id']]);
  80. Order::update(['status'=>2],['id'=>$gv['order_id']]);
  81. }else{
  82. // 更新身份
  83. User::update(['level'=>$clevel,'level_update'=>time()],['id'=>$user_info['id']]);
  84. }
  85. $user_info['level'] = $clevel;
  86. LmtUserLevelLog::createLevelLog($user_info['id'],1,1,'恭喜亲晋级'.$this->lev_set[$clevel]['name'],$user_info['id']);
  87. $this->userLevelChange($user_info['id']);
  88. }else{
  89. if($gv['lmt_type'] == 1){//名额
  90. // 更新身份 && 名额
  91. User::update(['quota_num'=>$user_info['quota_num']+$q_num],['id'=>$user_info['id']]);
  92. OrderItem::update(['dispatch_status'=>2],['id'=>$gv['id']]);
  93. Order::update(['status'=>2],['id'=>$gv['order_id']]);
  94. }
  95. }
  96. }
  97. }
  98. }
  99. if(!empty($quota)) (new LmtUserQuota())->saveAll($quota);
  100. // 递归增加业绩
  101. $this->savePerformance($user_info['id'],$order_info['total_fee']);
  102. // 推荐线奖励 start
  103. if($user_info['pid'] > 0)
  104. {
  105. // 获取推荐线能分红的会员
  106. $recom_list = $this->getRecommend($user_info['pid']);
  107. $current_lev = $user_info['level']; // 当前等级
  108. foreach ($recom_list as $ck=>$cv) {
  109. // 推荐线奖励条件
  110. if($cv['level'] > $current_lev ){
  111. if($special_goods) {
  112. $qf_money = bcsub($this->lev_set[$current_lev]['price'],$this->lev_set[$cv['level']]['price'],2) * $special_goods;
  113. }else{
  114. // 等级差率
  115. $rate = bcsub($this->lev_set[$current_lev]['discount'],$this->lev_set[$cv['level']]['discount'],2);
  116. $cl_rete = $rate > 0 ? $rate : 0;
  117. $qf_money = bcmul($order_info['total_fee'],$cl_rete/10,2);
  118. }
  119. $current_lev = $ck;
  120. if($qf_money > 0){
  121. $res = User::money($qf_money, $cv['id'], 'recommend', 0 , '推荐线奖励',['order_id'=>$order_id,'from_user'=>$user_info['id']]);
  122. }
  123. }
  124. }
  125. }
  126. }
  127. /***
  128. * 递归查询获取推荐线封顶5级
  129. */
  130. public function getRecommend($pid){
  131. global $recom_list ;
  132. $user_info = User::get(function ($query)use ($pid){
  133. $query->field("id,pid,level")->where('id',$pid);
  134. })->toArray();
  135. if(!isset($recom_list[$user_info['level']])) $recom_list[$user_info['level']]= $user_info;
  136. if( $user_info['pid'] > 0 && $user_info['level'] < 5){
  137. $this->getRecommend($user_info['pid']);
  138. }
  139. return $recom_list;
  140. }
  141. /**
  142. * 递归增加业绩
  143. * @param $user_id
  144. * @param $performance
  145. * @throws \think\db\exception\DataNotFoundException
  146. * @throws \think\db\exception\ModelNotFoundException
  147. * @throws \think\exception\DbException
  148. */
  149. public function savePerformance($user_id,$performance)
  150. {
  151. $user_info = User::find($user_id);
  152. $user_info->performance = bcadd($performance,$user_info->performance,2);
  153. $user_info->save();
  154. if($user_info->pid > 0) $this->savePerformance($user_info->pid,$performance);
  155. }
  156. /**
  157. * 会员推荐线等级变更
  158. * @param $user_id
  159. * @throws \think\db\exception\DataNotFoundException
  160. * @throws \think\db\exception\ModelNotFoundException
  161. * @throws \think\exception\DbException
  162. */
  163. function userLevelChange($user_id)
  164. {
  165. $field = 'id,pid,level';
  166. $user_info = User::find($user_id)->toArray();
  167. // 会员有推荐人
  168. if($user_info['pid'] > 0) {
  169. // 推荐人信息
  170. $parent_info = User::get(function ($query) use ($field,$user_info){
  171. $query->field($field)->where('id',$user_info['pid']);
  172. })->toArray();
  173. $upgrade_num = $this->upgrade[$parent_info['level']];
  174. // 等级大于0(游客之能购买升级)
  175. if($parent_info['level'] == 1) {
  176. $children_num = $this->getRecommendNum([$parent_info['id']]);
  177. if($children_num >= $upgrade_num) {
  178. // 推荐人会员等级升级
  179. User::update(['level'=> $parent_info['level']+1,'level_update'=>time()],['id'=>$parent_info['id']]);
  180. $parent_info['level'] = $parent_info['level']+1;
  181. // 等级变更日志
  182. LmtUserLevelLog::createLevelLog($parent_info['id'],$parent_info['level'],3,'恭喜亲晋级'.$this->lev_set[$parent_info['level']]['name'],$user_id);
  183. // 递归处理会员推荐线
  184. $this->userLevelChange($parent_info['id']);
  185. // 连续升级
  186. $this->userLevelChange($user_id);
  187. }
  188. }else if($parent_info['level'] < 6) {
  189. // 查询当前等级以上的下级会员(分组查询)
  190. $children_arr = User::all(function ($query)use ($parent_info){
  191. $query ->field('level,count(id) as num')->where('level','>=',$parent_info['level'])
  192. ->where('pid','=',$parent_info['id'])
  193. ->group('level');
  194. })->toArray();
  195. $children_num = array_sum(array_column($children_arr,'num'));// 当前等级及以上的所有下级
  196. if($children_num >= $upgrade_num && $parent_info['level'] < 6) {
  197. $parent_info['level'] = $parent_info['level']+1;
  198. // 推荐人会员等级升级
  199. User::update(['level'=> $parent_info['level'],'level_update'=>time()],['id'=>$parent_info['id']]);
  200. // 等级变更日志
  201. LmtUserLevelLog::createLevelLog($parent_info['id'],$parent_info['level'],3,'恭喜亲晋级'.$this->lev_set[$parent_info['level']]['name'],$user_id);
  202. // 递归处理会员推荐线
  203. $this->userLevelChange($parent_info['id']);
  204. }
  205. // 是否多次递归
  206. if($children_num >= $upgrade_num && $parent_info['level'] < 6) {
  207. foreach ($children_arr as $k=>$val) {
  208. if($parent_info['level'] < $val['level'] && $this->upgrade[$val['level']] <= $val['num'] && $parent_info['level'] < 6) {
  209. // 推荐人会员等级升级;
  210. $parent_info['level'] = $parent_info['level']+1;
  211. User::update(['level'=> $parent_info['level'],'level_update'=>time()],['id'=>$parent_info['id']]);
  212. // 等级变更日志
  213. LmtUserLevelLog::createLevelLog($parent_info['id'],$parent_info['level'],3,'恭喜亲晋级'.$this->lev_set[$parent_info['level']]['name'],$user_id);
  214. // 递归
  215. $this->userLevelChange($parent_info['id']);
  216. }
  217. }
  218. }
  219. }
  220. }
  221. }
  222. /**
  223. *
  224. * @param array $user_ids
  225. * @return mixed
  226. * @throws \think\exception\DbException
  227. */
  228. public function getRecommendNum($user_ids = [])
  229. {
  230. global $num ;
  231. $child_ren = User::all(function ($query)use ($user_ids){
  232. $query ->field('id,level,pid')
  233. ->where('pid','in',implode(',',$user_ids))
  234. ->where('pid','>','0');
  235. })->toArray();
  236. if(!empty($child_ren)) {
  237. foreach ($child_ren as $rv) {
  238. if($rv['level'] == 1) $num++;
  239. }
  240. $this->getRecommendNum(array_column($child_ren,'id'));
  241. }
  242. return $num;
  243. }
  244. }