242 lines
11 KiB
PHP
242 lines
11 KiB
PHP
<?php
|
||
namespace Yunshop\WeightValue\models;
|
||
|
||
|
||
use app\common\models\BaseModel;
|
||
use app\common\models\member\MemberParent;
|
||
use app\common\models\OrderGoods;
|
||
use Illuminate\Support\Facades\DB;
|
||
use Yunshop\TeamDividend\models\TeamDividendAgencyModel;
|
||
|
||
class WeightValue extends BaseModel{
|
||
|
||
public $table = 'yz_weight_value';
|
||
public $timestamps = false;
|
||
|
||
|
||
/**
|
||
* Common: 购买商品赠送权重值 - 开始处理
|
||
* Author: wu-hui
|
||
* Time: 2023/10/12 15:10
|
||
* @param $model
|
||
*/
|
||
public function giveInit($model){
|
||
\Log::debug('------购买商品赠送权重值 - 开始处理------',$model->id);
|
||
DB::beginTransaction();
|
||
try{
|
||
// 当前订单全部商品
|
||
$goodsList = $this->getGoodsList($model->id);
|
||
// 获取当前用户及上级信息
|
||
$agents = $this->getParent($model->uid);// 全部上级信息(包含购买人)
|
||
// 循环处理每个商品
|
||
$changeRecord = [];// 变更记录
|
||
foreach($goodsList as $goodsInfo){
|
||
// 由于涉及到删除 使用的经销商列表重新赋值给新的变量 方便操作
|
||
$useAgentList = $agents;
|
||
// 判断:赠送等级为二级时,删除第三个用户 赠送等级:0=二级,1=三级
|
||
if($goodsInfo['lv_type'] == 1 && count($useAgentList) >= 3) unset($useAgentList[2]);
|
||
// 循环上级信息 处理每一个用户、每一个商品的赠送情况
|
||
foreach($useAgentList as $agentKey => $agentInfo){
|
||
// 用户当前的权重值
|
||
$currentAgentHasWeightValue = (float)$agents[$agentKey]['weight_value']['quantity'] ?? 0;
|
||
// 符合条件 获取当前用户应得的权重值
|
||
$weightValue = $this->getWeightValue($goodsInfo,$agentInfo);// 应得权重值
|
||
$totalWeightValue = (float)sprintf("%.2f",$goodsInfo['total'] * $weightValue);// 总数量 * 应得权重值 = 总应得权重值
|
||
// 应得权重值大于0 记录改变信息并且修改持有权重值
|
||
if((float)$totalWeightValue > 0){
|
||
$changeAfter = sprintf("%.2f",($currentAgentHasWeightValue + $totalWeightValue));
|
||
$changeRecord[] = [
|
||
'uniacid' => $model->uniacid,
|
||
'member_id' => $agentInfo['uid'],// 用户id
|
||
'team_dividend_agency_level_id' => $agentInfo['team_dividend_agency_level_id'],// 经销商等级id
|
||
'goods_id' => $goodsInfo['goods_id'],// 商品id
|
||
'order_id' => $model->id,// 订单id
|
||
'order_goods_id' => $goodsInfo['id'],// 订单商品id
|
||
'change_type' => 1,// 变更类型:0=减少,1=增加
|
||
'change_quantity' => $totalWeightValue,// 变更数量
|
||
'change_front' => (float)$currentAgentHasWeightValue,// 变更前拥有的数量
|
||
'change_after' => $changeAfter,// 变更后拥有的数量
|
||
'remark' => "订单{$model->order_sn}赠送",// 备注
|
||
'created_at' => time(),// 变更时间
|
||
];
|
||
$agents[$agentKey]['weight_value']['quantity'] = $changeAfter;
|
||
}
|
||
}
|
||
}
|
||
// 修改用户权重值变更信息 | 处理权重值变更记录
|
||
if($changeRecord){
|
||
$updateWeightValueList = array_column($agents,'weight_value');
|
||
self::updateInfo($updateWeightValueList);
|
||
WeightValueLog::insert($changeRecord);
|
||
}
|
||
|
||
DB::commit();
|
||
}catch(\Exception $e){
|
||
\Log::debug('------购买商品赠送权重值 - 错误抛出------',$e->getMessage());
|
||
DB::rollBack();
|
||
}
|
||
|
||
return;
|
||
}
|
||
/**
|
||
* Common: 购买商品赠送权重值 - 获取相关商品列表
|
||
* Author: wu-hui
|
||
* Time: 2023/10/12 11:26
|
||
* @param $orderId
|
||
* @return array
|
||
*/
|
||
private function getGoodsList($orderId){
|
||
$list = OrderGoods::uniacid()
|
||
->join('yz_goods_weight_value', 'yz_goods_weight_value.goods_id', 'yz_order_goods.goods_id')
|
||
->where('yz_order_goods.order_id',$orderId)
|
||
->where('yz_goods_weight_value.is_open',1)
|
||
->select([
|
||
'yz_order_goods.id',
|
||
'yz_order_goods.goods_id',
|
||
'yz_order_goods.total',
|
||
'yz_order_goods.title',
|
||
'yz_goods_weight_value.is_open',
|
||
'yz_goods_weight_value.gift_type',
|
||
'yz_goods_weight_value.lv_type',
|
||
'yz_goods_weight_value.quantity',
|
||
'yz_goods_weight_value.ladder'
|
||
])
|
||
->get()
|
||
->makeHidden(['order','after_sales','buttons']);
|
||
|
||
return $list ? $list->toArray() : [];
|
||
}
|
||
/**
|
||
* Common: 购买商品赠送权重值 - 获取上级信息
|
||
* Author: wu-hui
|
||
* Time: 2023/10/12 11:06
|
||
* @param $uid
|
||
* @return array
|
||
*/
|
||
private function getParent($uid){
|
||
// 获取上级信息
|
||
$parents = MemberParent::uniacid()
|
||
->where('member_id', $uid)
|
||
->select(['parent_id','level'])
|
||
->orderBy('level', 'asc')
|
||
->limit(2)// 由于最多只分三层,这里只获取直推上级及其上级
|
||
->get()
|
||
->toArray();
|
||
// 包含购买人
|
||
$parents = array_merge([['parent_id' => $uid,'level' => 0]],$parents);
|
||
$uidS = array_column($parents,'parent_id');
|
||
// 获取经销商信息
|
||
$teamDividend = TeamDividendAgencyModel::uniacid()
|
||
->select(['uid','level','is_black'])
|
||
->whereIn('uid',$uidS)
|
||
->get();
|
||
$teamDividend = $teamDividend ? $teamDividend->keyBy('uid')->toArray() : [];
|
||
// 获取相关用户的权重值信息
|
||
$weightValueList = WeightValue::uniacid()
|
||
->select(['id','member_id','team_dividend_agency_level_id','quantity'])
|
||
->whereIn('member_id',(array)$uidS)
|
||
->get()
|
||
->toArray();
|
||
$weightValueGroup = [];
|
||
foreach($weightValueList as $weightValueItem){
|
||
$weightValueGroup[$weightValueItem['member_id']][$weightValueItem['team_dividend_agency_level_id']] = $weightValueItem;
|
||
}
|
||
// 获取全部经销商 以此来获取排名信息
|
||
$allTeamDividend = TeamDividendAgencyModel::uniacid()->pluck('uid')->toArray();
|
||
$allTeamDividend = array_flip($allTeamDividend);
|
||
$agents = [];
|
||
foreach($parents as $memberInfo){
|
||
$teamDividendInfo = $teamDividend[$memberInfo['parent_id']] ?? [];
|
||
// 判断:仅经销商 且 不是黑名单的用户才会赠送
|
||
$isBlack = (int)$teamDividendInfo['is_black'] ?? 0;// 是否为黑名单
|
||
if($teamDividendInfo && $isBlack != 1) {
|
||
$teamDividendInfo['ranking'] = ((int)$allTeamDividend[$memberInfo['parent_id']] + 1);
|
||
$weightValue = $weightValueGroup[$memberInfo['parent_id']][(int)$teamDividendInfo['level']] ?? [
|
||
'uniacid' => \YunShop::app()->uniacid,
|
||
'member_id' => $memberInfo['parent_id'],
|
||
'team_dividend_agency_level_id' => (int)$teamDividendInfo['level'],
|
||
'quantity' => 0,
|
||
];
|
||
$agents[] = [
|
||
'uid' => $memberInfo['parent_id'],
|
||
'level' => $memberInfo['level'],
|
||
'team_dividend_agency_level_id' => (int)$teamDividendInfo['level'],
|
||
'weight_value' => $weightValue,
|
||
'teamDividend' => $teamDividendInfo
|
||
];
|
||
}
|
||
}
|
||
|
||
return $agents;
|
||
}
|
||
/**
|
||
* Common: 购买商品赠送权重值 - 获取应得权重值
|
||
* Author: wu-hui
|
||
* Time: 2023/10/12 14:03
|
||
* @param $currentSale
|
||
* @param $agentInfo
|
||
* @return float|int
|
||
*/
|
||
private function getWeightValue($currentSale,$agentInfo){
|
||
if((int)$currentSale['gift_type'] == 0){
|
||
// 赠送固定值
|
||
return $currentSale['quantity'];
|
||
}else if($agentInfo['teamDividend']){
|
||
// 阶梯赠送 阶梯判断条件必须按照从大到小排序
|
||
$ladderList = json_decode($currentSale['ladder'],true);
|
||
array_multisort(array_column($ladderList,'where'),SORT_ASC, $ladderList);
|
||
$ranking = (int)$agentInfo['teamDividend']['ranking'];
|
||
$weightValueNum = 0;
|
||
foreach($ladderList as $ladder){
|
||
if($ranking <= $ladder['where'] && $ranking > 0){
|
||
$weightValueNum = (float)$ladder['num'];
|
||
break;
|
||
}
|
||
}
|
||
|
||
return $weightValueNum;
|
||
}else {
|
||
return (float)0;
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* Common: 修改信息
|
||
* 必须是包含member_id、team_dividend_agency_level_id、quantity的二维数组
|
||
* Author: wu-hui
|
||
* Time: 2023/10/12 15:09
|
||
* @param $updateWeightValueList
|
||
*/
|
||
public static function updateInfo($updateWeightValueList){
|
||
// 判断:是否为二维数组
|
||
if(!is_array($updateWeightValueList[0])) $updateWeightValueList = [$updateWeightValueList];
|
||
// 循环处理 存在修改,不存在添加
|
||
foreach($updateWeightValueList as $wv){
|
||
$weightValueModel = self::uniacid()
|
||
->where('member_id',$wv['member_id'])
|
||
->where('team_dividend_agency_level_id',$wv['team_dividend_agency_level_id'])
|
||
->first();
|
||
if(!$weightValueModel) $weightValueModel = new static();
|
||
// 修改赋值
|
||
if((int)$weightValueModel->id <= 0){
|
||
$weightValueModel->uniacid = \YunShop::app()->uniacid;
|
||
$weightValueModel->member_id = $wv['member_id'];
|
||
$weightValueModel->team_dividend_agency_level_id = $wv['team_dividend_agency_level_id'];
|
||
}
|
||
$weightValueModel->quantity = (float)$wv['quantity'];
|
||
|
||
$weightValueModel->save();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
}
|