jingcai-php/app/Jobs/HandleOrderWin.php

103 lines
3.1 KiB
PHP
Executable File

<?php
namespace App\Jobs;
use App\Enums\LottState;
use App\Enums\OrderType;
use App\Enums\PayState;
use App\Events\OrderWinedEvent;
use App\Model\Customer\Customer;
use App\Model\Order;
use App\Service\CustomerWalletService;
use App\Service\External\WechatService;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
/**
* 中奖后,累计中奖,代红人数
*/
class HandleOrderWin implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/** @var OrderWinedEvent */
protected $event;
public function __construct($event)
{
$this->event = $event;
$this->queue = config('queue.names.handle_order_win');
}
public function handle()
{
Log::info('HandleOrderWin start ', $this->event->getEventData());
$order = Order::find($this->event->orderId);
if (!$order) {
Log::error('HandleOrderWin not found order ', $this->event->getEventData());
return;
}
if ($order->lottery_state != LottState::WIN && $order->lottery_state != LottState::SEND) {
Log::error('HandleOrderWin not win', $this->event->getEventData());
return;
}
if ($order->type == OrderType::UNION) {
$this->handleUnionOrder($order);
} else {
$this->handleUnUnionOrder($order);
}
if ($order->type == OrderType::FADAN) {
$this->handleFadanOrder($order);
}
}
public function handleFadanOrder(Order $order) {
$gendanNum = Order::where('pid', $order->id)
->where('pay_state', PayState::SUCCESS)
->count();
Customer::where('id', $order->customer_id)
->update([
'gendan_num' => DB::raw("`gendan_num` + {$gendanNum}")
]);
Log::info('handleFadanOrder ---', [
'order_id' => $order->id,
'gendan_num' => $gendanNum,
]);
}
public function handleUnionOrder(Order $order) {
$perPrize = $order->lottery_prize / $order->union_piece_total;
// 合买参与人的数据
$unionOrders = Order::where('type', OrderType::UNION)
->where('pid', $order->id)
->get();
foreach ($unionOrders as $unionOrder) {
$buyPiece = $unionOrder->union_piece_self;
if ($unionOrder->id == $unionOrder->pid) {
$buyPiece = $unionOrder->union_piece_self + $unionOrder->union_piece_keep;
}
$winPrize = $perPrize * $buyPiece;
Customer::where('id', $unionOrder->customer_id)->update([
'win_prize_total' => DB::raw("`win_prize_total` + {$winPrize}")
]);
}
}
public function handleUnUnionOrder(Order $order) {
Customer::where('id', $order->customer_id)->update([
'win_prize_total' => DB::raw("`win_prize_total` + {$order->lottery_prize}")
]);
}
}