|
|
@@ -83,7 +83,20 @@ class TextbookApiService
|
|
|
public function getTextbookSeries(array $params = []): array
|
|
|
{
|
|
|
if ($this->useDatabase) {
|
|
|
- $series = TextbookSeries::query()->orderBy('sort_order')->get();
|
|
|
+ $query = TextbookSeries::query()->orderBy('sort_order');
|
|
|
+
|
|
|
+ // 默认只返回启用的系列(is_active = true)
|
|
|
+ // 除非显式传入 include_inactive=true
|
|
|
+ if (!isset($params['include_inactive']) || $params['include_inactive'] !== 'true') {
|
|
|
+ $query->where('is_active', true);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 支持按学段筛选
|
|
|
+ if (isset($params['stage'])) {
|
|
|
+ $query->where('stages', 'like', '%' . $params['stage'] . '%');
|
|
|
+ }
|
|
|
+
|
|
|
+ $series = $query->get();
|
|
|
return ['data' => $series->toArray(), 'meta' => ['total' => $series->count()]];
|
|
|
}
|
|
|
|
|
|
@@ -203,23 +216,46 @@ class TextbookApiService
|
|
|
public function getTextbooks(array $params = []): array
|
|
|
{
|
|
|
if ($this->useDatabase) {
|
|
|
- $query = Textbook::query();
|
|
|
+ $query = Textbook::query()
|
|
|
+ ->select('textbooks.*')
|
|
|
+ ->join('textbook_series', 'textbooks.series_id', '=', 'textbook_series.id');
|
|
|
+
|
|
|
+ // 默认只返回已发布且系列启用的教材
|
|
|
+ // 除非显式传入 include_unpublished=true 或 include_inactive_series=true
|
|
|
+ if (!isset($params['include_unpublished']) || $params['include_unpublished'] !== 'true') {
|
|
|
+ $query->where('textbooks.status', 'published');
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!isset($params['include_inactive_series']) || $params['include_inactive_series'] !== 'true') {
|
|
|
+ $query->where('textbook_series.is_active', true);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 支持按系列ID筛选
|
|
|
if (isset($params['series_id'])) {
|
|
|
- $query->where('series_id', $params['series_id']);
|
|
|
+ $query->where('textbooks.series_id', $params['series_id']);
|
|
|
}
|
|
|
+
|
|
|
+ // 支持按学段筛选
|
|
|
if (isset($params['stage'])) {
|
|
|
- $query->where('stage', $params['stage']);
|
|
|
+ $query->where('textbooks.stage', $params['stage']);
|
|
|
}
|
|
|
+
|
|
|
+ // 支持按年级筛选
|
|
|
if (isset($params['grade'])) {
|
|
|
- $query->where('grade', $params['grade']);
|
|
|
+ $query->where('textbooks.grade', $params['grade']);
|
|
|
}
|
|
|
+
|
|
|
+ // 支持按学期筛选
|
|
|
if (array_key_exists('semester', $params) && $params['semester'] !== null) {
|
|
|
- $query->where('semester', $params['semester']);
|
|
|
+ $query->where('textbooks.semester', $params['semester']);
|
|
|
}
|
|
|
+
|
|
|
+ // 显式按状态筛选(会覆盖默认的已发布筛选)
|
|
|
if (isset($params['status'])) {
|
|
|
- $query->where('status', $params['status']);
|
|
|
+ $query->where('textbooks.status', $params['status']);
|
|
|
}
|
|
|
- $textbooks = $query->orderBy('id')->get();
|
|
|
+
|
|
|
+ $textbooks = $query->orderBy('textbooks.id')->get();
|
|
|
return ['data' => $textbooks->toArray(), 'meta' => ['total' => $textbooks->count()]];
|
|
|
}
|
|
|
|
|
|
@@ -345,6 +381,22 @@ class TextbookApiService
|
|
|
public function getTextbookCatalog(int $textbookId, string $format = 'tree'): array
|
|
|
{
|
|
|
if ($this->useDatabase) {
|
|
|
+ // 先验证教材是否存在且已发布,且其系列处于启用状态
|
|
|
+ $textbook = Textbook::query()
|
|
|
+ ->select('textbooks.*')
|
|
|
+ ->join('textbook_series', 'textbooks.series_id', '=', 'textbook_series.id')
|
|
|
+ ->where('textbooks.id', $textbookId)
|
|
|
+ ->where('textbooks.status', 'published')
|
|
|
+ ->where('textbook_series.is_active', true)
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if (!$textbook) {
|
|
|
+ Log::warning('Textbook not found or not published or series inactive', [
|
|
|
+ 'textbook_id' => $textbookId
|
|
|
+ ]);
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
$nodes = TextbookCatalog::query()
|
|
|
->where('textbook_id', $textbookId)
|
|
|
->orderBy('sort_order')
|