【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)¶
-
SchemaVerificationTest(純 JDBC,4 tests)
- 15 表齊全
- 本 feature 表無任何 FK
- 每表非 PRIMARY 索引數符 §5.6
- 關鍵索引名稱存在(
uk_activity_code、idx_orders_payment_status_reserved_until、idx_bsa_field_value 等)
-
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
-
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)