bztang-admin/app/common/services/member/level/LevelUpgradeService.php

517 lines
20 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Author:
* Date: 2017/5/25
* Time: 下午4:55
*/
namespace app\common\services\member\level;
use app\common\events\member\MemberLevelUpgradeEvent;
use app\common\events\member\MemberLevelValidityEvent;
use app\common\events\order\AfterOrderPaidEvent;
use app\common\events\order\AfterOrderReceivedEvent;
use app\common\facades\Setting;
use app\common\models\Member;
use app\common\models\member\MemberChildren;
use app\common\models\MemberLevel;
use app\common\models\MemberShopInfo;
use app\common\models\notice\MessageTemp;
use app\common\models\Order;
use app\common\services\MessageService;
use app\common\services\notice\official\MemberUpgradeNotice;
use Yunshop\UniversalCard\models\ConsumeCoupon;
use Yunshop\UniversalCard\models\ConsumeCouponLog;
use Yunshop\UniversalCard\models\UniversalCardLevel;
use Yunshop\UniversalCard\services\MsgSendService;
use Exception;
class LevelUpgradeService
{
private $orderModel;
private $orderId;
private $memberModel;
private $new_level;
private $validity;
public function test($order)
{
$this->orderModel = $order;
$this->memberModel = MemberShopInfo::ofMemberId($this->orderModel->uid)->withLevel()->first();
$result = $this->check(0);
dd('ok');
exit;
$this->setValidity($result); // 设置会员等级期限
if ($result) {
return $this->upgrade($result);
}
return '';
}
/*
* 插件奖励会员等级升级
* 插件:企业微信好友分裂、
* member_id:升级的会员id
* after_level 要升级到的会员等级yz_member_level表模型
*/
public function pluginUpgrade($member_id, $after_level)
{
try {
\Log::debug('会员等级升级-插件升级开始' . $member_id, $after_level);
if (!$this->memberModel = MemberShopInfo::ofMemberId($member_id)->withLevel()->first()) {
throw new Exception('会员不存在');
}
$this->check(0, $after_level);
$member_level_weight = intval($this->memberModel->level->level) ?: 0;
$this->validity['is_goods'] = 1;
$this->validity['goods_total'] = 1;
if ($after_level->level > $member_level_weight){
$this->validity['upgrade'] = 1;
$this->validity['superposition'] = 1;
}
$this->setValidity($after_level->level > $member_level_weight);
if ($this->validity['upgrade'] && $this->upgrade($after_level->id) !== true) {
throw new Exception('未知原因');
}
\Log::debug('会员等级升级-插件升级结束' . $member_id, $after_level);
return ['result' => 1, 'msg' => '成功', 'data' => []];
} catch (Exception $e) {
return ['result' => 0, 'msg' => '会员等级升级失败:' . $e->getMessage(), 'data' => []];
}
}
public function checkUpgrade(AfterOrderReceivedEvent $event)
{
//event(new AfterOrderReceivedEvent(Order::where('status',3)->first()));
$this->orderId = $event->getOrderModel()->id;
$this->orderModel = Order::find($event->getOrderModel()->id);//$event->getOrderModel();
$uniacid = $this->orderModel->uniacid;
\Setting::$uniqueAccountId = \YunShop::app()->uniacid = $uniacid;
$this->memberModel = MemberShopInfo::ofMemberId($this->orderModel->uid)->withLevel()->first();
if (is_null($this->memberModel)) {
\Log::info('---==会员不存在==----');
return;
}
$result = $this->check(0);
\Log::info('---==check方法结果==----', $result);
$this->setValidity($result); // 设置会员等级期限
if ($result) {
return $this->upgrade($result);
}
return '';
}
public function checkUpgradeAfterPaid(AfterOrderPaidEvent $event)
{
$this->orderId = $event->getOrderModel()->id;
$this->orderModel = $event->getOrderModel();
$uniacid = $this->orderModel->uniacid;
\Setting::$uniqueAccountId = \YunShop::app()->uniacid = $uniacid;
//\Event::getListeners('app\common\events\order\AfterOrderPaidEvent');
// \Log::debug('checkUpgradeAfterPaid');
$set = \Setting::get('shop.member');
/*if (!is_null($set)) {
$uniacid = $this->orderModel->uniacid;
\Setting::$uniqueAccountId = \YunShop::app()->uniacid = $uniacid;
$set = Setting::get('shop.member');
}*/
if ($set['level_after'] != 1) {
return;
}
$this->memberModel = MemberShopInfo::ofMemberId($this->orderModel->uid)->withLevel()->first();
if (is_null($this->memberModel)) {
return;
}
$result = $this->check(1);
$this->setValidity($result); // 设置会员等级期限
if ($result) {
return $this->upgrade($result);
}
return '';
}
public function setValidity($isUpgrate = false)
{
$set = \Setting::get('shop.member');
if (!$set['term']) {
return;
}
if (!$this->validity['is_goods']) {
return;
}
$current_level_id = '';
if ($this->validity['upgrade']) {
$current_level_id = $this->new_level->id;
$validity = $this->new_level->validity * $this->validity['goods_total'];
} else {
//bug 会员当前等级 > 新的等级 有效期不应该叠加, 当等级相等时才叠加
//$validity = $this->memberModel->validity + $this->new_level->validity * $this->validity['goods_total'];
if ($this->validity['superposition']) {
$current_level_id = $this->memberModel->level->id;
$validity = $this->memberModel->validity + $this->new_level->validity * $this->validity['goods_total'];
}
}
if (isset($validity)) {
//一卡通消费券
if (app('plugins')->isEnabled('consume-coupon-switch') && Setting::get('plugin.consume_coupon_switch.status') == 1) {
if (app('plugins')->isEnabled('universal-card') && Setting::get('plugin.universal_card.switch') == 1) {
$consume_coupon = ConsumeCoupon::uniacid()->where('member_id', $this->memberModel->member_id)->first();
$universalCardLevel = UniversalCardLevel::uniacid()->where('member_level_id', $current_level_id)->first();
if ($universalCardLevel->consume_coupon_num) {
$get_consume_coupon = $universalCardLevel->consume_coupon_num * $this->validity['goods_total'];
if ($consume_coupon) {
$consume_coupon->amount = $consume_coupon->amount + $get_consume_coupon;
} else {
$consume_coupon = new ConsumeCoupon();
$consume_coupon->uniacid = $this->memberModel->uniacid;
$consume_coupon->member_id = $this->memberModel->member_id;
$consume_coupon->amount = $consume_coupon->amount + $get_consume_coupon;
}
$consume_coupon->amount = round($consume_coupon->amount, 2);
$consume_coupon->status = 1;
if ($consume_coupon->save()) {
$data = [
'uniacid' => \YunShop::app()->uniacid,
'member_id' => $this->memberModel->member_id,
'store_id' => 0,
'order_id' => $this->orderModel->id,
'type' => 1,
'amount' => $get_consume_coupon,
'created_at' => time(),
];
ConsumeCouponLog::create($data);
MsgSendService::getConsumeCoupon($get_consume_coupon, $this->memberModel->member_id);
};
}
}
}
$this->memberModel->validity = $validity;
$this->memberModel->downgrade_at = 0;
$this->memberModel->save();
if (!$isUpgrate) {
$levelId = intval($this->new_level->id);
event(new MemberLevelValidityEvent($this->memberModel, $this->validity['goods_total'], $levelId));
}
}
}
private function check($status,$new_level = null)
{
$set = \Setting::get('shop.member');
\Log::info('---==等级设置信息==----', [unserialize($set), json_decode($set, true)]);
if (!$new_level) {
//获取可升级的最高等级
switch ($set['level_type']) {
case 0:
$this->new_level = $this->checkOrderMoney();
break;
case 1:
$this->new_level = $this->checkOrderCount();
break;
case 2:
if ($status == 1) {
if ($set['level_after']) {
$this->new_level = $this->checkGoodsId();
}
} else {
if (!$set['level_after']) {
$this->new_level = $this->checkGoodsId();
}
}
break;
case 3:
// 此方法不返回新等级,升级单独处理
$this->new_level = $this->checkTeamPerformance();
break;
default:
$level = '';
}
} else {
$this->new_level = $new_level;
}
\Log::debug('判断是否升级',$this->new_level);
//比对当前等级权重,判断是否升级
if ($this->new_level) {
$memberLevel = isset($this->memberModel->level->level) ? $this->memberModel->level->level : 0;
\Log::info('---==会员等级信息==----', [$memberLevel, $this->new_level->level]);
if ($this->new_level->level == $memberLevel) {
$this->validity['superposition'] = true; //会员期限叠加
}
if ($this->new_level->level > $memberLevel) {
$this->validity['upgrade'] = true; // 会员期限 升级 期限叠加
return $this->new_level->id;
}
return '';
}
return '';
}
/**
* 会员完成订单总金额,返回对应最高会员等级数组
* @return mixed
*/
private function checkOrderMoney()
{
$set = \Setting::get('shop.member');
if ($set['level_after'] == 1) {
//付款后
$orderMoney = Order::where('uid', $this->orderModel->uid)->whereBetween('status', [Order::WAIT_SEND,Order::COMPLETE])->sum('price');
} else {
//完成后
$orderMoney = Order::where('uid', $this->orderModel->uid)->where('status', Order::COMPLETE)->sum('price');
}
//获取满足条件的最高等级
$level = MemberLevel::uniacid()->select('id', 'level', 'level_name')->whereBetween('order_money', [1, $orderMoney])->orderBy('level', 'desc')->first();
return $level;
}
/**
* 团队业绩(自购+一级+二级)
* @return mixed
*/
private function checkTeamPerformance()
{
$set = \Setting::get('shop.member');
// 这重新查询是因为orderModel的uid是435但是实际下单的人事438,为啥,不知道.懵逼
$order = Order::find($this->orderId);
$this->memberModel = MemberShopInfo::ofMemberId($order->uid)->withLevel()->first();
$uidArr = [
$this->memberModel->member_id
];
if ($this->memberModel->parent_id) {
$uidArr[] = $this->memberModel->parent_id;
$oneParent = MemberShopInfo::select(['member_id', 'parent_id'])
->where('member_id', $this->memberModel->parent_id)
->first();
if ($oneParent->parent_id) {
$uidArr[] = $oneParent->parent_id;
}
}
$status = Order::COMPLETE;
if ($set['level_after'] == 1) {
//付款后
$status = Order::WAIT_SEND;
}
foreach ($uidArr as $uid) {
$teamPerformance = MemberChildren::select(['yz_member_children.child_id', 'yz_member_children.member_id', 'yz_member_children.level'])
->join('yz_order','yz_member_children.child_id','=','yz_order.uid')
->where('yz_order.status', '>=', $status)
->where('yz_member_children.level', '<', 3)
->where('yz_member_children.member_id', $uid)
->sum('yz_order.price');
$teamPerformance += Order::where('uid', $uid)
->where('status', '>=', $status)
->sum('price');
//获取满足条件的最高等级
$level = MemberLevel::uniacid()
->select('id', 'level', 'level_name')
->whereBetween('team_performance', [1, $teamPerformance])
->orderBy('level', 'desc')
->first();
if ($level) {
$memberModel = MemberShopInfo::ofMemberId($uid)->withLevel()->first();
//查询会员不存在则不升级
if (is_null($memberModel)) {
continue;
}
$memberLevel = isset($memberModel->level->level) ? $memberModel->level->level : 0;
if ($level->level > $memberLevel) {
$memberModel->level_id = $level->id;
$memberModel->upgrade_at = time();
if ($memberModel->save()) {
//会员等级升级触发事件
event(new MemberLevelUpgradeEvent($memberModel,false));
$pluginLevel=[
'member_id'=>$memberModel->member_id,
'level_id'=>$memberModel->level_id,
'plugin_type' => 1
];
event(new \app\common\events\PluginLevelEvent($pluginLevel));
$this->notice($level);
}
}
}
}
return '';
}
/**
* 会员完成订单总数量,返回对应最高会员等级数组
* @return mixed
*/
private function checkOrderCount()
{
$set = \Setting::get('shop.member');
if ($set['level_after'] == 1) {
//付款后
$orderCount = Order::where('uid', $this->orderModel->uid)->whereBetween('status', [Order::WAIT_SEND,Order::COMPLETE])->count();
} else {
//完成后
$orderCount = Order::where('uid', $this->orderModel->uid)->where('status', Order::COMPLETE)->count();
}
$level = MemberLevel::uniacid()->select('id', 'level', 'level_name')->whereBetween('order_count', [1, $orderCount])->orderBy('level', 'desc')->first();
return $level;
}
/**
* 当前订单中满足升级会员等级的 最高会员等级数组,空返回 array
* @return array
*/
private function checkGoodsId()
{
$reallevel = [];
$goodsIds = array_pluck($this->orderModel->hasManyOrderGoods->toArray(), 'goods_id');
\Log::debug('---==get_order_model==---', $this->orderModel);
\Log::debug('---==get_member_model==---', $this->memberModel);
// $level = MemberLevel::uniacid()->select('id', 'level', 'level_name', 'goods_id', 'validity')->whereIn('goods_id', $goodsIds)->orderBy('level', 'desc')->first(); // 原先逻辑为购买指定某一商品即可升级, 现为购买指定任易商品即可升级
//获取
$levelid = MemberLevel::find($this->memberModel->level_id);
\Log::debug('---==levelid==---', $levelid);
$levels = MemberLevel::uniacid()->where('level', '>=', $levelid->level ? : 0)->select('id', 'level', 'level_name', 'goods_id', 'validity')->orderBy('level', 'desc')->get();
\Log::debug('---==levels==---', $levels);
$this->validity['is_goods'] = true; // 商品升级 开启等级期限
foreach ($this->orderModel->hasManyOrderGoods as $time) {
// if ($time->goods_id == $level->goods_id) { // 原先逻辑为购买指定某一商品即可升级, 现为购买指定任易商品即可升级
foreach ($levels as $level) {
$levelGoodsId = explode(',', $level->goods_id);
\Log::debug('---==levelGoodsId==---', $levelGoodsId);
\Log::debug('---==checkInarray==---', in_array($time->goods_id, $levelGoodsId));
if (in_array($time->goods_id, $levelGoodsId)) {
$this->validity['goods_total'] = $time->total;
$reallevel = MemberLevel::find($level->id);
\Log::debug('---===member_level_upgrade===---', $time->total);
//开启一卡通
if (app('plugins')->isEnabled('universal-card')) {
if ($time->goods_option_id) {
$reallevel->validity = (new \Yunshop\UniversalCard\services\LevelUpgradeService())->upgrade($level->id, $time->goods_option_id);
}
}
}
}
}
// return $level ?: [];
return $reallevel;
}
private function upgrade($levelId)
{
$this->memberModel->level_id = $levelId;
$this->memberModel->upgrade_at = time();
if ($this->memberModel->save()) {
//会员等级升级触发事件
$pluginLevel=[
'member_id'=>$this->orderModel->uid,
'level_id'=>$levelId,
'plugin_type' => 1
];
event(new MemberLevelUpgradeEvent($this->memberModel,false));
event(new \app\common\events\PluginLevelEvent($pluginLevel));
event(new MemberLevelValidityEvent($this->memberModel, $this->validity['goods_total'], $levelId));
$this->notice();
\Log::info('会员ID' . $this->memberModel->member_id . '会员等级升级成功等级ID' . $levelId);
} else {
\Log::info('会员ID' . $this->memberModel->member_id . '会员等级升级失败等级ID' . $levelId);
}
//todo 会员等级升级通知
return true;
}
private function notice($newLevel = null)
{
//$template_id = \Setting::get('shop.notice.customer_upgrade');
if(!empty($this->new_level)){
$memberNotice = new MemberUpgradeNotice($this->memberModel,$this->new_level);
}elseif (!empty($newLevel)){
$memberNotice = new MemberUpgradeNotice($this->memberModel,$newLevel);
}else{
\Log::debug("会员升级消息--新等级信息为空",[$this->memberModel,$newLevel]);
return true;
}
$memberNotice->sendMessage();
return ;
if (!trim($template_id)) {
return '';
}
$memberModel = Member::select('uid', 'nickname', 'realname')->where('uid', $this->memberModel->member_id)->with('hasOneFans')->first();
$member_name = $memberModel->realname ?: $memberModel->nickname;
$set = \Setting::get('shop.member');
$old_level = $set['level_name'] ?: '普通会员';
$old_level = $this->memberModel->level->level_name ?: $old_level;
$params = [
['name' => '粉丝昵称', 'value' => $member_name],
['name' => '旧等级', 'value' => $old_level],
['name' => '新等级', 'value' => $this->new_level->level_name],
['name' => '时间', 'value' => date('Y-m-d H:i',time())],
['name' => '有效期', 'value' => $this->memberModel->validity.'天'],
];
$msg = MessageTemp::getSendMsg($template_id, $params);
if (!$msg) {
return;
}
$news_link = MessageTemp::find($template_id)->news_link;
$news_link = $news_link ?:'';
MessageService::notice(MessageTemp::$template_id, $msg, $memberModel->uid,'',$news_link);
}
}