<?php
|
|
namespace app\common\model\plus\vip;
|
|
use app\common\enum\order\OrderTypeEnum;
|
use app\common\enum\plus\vip\VipAreaTypeEnum;
|
use app\common\model\BaseModel;
|
use app\common\model\user\User as UserModel;
|
use app\common\model\plus\vip\User as VipUserModel;
|
|
/**
|
* VIP专区订单模型
|
*/
|
class Order extends BaseModel
|
{
|
protected $name = 'vip_area_order';
|
protected $pk = 'id';
|
public $append = ['vip_area_type_text'];
|
|
/**
|
* VIP专区订单类型
|
* @param $value
|
* @return array
|
*/
|
public function getVipAreaTypeTextAttr($value, $data)
|
{
|
$types = VipAreaTypeEnum::getTypeName();
|
return $types[$data['vip_area_type']];
|
}
|
|
/**
|
* 订单所属用户
|
* @return \think\model\relation\BelongsTo
|
*/
|
public function user()
|
{
|
return $this->belongsTo('app\common\model\user\User');
|
}
|
|
/**
|
* VIP专区用户
|
* @return \think\model\relation\BelongsTo
|
*/
|
public function vipUser()
|
{
|
return $this->belongsTo('app\common\model\plus\vip\User', 'vip_area_user_id');
|
}
|
|
/**
|
* 关联订单主表
|
* @return \think\model\relation\BelongsTo
|
*/
|
public function orderMaster()
|
{
|
return $this->belongsTo('app\common\model\order\Order', 'order_id');
|
}
|
|
/**
|
* 推荐人用户
|
* @return \think\model\relation\BelongsTo
|
*/
|
public function referee()
|
{
|
return $this->belongsTo('app\common\model\user\User', 'referee_id');
|
}
|
|
/**
|
* 订单类型
|
* @param $value
|
* @return array
|
*/
|
public function getOrderTypeAttr($value)
|
{
|
$types = OrderTypeEnum::getTypeName();
|
return ['text' => $types[$value], 'value' => $value];
|
}
|
|
/**
|
* 订单详情 - 获取单个订单
|
*/
|
public static function getDetailByOrderId($orderId, $orderType)
|
{
|
return (new static())->where('order_id', '=', $orderId)
|
->where('order_type', '=', $orderType)
|
->find();
|
}
|
|
/**
|
* 获取订单的所有VIP专区订单记录
|
*/
|
public static function getAllDetailsByOrderId($orderId, $orderType)
|
{
|
return (new static())->where('order_id', '=', $orderId)
|
->where('order_type', '=', $orderType)
|
->select();
|
}
|
|
/**
|
* 发放VIP专区订单佣金
|
* @param $order
|
* @param int $orderType
|
* @return bool
|
* @throws \think\db\exception\DataNotFoundException
|
* @throws \think\db\exception\DbException
|
* @throws \think\db\exception\ModelNotFoundException
|
*/
|
public static function grantMoney($order, $orderType = OrderTypeEnum::MASTER)
|
{
|
// 订单是否已完成
|
if ($order['order_status']['value'] != 30) {
|
return false;
|
}
|
|
// 获取该订单的所有VIP专区订单记录
|
$models = self::getAllDetailsByOrderId($order['order_id'], $orderType);
|
if ($models->isEmpty()) {
|
return false;
|
}
|
|
// 佣金结算天数
|
$settleDays = Setting::getItem('settlement', $order['app_id'])['settle_days'];
|
$success = false;
|
|
// 处理每个VIP专区订单
|
foreach ($models as $model) {
|
// 跳过已结算的订单
|
if ($model['is_settled'] == 1) {
|
continue;
|
}
|
|
// 写入结算时间
|
$deadlineTime = $model['settle_time'] ?: 0;
|
if ($deadlineTime == 0) {
|
$deadlineTime = $order['receipt_time'] + $settleDays * 86400;
|
$model->save([
|
'settle_time' => $deadlineTime
|
]);
|
}
|
|
// 未到结算时间,跳过
|
if ($deadlineTime > time()) {
|
continue;
|
}
|
if ($model['vip_area_user_id'] != 0) {
|
User::grantMoney($model['vip_area_user_id'], $model['vip_area_money'], VipAreaTypeEnum::getTypeName()[$model['vip_area_type']]);
|
}
|
// 发放下级收益补贴给下级用户(当下级获得推广佣金或复购佣金时)
|
if ($model['vip_area_type'] == 10 || $model['vip_area_type'] == 20) {
|
// 获取下级用户的推荐人(即上级用户)
|
$superiorUser = UserModel::detail($model['vip_area_user_id']);
|
if ($superiorUser && $superiorUser['referee_id']) {
|
if (UserModel::getOperatingSubsidy($superiorUser['referee_id'],Setting::getItem('basic', $order['app_id']))){
|
$vipUser = VipUserModel::detail($superiorUser['referee_id']);
|
if (!empty($vipUser)){
|
if ($vipUser['grade']['operating_subsidy'] > 0) {
|
// 获取补贴比例设置
|
$subsidyRate = $vipUser['grade']['operating_subsidy'];
|
// 计算下级收益补贴
|
$subsidyAmount = bcmul($model['vip_area_money'], bcdiv((string)$subsidyRate, '100', 4), 2);
|
User::grantMoney($superiorUser['referee_id'], $subsidyAmount, '下级收益补贴');
|
// 记录分销订单
|
self::createDistributionOrder($order, $superiorUser['referee_id'], $subsidyAmount, 'vip_subsidy', $model['vip_area_money']);
|
}
|
}
|
|
}
|
|
}
|
}
|
|
// 发放平台直推佣金(满足直推条件后)
|
//self::grantPlatformCommission($order, $model);
|
|
// 更新VIP订单记录
|
$model->save([
|
'is_settled' => 1,
|
'settle_time' => time()
|
]);
|
|
$success = true;
|
}
|
|
return $success;
|
}
|
|
/**
|
* 发放平台直推佣金(已弃用)
|
* @param $order
|
* @param $model
|
* @return void
|
*/
|
protected static function grantPlatformCommission($order, $model)
|
{
|
// 获取平台直推佣金设置
|
$setting = Setting::getItem('basic', $order['app_id']);
|
$requiredReferralCount = $setting['referee_buy_count'] ?? 0;
|
|
// 如果设置了直推条件且用户有推荐人
|
if ($requiredReferralCount > 0 && $model['vip_area_user_id'] > 0) {
|
// 检查推荐人是否满足直推条件(直推用户数量)
|
$directReferralsCount = UserModel::where('referee_id', '=', $model['vip_area_user_id'])->count();
|
|
if ($directReferralsCount >= $requiredReferralCount) {
|
// 计算平台直推佣金
|
$platformCommissionRate = $setting['platform_commission_rate'] ?? 5;
|
$platformCommissionAmount = bcmul($model['order_price'], bcdiv((string)$platformCommissionRate, '100', 4), 2);
|
|
// 发放平台直推佣金
|
User::grantMoney($model['vip_area_user_id'], $platformCommissionAmount, '平台直推佣金');
|
|
// 记录分销订单
|
self::createDistributionOrder($order, $model['vip_area_user_id'], $platformCommissionAmount, 'platform_commission', $model['vip_area_money']);
|
}
|
}
|
}
|
|
/**
|
* 创建分销订单记录
|
* @param $order
|
* @param $userId
|
* @param $amount
|
* @param $type
|
* @return bool
|
*/
|
protected static function createDistributionOrder($order, $userId, $amount, $type, $subordinate_money)
|
{
|
// 创建分销订单记录以跟踪各种类型的佣金
|
$distributionOrder = new self();
|
$vip_area_type = 0;
|
switch ($type) {
|
case 'vip_subsidy':
|
$vip_area_type = 30; // VIP专区补贴
|
break;
|
case 'platform_commission':
|
$vip_area_type = 40; // 平台直推佣金
|
break;
|
}
|
|
return $distributionOrder->save([
|
'user_id' => $userId,
|
'order_id' => $order['order_id'],
|
'order_type' => OrderTypeEnum::MASTER,
|
'order_price' => $order['pay_price'],
|
'vip_area_user_id' => $userId,
|
'referee_id' => $order['user_id'], // 被推荐人
|
'vip_area_money' => $amount,
|
'subordinate_money' => $subordinate_money,
|
'team_revenue' => 0,
|
'vip_area_type' => $vip_area_type,
|
'is_settled' => 1,
|
'settle_time' => time(),
|
'app_id' => $order['app_id']
|
]);
|
}
|
|
/**
|
* 创建VIP专区订单记录
|
* @param array $order 订单信息数组
|
* @param int $order_type 订单类型,默认为OrderTypeEnum::MASTER
|
* @return bool|\think\Collection 是否成功创建订单
|
*/
|
public static function createOrder($order, $order_type = OrderTypeEnum::MASTER)
|
{
|
try {
|
// VIP专区订单模型
|
$model = new self;
|
// VIP专区基本设置
|
$setting = Setting::getItem('basic', $order['app_id']);
|
// 是否开启VIP专区功能
|
if (!$setting['is_open']) {
|
return false;
|
}
|
$data = [
|
'user_id' => $order['user_id'],
|
'order_id' => $order['order_id'],
|
'order_type' => $order_type,
|
'order_price' => $order['pay_price'],
|
'settlement_price' => $order['settlement_price'],
|
'vip_area_user_id' => 0,
|
'referee_id' => 0,
|
'vip_area_money' => 0,
|
'vip_area_type' => 0,
|
'is_settled' => 0,
|
'settle_time' => 0,
|
'app_id' => $order['app_id']
|
];
|
$list = [];
|
// 计算佣金金额
|
$orderPrice = bcsub(bcsub($order['pay_price'], $order['express_price'], 2), $order['settlement_price'], 2);
|
//$viewpoint_money = 0;
|
// 获取当前买家的推荐人信息
|
$userModel = UserModel::detail($order['user_id']);
|
if (!empty($userModel) && !empty($userModel['referee_id'])) {
|
// 检查推荐人是否为VIP专区用户
|
$vipUser = User::detail($userModel['referee_id']);
|
if ($vipUser) {
|
$data['vip_area_user_id'] = $vipUser['user_id'];
|
$data['referee_id'] = $userModel['referee_id'];
|
// 获取VIP等级设置
|
$vipGrade = Grade::detail($vipUser['grade_id']);
|
if ($vipGrade) {
|
$config = Setting::getItem('basic', $order['app_id']);
|
$purchase_count = (new self())->getPurchaseCount($order['user_id']);
|
$vip_quantity=0;
|
$product_price_repurchase=0;
|
foreach ($order['product'] as $product) {
|
/*if ($product['is_repurchase'] == 1) {
|
$viewpoint_money = bcadd($viewpoint_money, ($product['is_viewpoint_money'] ? $product['viewpoint_money'] : $vipGrade['viewpoint_money']), 2);
|
}*/
|
if (in_array($product['product_id'], $config['become__buy_product_ids']) || $product['is_vip']) {
|
// 获取VIP专区商品数量
|
$vip_quantity = bcadd($vip_quantity, $product['total_num'], 2);
|
// 为每个商品生成分红订单
|
/*for ($i = 0; $i < $quantity; $i++) {
|
if ($purchase_count == 1) {
|
$list[] = array_merge($data, ['vip_area_type' => 10, 'vip_area_money' => $vipGrade['agent_money'], 'is_vip' => 1, 'purchase_count' => $purchase_count]);
|
$purchase_count++;
|
} else {
|
if ($vipGrade['repurchase_money'] > 0) {
|
$list[] = array_merge($data, ['vip_area_type' => 20, 'vip_area_money' => $vipGrade['repurchase_money'], 'is_vip' => 1, 'purchase_count' => $purchase_count]);
|
$purchase_count++;
|
}
|
}
|
}*/
|
}
|
//复购专区利润
|
if($product['is_repurchase']){
|
$product_price_repurchase=bcadd($product_price_repurchase, bcsub($product['total_pay_price'], $product['total_settlement_price'], 2));
|
|
}
|
}
|
if ($vip_quantity>0){
|
if ($purchase_count == 1) {
|
$list[] = array_merge($data, ['vip_area_type' => 10, 'vip_area_money' => bcmul($vipGrade['agent_money'],$vip_quantity,2), 'is_vip' => 1, 'purchase_count' => $purchase_count]);
|
} else {
|
if ($vipGrade['repurchase_money'] > 0) {
|
$list[] = array_merge($data, ['vip_area_type' => 20, 'vip_area_money' => bcmul($vipGrade['repurchase_money'],$vip_quantity,2), 'is_vip' => 1, 'purchase_count' => $purchase_count]);
|
}
|
}
|
}
|
if ($product_price_repurchase>0){
|
//复购专区级差奖
|
if ($setting['jcaward']){
|
$refereeJc=User::getAllJcUser($userModel['user_id']);
|
foreach ($refereeJc as $v){
|
if ( (new User())->getViewpointMoneyQualification($v['user_id'], $setting)){
|
$list[] = array_merge($data, ['vip_area_type' => 70, 'vip_area_money' =>bcmul($product_price_repurchase, bcdiv($v['bonus_percent'], 100, 4), 2),'vip_area_user_id'=>$v['user_id']]);
|
}
|
|
}
|
}
|
//复购专区平级奖
|
if ($setting['pjaward']){
|
$refereeJc=User::getAllPjUser($userModel['user_id'],$setting['pjaward_level']);
|
foreach ($refereeJc as $v){
|
if ((new User())->getViewpointMoneyQualification($v['user_id'], $setting)) {
|
$list[] = array_merge($data, ['vip_area_type' => 80, 'vip_area_money' => bcmul($product_price_repurchase, bcdiv($v['bonus_percent'], 100, 4), 2), 'vip_area_user_id' => $v['user_id']]);
|
}
|
}
|
}
|
}
|
|
// 检查并处理直推佣金
|
$directReferralsCount = 0;
|
$user = UserModel::detail($order['user_id']);
|
//见点奖
|
/* if (!empty($user['referee_id'])) {
|
if ($viewpoint_money > 0 && (new User())->getViewpointMoneyQualification($user['referee_id'], $setting)) {
|
$list[] = array_merge($data, ['vip_area_type' => 60, 'vip_area_money' => $viewpoint_money]);
|
}
|
}*/
|
$requiredReferralCount = $setting['referee_buy_count'] ?? 0;
|
if (!empty($user['referee_id'])) {
|
// 检查推荐人是否满足直推条件(直推用户数量)
|
$directReferralsCount = UserModel::where('referee_id', '=', $user['referee_id'])->count();
|
}
|
if ($vipGrade['commission'] > 0 && $directReferralsCount >= $requiredReferralCount && $orderPrice > 0) {
|
// 计算平台直推佣金金额
|
$commissionAmount = bcmul($orderPrice, bcdiv($vipGrade['commission'], '100', 4), 2);
|
$list[] = array_merge($data, ['vip_area_type' => 40, 'vip_area_money' => $commissionAmount]);
|
}
|
}
|
}
|
}
|
// 处理供应商推荐人佣金
|
if ($order['supplier']['referee_id'] != 0) {
|
$supplierReferee = VipUserModel::detail($order['supplier']['referee_id']);
|
if ($supplierReferee) {
|
$vipGradeSupplier = Grade::detail($supplierReferee['grade_id']);
|
if ($vipGradeSupplier['supplier_money'] > 0 && $orderPrice > 0) {
|
// 计算直推店铺交易额佣金金额
|
$supplier_money = bcmul($orderPrice, bcdiv($vipGrade['supplier_money'], '100', 4), 2);
|
$list[] = array_merge($data, ['vip_area_type' => 50, 'vip_area_money' => $supplier_money, 'vip_area_user_id' => $supplierReferee['user_id'], 'referee_id' => $supplierReferee['referee_id']]);
|
}
|
}
|
}
|
log_write($list);
|
if (empty($list)) {
|
return true;
|
}
|
// 保存VIP专区订单记录
|
return $model->saveAll($list);
|
} catch (\Exception $e) {
|
log_write('创建VIP专区订单失败:' . $e->getMessage());
|
return false;
|
}
|
|
}
|
|
public function getPurchaseCount($user_id)
|
{
|
return self::where(['user_id' => $user_id, 'is_vip' => 1,'is_invalid'=>0])->count() + 1;
|
}
|
}
|