Task #1485
進行中Feature #1464: [M1] 垂直切片:HPICIOEB 散客線上報名端到端
[API] T01b 核心 schema 與 entity 實作
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
是由 鍾正剛 於 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)¶
-
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)