bztang-admin/plugins/weight-value/src/models/WeightValue.php

242 lines
11 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
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();
}
}
}