Files
2023-11-17 20:55:32 +08:00

283 lines
7.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @name: 购物车相关操作方法
* @author: kahu4
* @date: 2023-11-06 15:03
* @descriptionindex.utils
* @update: 2023-11-06 15:03
* */
import { computed, nextTick, ref, unref } from "vue";
import { changeCartSku, computeSelectInfo, deleteCartByIds, getCartList, updateCartNumber } from "@/api/cart";
import { onShow } from '@dcloudio/uni-app'
import _ from "loadsh";
import { useInterface } from "@/hooks/useInterface";
import { useRouter } from "@/hooks/useRouter";
/**
* 购物车数据
*/
export function useCartData() {
const cartListLoading = ref(false)
const cartList = ref([])
const showEmpty = computed(() => cartList.value.length <= 0)
/**
* 获取购物车列表
* @returns {Promise<void>}
*/
async function doGetCartList() {
try {
cartListLoading.value = true
const res = await getCartList()
cartList.value = res?.valid ?? []
} finally {
cartListLoading.value = false
}
}
onShow(async () => {
await doGetCartList()
})
return {
showEmpty,
cartListLoading,
cartList,
doGetCartList
}
}
/**
* 用户操作相关
*/
export function useCartOption(options) {
const {cartList, doGetCartList} = options
const {toast} = useInterface()
const {push} = useRouter()
const manage = ref(false)
const manageStr = computed(() => {
return manage.value ? '取消' : '管理'
})
const shoppingSelect = ref([]) // 选中数据
const shoppingSelectAll = ref(false) // 是否全选
/**
* 用户单选
* @param value
*/
async function handleSingleSelect(value) {
shoppingSelectAll.value = value.length === cartList.value.length
setTimeout(async () => {
await computeSelectInfoByShoppingSelect()
}, 100)
}
/**
* 用户全选
* @param e
* @returns {Promise<void>}
*/
async function handleSelectAll(e) {
shoppingSelect.value = !!e ? cartList.value.map(item => item.id) : []
shoppingSelectAll.value = e
await computeSelectInfoByShoppingSelect()
}
const statisticsInfo = ref(undefined) // 统计信息
/**
* 根据shoppingSelect去计算选中数据
* @returns {Promise<void>}
*/
async function computeSelectInfoByShoppingSelect() {
if (unref(shoppingSelect).length <= 0) return statisticsInfo.value = void (0)
const res = await computeSelectInfo({cartId: unref(shoppingSelect).join(',')});
statisticsInfo.value = res.priceGroup
}
/**
* 重新设置选中信息
* @returns {Promise<void>}
*/
async function resetUserSelect() {
shoppingSelect.value = []
shoppingSelectAll.value = false
await computeSelectInfoByShoppingSelect()
}
/**
* 打开删除弹窗
* @returns {*}
*/
function openDelModal(modalRef) {
if (unref(shoppingSelect).length <= 0) return toast({title: '请勾选需要删除的商品'})
unref(modalRef).show()
}
/**
* 删除数据
* @returns {Promise<void>}
*/
async function doDelete() {
await deleteCartByIds({
ids: shoppingSelect.value
})
await doGetCartList()
await resetUserSelect()
}
/**
* 提交订单
* @returns {*}
*/
function submitOrder() {
if (unref(shoppingSelect).length <= 0) return toast({title: '请勾选需要购买的商品'})
push({url: '/pages/submitOrder/submitOrder'}, {
data: {cartId: shoppingSelect.value.toString()}
})
}
return {
manage,
manageStr,
shoppingSelect,
shoppingSelectAll,
statisticsInfo,
handleSingleSelect,
handleSelectAll,
computeSelectInfoByShoppingSelect,
openDelModal,
doDelete,
submitOrder
}
}
/**
* 更改sku
*/
export function useSku() {
const {toast} = useInterface()
const openSkuProductId = ref(undefined) // 当前选中的sku
const openSkuCartId = ref(undefined)
/**
* 打开sku选择器
* @param item
* @param modalRef
*/
function handleOpenSkuSelect(item, modalRef) {
openSkuProductId.value = item.productId
openSkuCartId.value = item.id
nextTick(() => {
modalRef.open(item.cartNum, item.productInfo.attrInfo.sku)
})
}
/**
* 关闭sku选择器
*/
function handleCloseSkuSelect() {
openSkuProductId.value = openSkuCartId.value = void (0)
}
async function handleSubmitSkuSelect(e, modalRef, cartList, func, doGetCartList) {
if (!openSkuProductId.value) return
const {store, num} = e
await changeCartSku({
id: openSkuCartId.value,
productId: openSkuProductId.value,
productAttrUnique: store.unique
})
if (typeof func === 'function') {
const find = cartList.find(item => item.id === openSkuCartId.value);
await func({detail: {value: num}}, find)
}
setTimeout(async () => {
await doGetCartList()
toast({title: '修改成功', icon: 'success'})
modalRef.close()
}, 400)
}
return {
openSkuProductId,
handleOpenSkuSelect,
handleCloseSkuSelect,
handleSubmitSkuSelect
}
}
/**
* 更改购物车数量
*/
export function useCartNumber(options) {
const {toast} = useInterface()
/**
* 用户手动输入改变数量
* @param e
* @param item
* @returns {*}
*/
function handleCartNumberInputChange(e, item) {
const value = Number(e.detail.value)
if (value <= 0) {
item.cartNum = 1
toast({title: '至少选一件哦~'})
}
if (value > item.trueStock) {
item.cartNum = item.productInfo.stock
toast({title: '超出库存啦~'})
}
item.cartNum = value
doCartNumberChangeRequest(item)
}
/**
* 用户点击购物车+-改变数量
* @param item
* @param type
* @returns {*}
*/
function handleCartNumberChange(item, type = 'plus') {
if (type === 'plus') {
if (item.cartNum + 1 > item.trueStock){
item.cartNum = item.trueStock
} else{
item.cartNum += 1
}
} else {
if (item.cartNum <= 1){
item.cartNum = 1
} else {
item.cartNum -= 1
}
}
doCartNumberChangeRequest(item)
}
/**
* 请求改变后台用户购物车数据
* @param item
* @returns {Promise<void>}
*/
const doCartNumberChangeRequest = _.debounce(async (item) => {
await updateCartNumber({
id: item.id,
number: item.cartNum
})
options && options.afterChange && await options.afterChange()
}, 300)
return {
handleCartNumberInputChange,
handleCartNumberChange
}
}