6
0
Fork 0

优化分销预收益

release
李静 2021-12-28 19:43:03 +08:00
parent 9e0bfa86bd
commit e7adab6c49
7 changed files with 258 additions and 99 deletions

View File

@ -54,6 +54,7 @@ class UserInfo extends Model
'quota_v1', 'quota_v1',
'quota_v2', 'quota_v2',
'growth_value', 'growth_value',
'pre_growth_value',
'group_sales_value', 'group_sales_value',
]; ];
@ -160,6 +161,34 @@ class UserInfo extends Model
return []; return [];
} }
/**
* 变更预收益成长值
*
* @param float $growthValue
* @return void
*/
public function incrPreGrowthValue($growthValue)
{
if (bccomp($growthValue, '0', 2) === 0) {
return;
}
// 增加预收益的成长值
$this->increment('pre_growth_value', $growthValue);
$compared = bccomp(bcadd($this->growth_value, $this->pre_growth_value, 2), '650', 2);
if ($this->agent_level === 1 && $compared < 0) {
$this->update([
'agent_level' => 0,
]);
} elseif ($this->agent_level === 0 && $compared >= 0) {
$this->update([
'agent_level' => 1,
]);
}
}
/** /**
* 代理等级排名 * 代理等级排名
* *

View File

@ -359,7 +359,36 @@ class AfterSaleService
{ {
if ($this->isWaitFinance($afterSale)) { if ($this->isWaitFinance($afterSale)) {
$order = $afterSale->order; $order = $afterSale->order;
$afterSaleProduct = $afterSale->orderProduct;
// 售后变更的销售值
$salesValue = '0';
if (in_array($afterSale->type, [AfterSale::TYPE_REFUND_AND_RETURN, AfterSale::TYPE_REFUND])) { if (in_array($afterSale->type, [AfterSale::TYPE_REFUND_AND_RETURN, AfterSale::TYPE_REFUND])) {
if ($afterSaleProduct->total_amount > 0) {
// 总销售值
$totalSalesValue = bcmul($afterSaleProduct->sales_value, $afterSaleProduct->quantity);
// 售后变更金额
$amount = $afterSale->amount;
if ($amount >= $afterSaleProduct->total_amount) {
$amount = $afterSaleProduct->total_amount;
}
$changeSalesValue = bcmul($totalSalesValue, $amount, 2);
$changeSalesValue = bcdiv($changeSalesValue, $afterSaleProduct->total_amount, 3);
// 四舍五入(保留两位小数)
$salesValue = round($changeSalesValue, 2);
} else {
$qty = $afterSale->num;
if ($qty > $afterSaleProduct->quantity) {
$qty = $afterSaleProduct->quantity;
}
$salesValue = bcmul($afterSaleProduct->sales_value, $qty, 2);
}
//执行实际退款操作; //执行实际退款操作;
if ($afterSale->amount > 0) {//退款金额大于0才做实际退款 if ($afterSale->amount > 0) {//退款金额大于0才做实际退款
$order->refundLogs()->create([ $order->refundLogs()->create([
@ -369,17 +398,25 @@ class AfterSaleService
]); ]);
} }
} elseif (in_array($afterSale->type, [AfterSale::TYPE_CHANGE])) {//换货流程 } elseif (in_array($afterSale->type, [AfterSale::TYPE_CHANGE])) {//换货流程
$qty = $afterSale->num;
if ($qty > $afterSaleProduct->quantity) {
$qty = $afterSaleProduct->quantity;
}
$salesValue = bcmul($afterSaleProduct->sales_value, $qty, 2);
//复制一个订单存商品价格支付价格为0; //复制一个订单存商品价格支付价格为0;
$changeOrder = new Order(); $changeOrder = new Order();
$changeOrder->user_id = $order->user_id; $changeOrder->user_id = $order->user_id;
$changeOrder->sn = serial_number(); $changeOrder->sn = serial_number();
$changeOrder->products_total_amount = bcmul($afterSale->orderProduct->sell_price, $afterSale->num); $changeOrder->products_total_amount = bcmul($afterSaleProduct->sell_price, $afterSale->num);
$changeOrder->coupon_discount_amount = 0; $changeOrder->coupon_discount_amount = 0;
$changeOrder->vip_discount_amount = bcmul(($afterSale->orderProduct->sell_price-$afterSale->orderProduct->vip_price), $afterSale->num); $changeOrder->vip_discount_amount = bcmul(($afterSaleProduct->sell_price-$afterSaleProduct->vip_price), $afterSale->num);
$changeOrder->reduced_amount = 0; $changeOrder->reduced_amount = 0;
$changeOrder->shipping_fee = 0; $changeOrder->shipping_fee = 0;
$changeOrder->total_amount = 0; $changeOrder->total_amount = 0;
$changeOrder->sales_value = $salesValue;
// 收货地址 // 收货地址
$changeOrder->consignee_name = $order->consignee_name; $changeOrder->consignee_name = $order->consignee_name;
@ -394,20 +431,20 @@ class AfterSaleService
OrderProduct::create([ OrderProduct::create([
'user_id' => $changeOrder->user_id, 'user_id' => $changeOrder->user_id,
'order_id' => $changeOrder->id, 'order_id' => $changeOrder->id,
'gift_for_sku_id' => $afterSale->orderProduct->gift_for_sku_id, 'gift_for_sku_id' => $afterSaleProduct->gift_for_sku_id,
'spu_id' => $afterSale->orderProduct->spu_id, 'spu_id' => $afterSaleProduct->spu_id,
'sku_id' => $afterSale->orderProduct->sku_id, 'sku_id' => $afterSaleProduct->sku_id,
'category_id' => $afterSale->orderProduct->category_id, 'category_id' => $afterSaleProduct->category_id,
'name' => $afterSale->orderProduct->name, 'name' => $afterSaleProduct->name,
'specs' => $afterSale->orderProduct->specs, 'specs' => $afterSaleProduct->specs,
'cover' => $afterSale->orderProduct->cover, 'cover' => $afterSaleProduct->cover,
'weight' => $afterSale->orderProduct->weight, 'weight' => $afterSaleProduct->weight,
'sell_price' => $afterSale->orderProduct->sell_price, 'sell_price' => $afterSaleProduct->sell_price,
'vip_price' => $afterSale->orderProduct->vip_price, 'vip_price' => $afterSaleProduct->vip_price,
'sales_value' => $afterSale->orderProduct->sales_value, 'sales_value' => $afterSaleProduct->sales_value,
'quantity' => $afterSale->num, 'quantity' => $afterSale->num,
'coupon_discount_amount'=> 0, 'coupon_discount_amount'=> 0,
'vip_discount_amount' => $afterSale->orderProduct->sell_price - $afterSale->orderProduct->vip_price, 'vip_discount_amount' => $afterSaleProduct->sell_price - $afterSaleProduct->vip_price,
'reduced_amount' => 0, 'reduced_amount' => 0,
'total_amount' => $afterSale->amount, 'total_amount' => $afterSale->amount,
]); ]);
@ -419,7 +456,18 @@ class AfterSaleService
]); ]);
} }
if (in_array($afterSale->type, [ $afterSale->update([
'sales_value' => $salesValue,
'state' => AfterSale::STATE_FINISH,
'remarks' => $remarks,
]);
$afterSale->logs()->create([
'name' => '财务审核',
'desc' => $remarks,
]);
if (! $afterSaleProduct->isGift() && in_array($afterSale->type, [
AfterSale::TYPE_REFUND_AND_RETURN, AfterSale::TYPE_REFUND_AND_RETURN,
AfterSale::TYPE_REFUND, AfterSale::TYPE_REFUND,
AfterSale::TYPE_CHANGE, AfterSale::TYPE_CHANGE,
@ -431,15 +479,9 @@ class AfterSaleService
]); ]);
} }
AfterSaleLog::create([ if (bccomp($afterSale->sales_value, '0', 2) === 1) {
'after_sale_id' => $afterSale->id, $order->user->userInfo->incrPreGrowthValue(bcmul($afterSale->sales_value, '-1', 2));
'name' => '财务审核', }
'desc' => $remarks,
]);
$afterSale->update([
'state' => $afterSale::STATE_FINISH,
'remarks' => $remarks,
]);
} else { } else {
throw new BizException('该售后订单状态异常'); throw new BizException('该售后订单状态异常');
} }

View File

@ -76,41 +76,6 @@ class DistributionPreIncomeJobService
return; return;
} }
// 售后商品的总差价(元)
$totalDiffPrice = 0;
if (! is_null($afterSaleProduct->vip_price) && $afterSaleProduct->vip_discount_amount === 0) {
$diffPrice = $afterSaleProduct->sell_price - $afterSaleProduct->vip_price;
if ($diffPrice > 0) {
$totalDiffPrice = bcdiv($diffPrice * $afterSaleProduct->quantity, '100');
}
}
// 售后商品的总销售值
$totalSalesValue = bcmul($afterSaleProduct->sales_value, $afterSaleProduct->quantity);
// 变更比例
$changeRate = 1;
if ($afterSaleProduct->total_amount > 0) {
$amount = $afterSale->amount;
if ($amount >= $afterSaleProduct->total_amount) {
$amount = $afterSaleProduct->total_amount;
}
$changeRate = bcdiv($amount, $afterSaleProduct->total_amount);
} else {
$qty = $afterSale->num;
if ($qty > $afterSaleProduct->quantity) {
$qty = $afterSaleProduct->quantity;
}
$changeRate = bcdiv($qty, $afterSaleProduct->quantity);
}
$preIncomes = DistributionPreIncome::where('order_id', $afterSale->order_id)->get(); $preIncomes = DistributionPreIncome::where('order_id', $afterSale->order_id)->get();
$time = now(); $time = now();
@ -119,49 +84,91 @@ class DistributionPreIncomeJobService
foreach ($preIncomes as $preIncome) { foreach ($preIncomes as $preIncome) {
$rule = $preIncome->rule; $rule = $preIncome->rule;
$changeAmount = 0; if ($preIncome->type === DistributionPreIncome::TYPE_PRICE_DIFF) {
$changeSalesValue = 0; // 售后商品的总差价(元)
$changeRevenue = 0; $totalDiffPrice = 0;
switch ($preIncome->type) { if (! is_null($afterSaleProduct->vip_price) && $afterSaleProduct->vip_discount_amount === 0) {
case DistributionPreIncome::TYPE_PRICE_DIFF: $diffPrice = $afterSaleProduct->sell_price - $afterSaleProduct->vip_price;
$changeAmount = bcmul($totalDiffPrice, $changeRate);
$changeSalesValue = bcmul($totalSalesValue, $changeRate);
// 差价奖励按变更的差价计算
$changeRevenue = bcmul($changeAmount, $rule['bonus_rate']);
$changeRevenue = bcmul($changeRevenue, bcsub('1', $rule['fee_rate']));
break;
case DistributionPreIncome::TYPE_LEVEL_DIFF: if ($diffPrice > 0) {
case DistributionPreIncome::TYPE_LEVEL_SAME: $totalDiffPrice = bcdiv($diffPrice * $afterSaleProduct->quantity, '100');
$changeAmount = bcmul(bcdiv($afterSaleProduct->total_amount, '100'), $changeRate); }
$changeSalesValue = bcmul($totalSalesValue, $changeRate); }
// 级差奖励和平级奖励按变更的销售值算收益
$changeRevenue = bcmul($changeSalesValue, $rule['bonus_rate']); if (bccomp($totalDiffPrice, '0', 2) <= 0) {
$changeRevenue = bcmul($changeRevenue, bcsub('1', $rule['fee_rate'])); continue;
break; }
$changeAmount = 0;
if ($afterSaleProduct->total_amount > 0) {
$amount = $afterSale->amount;
if ($amount >= $afterSaleProduct->total_amount) {
$amount = $afterSaleProduct->total_amount;
}
$changeAmount = bcdiv(bcmul($totalDiffPrice, $amount), $afterSaleProduct->total_amount);
} else {
$qty = $afterSale->num;
if ($qty > $afterSaleProduct->quantity) {
$qty = $afterSaleProduct->quantity;
}
$changeAmount = bcdiv(bcmul($totalDiffPrice, $qty), $afterSaleProduct->quantity);
}
// 差价奖励按变更的差价计算
$changeRevenue = bcmul($changeAmount, $rule['bonus_rate']);
$changeRevenue = bcmul($changeRevenue, bcsub('1', $rule['fee_rate']));
$changeRevenue = round($changeRevenue, 2);
// 变更金额
$changeAmount = round($changeAmount, 2);
// 变更成长值
$changeSalesValue = $afterSale->sales_value;
$preIncome->update([
'total_amount' => DB::raw("total_amount-{$changeAmount}"),
'total_revenue' => DB::raw("total_revenue-{$changeRevenue}"),
'total_sales_value' => DB::raw("total_sales_value-{$changeSalesValue}"),
]);
$preIncomeLogs[] = [
'pre_income_id' => $preIncome->id,
'pre_income_job_id' => $job->id,
'change_amount' => bcmul($changeAmount, '-1'),
'change_revenue' => bcmul($changeRevenue, '-1'),
'change_sales_value' => bcmul($changeSalesValue, '-1'),
'remarks' => $afterSale->isChange() ? '订单换货' : '订单退款',
'created_at' => $time,
'updated_at' => $time,
];
} elseif (in_array($preIncome->type, [DistributionPreIncome::TYPE_LEVEL_DIFF, DistributionPreIncome::TYPE_LEVEL_SAME])) {
$changeAmount = bcdiv($afterSale->amount, '100');
$changeSalesValue = $afterSale->sales_value;
// 级差奖励和平级奖励按变更的销售值算收益
$changeRevenue = bcmul($changeSalesValue, $rule['bonus_rate']);
$changeRevenue = bcmul($changeRevenue, bcsub('1', $rule['fee_rate']));
$changeRevenue = round($changeRevenue, 2);
$preIncome->update([
'total_amount' => DB::raw("total_amount-{$changeAmount}"),
'total_revenue' => DB::raw("total_revenue-{$changeRevenue}"),
'total_sales_value' => DB::raw("total_sales_value-{$changeSalesValue}"),
]);
$preIncomeLogs[] = [
'pre_income_id' => $preIncome->id,
'pre_income_job_id' => $job->id,
'change_amount' => bcmul($changeAmount, '-1'),
'change_revenue' => bcmul($changeRevenue, '-1'),
'change_sales_value' => bcmul($changeSalesValue, '-1'),
'remarks' => $afterSale->isChange() ? '订单换货' : '订单退款',
'created_at' => $time,
'updated_at' => $time,
];
} }
$changeAmount = round($changeAmount, 2);
$changeSalesValue = round($changeSalesValue, 2);
$changeRevenue = round($changeRevenue, 2);
$preIncome->update([
'total_amount' => DB::raw("total_amount-{$changeAmount}"),
'total_sales_value' => DB::raw("total_sales_value-{$changeSalesValue}"),
'total_revenue' => DB::raw("total_revenue-{$changeRevenue}"),
]);
$preIncomeLogs[] = [
'pre_income_id' => $preIncome->id,
'pre_income_job_id' => $job->id,
'change_amount' => bcmul($changeAmount, '-1'),
'change_sales_value' => bcmul($changeSalesValue, '-1'),
'change_revenue' => bcmul($changeRevenue, '-1'),
'remarks' => $afterSale->isChange() ? '订单换货' : '订单退款',
'created_at' => $time,
'updated_at' => $time,
];
} }
DistributionPreIncomeLog::insert($preIncomeLogs); DistributionPreIncomeLog::insert($preIncomeLogs);

View File

@ -124,6 +124,7 @@ class OrderService
$productsTotalAmount, $productsTotalAmount,
$vipDiscountAmount, $vipDiscountAmount,
$couponDiscountAmount, $couponDiscountAmount,
$salesValue
) = $this->calculateFees($mapProducts); ) = $this->calculateFees($mapProducts);
$order = $this->storeOrder( $order = $this->storeOrder(
@ -133,6 +134,7 @@ class OrderService
$couponDiscountAmount, $couponDiscountAmount,
$vipDiscountAmount, $vipDiscountAmount,
$shippingFee, $shippingFee,
$salesValue,
$note, $note,
$coupon $coupon
); );
@ -160,6 +162,7 @@ class OrderService
* @param int $couponDiscountAmount * @param int $couponDiscountAmount
* @param int $vipDiscountAmount * @param int $vipDiscountAmount
* @param int $shippingFee * @param int $shippingFee
* @param float $salesValue
* @param string|null $note * @param string|null $note
* @param \App\Models\UserCoupon|null $coupon * @param \App\Models\UserCoupon|null $coupon
* @return \App\Models\Order * @return \App\Models\Order
@ -171,6 +174,7 @@ class OrderService
int $couponDiscountAmount, int $couponDiscountAmount,
int $vipDiscountAmount, int $vipDiscountAmount,
int $shippingFee, int $shippingFee,
$salesValue,
?string $note = null, ?string $note = null,
?UserCoupon $coupon = null, ?UserCoupon $coupon = null,
): Order { ): Order {
@ -194,6 +198,7 @@ class OrderService
'shipping_fee' => $shippingFee, 'shipping_fee' => $shippingFee,
'products_total_amount' => $productsTotalAmount, 'products_total_amount' => $productsTotalAmount,
'total_amount' => $totalAmount, // 商品总额-券折扣金额-会员折扣金额+邮费 'total_amount' => $totalAmount, // 商品总额-券折扣金额-会员折扣金额+邮费
'sales_value' => $salesValue, // 订单总销售值
'note' => $note, 'note' => $note,
// 收货地址 // 收货地址
'consignee_name' => $shippingAddress->consignee, 'consignee_name' => $shippingAddress->consignee,
@ -445,6 +450,7 @@ class OrderService
$productsTotalAmount, $productsTotalAmount,
$vipDiscountAmount, $vipDiscountAmount,
$couponDiscountAmount, $couponDiscountAmount,
$salesValue,
) = $this->calculateFees($mapProducts); ) = $this->calculateFees($mapProducts);
$totalAmount = $productsTotalAmount - $couponDiscountAmount - $vipDiscountAmount; $totalAmount = $productsTotalAmount - $couponDiscountAmount - $vipDiscountAmount;
@ -484,17 +490,20 @@ class OrderService
$productsTotalAmount = 0; $productsTotalAmount = 0;
$vipDiscountAmount = 0; $vipDiscountAmount = 0;
$couponDiscountAmount = 0; $couponDiscountAmount = 0;
$salesValue = 0;
foreach ($products as $product) { foreach ($products as $product) {
$productsTotalAmount += $product['total_amount']; $productsTotalAmount += $product['total_amount'];
$vipDiscountAmount += $product['vip_discount_amount']; $vipDiscountAmount += $product['vip_discount_amount'];
$couponDiscountAmount += $product['coupon_discount_amount']; $couponDiscountAmount += $product['coupon_discount_amount'];
$salesValue = bcadd($salesValue, $product['total_sales_value']);
} }
return [ return [
$productsTotalAmount, $productsTotalAmount,
$vipDiscountAmount, $vipDiscountAmount,
$couponDiscountAmount, $couponDiscountAmount,
$salesValue,
]; ];
} }
@ -567,6 +576,8 @@ class OrderService
), ),
// 总金额 // 总金额
'total_amount' => $sku->sell_price * $item['quantity'], 'total_amount' => $sku->sell_price * $item['quantity'],
// 总销售值
'total_sales_value' => bcdiv($sku->sales_value, $item['quantity']),
]); ]);
}); });
@ -832,6 +843,9 @@ class OrderService
'reason' => '取消订单', 'reason' => '取消订单',
]); ]);
// 扣除用户的预成长值
$order->user->userInfo->incrPreGrowthValue(bcmul($order->sales_value, '-1', 2));
DistributionPreIncomeJob::create([ DistributionPreIncomeJob::create([
'jobable_id' => $refundLog->id, 'jobable_id' => $refundLog->id,
'jobable_type' => $refundLog->getMorphClass(), 'jobable_type' => $refundLog->getMorphClass(),

View File

@ -87,6 +87,9 @@ class PayService
'auto_complete_at' => now()->addDays(app_settings('app.order_auto_complete_days', 7)), 'auto_complete_at' => now()->addDays(app_settings('app.order_auto_complete_days', 7)),
]); ]);
// 增加用户的预成长值
$payable->user->userInfo->incrPreGrowthValue($payable->sales_value);
DistributionPreIncomeJob::create([ DistributionPreIncomeJob::create([
'jobable_id' => $payable->id, 'jobable_id' => $payable->id,
'jobable_type' => $payable->getMorphClass(), 'jobable_type' => $payable->getMorphClass(),

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddPreGrowthsValueToUserInfosTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('user_infos', function (Blueprint $table) {
$table->unsignedDecimal('pre_growth_value', 18, 2)->default(0)->comment('预收益成长值');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('user_infos', function (Blueprint $table) {
$table->dropColumn(['pre_growth_value']);
});
}
}

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddSalesValueToAfterSalesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('after_sales', function (Blueprint $table) {
$table->unsignedDecimal('sales_value', 18, 2)->default(0.00)->comment('变更销售值');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('after_sales', function (Blueprint $table) {
$table->dropColumn(['sales_value']);
});
}
}