MemberReferralService.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Name: 芸众商城系统
  5. * Author: 广州市芸众信息科技有限公司
  6. * Profile: 广州市芸众信息科技有限公司位于国际商贸中心的广州,专注于移动电子商务生态系统打造,拥有芸众社交电商系统、区块链数字资产管理系统、供应链管理系统、电子合同等产品/服务。官网 :www.yunzmall.com www.yunzshop.com
  7. * Date: 2021/7/20
  8. * Time: 9:32
  9. */
  10. namespace app\frontend\modules\member\services;
  11. use app\backend\modules\member\models\MemberParent;
  12. use app\common\exceptions\AppException;
  13. use app\common\facades\Setting;
  14. use app\common\helpers\ImageHelper;
  15. use app\common\helpers\Url;
  16. use app\common\models\member\ChildrenOfMember;
  17. use app\common\models\member\MemberChildren;
  18. use app\common\models\MemberShopInfo;
  19. use app\common\models\Order;
  20. use app\frontend\modules\member\models\MemberModel;
  21. use Illuminate\Support\Facades\DB;
  22. use Yunshop\AgentListSet\admin\SetController;
  23. class MemberReferralService
  24. {
  25. public $mc_member;
  26. public $yz_member;
  27. public $member_id;
  28. public $member_child;
  29. /**
  30. * MemberReferralService constructor.
  31. * @throws AppException
  32. */
  33. public function __construct()
  34. {
  35. $this->member_id = \app\frontend\models\Member::current()->uid;
  36. $this->mc_member = MemberModel::getMyReferrerInfo($this->member_id)->first();
  37. $this->yz_member = $this->mc_member->yzMember;
  38. // $this->member_child = MemberChildren::where('member_id', $this->member_id)
  39. // ->get();
  40. if (!$this->mc_member) {
  41. throw new AppException('会员ID有误');
  42. }
  43. }
  44. /**
  45. * 我推荐的人 一二级数据v2
  46. * @return array
  47. * @throws AppException
  48. */
  49. public function getMyAgentData_v2()
  50. {
  51. $relationLevel = request()->input('relationLevel', 1);
  52. $pageSize = 10;
  53. $keyword = request()->input('keyword');
  54. $page = request()->page;
  55. //获取一级下级会员ID
  56. $teamMembersIds = MemberChildren::where('member_id', $this->member_id)
  57. ->where('level', $relationLevel)
  58. ->pluck('child_id')
  59. ->toArray();
  60. //todo 原先是模糊搜索,后期优化
  61. if (!empty($keyword)) {
  62. $key_uid = MemberModel::uniacid()->where('nickname', 'like', '%' . $keyword . '%')
  63. ->orWhere('mobile', 'like', '%' . $keyword . '%')
  64. ->orWhere('realname', 'like', '%' . $keyword . '%')
  65. ->pluck('uid')
  66. ->toArray();
  67. //获取交集
  68. $teamMembersIds = array_intersect($teamMembersIds, $key_uid);
  69. }
  70. //自定义分页
  71. // $page_start = ($page-1) * $pageSize;
  72. // $teamMembersIds = array_slice($teamMembersIds,$page_start,$pageSize);
  73. // 总订单数,总订单金额
  74. // todo yz_member 中的wechat 拿到外层 uid as id withSum
  75. if (app('plugins')->isEnabled('agent-list-set') && \Setting::get('plugin.agent-liset-set.pay_order')) {
  76. $teamMembers = SetController::getTeamMember($pageSize, $teamMembersIds); //统计已完成+已支付订单
  77. } else {
  78. $teamMembers = MemberModel::select(['mobile', 'createtime', 'avatar', 'nickname', 'uid', 'realname'])
  79. ->whereIn('uid', $teamMembersIds)
  80. ->with([
  81. 'yzMember' => function ($builder) {
  82. $builder->select(['member_id', 'is_agent', 'status', 'wechat', 'deleted_at', 'inviter','yz_openid']);
  83. },
  84. 'orders' => function ($order) {
  85. $order->select(['id', 'uid', 'price', 'status'])->where('status', 3);
  86. },
  87. 'memberChildren' => function ($member) {
  88. $member->select(['id', 'child_id', 'level', 'member_id'])->where('level', 1)
  89. ->with([
  90. 'orders' => function ($order) {
  91. $order->select(['id', 'uid', 'price', 'status'])->where('status', 3);
  92. }
  93. ]);
  94. }
  95. ])
  96. ->orderBy('uid', 'desc')
  97. ->simplePaginate($pageSize)
  98. ->toArray();
  99. }
  100. $teamMembers['total'] = count($teamMembersIds);
  101. $teamMembers['last_page'] = ceil($teamMembers['total'] / $pageSize);
  102. foreach ($teamMembers['data'] as &$v) {
  103. $v['team_order_money'] = round(
  104. collect($v['member_children'])->sum(function ($member_children) {
  105. return collect($member_children['orders'])->sum('price');
  106. }),
  107. 2
  108. );
  109. $v['team_total'] = collect($v['member_children'])->count();
  110. //会员自己
  111. $v['child_order_money'] = round(collect($v['orders'])->sum('price'), 2);
  112. $v['child_order_total'] = collect($v['orders'])->count();
  113. $v['avatar'] = $v['avatar_image'];
  114. unset($v['avatar_image']);
  115. $v['createtime'] = date('Y-m-d H:i:s', $v['createtime']);
  116. $v['id'] = $v['uid'];
  117. unset($v['uid']);
  118. $v['wechat'] = $v['yz_member']['wechat'] ?: 0;
  119. $v['mobile'] = $v['mobile'] ?: 0;
  120. $v['realname'] = $v['realname'] ?: 0;
  121. $v['inviter'] = empty($v['yz_member']['inviter']) ? 1 : 0;
  122. $v['avatar']=$v['avatar']?:yz_tomedia(Setting::get('shop.shop')['logo']);
  123. if (!is_null($v['yz_member'])) {
  124. if (1 == $v['yz_member']['is_agent'] && 2 == $v['yz_member']['status']) {
  125. $v['is_agent'] = 1;
  126. }
  127. $v['nickname']=$v['nickname']?:$v['yz_member']['yz_openid'];
  128. }
  129. unset($v['yz_member']);
  130. unset($v['member_children']);
  131. unset($v['orders']);
  132. }
  133. $data = $teamMembers;
  134. return show_json(1, $data);
  135. }
  136. /**
  137. * 我推荐的人 v2 基本信息
  138. *
  139. * @return \Illuminate\Http\JsonResponse
  140. */
  141. public function getMyAgent_v2()
  142. {
  143. set_time_limit(0);
  144. $total = 0;
  145. $relation_base = \Setting::get('relation_base');
  146. //如果没有设置则显示
  147. if (empty($relation_base)) {
  148. $relation_base['relation_level'][0] = true;
  149. $relation_base['relation_level'][1] = true;
  150. }
  151. for ($i = 1; $i <= 2; $i++) {
  152. $agent_count = MemberChildren::where('member_id', $this->member_id)
  153. ->where('level', $i)
  154. ->count();
  155. $total += $agent_count;
  156. $data['level' . $i] = [
  157. 'level' => $relation_base['relation_level']['name' . $i] ?: $i . '级',
  158. 'total' => $agent_count,
  159. 'is_show' => $relation_base['relation_level'][$i - 1] ? true : false,
  160. 'level_p' => 2,
  161. ];
  162. }
  163. $data['total'] = $total;
  164. return show_json(1, $data);
  165. }
  166. /**
  167. * 我的推荐人v2
  168. *
  169. * @return \Illuminate\Http\JsonResponse
  170. */
  171. public function getMyReferral_v2()
  172. {
  173. ini_set('memory_limit', -1);
  174. $member_id = \YunShop::app()->getMemberId();
  175. $member_info = $this->mc_member->toArray();
  176. $unicid = \YunShop::app()->uniacid;
  177. $set = \Setting::get('shop.member');
  178. $member_set = \Setting::get('relation_base');
  179. if (isset($set) && $set['headimg']) {
  180. $avatar = replace_yunshop(yz_tomedia($set['headimg']));
  181. } else {
  182. $avatar = Url::shopUrl('static/images/photo-mr.jpg');
  183. }
  184. //IOS时,把微信头像url改为https前缀
  185. $avatar = ImageHelper::iosWechatAvatar(yz_tomedia($avatar));;
  186. $member_info['avatar'] = yz_tomedia($member_info['avatar']);;
  187. //查询上级
  188. $referrer_info = MemberModel::getMyReferrerInfo($member_info['yz_member']['parent_id'])->first();
  189. if ($member_info['yz_member']['inviter'] == 1) {
  190. if (!empty($referrer_info)) {
  191. $info = $referrer_info->toArray();
  192. $data = [
  193. 'uid' => $info['uid'],
  194. 'avatar' => $info['avatar'],
  195. 'nickname' => $info['nickname'],
  196. 'level' => $info['yz_member']['level']['level_name'],
  197. 'is_show' => $member_set['is_referrer'] ?: 0,
  198. 'referrer_phone' => $info['mobile'],
  199. 'referrer_wechat' => $info['yz_member']['wechat'],
  200. ];
  201. } else {
  202. $data = [
  203. 'uid' => '',
  204. 'avatar' => $avatar,
  205. 'nickname' => '总店',
  206. 'level' => '',
  207. 'is_show' => $member_set['is_referrer'] ?: 0,
  208. ];
  209. }
  210. } else {
  211. $data = [
  212. 'uid' => '',
  213. 'avatar' => $avatar,
  214. 'nickname' => '暂无',
  215. 'level' => '',
  216. 'is_show' => $member_set['is_referrer'] ?: 0,
  217. ];
  218. }
  219. //---------------------new-----------------------
  220. //团队1级会员 防止会员删除
  221. $data['child_total'] = DB::table('yz_member_children')
  222. ->join('yz_member', function ($join) {
  223. $join->on('yz_member.member_id', '=', 'yz_member_children.child_id')
  224. ->whereNull('deleted_at');
  225. })
  226. ->where('yz_member_children.uniacid', $unicid)
  227. ->where('yz_member_children.member_id', $member_id)
  228. ->where('level', 1)
  229. ->count();
  230. $level_childs = MemberChildren::where('member_id', $this->member_id)->where("level", 1)->pluck("child_id");
  231. $team_order_money = 0;
  232. if (!empty($level_childs)) {
  233. if (app('plugins')->isEnabled('agent-list-set') && \Setting::get('plugin.agent-liset-set.pay_order')) {
  234. $team_order_money = SetController::getChildOrderMoney($member_id, $unicid); //统计已完成+已支付订单+自己的订单
  235. } else {
  236. $team_order_money = MemberChildren::select(
  237. ['yz_member_children.child_id', 'yz_member_children.member_id']
  238. )
  239. ->join('yz_order', 'yz_member_children.child_id', '=', 'yz_order.uid')
  240. ->where('yz_order.status', 3)
  241. ->where('yz_member_children.level', 1)
  242. ->where('yz_member_children.member_id', $member_id)
  243. ->sum('yz_order.price');
  244. }
  245. }
  246. $data['child_order_money'] = round($team_order_money, 2);
  247. //团队会员
  248. $data['team_total'] = DB::table('yz_member_children')
  249. ->join('yz_member', function ($join) {
  250. $join->on('yz_member.member_id', '=', 'yz_member_children.child_id')
  251. ->whereNull('deleted_at');
  252. })
  253. ->where('yz_member_children.uniacid', $unicid)
  254. ->where('yz_member_children.member_id', $member_id)
  255. ->count();
  256. $childs = MemberChildren::where('member_id', $this->member_id)->pluck("child_id");
  257. $team_all = 0;
  258. if (!empty($childs)) {
  259. if (app('plugins')->isEnabled('agent-list-set') && \Setting::get('plugin.agent-liset-set.pay_order')) {
  260. $team_all = SetController::getAllOrderMoney($member_id, $unicid); //统计已完成+已支付订单+自己的订单
  261. } else {
  262. $team_all = MemberChildren::select(['yz_member_children.child_id', 'yz_member_children.member_id'])
  263. ->join('yz_order', 'yz_member_children.child_id', '=', 'yz_order.uid')
  264. ->where('yz_order.status', 3)
  265. ->where('yz_member_children.member_id', $member_id)
  266. ->sum('yz_order.price');
  267. }
  268. }
  269. $data['team_order_money'] = round($team_all, 2);
  270. $team_goods_total = 0;
  271. if (!empty($childs)) {
  272. $team_goods_total = MemberChildren::select(['yz_member_children.child_id', 'yz_member_children.member_id'])
  273. ->join('yz_order', 'yz_member_children.child_id', '=', 'yz_order.uid')
  274. ->where('yz_order.status', '>=', 1)
  275. ->where('yz_member_children.member_id', $member_id)
  276. ->sum('yz_order.goods_total');
  277. }
  278. $data['team_goods_total'] = intval($team_goods_total);
  279. //---------------------new-----------------------
  280. $data['self'] = $member_info;
  281. $data['is_recommend_wechat'] = $member_set['is_recommend_wechat'] ?: 0;
  282. $data['wechat'] = $member_set['relation_level']['wechat'] ?: 0;
  283. $data['phone'] = $member_set['relation_level']['phone'] ?: 0;
  284. $data['realname'] = $member_set['relation_level']['realname'] ?: 0;
  285. $data['name1'] = $member_set['relation_level']['name1'] ?: '';
  286. $data['name2'] = $member_set['relation_level']['name2'] ?: '';
  287. $data['name3'] = $member_set['relation_level']['name3'] ?: '';
  288. //如果开启统计商品
  289. $data['statistical_goods'] = [];
  290. if (Setting::get('shop.relation_base.is_statistical_goods')) {
  291. $statisticalGoods = Setting::get('shop.relation_base.statistical_goods');
  292. foreach ($statisticalGoods as &$goods) {
  293. $goods['team_bought_total'] = $this->teamBuyGoodsTotal(\YunShop::app()->getMemberId(), $goods['id']);
  294. }
  295. $data['statistical_goods'] = $statisticalGoods ? : [];
  296. }
  297. if (!empty($data)) {
  298. return show_json(1, $data);
  299. }
  300. return show_json(0, '会员不存在');
  301. }
  302. private function teamBuyGoodsTotal($uid, $goodsId)
  303. {
  304. $teamTotal = ChildrenOfMember::select(['yz_member_children.child_id', 'yz_member_children.member_id'])
  305. ->join('yz_order', 'yz_member_children.child_id', '=', 'yz_order.uid')
  306. ->join('yz_order_goods', function ($join) {
  307. $join->on('yz_order_goods.order_id', '=', 'yz_order.id');
  308. })
  309. ->where('yz_order.status', Order::COMPLETE)
  310. ->where('yz_member_children.member_id', $uid)
  311. ->where('yz_order_goods.goods_id', $goodsId)
  312. ->sum('yz_order_goods.total');
  313. //自购数量
  314. $selfTotal = Order::where('uid', $uid)
  315. ->where('status', Order::COMPLETE)
  316. ->whereHas('orderGoods', function ($query) use ($goodsId) {
  317. $query->where('goods_id', $goodsId);
  318. })->sum('goods_total');
  319. return $teamTotal + $selfTotal;
  320. }
  321. /**
  322. * 会员推荐人上级
  323. * @return array|\Illuminate\Http\JsonResponse
  324. */
  325. public function getMyReferralParents()
  326. {
  327. if ($this->yz_member['inviter'] == 1 && !empty(
  328. MemberShopInfo::getMemberShopInfo(
  329. $this->yz_member['parent_id']
  330. )
  331. )) {
  332. $data = MemberParent::getAgentParentByMemberId($this->yz_member['parent_id']);
  333. return show_json(1, $data);
  334. } else {
  335. return show_json(1, ['is_show' => 0]); //没有推荐人上级
  336. }
  337. }
  338. }