You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
5.2 KiB
201 lines
5.2 KiB
import { create } from 'zustand'; |
|
|
|
/** |
|
* OrderItemBase,订单项基础信息模型 |
|
*/ |
|
export interface OrderItemBase { |
|
/** |
|
* Cart Item Id,购物车项ID(如来源于购物车则必填) |
|
*/ |
|
cart_item_id?: number | null; |
|
/** |
|
* Offer Id,商品ID |
|
*/ |
|
offer_id: string | number; |
|
/** |
|
* Product Image,商品图片 |
|
*/ |
|
product_image?: null | string; |
|
/** |
|
* Product Name,商品名称 |
|
*/ |
|
product_name: string; |
|
/** |
|
* Product Name Ar,商品阿拉伯语名称 |
|
*/ |
|
product_name_ar?: null | string; |
|
/** |
|
* Product Name En,商品法语名称 |
|
*/ |
|
product_name_en?: null | string; |
|
/** |
|
* Product Name Fr,商品中文名称 |
|
*/ |
|
product_name_fr?: null | string; |
|
/** |
|
* Quantity,商品数量 |
|
*/ |
|
quantity: number; |
|
/** |
|
* Sku Attributes,SKU属性 |
|
*/ |
|
sku_attributes?: { [key: string]: any }[] | null; |
|
/** |
|
* Sku Id,SKU ID |
|
*/ |
|
sku_id?: number | null | string; |
|
/** |
|
* Total Price,商品总价 |
|
*/ |
|
total_price: number; |
|
/** |
|
* Unit Price,商品单价 |
|
*/ |
|
unit_price: number; |
|
[property: string]: any; |
|
} |
|
|
|
/** |
|
* OrderCreate,订单创建模型 |
|
*/ |
|
export interface OrderCreateRequest { |
|
/** |
|
* Actual Amount,实际支付金额 |
|
*/ |
|
actual_amount?: number | null; |
|
/** |
|
* Address Id,收货地址ID |
|
*/ |
|
address_id: number; |
|
/** |
|
* Buyer Message,买家留言 |
|
*/ |
|
buyer_message?: null | string; |
|
/** |
|
* Create Payment,是否创建支付记录 |
|
*/ |
|
create_payment?: boolean | null; |
|
/** |
|
* Currency,货币 |
|
*/ |
|
currency?: null | string; |
|
/** |
|
* Discount Amount,优惠金额 |
|
*/ |
|
discount_amount?: number | null; |
|
/** |
|
* Domestic Shipping Fee,国内运费 |
|
*/ |
|
domestic_shipping_fee?: number | null; |
|
/** |
|
* Items,订单项 |
|
*/ |
|
items: OrderItemBase[]; |
|
/** |
|
* Payment Method,支付方式 |
|
*/ |
|
payment_method?: null | string; |
|
/** |
|
* Receiver Address,货代地址 |
|
*/ |
|
receiver_address: string; |
|
/** |
|
* Shipping Fee,运费 |
|
*/ |
|
shipping_fee?: number | null; |
|
/** |
|
* Total Amount,订单总金额 |
|
*/ |
|
total_amount?: number | null; |
|
/** |
|
* Transport Type,运输方式 1-海运 2-空运 |
|
*/ |
|
transport_type?: number | null; |
|
[property: string]: any; |
|
} |
|
|
|
interface CreateOrderState { |
|
orderData: OrderCreateRequest; |
|
setOrderData: (data: Partial<OrderCreateRequest>) => void; |
|
setOrderItems: (items: OrderItemBase[]) => void; |
|
addOrderItem: (item: OrderItemBase) => void; |
|
removeOrderItem: (offerId: string | number, skuId?: string | number | null) => void; |
|
updateOrderItem: (item: Partial<OrderItemBase> & { offer_id: string | number, sku_id?: string | number | null }) => void; |
|
resetOrder: () => void; |
|
items: {cart_item_id: number}[]; |
|
setItems: (items: {cart_item_id: number}[]) => void; |
|
} |
|
|
|
const initialOrderData: OrderCreateRequest = { |
|
address_id: 0, |
|
items: [], |
|
buyer_message: '', |
|
payment_method: '', |
|
create_payment: true, |
|
actual_amount: 0, |
|
discount_amount: 0, |
|
shipping_fee: 0, |
|
domestic_shipping_fee: 0, |
|
currency: '', |
|
receiver_address: '', |
|
total_amount: 0, |
|
transport_type: null |
|
}; |
|
|
|
const useCreateOrderStore = create<CreateOrderState>((set) => ({ |
|
orderData: { ...initialOrderData }, |
|
|
|
setOrderData: (data: Partial<OrderCreateRequest>) => set((state) => ({ |
|
orderData: { ...state.orderData, ...data } |
|
})), |
|
|
|
setOrderItems: (items: OrderItemBase[]) => set((state) => ({ |
|
orderData: { ...state.orderData, items } |
|
})), |
|
|
|
addOrderItem: (item: OrderItemBase) => set((state) => { |
|
const items = [...state.orderData.items, item]; |
|
return { |
|
orderData: { ...state.orderData, items } |
|
}; |
|
}), |
|
|
|
removeOrderItem: (offerId: string | number, skuId?: string | number | null) => set((state) => { |
|
const items = state.orderData.items.filter(item => { |
|
if (skuId) { |
|
return !(item.offer_id === offerId && item.sku_id === skuId); |
|
} |
|
return item.offer_id !== offerId; |
|
}); |
|
|
|
return { |
|
orderData: { ...state.orderData, items } |
|
}; |
|
}), |
|
|
|
updateOrderItem: (item: Partial<OrderItemBase> & { offer_id: string | number, sku_id?: string | number | null }) => set((state) => { |
|
const items = state.orderData.items.map(existingItem => { |
|
const matchesOfferId = existingItem.offer_id === item.offer_id; |
|
const matchesSkuId = item.sku_id |
|
? existingItem.sku_id === item.sku_id |
|
: true; |
|
|
|
if (matchesOfferId && matchesSkuId) { |
|
return { ...existingItem, ...item }; |
|
} |
|
return existingItem; |
|
}); |
|
|
|
return { |
|
orderData: { ...state.orderData, items } |
|
}; |
|
}), |
|
|
|
resetOrder: () => set({ |
|
orderData: { ...initialOrderData } |
|
}), |
|
items: [], |
|
setItems: (items: {cart_item_id: number}[]) => set({ items }) |
|
})); |
|
|
|
export default useCreateOrderStore;
|
|
|