123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- <?php
- namespace App\Services\Coach;
- use App\Models\MemberUser;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- class CoachFlowService
- {
- /**
- * 创建投流订单
- *
- * @param int $userId 用户ID
- * @param array $params 订单参数
- * @return array
- */
- public function createOrder(int $userId, array $params)
- {
- try {
- return DB::transaction(function () use ($params, $userId) {
- // 查询用户信息
- $user = MemberUser::findOrFail($userId);
- // 验证用户是否为教练
- abort_if(! $user->coach, 403, '非教练用户无法创建投流订单');
- // 验证时间段参数
- abort_if(! in_array($params['time_slot'], [1, 2, 3]), 422, '无效的时间段');
- // 验证天数参数
- $validDays = [1, 7, 15, 30, 90, 180, 365];
- abort_if(! in_array($params['days'], $validDays), 422, '无效的天数');
- // 验证位置类型
- abort_if(! in_array($params['position_type'], [1, 2]), 422, '无效的位置类型');
- // 计算订单金额
- $amount = $this->calculateAmount($params['time_slot'], $params['days']);
- // 生成订单号
- $orderNo = $this->generateOrderNo();
- // 创建订单
- $order = $user->coach->flowOrders()->create([
- 'order_no' => $orderNo,
- 'coach_id' => $user->id,
- 'position_type' => $params['position_type'],
- 'time_slot' => $params['time_slot'],
- 'days' => $params['days'],
- 'amount' => $amount,
- 'state' => 0,
- 'start_time' => null,
- 'end_time' => null,
- ]);
- Log::info('创建投流订单成功', [
- 'order_id' => $order->id,
- 'order_no' => $orderNo,
- 'user_id' => $userId,
- 'amount' => $amount,
- 'params' => $params,
- ]);
- return [
- 'order_id' => $order->id,
- 'order_no' => $orderNo,
- 'amount' => number_format($amount, 2),
- ];
- });
- } catch (\Exception $e) {
- Log::error('创建投流订单失败', [
- 'message' => $e->getMessage(),
- 'user_id' => $userId,
- 'params' => $params,
- 'trace' => $e->getTraceAsString(),
- ]);
- throw new \Exception('创建订单失败:'.$e->getMessage());
- }
- }
- /**
- * 生成订单号
- */
- private function generateOrderNo(): string
- {
- return 'FL'.date('YmdHis').mt_rand(1000, 9999);
- }
- /**
- * 获取价格配置
- */
- public function getPriceConfig()
- {
- return [
- 'time_slots' => [
- ['type' => 1, 'name' => '上午', 'time' => '6:00~12:00', 'price' => 4],
- ['type' => 2, 'name' => '下午', 'time' => '12:00~18:00', 'price' => 6],
- ['type' => 3, 'name' => '晚上', 'time' => '18:00~6:00', 'price' => 8],
- ],
- 'days' => [
- ['days' => 1, 'price' => 12],
- ['days' => 7, 'price' => 53],
- ['days' => 15, 'price' => 99],
- ['days' => 30, 'price' => 160],
- ['days' => 90, 'price' => 430],
- ['days' => 180, 'price' => 760],
- ['days' => 365, 'price' => 1360],
- ],
- ];
- }
- /**
- * 计算订单金额
- */
- private function calculateAmount($timeSlot, $days)
- {
- $dayPrice = 0;
- switch ($timeSlot) {
- case 1:
- $dayPrice = 4;
- break;
- case 2:
- $dayPrice = 6;
- break;
- case 3:
- $dayPrice = 8;
- break;
- }
- $totalPrice = 0;
- switch ($days) {
- case 1:
- $totalPrice = 12;
- break;
- case 7:
- $totalPrice = 53;
- break;
- case 15:
- $totalPrice = 99;
- break;
- case 30:
- $totalPrice = 160;
- break;
- case 90:
- $totalPrice = 430;
- break;
- case 180:
- $totalPrice = 760;
- break;
- case 365:
- $totalPrice = 1360;
- break;
- }
- return $totalPrice;
- }
- }
|