1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-22 19:44:02 +08:00
2020-09-17 21:29:29 +08:00

147 lines
4.3 KiB
PHP

<?php
namespace App\Services\Logic\Order;
use App\Models\Course as CourseModel;
use App\Models\Order as OrderModel;
use App\Models\Package as PackageModel;
use App\Models\Reward as RewardModel;
use App\Models\Vip as VipModel;
use App\Repos\Package as PackageRepo;
use App\Services\Logic\Service;
use App\Validators\Order as OrderValidator;
class OrderConfirm extends Service
{
public function handle($itemId, $itemType)
{
$user = $this->getLoginUser();
$validator = new OrderValidator();
$validator->checkItemType($itemType);
$result = [];
$result['item_id'] = $itemId;
$result['item_type'] = $itemType;
if ($itemType == OrderModel::ITEM_COURSE) {
$course = $validator->checkCourse($itemId);
$result['item_info']['course'] = $this->handleCourseInfo($course);
$result['total_amount'] = $course->market_price;
$result['pay_amount'] = $user->vip ? $course->vip_price : $course->market_price;
$result['discount_amount'] = $result['total_amount'] - $result['pay_amount'];
} elseif ($itemType == OrderModel::ITEM_PACKAGE) {
$package = $validator->checkPackage($itemId);
$result['item_info']['package'] = $this->handlePackageInfo($package);
$result['total_amount'] = 0;
foreach ($result['item_info']['package']['courses'] as $course) {
$result['total_amount'] += $course['market_price'];
}
$result['pay_amount'] = $user->vip ? $package->vip_price : $package->market_price;
$result['discount_amount'] = $result['total_amount'] - $result['pay_amount'];
} elseif ($itemType == OrderModel::ITEM_VIP) {
$vip = $validator->checkVip($itemId);
$result['item_info']['vip'] = $this->handleVipInfo($vip);
$result['total_amount'] = $vip->price;
$result['pay_amount'] = $vip->price;
$result['discount_amount'] = 0;
} elseif ($itemType == OrderModel::ITEM_REWARD) {
list($courseId, $rewardId) = explode('-', $itemId);
$course = $validator->checkCourse($courseId);
$reward = $validator->checkReward($rewardId);
$result['item_info']['course'] = $this->handleCourseInfo($course);
$result['item_info']['reward'] = $this->handleRewardInfo($reward);
$result['total_amount'] = $reward->price;
$result['pay_amount'] = $reward->price;
$result['discount_amount'] = 0;
}
$validator->checkAmount($result['pay_amount']);
return $result;
}
protected function handleCourseInfo(CourseModel $course)
{
return $this->formatCourseInfo($course);
}
protected function handlePackageInfo(PackageModel $package)
{
$result = [
'id' => $package->id,
'title' => $package->title,
'market_price' => $package->market_price,
'vip_price' => $package->vip_price,
];
$packageRepo = new PackageRepo();
$courses = $packageRepo->findCourses($package->id);
foreach ($courses as $course) {
$result['courses'][] = $this->formatCourseInfo($course);
}
return $result;
}
protected function handleVipInfo(VipModel $vip)
{
return [
'id' => $vip->id,
'title' => $vip->title,
'expiry' => $vip->expiry,
'price' => $vip->price,
];
}
protected function handleRewardInfo(RewardModel $reward)
{
return [
'id' => $reward->id,
'title' => $reward->title,
'price' => $reward->price,
];
}
protected function formatCourseInfo(CourseModel $course)
{
return [
'id' => $course->id,
'title' => $course->title,
'cover' => $course->cover,
'model' => $course->model,
'level' => $course->level,
'user_count' => $course->user_count,
'lesson_count' => $course->lesson_count,
'study_expiry' => $course->study_expiry,
'refund_expiry' => $course->refund_expiry,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
];
}
}