專案

一般

配置概況

動作

Task #1485

進行中

Feature #1464: [M1] 垂直切片:HPICIOEB 散客線上報名端到端

[API] T01b 核心 schema 與 entity 實作

是由 鍾正剛 於 27 天 前加入. 於 27 天 前更新.

狀態:
Resolved
優先權:
Normal
被分派者:
開始日期:
2026-09-04
完成日期:
完成百分比:

0%

預估工時:

概述

範圍
依核可的 ERD(T01a)建立資料表與 JPA entity:Activity / PriceTier / Session / Customer / Order / Booking。

建索引,不建 FK 約束(D18、spec §4.5)—— 關聯欄位仍必須有索引;刪除走 service 層,不依賴 ON DELETE CASCADE。
Session 名額上限為選填(D17)。

驗收
schema 與 ERD 一致;entity 可 CRUD;索引存在且無 FK 約束;刪除路徑測試無孤兒資料;mvn test 通過

相依
T01a #1470

spec: docs/features/001-booking-platform/spec.md
tickets: docs/features/001-booking-platform/tickets.md


相關的議題清單 4 (4 進行中 — 0 已結束)

被阻擋 hpigeopark - Task #1470: [API] T01a 核心 schema ERD 設計Resolved鍾正剛2026-09-04

動作
阻擋 hpigeopark - Feature #1471: [API] T02 開放日期表匯入(後端)New鍾正剛2026-09-04

動作
阻擋 hpigeopark - Feature #1473: [API] T04 動態表單引擎New鍾正剛2026-09-04

動作
阻擋 hpigeopark - Feature #1474: [API] T05 計價純計算模組New鍾正剛2026-09-04

動作

是由 鍾正剛 於 27 天 前更新

  • 被阻擋 Task #1470: [API] T01a 核心 schema ERD 設計 已新增

是由 鍾正剛 於 27 天 前更新

  • 阻擋 Feature #1471: [API] T02 開放日期表匯入(後端) 已新增

是由 鍾正剛 於 27 天 前更新

是由 鍾正剛 於 27 天 前更新

  • 阻擋 Feature #1474: [API] T05 計價純計算模組 已新增

是由 鍾正剛 於 27 天 前更新

  • 狀態 從 New 變更為 Resolved

【T01b 完成】

branch:feature/001-booking-platform-api
MR:https://gitlab.com/sylksoft/hpigeopark/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature%2F001-booking-platform-api

一、實作內容

DDL(java/src/main/resources/db/migration/V001__booking_platform_m1_schema.sql)

  • 15 張表全建,utf8mb4 / utf8mb4_unicode_ci
  • 建索引不建 FK:0 個 FOREIGN KEY,32 個非 PRIMARY 索引(與 ERD Rev 3 §5.6 逐表一致)

Entity / Repository(com.hpigeopark.model.booking.*、com.hpigeopark.repository.booking.*)

  • 15 entity(extends BaseAuditableEntity;orders PK 為 varchar(14) order_no)
  • 15 repository,每有邏輯 FK 的子表加 findOrphanIds() 供孤兒偵測(D18 條件 5)
  • SessionRepository.reserveCapacity/releaseCapacity 為 @Modifying 原生 UPDATE,SQL 直接抄自 ERD §4.5(無 version 條件)
  • Order/OrderPayment 因與框架 sec.model.Order 於同一 EMF 內簡名碰撞,本 feature 改名為 BookingOrder / BookingOrderPayment(表名不變)

Seed 資料(java/src/main/resources/db/seed/V001__hpicioeb_seed.sql,dev only)

  • HPICIOEB:1 activity + 一般票 200 / 居民票 170、19 欄表單定義、4 組表單選項(invoice / activityWay / groupType / guideLang)+ zh_TW i18n
  • 場次不 seed(來自 T02 匯入功能,D16)

二、information_schema 驗證結果

MySQL 8.0.23 @ 59.120.143.37/hpigeopark:

== Tables ==            total_tables = 15
== FK count ==          fk_count = 0
== Total indexes ==     total_non_pk_indexes = 32
== Per-table 索引數 ==
activity                    3
activity_i18n               1
booking                     7
booking_search_attribute    2
form_definition             1
form_definition_i18n        1
form_field                  3
form_field_i18n             1
form_option                 1
form_option_i18n            1
order_invoice               1
order_payment               1
orders                      4
price_tier                  2
session                     3

與 ERD Rev 3 §5.6 逐項比對通過。

三、測試涵蓋(12/12 通過,mvn -o test)

  1. SchemaVerificationTest(純 JDBC,4 tests)

    • 15 表齊全
    • 本 feature 表無任何 FK
    • 每表非 PRIMARY 索引數符 §5.6
    • 關鍵索引名稱存在(uk_activity_code、idx_orders_payment_status_reserved_until、idx_bsa_field_value 等)
  2. BookingEntityCrudTest(4 tests)

    • Activity + i18n + PriceTier + Session CRUD(含 session_extra_fields JSON 陣列)
    • Order + Booking + OrderPayment + OrderInvoice + BookingSearchAttribute CRUD(varchar PK、JSON price_breakdown、D21 側表 idx_bsa_field_value 篩選查詢)
    • FormDefinition + FormField + FormOption + i18n CRUD(含 searchable=true 的 findByFormDefinitionIdAndSearchableTrue)
    • Session 名額原子扣減:capacity=5 扣 3 成功、再扣 2 成功、第三次扣 1 失敗回 0;capacity=NULL 任意數字皆成功;釋放路徑防呆 occupied_count >= n
  3. OrphanFreeDeleteTest(4 tests,D18 條件 4)

    • Activity 刪除連帶 activity_i18n / price_tier / session:三孤兒查詢空
    • Order 刪除連帶 booking / payment / invoice / bsa:四孤兒查詢空
    • FormDefinition 刪除連帶 form_field / i18n:三孤兒查詢空
    • 負面測試:故意漏刪子表時 findOrphanIds() 確實回傳非空,證明孤兒偵測本身不空跑

四、發現的 ERD / spec 衝突

無 —— ERD Rev 3 可直接建表,實作過程未遇到需要修改 ERD 的問題。

五、實作過程遇到的環境問題(已寫入 decisions-pending D-005)

hpigeopark DB 目前沒有 ss3a schema(ss3a_settings 等 ~15 張表)。Application.java 的 @ComponentScan 涵蓋 com.sylksoft,框架 SettingServiceImpl 的 @PostConstruct 會讀 ss3a_settings,導致完整 @SpringBootTest 無法啟動。

T01b 已用精簡 BookingJpaTestConfig 繞過(只掛 booking 相關 bean),12 個測試順利通過。但 T05 之後若要跑 controller 整合測試,必須解決 —— 已寫入 docs/status/decisions-pending.md D-005,請 coordinator 裁示由誰負責。

六、後續事項(不擋 T01b)

  • 依 tickets.md,T02 場次匯入是下一張,可開工
  • T05 建立訂單 service 時需一併寫入 booking_search_attribute(設計筆記已寫入 docs/features/001-booking-platform/api/design.md §2.6)
動作

匯出至 Atom PDF