checkOrderBySn($sn); $user = $this->getLoginUser(); return $this->handleOrder($order, $user); } protected function handleOrder(OrderModel $order, UserModel $user) { $order->item_info = $this->handleItemInfo($order); $result = [ 'sn' => $order->sn, 'subject' => $order->subject, 'amount' => $order->amount, 'status' => $order->status, 'deleted' => $order->deleted, 'item_id' => $order->item_id, 'item_type' => $order->item_type, 'item_info' => $order->item_info, 'promotion_id' => $order->promotion_id, 'promotion_type' => $order->promotion_type, 'promotion_info' => $order->promotion_info, 'create_time' => $order->create_time, 'update_time' => $order->update_time, ]; $result['status_history'] = $this->handleStatusHistory($order->id); $result['owner'] = $this->handleShallowUserInfo($order->owner_id); $result['me'] = $this->handleMeInfo($order, $user); return $result; } protected function handleStatusHistory($orderId) { $orderRepo = new OrderRepo(); $records = $orderRepo->findStatusHistory($orderId); if ($records->count() == 0) return []; $result = []; foreach ($records as $record) { $result[] = [ 'status' => $record->status, 'create_time' => $record->create_time, ]; } return $result; } protected function handleMeInfo(OrderModel $order, UserModel $user) { $result = [ 'owned' => 0, 'allow_pay' => 0, 'allow_cancel' => 0, 'allow_refund' => 0, ]; if ($user->id == $order->owner_id) { $result['owned'] = 1; } if ($order->status == OrderModel::STATUS_PENDING) { $result['allow_pay'] = 1; $result['allow_cancel'] = 1; } if ($order->status == OrderModel::STATUS_FINISHED) { /** * 只允许线上课程退款 */ if ($order->item_type == OrderModel::ITEM_COURSE) { $course = $order->item_info['course']; $refundTimeOk = $course['refund_expiry_time'] > time(); $courseModelOk = $course['model'] != CourseModel::MODEL_OFFLINE; if ($refundTimeOk && $courseModelOk) { $result['allow_refund'] = 1; } } elseif ($order->item_type == OrderModel::ITEM_PACKAGE) { $courses = $order->item_info['courses']; foreach ($courses as $course) { $refundTimeOk = $course['refund_expiry_time'] > time(); $courseModelOk = $course['model'] != CourseModel::MODEL_OFFLINE; if ($refundTimeOk && $courseModelOk) { $result['allow_refund'] = 1; } } } } return $result; } protected function handleItemInfo(OrderModel $order) { $itemInfo = $order->item_info; $result = []; switch ($order->item_type) { case OrderModel::ITEM_COURSE: $result = $this->handleCourseInfo($itemInfo); break; case OrderModel::ITEM_PACKAGE: $result = $this->handlePackageInfo($itemInfo); break; case OrderModel::ITEM_VIP: $result = $this->handleVipInfo($itemInfo); break; case OrderModel::ITEM_REWARD: $result = $this->handleRewardInfo($itemInfo); break; case OrderModel::ITEM_TEST: $result = $this->handleTestInfo($itemInfo); break; } return $result ?: new \stdClass(); } protected function handleCourseInfo($itemInfo) { $itemInfo['course']['cover'] = kg_cos_course_cover_url($itemInfo['course']['cover']); return $itemInfo; } protected function handlePackageInfo($itemInfo) { $baseUrl = kg_cos_url(); foreach ($itemInfo['courses'] as &$course) { $course['cover'] = $baseUrl . $course['cover']; } return $itemInfo; } protected function handleVipInfo($itemInfo) { return $itemInfo; } protected function handleRewardInfo($itemInfo) { return $itemInfo; } protected function handleTestInfo($itemInfo) { return $itemInfo; } }