# Launch 套餐產品映射并發修復

已修復授權審查中的 AUTH-03。僅修改 Launch 服務端與對應回歸測試，未部署、未發布 SDK；Licentivo 和 SDK 的授權決定邊界不變。

## 修改

- 保存映射時，在事務內先鎖定共同的 Launch 產品記錄，再鎖套餐版本。不同套餐或不同進程的保存請求因此遵守同一產品鎖；沖突請求返回 HTTP 409 `PRODUCT_MAPPING_CONFLICT`。
- `products.licentivo_product_id` 保存穩定的公開產品路由。首次成功保存映射后，同一 Launch 產品的其他套餐只能選擇這個 Licentivo 產品；允許選擇其不同策略。該字段不保存功能權限、設備額度或客戶授權狀態。
- 客戶身份讀取穩定路由，不再根據所有套餐的最大版本選擇產品。發布套餐及生成 SDK 接入配置時也核對同一綁定。
- 舊庫自動增加可空字段。尚無穩定字段的資料依次參考已付款等購買歷史、歷史發布記錄和其余映射；同一優先級存在多個產品時明確提示沖突，不猜測。唯一的已購產品優先于無關草稿，之后保存兼容映射可固化綁定。產品內容編輯保留綁定。

已經售往多個 Licentivo 產品的歷史錯誤資料仍需人工核對，本次不會改寫購買記錄或遠端許可證。需要改用另一個 Licentivo 產品時，應建立新的 Launch 產品，不能借新套餐改寫原產品路由。

實現見 [映射保存](https://github.com/spf86/licentivo-launch/blob/main/internal/app/connections.go)、[產品路由](https://github.com/spf86/licentivo-launch/blob/main/internal/app/product_mapping.go)、[身份簽發](https://github.com/spf86/licentivo-launch/blob/main/internal/app/identity.go)、[發布校驗](https://github.com/spf86/licentivo-launch/blob/main/internal/app/catalog.go)、[接入檢查](https://github.com/spf86/licentivo-launch/blob/main/internal/app/integration.go)、[資料模型](https://github.com/spf86/licentivo-launch/blob/main/internal/storage/models.go)。

## 本地驗證

| 檢查 | 結果 |
| --- | --- |
| 修復前實現對照 | 同一回歸測試穩定捕獲兩個沖突保存同時成功，按預期失敗 |
| 修復后的映射專項回歸 | 沖突請求一個成功、一個 409；兩個兼容保存均成功；付款同步后身份不受錯誤草稿影響；SDK 接入層接受正確產品上下文 |
| 歷史資料保護 | 已購路由優先、歧義報錯、錯誤草稿禁止發布、錯誤歷史發布無法生成 SDK 配置、內容編輯保留綁定，均通過 |
| Go 全部源碼包及 MySQL 回歸 | 192 條測試通過記錄，含子用例；無失敗。`TestProductUploadRoundTrip` 跳過，未計作通過 |
| 舊庫結構升級 | 缺少路由列的結構經初始化后補齊可空字段；重復初始化通過 |
| 真實 Launch、Licentivo 與 Go SDK 聯調 | 13 個業務階段通過，涵蓋購買、真實簽名功能執行、普通關閉恢復、退出、遠程解綁、舊代次、續費退款、帳號撤銷及退款/拒付后的拒絕運行 |
| 最終補測 | 在新的空庫通過映射專項回歸，補含歷史發布的接入配置檢查；`go vet` 通過 |

完整回歸及真實服務聯調完成后，最后增加了 SDK 接入檢查的一致性校驗，并單獨重新運行包含此場景的專項回歸和 `go vet`。舊實現的預期失敗用于證明測試能抓到原競態，不是未解決的回歸失敗。

聯調使用本機獨立 MySQL 8.0.32、當前 Licentivo 服務與實際 Go SDK；支付渠道和 DeepL 使用隔離模擬服務，沒有實際扣款或付費翻譯。并發與歷史錯誤映射專項測試使用實際 Launch 業務、MySQL 和協議模擬器；不聲稱九種 SDK 均完成本輪真實服務聯調。

本輪未訪問 `192.168.2.177`。本次啟動的 MySQL、Licentivo 臨時進程已停止，原有服務保留。原始材料留在忽略目錄 `.local/mapping-fix-20261024/`，可分享摘要見 [驗證證據](https://github.com/spf86/licentivo-launch/blob/main/docs/product-mapping-fix-evidence-2026-10-24.json)。
