建立組合商品

View as Markdown
建立單一組合商品,一次建立商品、規格與配方三張表。 `productCategoryId` 為必填,規則與「商品」家族相同:必須是可指派的(子)分類,省略回傳 400 product_category_id_required,帶了但分類不存在、不可指派或屬於其他租戶一律回傳 400 invalid_product_category_id。 `components`(配方)的驗證規則: - 必填、至少 1 筆,省略或空陣列回傳 400 bundle_components_required - 每個元件用 `componentSkuId` 或 `componentSkuOuterSysCode` 擇一指名,兩者都有值時以 `componentSkuId` 為準,兩者都沒給回傳 400 component_identifier_required;用代碼指名且對到超過 1 筆規格(`outerSysCode` 沒有唯一索引)回傳 400 component_sku_code_ambiguous,絕不會替你挑一筆 - 元件必須存在、屬於同一租戶,且必須是一般規格(不允許巢狀組合品)——找不到或跨租戶一律回傳 400 component_not_found,不區分兩者以避免洩漏元件序號屬於別的租戶;是組合品型別回傳 400 component_cannot_be_a_bundle - 元件不可重複,回傳 400 component_duplicated;每組用量(`quantity`)必須為正數,超出可表示範圍或四捨五入到小數 4 位後不大於 0 都視為不合法,回傳 400 invalid_component_quantity `price`、`sellPrice` 若有帶值必須介於 0 到 9999999.99,超出回傳 400 invalid_price;`quantityPrecision` 若有帶值必須介於 0 到 4,超出回傳 400 invalid_quantity_precision。 `outerSysCode` 已對應到既有組合商品時改為更新該筆(冪等去重);若對應到的是一筆一般商品,回傳 400 product_type_conflict,且絕不會改為新增——請改用商品專屬端點,或換一個代碼。`status` 不是可寫欄位:透過本端點建立的組合商品一律為 Active,之後的狀態變更只能由後台維護。 **三張表的寫入在單一交易內完成,中途任何一步失敗都會整筆回滾**,不會留下配方對不上的半成品組合商品。

Authentication

X-Signaturestring
每個 /v1 請求都必須帶 `X-Client-Id`、`X-Timestamp`、`X-Nonce` 與 `X-Signature` 四個標頭。`X-Signature` 是以 client secret 對 canonical string 做 HMAC-SHA256 後的 Base64。 canonical string 的組成、可複製的簽章範例與 401 排查步驟,請參閱[「驗證與簽章」](/authentication)。

Request

This endpoint expects an object.
idlong or nullOptional

組合商品序號(商品序號)。帶 id 時一律視為更新該筆,不會再比對 outerSysCode;省略時改依 outerSysCode 判斷新增或更新。PUT /v1/bundles/{id} 會忽略這裡的值,一律以路徑上的 id 為準。

outerSysCodestring or nullOptional

ERP 端的組合商品代碼,用來與既有組合商品比對、去重。新增時省略視為空字串;更新時省略保留現有值。長度上限 50 字元,超過回傳 400 outer_sys_code_too_long。

namestring or nullOptional

組合商品名稱。新增時省略視為空字串;更新時省略保留現有值。長度上限 100 字元,超過回傳 400 name_too_long。

productCategoryIdlong or nullOptional

商品分類序號,必須是可指派的(子)分類 id。新增時必填,省略回傳 400 product_category_id_required;帶了但分類不存在、不可指派或屬於其他租戶,回傳 400 invalid_product_category_id。

更新時省略會保留目前的分類;若有帶值,會依相同規則重新驗證。

unitstring or nullOptional

商品單位。新增時省略視為空字串;更新時省略保留現有值。長度上限 50 字元,超過回傳 400 unit_too_long。

specstring or nullOptional

規格內容。新增時省略視為空字串;更新時省略保留現有值。長度上限 100 字元,超過回傳 400 spec_too_long。

barcodestring or nullOptional

條碼。新增時省略視為空字串;更新時省略保留現有值。長度上限 50 字元,超過回傳 400 barcode_too_long。

warehousestring or nullOptional

倉別。新增時省略視為空字串;更新時省略保留現有值。長度上限 50 字元,超過回傳 400 warehouse_too_long。

pricedouble or nullOptional

牌價。新增時省略視為 0;更新時省略保留現有值。必須介於 0 到 9999999.99,超出範圍回傳 400 invalid_price。

sellPricedouble or nullOptional

對外售價。範圍與省略規則同 price,超出範圍同樣回傳 400 invalid_price。

quantityPrecisioninteger or nullOptional

數量精度(0 為整數,1 至 4 為小數位數)。新增時省略視為 0;更新時省略保留現有值。必須介於 0 到 4,超出範圍回傳 400 invalid_quantity_precision。

componentslist of objects or nullOptional

配方,至少 1 筆;建立時必填,省略或空陣列一律回傳 400 bundle_components_required(建立永遠會送出自己的配方陣列,省略在效果上等同空陣列)。更新時省略(null)即配方維持不變;帶值(包含空陣列)即配方整份替換,替換規則見更新端點的說明,替換整個失敗時完全不套用、原配方保留。

Response

OK
idlongOptional

新增或更新成功後,該筆資料的 id。

Errors

400
Bad Request Error
401
Unauthorized Error
403
Forbidden Error
500
Internal Server Error