2023-11-14 17:21:03 +08:00
|
|
|
|
/**
|
|
|
|
|
* @name: 购物车相关操作方法
|
|
|
|
|
* @author: kahu4
|
|
|
|
|
* @date: 2023-11-06 15:03
|
|
|
|
|
* @description:index.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') {
|
2023-11-17 20:55:32 +08:00
|
|
|
|
if (item.cartNum + 1 > item.trueStock){
|
|
|
|
|
item.cartNum = item.trueStock
|
|
|
|
|
} else{
|
|
|
|
|
item.cartNum += 1
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-14 17:21:03 +08:00
|
|
|
|
} else {
|
2023-11-17 20:55:32 +08:00
|
|
|
|
if (item.cartNum <= 1){
|
|
|
|
|
item.cartNum = 1
|
|
|
|
|
} else {
|
|
|
|
|
item.cartNum -= 1
|
|
|
|
|
}
|
2023-11-14 17:21:03 +08:00
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
}
|