LevelUpgradeService.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. <?php
  2. /**
  3. * Author: 芸众商城 www.yunzshop.com
  4. * Date: 2017/5/25
  5. * Time: 下午4:55
  6. */
  7. namespace app\common\services\member\level;
  8. use app\common\events\member\MemberLevelUpgradeEvent;
  9. use app\common\events\member\MemberLevelValidityEvent;
  10. use app\common\events\order\AfterOrderPaidEvent;
  11. use app\common\events\order\AfterOrderReceivedEvent;
  12. use app\common\facades\Setting;
  13. use app\common\models\Member;
  14. use app\common\models\member\MemberChildren;
  15. use app\common\models\MemberLevel;
  16. use app\common\models\MemberShopInfo;
  17. use app\common\models\notice\MessageTemp;
  18. use app\common\models\Order;
  19. use app\common\services\MessageService;
  20. use app\common\services\notice\official\MemberUpgradeNotice;
  21. use Yunshop\UniversalCard\models\ConsumeCoupon;
  22. use Yunshop\UniversalCard\models\ConsumeCouponLog;
  23. use Yunshop\UniversalCard\models\UniversalCardLevel;
  24. use Yunshop\UniversalCard\services\MsgSendService;
  25. use Exception;
  26. class LevelUpgradeService
  27. {
  28. private $orderModel;
  29. private $orderId;
  30. private $memberModel;
  31. private $new_level;
  32. private $validity;
  33. public function test($order)
  34. {
  35. $this->orderModel = $order;
  36. $this->memberModel = MemberShopInfo::ofMemberId($this->orderModel->uid)->withLevel()->first();
  37. $result = $this->check(0);
  38. dd('ok');
  39. exit;
  40. $this->setValidity($result); // 设置会员等级期限
  41. if ($result) {
  42. return $this->upgrade($result);
  43. }
  44. return '';
  45. }
  46. /*
  47. * 插件奖励会员等级升级
  48. * 插件:企业微信好友分裂、
  49. * member_id:升级的会员id
  50. * after_level 要升级到的会员等级,yz_member_level表模型
  51. */
  52. public function pluginUpgrade($member_id, $after_level)
  53. {
  54. try {
  55. \Log::debug('会员等级升级-插件升级开始' . $member_id, $after_level);
  56. if (!$this->memberModel = MemberShopInfo::ofMemberId($member_id)->withLevel()->first()) {
  57. throw new Exception('会员不存在');
  58. }
  59. $this->check(0, $after_level);
  60. $member_level_weight = intval($this->memberModel->level->level) ?: 0;
  61. $this->validity['is_goods'] = 1;
  62. $this->validity['goods_total'] = 1;
  63. if ($after_level->level > $member_level_weight){
  64. $this->validity['upgrade'] = 1;
  65. $this->validity['superposition'] = 1;
  66. }
  67. $this->setValidity($after_level->level > $member_level_weight);
  68. if ($this->validity['upgrade'] && $this->upgrade($after_level->id) !== true) {
  69. throw new Exception('未知原因');
  70. }
  71. \Log::debug('会员等级升级-插件升级结束' . $member_id, $after_level);
  72. return ['result' => 1, 'msg' => '成功', 'data' => []];
  73. } catch (Exception $e) {
  74. return ['result' => 0, 'msg' => '会员等级升级失败:' . $e->getMessage(), 'data' => []];
  75. }
  76. }
  77. public function checkUpgrade(AfterOrderReceivedEvent $event)
  78. {
  79. //event(new AfterOrderReceivedEvent(Order::where('status',3)->first()));
  80. $this->orderId = $event->getOrderModel()->id;
  81. $this->orderModel = Order::find($event->getOrderModel()->id);//$event->getOrderModel();
  82. $uniacid = $this->orderModel->uniacid;
  83. \Setting::$uniqueAccountId = \YunShop::app()->uniacid = $uniacid;
  84. $this->memberModel = MemberShopInfo::ofMemberId($this->orderModel->uid)->withLevel()->first();
  85. if (is_null($this->memberModel)) {
  86. \Log::info('---==会员不存在==----');
  87. return;
  88. }
  89. $result = $this->check(0);
  90. \Log::info('---==check方法结果==----', $result);
  91. $this->setValidity($result); // 设置会员等级期限
  92. if ($result) {
  93. return $this->upgrade($result);
  94. }
  95. return '';
  96. }
  97. public function checkUpgradeAfterPaid(AfterOrderPaidEvent $event)
  98. {
  99. $this->orderId = $event->getOrderModel()->id;
  100. $this->orderModel = $event->getOrderModel();
  101. $uniacid = $this->orderModel->uniacid;
  102. \Setting::$uniqueAccountId = \YunShop::app()->uniacid = $uniacid;
  103. //\Event::getListeners('app\common\events\order\AfterOrderPaidEvent');
  104. \Log::debug('checkUpgradeAfterPaid');
  105. $set = \Setting::get('shop.member');
  106. /*if (!is_null($set)) {
  107. $uniacid = $this->orderModel->uniacid;
  108. \Setting::$uniqueAccountId = \YunShop::app()->uniacid = $uniacid;
  109. $set = Setting::get('shop.member');
  110. }*/
  111. if ($set['level_after'] != 1) {
  112. return;
  113. }
  114. $this->memberModel = MemberShopInfo::ofMemberId($this->orderModel->uid)->withLevel()->first();
  115. if (is_null($this->memberModel)) {
  116. return;
  117. }
  118. $result = $this->check(1);
  119. $this->setValidity($result); // 设置会员等级期限
  120. if ($result) {
  121. return $this->upgrade($result);
  122. }
  123. return '';
  124. }
  125. public function setValidity($isUpgrate = false)
  126. {
  127. $set = \Setting::get('shop.member');
  128. if (!$set['term']) {
  129. return;
  130. }
  131. if (!$this->validity['is_goods']) {
  132. return;
  133. }
  134. $current_level_id = '';
  135. if ($this->validity['upgrade']) {
  136. $current_level_id = $this->new_level->id;
  137. $validity = $this->new_level->validity * $this->validity['goods_total'];
  138. } else {
  139. //bug 会员当前等级 > 新的等级 有效期不应该叠加, 当等级相等时才叠加
  140. //$validity = $this->memberModel->validity + $this->new_level->validity * $this->validity['goods_total'];
  141. if ($this->validity['superposition']) {
  142. $current_level_id = $this->memberModel->level->id;
  143. $validity = $this->memberModel->validity + $this->new_level->validity * $this->validity['goods_total'];
  144. }
  145. }
  146. if (isset($validity)) {
  147. //一卡通消费券
  148. if (app('plugins')->isEnabled('consume-coupon-switch') && Setting::get('plugin.consume_coupon_switch.status') == 1) {
  149. if (app('plugins')->isEnabled('universal-card') && Setting::get('plugin.universal_card.switch') == 1) {
  150. $consume_coupon = ConsumeCoupon::uniacid()->where('member_id', $this->memberModel->member_id)->first();
  151. $universalCardLevel = UniversalCardLevel::uniacid()->where('member_level_id', $current_level_id)->first();
  152. if ($universalCardLevel->consume_coupon_num) {
  153. $get_consume_coupon = $universalCardLevel->consume_coupon_num * $this->validity['goods_total'];
  154. if ($consume_coupon) {
  155. $consume_coupon->amount = $consume_coupon->amount + $get_consume_coupon;
  156. } else {
  157. $consume_coupon = new ConsumeCoupon();
  158. $consume_coupon->uniacid = $this->memberModel->uniacid;
  159. $consume_coupon->member_id = $this->memberModel->member_id;
  160. $consume_coupon->amount = $consume_coupon->amount + $get_consume_coupon;
  161. }
  162. $consume_coupon->amount = round($consume_coupon->amount, 2);
  163. $consume_coupon->status = 1;
  164. if ($consume_coupon->save()) {
  165. $data = [
  166. 'uniacid' => \YunShop::app()->uniacid,
  167. 'member_id' => $this->memberModel->member_id,
  168. 'store_id' => 0,
  169. 'order_id' => $this->orderModel->id,
  170. 'type' => 1,
  171. 'amount' => $get_consume_coupon,
  172. 'created_at' => time(),
  173. ];
  174. ConsumeCouponLog::create($data);
  175. MsgSendService::getConsumeCoupon($get_consume_coupon, $this->memberModel->member_id);
  176. };
  177. }
  178. }
  179. }
  180. $this->memberModel->validity = $validity;
  181. $this->memberModel->downgrade_at = 0;
  182. $this->memberModel->save();
  183. if (!$isUpgrate) {
  184. $levelId = intval($this->new_level->id);
  185. event(new MemberLevelValidityEvent($this->memberModel, $this->validity['goods_total'], $levelId));
  186. }
  187. }
  188. }
  189. private function check($status,$new_level = null)
  190. {
  191. $set = \Setting::get('shop.member');
  192. \Log::info('---==等级设置信息==----', [unserialize($set), json_decode($set, true)]);
  193. if (!$new_level) {
  194. //获取可升级的最高等级
  195. switch ($set['level_type']) {
  196. case 0:
  197. $this->new_level = $this->checkOrderMoney();
  198. break;
  199. case 1:
  200. $this->new_level = $this->checkOrderCount();
  201. break;
  202. case 2:
  203. if ($status == 1) {
  204. if ($set['level_after']) {
  205. $this->new_level = $this->checkGoodsId();
  206. }
  207. } else {
  208. if (!$set['level_after']) {
  209. $this->new_level = $this->checkGoodsId();
  210. }
  211. }
  212. break;
  213. case 3:
  214. // 此方法不返回新等级,升级单独处理
  215. $this->new_level = $this->checkTeamPerformance();
  216. break;
  217. default:
  218. $level = '';
  219. }
  220. } else {
  221. $this->new_level = $new_level;
  222. }
  223. \Log::debug('判断是否升级',$this->new_level);
  224. //比对当前等级权重,判断是否升级
  225. if ($this->new_level) {
  226. $memberLevel = isset($this->memberModel->level->level) ? $this->memberModel->level->level : 0;
  227. \Log::info('---==会员等级信息==----', [$memberLevel, $this->new_level->level]);
  228. if ($this->new_level->level == $memberLevel) {
  229. $this->validity['superposition'] = true; //会员期限叠加
  230. }
  231. if ($this->new_level->level > $memberLevel) {
  232. $this->validity['upgrade'] = true; // 会员期限 升级 期限叠加
  233. return $this->new_level->id;
  234. }
  235. return '';
  236. }
  237. return '';
  238. }
  239. /**
  240. * 会员完成订单总金额,返回对应最高会员等级数组
  241. * @return mixed
  242. */
  243. private function checkOrderMoney()
  244. {
  245. $set = \Setting::get('shop.member');
  246. if ($set['level_after'] == 1) {
  247. //付款后
  248. $orderMoney = Order::where('uid', $this->orderModel->uid)->whereBetween('status', [Order::WAIT_SEND,Order::COMPLETE])->sum('price');
  249. } else {
  250. //完成后
  251. $orderMoney = Order::where('uid', $this->orderModel->uid)->where('status', Order::COMPLETE)->sum('price');
  252. }
  253. //获取满足条件的最高等级
  254. $level = MemberLevel::uniacid()->select('id', 'level', 'level_name')->whereBetween('order_money', [1, $orderMoney])->orderBy('level', 'desc')->first();
  255. return $level;
  256. }
  257. /**
  258. * 团队业绩(自购+一级+二级)
  259. * @return mixed
  260. */
  261. private function checkTeamPerformance()
  262. {
  263. $set = \Setting::get('shop.member');
  264. // 这重新查询是因为orderModel的uid是435但是实际下单的人事438,为啥,不知道.懵逼
  265. $order = Order::find($this->orderId);
  266. $this->memberModel = MemberShopInfo::ofMemberId($order->uid)->withLevel()->first();
  267. $uidArr = [
  268. $this->memberModel->member_id
  269. ];
  270. if ($this->memberModel->parent_id) {
  271. $uidArr[] = $this->memberModel->parent_id;
  272. $oneParent = MemberShopInfo::select(['member_id', 'parent_id'])
  273. ->where('member_id', $this->memberModel->parent_id)
  274. ->first();
  275. if ($oneParent->parent_id) {
  276. $uidArr[] = $oneParent->parent_id;
  277. }
  278. }
  279. $status = Order::COMPLETE;
  280. if ($set['level_after'] == 1) {
  281. //付款后
  282. $status = Order::WAIT_SEND;
  283. }
  284. foreach ($uidArr as $uid) {
  285. $teamPerformance = MemberChildren::select(['yz_member_children.child_id', 'yz_member_children.member_id', 'yz_member_children.level'])
  286. ->join('yz_order','yz_member_children.child_id','=','yz_order.uid')
  287. ->where('yz_order.status', '>=', $status)
  288. ->where('yz_member_children.level', '<', 3)
  289. ->where('yz_member_children.member_id', $uid)
  290. ->sum('yz_order.price');
  291. $teamPerformance += Order::where('uid', $uid)
  292. ->where('status', '>=', $status)
  293. ->sum('price');
  294. //获取满足条件的最高等级
  295. $level = MemberLevel::uniacid()
  296. ->select('id', 'level', 'level_name')
  297. ->whereBetween('team_performance', [1, $teamPerformance])
  298. ->orderBy('level', 'desc')
  299. ->first();
  300. if ($level) {
  301. $memberModel = MemberShopInfo::ofMemberId($uid)->withLevel()->first();
  302. //查询会员不存在则不升级
  303. if (is_null($memberModel)) {
  304. continue;
  305. }
  306. $memberLevel = isset($memberModel->level->level) ? $memberModel->level->level : 0;
  307. if ($level->level > $memberLevel) {
  308. $memberModel->level_id = $level->id;
  309. $memberModel->upgrade_at = time();
  310. if ($memberModel->save()) {
  311. //会员等级升级触发事件
  312. event(new MemberLevelUpgradeEvent($memberModel,false));
  313. $pluginLevel=[
  314. 'member_id'=>$memberModel->member_id,
  315. 'level_id'=>$memberModel->level_id,
  316. 'plugin_type' => 1
  317. ];
  318. event(new \app\common\events\PluginLevelEvent($pluginLevel));
  319. $this->notice($level);
  320. }
  321. }
  322. }
  323. }
  324. return '';
  325. }
  326. /**
  327. * 会员完成订单总数量,返回对应最高会员等级数组
  328. * @return mixed
  329. */
  330. private function checkOrderCount()
  331. {
  332. $set = \Setting::get('shop.member');
  333. if ($set['level_after'] == 1) {
  334. //付款后
  335. $orderCount = Order::where('uid', $this->orderModel->uid)->whereBetween('status', [Order::WAIT_SEND,Order::COMPLETE])->count();
  336. } else {
  337. //完成后
  338. $orderCount = Order::where('uid', $this->orderModel->uid)->where('status', Order::COMPLETE)->count();
  339. }
  340. $level = MemberLevel::uniacid()->select('id', 'level', 'level_name')->whereBetween('order_count', [1, $orderCount])->orderBy('level', 'desc')->first();
  341. return $level;
  342. }
  343. /**
  344. * 当前订单中满足升级会员等级的 最高会员等级数组,空返回 array
  345. * @return array
  346. */
  347. private function checkGoodsId()
  348. {
  349. $reallevel = [];
  350. $goodsIds = array_pluck($this->orderModel->hasManyOrderGoods->toArray(), 'goods_id');
  351. \Log::debug('---==get_order_model==---', $this->orderModel);
  352. \Log::debug('---==get_member_model==---', $this->memberModel);
  353. // $level = MemberLevel::uniacid()->select('id', 'level', 'level_name', 'goods_id', 'validity')->whereIn('goods_id', $goodsIds)->orderBy('level', 'desc')->first(); // 原先逻辑为购买指定某一商品即可升级, 现为购买指定任易商品即可升级
  354. //获取
  355. $levelid = MemberLevel::find($this->memberModel->level_id);
  356. \Log::debug('---==levelid==---', $levelid);
  357. $levels = MemberLevel::uniacid()->where('level', '>=', $levelid->level ? : 0)->select('id', 'level', 'level_name', 'goods_id', 'validity')->orderBy('level', 'desc')->get();
  358. \Log::debug('---==levels==---', $levels);
  359. $this->validity['is_goods'] = true; // 商品升级 开启等级期限
  360. foreach ($this->orderModel->hasManyOrderGoods as $time) {
  361. // if ($time->goods_id == $level->goods_id) { // 原先逻辑为购买指定某一商品即可升级, 现为购买指定任易商品即可升级
  362. foreach ($levels as $level) {
  363. $levelGoodsId = explode(',', $level->goods_id);
  364. \Log::debug('---==levelGoodsId==---', $levelGoodsId);
  365. \Log::debug('---==checkInarray==---', in_array($time->goods_id, $levelGoodsId));
  366. if (in_array($time->goods_id, $levelGoodsId)) {
  367. $this->validity['goods_total'] = $time->total;
  368. $reallevel = MemberLevel::find($level->id);
  369. \Log::debug('---===member_level_upgrade===---', $time->total);
  370. //开启一卡通
  371. if (app('plugins')->isEnabled('universal-card')) {
  372. if ($time->goods_option_id) {
  373. $reallevel->validity = (new \Yunshop\UniversalCard\services\LevelUpgradeService())->upgrade($level->id, $time->goods_option_id);
  374. }
  375. }
  376. }
  377. }
  378. }
  379. // return $level ?: [];
  380. return $reallevel;
  381. }
  382. private function upgrade($levelId)
  383. {
  384. $this->memberModel->level_id = $levelId;
  385. $this->memberModel->upgrade_at = time();
  386. if ($this->memberModel->save()) {
  387. //会员等级升级触发事件
  388. $pluginLevel=[
  389. 'member_id'=>$this->orderModel->uid,
  390. 'level_id'=>$levelId,
  391. 'plugin_type' => 1
  392. ];
  393. event(new MemberLevelUpgradeEvent($this->memberModel,false));
  394. event(new \app\common\events\PluginLevelEvent($pluginLevel));
  395. event(new MemberLevelValidityEvent($this->memberModel, $this->validity['goods_total'], $levelId));
  396. $this->notice();
  397. \Log::info('会员ID' . $this->memberModel->member_id . '会员等级升级成功,等级ID' . $levelId);
  398. } else {
  399. \Log::info('会员ID' . $this->memberModel->member_id . '会员等级升级失败,等级ID' . $levelId);
  400. }
  401. //todo 会员等级升级通知
  402. return true;
  403. }
  404. private function notice($newLevel = null)
  405. {
  406. //$template_id = \Setting::get('shop.notice.customer_upgrade');
  407. if(!empty($this->new_level)){
  408. $memberNotice = new MemberUpgradeNotice($this->memberModel,$this->new_level);
  409. }elseif (!empty($newLevel)){
  410. $memberNotice = new MemberUpgradeNotice($this->memberModel,$newLevel);
  411. }else{
  412. \Log::debug("会员升级消息--新等级信息为空",[$this->memberModel,$newLevel]);
  413. return true;
  414. }
  415. $memberNotice->sendMessage();
  416. return ;
  417. if (!trim($template_id)) {
  418. return '';
  419. }
  420. $memberModel = Member::select('uid', 'nickname', 'realname')->where('uid', $this->memberModel->member_id)->with('hasOneFans')->first();
  421. $member_name = $memberModel->realname ?: $memberModel->nickname;
  422. $set = \Setting::get('shop.member');
  423. $old_level = $set['level_name'] ?: '普通会员';
  424. $old_level = $this->memberModel->level->level_name ?: $old_level;
  425. $params = [
  426. ['name' => '粉丝昵称', 'value' => $member_name],
  427. ['name' => '旧等级', 'value' => $old_level],
  428. ['name' => '新等级', 'value' => $this->new_level->level_name],
  429. ['name' => '时间', 'value' => date('Y-m-d H:i',time())],
  430. ['name' => '有效期', 'value' => $this->memberModel->validity.'天'],
  431. ];
  432. $msg = MessageTemp::getSendMsg($template_id, $params);
  433. if (!$msg) {
  434. return;
  435. }
  436. $news_link = MessageTemp::find($template_id)->news_link;
  437. $news_link = $news_link ?:'';
  438. MessageService::notice(MessageTemp::$template_id, $msg, $memberModel->uid,'',$news_link);
  439. }
  440. }