import { produce } from 'immer' import _ from 'lodash' export default function appBatchToApiBatch (params: ISubmitBatchParams): IOrderBatchRequestData { const { orderBatch, deliveryType, payment, shipping, takeawayInfo = {}, ignoreUnavailable = false, needTableware, lastSubOrder, promoCode, riceCoin, from, } = params const data: IOrderBatchRequestData = { batchID: orderBatch.id, items: toBatchRequestItems(orderBatch.items), remark: orderBatch.remark, ignoreUnavailable: ignoreUnavailable, takeout: orderBatch.takeout, deliveryType: deliveryType, payment: payment, shipping: shipping, needTableware: needTableware ?? deliveryType !== 'table', takeawayInfo: takeawayInfo, promoCode: promoCode, riceCoin: riceCoin, from, } if (deliveryType === 'storeDelivery') { data.takeawayInfo = takeawayInfo } if (lastSubOrder != null) { data.lastSubOrder = lastSubOrder } return data } function toBatchRequestItems (batchItems: IAppBatchItem[]): IOrderBatchRequestItem[] { const formatedItems: IOrderBatchRequestItem[] = [] // 全部 batch 共用 index,所以要重新編排 setMenuIndex // 原本的 setMenuIndex 會加上這個 setIndex let setIndex = 0 batchItems.forEach(batchItem => { const isSet = batchItem.setItems != null && batchItem.setItems.length > 0 const mainBatchItem: IOrderBatchRequestItem = { menuID: batchItem.menuId, // 套餐的餐點自己的 id setID: batchItem.setId != null ? batchItem.setId : undefined, // 套餐的餐點原本的 id setMenuID: batchItem.setMenuId != null ? batchItem.setMenuId : null, // 套餐的餐點原本的 id setMenuIndex: null, setName: isSet ? batchItem.name : undefined, name: batchItem.name, desc: batchItem.desc != null ? batchItem.desc : '', price: batchItem.price, discount: batchItem.discount, modifiers: batchItem.modifiers, divisor: batchItem.divisor, options: batchItem.options.map(option => { return { optionID: option.optionItemId, name: option.name, price: option.price, quantity: option.quantity, } }), tags: batchItem.tags, remarks: batchItem.remarks, isSet: false, } if (isSet) { // 套餐 // 重新設定 setMenuIndex (setItem is read only, so use produce) const setItems = produce(batchItem.setItems, (setItems) => { setItems.forEach(setItem => { if (setItem.setMenuIndex === null) { // 未分組的 setMenuItemIndex 設為 0 setItem.setMenuIndex = 0 + setIndex } else { setItem.setMenuIndex += setIndex } }) }) const setGroups: { [setMenuIndex: number]: IAppBatchItem[] } = _.groupBy(setItems, 'setMenuIndex') // 加入 setItems with same setMenuIndex _.forEach(setGroups, (setGroupItems, setMenuIndex) => { // 加入相同 setMenuIndex 的 main item formatedItems.push({ ...mainBatchItem, setMenuIndex: Number(setMenuIndex), isSet: true, }) setGroupItems.forEach(setItem => { const setBatchItem: IOrderBatchRequestItem = { menuID: setItem.menuId, // 套餐的餐點自己的 id setMenuID: setItem.setMenuId as string, // 套餐的餐點原本的 id setMenuIndex: Number(setMenuIndex), setName: mainBatchItem.setName, name: setItem.name, desc: setItem.desc != null ? setItem.desc : '', price: setItem.price, discount: setItem.discount, modifiers: setItem.modifiers, options: setItem.options.map(option => { return { optionID: option.optionItemId, name: option.name, price: option.price, quantity: option.quantity, } }), tags: setItem.tags, remarks: setItem.remarks, isSet: false, } Array(setItem.quantity).fill(0).forEach(() => { // 有幾個 quantity 就要 push 幾次 formatedItems.push(setBatchItem) }) }) }) // 有幾個 quantity 就會用掉幾個 setIndex setIndex += batchItem.quantity } else { // 單點,有幾個 quantity 就 push 幾次 Array(batchItem.quantity).fill(0).forEach(() => { formatedItems.push(mainBatchItem) }) } }) return formatedItems }