Merge branch 'dev' into 'master'

uniapp【修复】: 拼团订单分享按钮后续逻辑不通 / 分享页面,文章详情页跳转链接

See merge request jianweie/coreshoppro!83
This commit is contained in:
花城
2024-11-13 11:08:08 +00:00
8 changed files with 1128 additions and 954 deletions

View File

@@ -3,91 +3,91 @@ import type { Response } from '@/core/models';
/** 获取不同类型营销下单支持的配送方式 */ /** 获取不同类型营销下单支持的配送方式 */
export const queryOrderDistributionModel = (data : any) : Promise<Response<any>> => { export const queryOrderDistributionModel = (data : any) : Promise<Response<any>> => {
return post('Api/Order/GetOrderDistributionModel', { return post('Api/Order/GetOrderDistributionModel', {
data, data,
}, true); }, true);
} }
/** 获取全部订单列表 */ /** 获取全部订单列表 */
export const queryOrderList = (data : any) : Promise<Response<any>> => { export const queryOrderList = (data : any) : Promise<Response<any>> => {
return post('Api/Order/GetOrderList', { return post('Api/Order/GetOrderList', {
data, data,
}, true); }, true);
} }
/** 根据订单编号获取当前订单的支付信息 */ /** 根据订单编号获取当前订单的支付信息 */
export const queryOrderPayInfo = (data : any) : Promise<Response<any>> => { export const queryOrderPayInfo = (data : any) : Promise<Response<any>> => {
return post('Api/Order/GetOrderPayInfo', { return post('Api/Order/GetOrderPayInfo', {
data, data,
}, true); }, true);
} }
/** 确认收货 */ /** 确认收货 */
export const queryOrderConfirm = (data : any) : Promise<Response<any>> => { export const queryOrderConfirm = (data : any) : Promise<Response<any>> => {
return post('Api/Order/OrderConfirm', { return post('Api/Order/OrderConfirm', {
data, data,
}, true); }, true);
} }
/** 查询当前订单是否接入微信发货信息管理 */ /** 查询当前订单是否接入微信发货信息管理 */
export const queryOrderShippingList = (data : any) : Promise<Response<any>> => { export const queryOrderShippingList = (data : any) : Promise<Response<any>> => {
return post('Api/Order/OrderShippingList', { return post('Api/Order/OrderShippingList', {
data, data,
}, true); }, true);
} }
/** 获取订单详情 */ /** 获取订单详情 */
export const queryOrderDetails = (data : any) : Promise<Response<any>> => { export const queryOrderDetails = (data : any) : Promise<Response<any>> => {
return post('Api/Order/OrderDetails', { return post('Api/Order/OrderDetails', {
data, data,
}, true); }, true);
} }
/** 取消订单 */ /** 取消订单 */
export const queryCancelOrder = (data : any) : Promise<Response<any>> => { export const queryCancelOrder = (data : any) : Promise<Response<any>> => {
return post('Api/Order/CancelOrder', { return post('Api/Order/CancelOrder', {
data, data,
}, true); }, true);
} }
/** 订单评价接口 */ /** 订单评价接口 */
export const submitOrderEvaluate = (data : any) : Promise<Response<any>> => { export const submitOrderEvaluate = (data : any) : Promise<Response<any>> => {
return post('Api/User/OrderEvaluate', { return post('Api/User/OrderEvaluate', {
data, data,
}, true); }, true);
} }
/** 判断用户下单可以使用多少积分 */ /** 判断用户下单可以使用多少积分 */
export const queryUserPoint = (data : any) : Promise<Response<any>> => { export const queryUserPoint = (data : any) : Promise<Response<any>> => {
return post('Api/User/GetUserPoint', { return post('Api/User/GetUserPoint', {
data, data,
}, true); }, true);
} }
/** 根据订单id取拼团信息用在订单详情页 */ /** 根据订单id取拼团信息用在订单详情页 */
export const queryOrderPinTuanTeamInfo = (data : any) : Promise<Response<any>> => { export const queryOrderPinTuanTeamInfo = (data : any) : Promise<Response<any>> => {
return post('Api/PinTuan/GetPinTuanTeam', { return post('Api/PinTuan/GetPinTuanTeam', {
data, data,
}, true); }, true);
} }
/** 获取发票是否开具 */ /** 获取发票是否开具 */
export const queryCheckInvoice = (data : any) : Promise<Response<any>> => { export const queryCheckInvoice = (data : any) : Promise<Response<any>> => {
return post('Api/Order/CheckInvoice', { return post('Api/Order/CheckInvoice', {
data, data,
}, true); }, true);
} }
/** 提交发票申请 */ /** 提交发票申请 */
export const querySubmitInvoiceApply = (data : any) : Promise<Response<any>> => { export const querySubmitInvoiceApply = (data : any) : Promise<Response<any>> => {
return post('Api/Order/SubmitInvoiceApply', { return post('Api/Order/SubmitInvoiceApply', {
data, data,
}, true); }, true);
} }
/** 物流信息接口 */ /** 物流信息接口 */
export const queryLogisticsByApi = (data : any) : Promise<Response<any>> => { export const queryLogisticsByApi = (data : any) : Promise<Response<any>> => {
return post('Api/Order/LogisticsByApi', { return post('Api/Order/LogisticsByApi', {
data, data,
}, true); }, true);
} }

View File

@@ -26,7 +26,7 @@
</view> </view>
<!-- 积分兑换价格 --> <!-- 积分兑换价格 -->
<Point :flex="true" :data="props.goodsDetailData?.product" fontSize="24rpx"></Point> <Point v-if="!props.isActivityGoods" :flex="true" :data="props.goodsDetailData?.product" fontSize="24rpx"></Point>
<view class="name-box" v-if="props.goodsDetailData?.name || props.goodsDetailData?.brief"> <view class="name-box" v-if="props.goodsDetailData?.name || props.goodsDetailData?.brief">
<view class="name">{{ props.goodsDetailData?.name }}</view> <view class="name">{{ props.goodsDetailData?.name }}</view>

View File

@@ -78,10 +78,10 @@
handleRouteSwitchTab(); handleRouteSwitchTab();
} }
break; break;
/** 文章页面 */ /** 文章详情页面 */
case ShareEnum.article: case ShareEnum.article:
if (shareData.data?.params?.articleId) { if (shareData.data?.params?.articleId) {
handleRouteRedirectTo(`/pages/subpackage/article/category/category?id=${shareData.data?.params?.articleId}&idType=${shareData.data?.params?.articleType}`) handleRouteRedirectTo(`/pages/subpackage/article/detail/detail?id=${shareData.data?.params?.articleId}`)
} else { } else {
handleRouteSwitchTab(); handleRouteSwitchTab();
} }

View File

@@ -41,7 +41,7 @@
<lpainterText :text="'截止:' + state.shareData.endTime" <lpainterText :text="'截止:' + state.shareData.endTime"
css="color: #212121; background: #ffb400; padding:8rpx 20rpx;border-radius:12rpx" /> css="color: #212121; background: #ffb400; padding:8rpx 20rpx;border-radius:12rpx" />
</lpainterView> </lpainterView>
<lpainterView css="margin-top: 30rpx; font-size: 26rpx; color: #8c5400"> <lpainterView css="width: 570rpx;margin-top: 30rpx; font-size: 26rpx; color: #8c5400">
<lpainterText :text="state.shareData.brief" <lpainterText :text="state.shareData.brief"
css=" background: #fff4d9; padding:8rpx 20rpx; border-radius:12rpx" /> css=" background: #fff4d9; padding:8rpx 20rpx; border-radius:12rpx" />
</lpainterView> </lpainterView>
@@ -130,7 +130,7 @@
if (state.shareType == ShareEnum.goods) { if (state.shareType == ShareEnum.goods) {
/** 获取商品详情 */ /** 获取商品详情 */
getGoodsDetail(query) getGoodsDetail(query)
} else if (state.shareType == ShareEnum.pinTuan || state.shareType === ShareEnum.addPinTuan) { } else if (state.shareType == ShareEnum.pinTuan || state.shareType == ShareEnum.addPinTuan) {
/** 获取活动拼团详情 */ /** 获取活动拼团详情 */
getActivityPinTuan(query); getActivityPinTuan(query);
} else if (state.shareType == ShareEnum.serviceGoods) { } else if (state.shareType == ShareEnum.serviceGoods) {
@@ -196,7 +196,7 @@
state.shareData.mktprice = goodsDetail.data?.mktprice; state.shareData.mktprice = goodsDetail.data?.mktprice;
state.shareData.showPinTuanArguments = true; state.shareData.showPinTuanArguments = true;
state.shareData.endTime = goodsDetail.data?.groupEndTime; state.shareData.endTime = goodsDetail.data?.pinTuanRule?.endTime;
state.shareData.peopleNumber = goodsDetail.data?.pinTuanRule?.peopleNumber; state.shareData.peopleNumber = goodsDetail.data?.pinTuanRule?.peopleNumber;
} else { } else {
handleShowToast(goodsDetail.msg, 'none', () => { handleShowToast(goodsDetail.msg, 'none', () => {

View File

@@ -86,3 +86,80 @@
background-color: #d33123; background-color: #d33123;
} }
} }
.pinTuan-popup-box{
padding: 40rpx;
.time-title{
font-size: 27rpx;
text-align: center;
margin-bottom: 5rpx;
}
.time{
text-align: center;
}
.teams-box{
margin-top: 40rpx;
display: flex;
flex-wrap: wrap;
justify-content: center;
.img-box{
position: relative;
width: 80rpx;
height: 80rpx;
border-radius: 50%;
margin-right: 30rpx;
margin-bottom: 20rpx;
.tit{
position: absolute;
top: -5rpx;
left: -10rpx;
display: inline-block;
background-color: #d33123;
color: #fff;
font-size: 22rpx;
z-index: 98;
padding: 0 10rpx;
border-radius: 10rpx;
-webkit-transform: scale(0.8);
transform: scale(0.8);
}
.img{
display: block;
width: 80rpx;
height: 80rpx;
border: 1px solid #d33123;
border-radius: 50%;
}
}
.need-peo{
width: 80rpx;
height: 80rpx;
border-radius: 50%;
display: flex;
border: 1px dashed #e1e1e1;
margin-right: 30rpx;
margin-bottom: 20rpx;
.tit{
margin: auto;
color: #d1d1d1;
font-size: 27rpx;
}
}
}
.peo-box{
margin-top: 20rpx;
text-align: center;
.peo{
color: #d33123;
}
}
.btn-box{
margin: 40rpx auto 0;
background-color: #d33123;
font-size: 27rpx;
padding: 20rpx 0;
justify-content: center;
width: 400rpx;
color: #fff;
border-radius: 20px;
}
}

View File

@@ -1,310 +1,350 @@
<template> <template>
<coreshop-page bgColor="rgba(0,0,0,0)" :isShowStatusBarHeight="false" :placeholder="false" showLoginModalDom <coreshop-page bgColor="rgba(0,0,0,0)" :isShowStatusBarHeight="false" :placeholder="false" showLoginModalDom
needLoadingPage :loadingPage="loadingPage"> needLoadingPage :loadingPage="loadingPage">
<view class="goods-detail"> <view class="goods-detail">
<!-- 商品详情 --> <!-- 商品详情 -->
<GoodsDetail :goodsId="state.goodsDetailData?.id" :goodsDetailData="state.goodsDetailData" <GoodsDetail :goodsId="state.goodsDetailData?.id" :goodsDetailData="state.goodsDetailData"
:swiperBanner="state.swiperBanner" :shareType="ShareEnum.pinTuan" :swiperBanner="state.swiperBanner" :shareType="ShareEnum.pinTuan"
:goodsDetailContent="state.goodsDetailContent" :isActivityGoods="true"> :goodsDetailContent="state.goodsDetailContent" :isActivityGoods="true">
<template #activityGoodsOtheService> <template #activityGoodsOtheService>
<view class="pinTuan-record" v-if="state.goodsDetailData?.pinTuanRecord?.length > 0"> <view class="pinTuan-record" v-if="state.goodsDetailData?.pinTuanRecord?.length > 0">
<view class="title"> <view class="title">
<view class="tit">开团信息</view> <view class="tit">开团信息</view>
<view class="desc">{{ state.goodsDetailData?.pinTuanRecordNums || '0' }}人在拼单可直接参与</view> <view class="desc">{{ state.goodsDetailData?.pinTuanRecordNums || '0' }}人在拼单可直接参与</view>
</view> </view>
<view class="pinTuan-box"> <view class="pinTuan-box">
<view class="item-box" v-for="item, index in state.goodsDetailData?.pinTuanRecord" <view class="item-box" v-for="item, index in state.goodsDetailData?.pinTuanRecord"
:key="index"> :key="index">
<view class="msg-box"> <view class="msg-box">
<view class="msg">还差 <text class="red">{{ item.teamNums || '' }}</text> 拼成</view> <view class="msg">还差 <text class="red">{{ item.teamNums || '' }}</text> 拼成</view>
<view class="time"> <view class="time">
剩余 剩余
<uv-count-down :time="item.lastTime * 1000" format="HH:mm:ss"></uv-count-down> <uv-count-down :time="item.lastTime * 1000" format="HH:mm:ss"></uv-count-down>
</view> </view>
</view> </view>
<view class="peo-box"> <view class="peo-box">
<image class="peo" v-for="cell, cellIndex in item.teams" :key="cellIndex" <image class="peo" v-for="cell, cellIndex in item.teams" :key="cellIndex"
:src="cell.userAvatar"></image> :src="cell.userAvatar"></image>
</view> </view>
<view class="peo-share"> <view class="peo-share">
<uv-button v-if="item.isOverdue" type="success" :disabled="true" size="mini" <uv-button v-if="item.isOverdue" type="success" :disabled="true" size="mini"
text="已结束"></uv-button> text="已结束"></uv-button>
<uv-button v-else type="success" size="mini" text="去拼单" <uv-button v-else type="success" size="mini" text="去拼单"
@click="handleSplicingOrders(item.teamId)"></uv-button> @click="handleSplicingOrders(item.teamId)"></uv-button>
</view> </view>
</view> </view>
</view> </view>
</view> </view>
</template> </template>
</GoodsDetail> </GoodsDetail>
<!-- 为您推荐 --> <!-- 为您推荐 -->
<GoodsDetailRecommend></GoodsDetailRecommend> <GoodsDetailRecommend></GoodsDetailRecommend>
<!-- 底部 购买 --> <!-- 底部 购买 -->
<GoodsDetailBottomTabbar> <GoodsDetailBottomTabbar>
<template #bottomTabbar> <template #bottomTabbar>
<view class="btn-box"> <view class="btn-box">
<view class="btn" @click="handleSingleBuy"> <view class="btn" @click="handleSingleBuy">
<view class="box"> <view class="box">
<view class="num">{{ state.goodsDetailData.price }}</view> <view class="num">{{ state.goodsDetailData.price }}</view>
<view class="tit">单独购买</view> <view class="tit">单独购买</view>
</view> </view>
</view> </view>
<view class="btn buy" @click="handleMultipleBuy"> <view class="btn buy" @click="handleMultipleBuy()">
<view class="box"> <view class="box">
<view class="num">{{ state.goodsDetailData.pinTuanPrice }}</view> <view class="num">{{ state.goodsDetailData.pinTuanPrice }}</view>
<view class="tit">发起拼团</view> <view class="tit">发起拼团</view>
</view> </view>
</view> </view>
</view> </view>
</template> </template>
</GoodsDetailBottomTabbar> </GoodsDetailBottomTabbar>
<!-- 商品sku弹框 --> <!-- 商品sku弹框 -->
<GoodsDetailSkuPopup :showSku="state.showSku" :goodsDetailData="state.goodsDetailData" <GoodsDetailSkuPopup :showSku="state.showSku" :goodsDetailData="state.goodsDetailData"
:isShowAddCartBtn="false" :buyNowNowloading="loading" @handleChangePopup="handleChangePopup" :isShowAddCartBtn="false" :buyNowNowloading="loading" @handleChangePopup="handleChangePopup"
@handleBuyNow="handleBuyNow" :btnBuyTitlt="state.btnBuyTitlt"> @handleBuyNow="handleBuyNow" :btnBuyTitlt="state.btnBuyTitlt">
</GoodsDetailSkuPopup> </GoodsDetailSkuPopup>
</view>
</coreshop-page> <!-- 分享进来的参与拼团弹框 -->
<uv-popup ref="pinTuanPopup" mode="bottom" :closeable="true">
<view class="pinTuan-popup-box">
<view class="time-title">剩余时间</view>
<view class="time">
<uv-count-down :time="state.teamInfo.lastTime * 1000" :autoStart="true" :millisecond="true" format="DD天HH时mm分ss秒"></uv-count-down>
</view>
<view class="teams-box">
<view class="img-box" v-for="item,index in state.teamInfo.teams" :key="index">
<text class="tit" v-if="item.recordId == item.teamId">拼主</text>
<image class="img" :src="item.userAvatar"></image>
</view>
<view class="need-peo" v-if="state.teamInfo?.teamNums" v-for="item in state.teamInfo?.teamNums" :key="item">
<text class="tit">?</text>
</view>
</view>
<view class="peo-box">
还差 <text class="peo">{{ state.teamInfo?.teamNums || '' }}</text> 赶快拼单吧
</view>
<view class="btn-box" @click="handleJoinGroupBuy">
参与拼团
</view>
</view>
</uv-popup>
</view>
</coreshop-page>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { onLoad, onShareAppMessage, onShareTimeline, onPullDownRefresh } from '@dcloudio/uni-app'; import { onLoad, onShareAppMessage, onShareTimeline, onPullDownRefresh } from '@dcloudio/uni-app';
import { queryPinTuanGoodsDetail, queryCartNum, queryAddCart, queryOrderPinTuanTeamInfo } from '@/core/api'; import { queryPinTuanGoodsDetail, queryCartNum, queryAddCart, queryOrderPinTuanTeamInfo } from '@/core/api';
import type { Response } from '@/core/models'; import type { Response } from '@/core/models';
import { UserToken, shareUrl } from '@/core/consts' import { UserToken, shareUrl } from '@/core/consts'
import { useCartStore, useLoginStore } from '@/core/store'; import { useCartStore, useLoginStore } from '@/core/store';
import { PaymentTypeEnum, ShareEnum, ShareClientEnum, ShareModelEnum } from '@/core/enum'; import { PaymentTypeEnum, ShareEnum, ShareClientEnum, ShareModelEnum } from '@/core/enum';
import { handleRouteNavigateTo, handleShowToast, getShareUrl } from '@/core/utils'; import { handleRouteNavigateTo, handleShowToast, getShareUrl } from '@/core/utils';
import { deepClone } from '@/uni_modules/uv-ui-tools/libs/function/index.js'; import { deepClone } from '@/uni_modules/uv-ui-tools/libs/function/index.js';
import GoodsDetail from '@/pages/components/goods-detail/index.vue'; import GoodsDetail from '@/pages/components/goods-detail/index.vue';
import GoodsDetailRecommend from '@/pages/components/goods-detail/components/goods-detail-recommend/goods-detail-recommend.vue'; import GoodsDetailRecommend from '@/pages/components/goods-detail/components/goods-detail-recommend/goods-detail-recommend.vue';
import GoodsDetailSkuPopup from '@/pages/components/goods-detail/components/goods-detail-sku/goods-detail-sku.vue'; import GoodsDetailSkuPopup from '@/pages/components/goods-detail/components/goods-detail-sku/goods-detail-sku.vue';
import GoodsDetailBottomTabbar from '@/pages/components/goods-detail/components/goods-detail-bottom-tabbar/goods-detail-bottom-tabbar.vue'; import GoodsDetailBottomTabbar from '@/pages/components/goods-detail/components/goods-detail-bottom-tabbar/goods-detail-bottom-tabbar.vue';
import { useLoadingFn } from '@/core/hooks'; import { useLoadingFn } from '@/core/hooks';
interface QueryParams { interface QueryParams {
id : number; id : number;
teamId ?: number; teamId ?: number;
} }
/** 登录store */ /** 登录store */
const _useLoginStore = useLoginStore(); const _useLoginStore = useLoginStore();
/** 获取购物车数据 */ /** 获取购物车数据 */
const cartStore = useCartStore(); const cartStore = useCartStore();
const state = reactive<{ /** 分享进来的参与拼团弹框 */
id : number; const pinTuanPopup = ref();
goodsDetailData : any,
swiperBanner : Array<string>;
goodsDetailContent : string;
skuPrice : Number;
defaultSkuList : Array<any>;
activitySkuList : Array<any>;
showSku : boolean;
teamId : number;
isSingleBuy : boolean;
btnBuyTitlt : string;
teamInfo : any;
shareUrl : string;
}>({
id: 0,
goodsDetailData: {},
swiperBanner: [],
goodsDetailContent: "",
skuPrice: 0,
defaultSkuList: [],
activitySkuList: [],
showSku: false,
teamId: 0,
isSingleBuy: true,
btnBuyTitlt: "发起拼团",
teamInfo: {},
shareUrl: "",
});
const loading = ref(false); const state = reactive<{
const loadingPage = ref(true); id : number;
const handleBuyNow = useLoadingFn(onBuyNow, loading); goodsDetailData : any,
const handleGetGoodsDetail = useLoadingFn(getGoodsDetail, loadingPage); swiperBanner : Array<string>;
goodsDetailContent : string;
skuPrice : Number;
defaultSkuList : Array<any>;
activitySkuList : Array<any>;
showSku : boolean;
teamId : number;
isSingleBuy : boolean;
btnBuyTitlt : string;
teamInfo : any;
shareUrl : string;
}>({
id: 0,
goodsDetailData: {},
swiperBanner: [],
goodsDetailContent: "",
skuPrice: 0,
defaultSkuList: [],
activitySkuList: [],
showSku: false,
teamId: 0,
isSingleBuy: true,
btnBuyTitlt: "发起拼团",
teamInfo: {},
shareUrl: "",
});
onLoad((query : QueryParams) => { const loading = ref(false);
if (query?.teamId) { const loadingPage = ref(true);
state.teamId = query?.teamId; const handleBuyNow = useLoadingFn(onBuyNow, loading);
state.goodsDetailData = { const handleGetGoodsDetail = useLoadingFn(getGoodsDetail, loadingPage);
teamId: query?.teamId
};
getOrderPinTuanTeamInfo(query?.teamId);
}
/** 获取商品详情 */
state.id = Number(query.id);
handleGetGoodsDetail();
});
onPullDownRefresh(async () => { onLoad((query : QueryParams) => {
await handleGetGoodsDetail(); if (query?.teamId) {
uni.stopPullDownRefresh(); state.teamId = query?.teamId;
}); state.goodsDetailData = {
teamId: query?.teamId
};
getOrderPinTuanTeamInfo(query?.teamId);
}
/** 获取商品详情 */
state.id = Number(query.id);
handleGetGoodsDetail();
});
async function getGoodsDetail() { onPullDownRefresh(async () => {
let data = { await handleGetGoodsDetail();
id: state.id, uni.stopPullDownRefresh();
data: true, });
}
if (uni.getStorageSync(UserToken)) {
data['token'] = uni.getStorageSync(UserToken)
}
const goodsDetail : Response<any> = await queryPinTuanGoodsDetail(data);
/** 增加活动价格,并合并对象,可能会存在 teamId */ async function getGoodsDetail() {
Object.assign(state.goodsDetailData, { let data = {
...goodsDetail.data, id: state.id,
activityPrice: goodsDetail.data.pinTuanPrice, data: true,
}); }
if (uni.getStorageSync(UserToken)) {
data['token'] = uni.getStorageSync(UserToken)
}
const goodsDetail : Response<any> = await queryPinTuanGoodsDetail(data);
/** 默认价格 */ /** 增加活动价格,并合并对象,可能会存在 teamId */
state.skuPrice = goodsDetail?.data?.price; Object.assign(state.goodsDetailData, {
/** 商品轮播图 */ ...goodsDetail.data,
state.swiperBanner = goodsDetail?.data?.images?.split(','); activityPrice: goodsDetail.data.pinTuanPrice,
/** 商品详情内容 */ });
state.goodsDetailContent = goodsDetail?.data?.intro;
/** 默认sku */
state.defaultSkuList = deepClone(goodsDetail?.data?.skuList?.sku_list);
/** 活动商品价格sku */
state.activitySkuList = deepClone(state.goodsDetailData?.skuList?.sku_list?.map((item : any) => {
item.price = (Number(item.price) - Number(state.goodsDetailData.pinTuanRule.discountAmount));
return item;
}));
/** 如果用户登录,获取购物车数量 */
if (uni.getStorageSync(UserToken)) {
getCartNum();
}
state.shareUrl = await getShareUrl({
client: ShareClientEnum.wxMiNiProgram,
url: shareUrl,
type: ShareModelEnum.url,
page: ShareEnum.pinTuan,
params: {
groupId: state.id,
goodsId: state.goodsDetailData.id,
teamId: state.teamId
}
})
}
/** 获取通过分享进来的拼团数据 */ /** 默认价格 */
const getOrderPinTuanTeamInfo = async (teamId : number) => { state.skuPrice = goodsDetail?.data?.price;
const teamInfo : Response<any> = await queryOrderPinTuanTeamInfo({ teamId, }); /** 商品轮播图 */
if (teamInfo.status) { state.swiperBanner = goodsDetail?.data?.images?.split(',');
state.teamInfo = teamInfo?.data; /** 商品详情内容 */
} else { state.goodsDetailContent = goodsDetail?.data?.intro;
handleShowToast(teamInfo.msg) /** 默认sku */
} state.defaultSkuList = deepClone(goodsDetail?.data?.skuList?.sku_list);
} /** 活动商品价格sku */
/** 获取购物车数量 */ state.activitySkuList = deepClone(state.goodsDetailData?.skuList?.sku_list?.map((item : any) => {
const getCartNum = async () => { item.price = (Number(item.price) - Number(state.goodsDetailData.pinTuanRule.discountAmount));
const num : Response<number> = await queryCartNum(); return item;
cartStore.setCartNum(num?.data || 0); }));
} /** 如果用户登录,获取购物车数量 */
if (uni.getStorageSync(UserToken)) {
getCartNum();
}
state.shareUrl = await getShareUrl({
client: ShareClientEnum.wxMiNiProgram,
url: shareUrl,
type: ShareModelEnum.url,
page: ShareEnum.pinTuan,
params: {
groupId: state.id,
goodsId: state.goodsDetailData.id,
teamId: state.teamId
}
})
}
/** 单独购买 */ /** 获取通过分享进来的拼团数据 */
const handleSingleBuy = () => { const getOrderPinTuanTeamInfo = async (teamId : number) => {
_useLoginStore.checkLogin(() => { const teamInfo : Response<any> = await queryOrderPinTuanTeamInfo({ teamId, });
state.teamId = 0; if (teamInfo.status) {
state.showSku = true; state.teamInfo = teamInfo?.data;
state.isSingleBuy = true; pinTuanPopup.value.open();
state.btnBuyTitlt = '单独购买'; } else {
state.goodsDetailData.skuList.sku_list = state.defaultSkuList; handleShowToast(teamInfo.msg)
}); }
} }
/** 获取购物车数量 */
const getCartNum = async () => {
const num : Response<number> = await queryCartNum();
cartStore.setCartNum(num?.data || 0);
}
/** 拼团购买 */ /** 单独购买 */
const handleMultipleBuy = () => { const handleSingleBuy = () => {
_useLoginStore.checkLogin(() => { _useLoginStore.checkLogin(() => {
state.teamId = 0; state.teamId = 0;
state.showSku = true; state.showSku = true;
state.isSingleBuy = false; state.isSingleBuy = true;
state.btnBuyTitlt = '发起拼团'; state.btnBuyTitlt = '单独购买';
state.goodsDetailData.skuList.sku_list = state.activitySkuList; state.goodsDetailData.skuList.sku_list = state.defaultSkuList;
}); });
} }
/** 去拼单 */ /** 拼团购买统一调用 */
const handleSplicingOrders = (teamId : number) => { const handlePinTuan = (title?:string)=>{
state.teamId = teamId; _useLoginStore.checkLogin(() => {
handleMultipleBuy(); state.showSku = true;
} state.isSingleBuy = false;
state.btnBuyTitlt = title || '发起拼团';
state.goodsDetailData.skuList.sku_list = state.activitySkuList;
});
}
/** 关闭sku弹框 */ /** 弹框中的按钮参与拼团购买 */
const handleChangePopup = (show : boolean) => { const handleJoinGroupBuy = ()=>{
state.showSku = show; pinTuanPopup.value.close();
} handlePinTuan('参与拼团');
}
/** 立即购买购买 */ /** 拼团购买 */
async function onBuyNow({ productId, nums } : any) { const handleMultipleBuy = () => {
if (state.isSingleBuy) { state.teamId = 0;
await handleSingleQuery(productId, nums) handlePinTuan()
} else { }
await handleMultipleQuery(productId, nums)
}
}
/** 处理单个购买请求 */ /** 去拼单购买 */
const handleSingleQuery = async (productId : number, nums : number) => { const handleSplicingOrders = (teamId : number) => {
const addCart : Response<number> = await queryAddCart({ state.teamId = teamId;
ProductId: productId, handlePinTuan('去拼单');
Nums: nums, }
type: PaymentTypeEnum.pinTuan,
cartType: PaymentTypeEnum.common,
});
if (addCart.status) {
handleRouteNavigateTo(`/pages/order/submit/submit?cartIds=${addCart.data}`)
/** 关闭sku弹框 */
handleChangePopup(false);
} else {
handleShowToast(addCart.msg);
}
}
/** 处理拼团购买请求 */ /** 关闭sku弹框 */
const handleMultipleQuery = async (productId : number, nums : number) => { const handleChangePopup = (show : boolean) => {
const addCart : Response<number> = await queryAddCart({ state.showSku = show;
ProductId: productId, }
Nums: nums,
type: PaymentTypeEnum.pinTuan,
cartType: PaymentTypeEnum.pinTuan,
objectId: state.id,
teamId: state.teamId
});
if (addCart.status) {
handleRouteNavigateTo(`/pages/order/submit/submit?cartIds=${addCart.data}&orderType=${PaymentTypeEnum.pinTuan}&objectId=${state.id}${state.teamId != 0 ? `&teamId=${state.teamId}` : ''}`)
/** 关闭sku弹框 */
handleChangePopup(false);
} else {
handleShowToast(addCart.msg);
}
}
/** 分享 */ /** 立即购买购买 */
onShareAppMessage(() => { async function onBuyNow({ productId, nums } : any) {
return { if (state.isSingleBuy) {
title: state.goodsDetailData.name, await handleSingleQuery(productId, nums)
imageUrl: state.goodsDetailData.image, } else {
path: state.shareUrl await handleMultipleQuery(productId, nums)
} }
}); }
onShareTimeline(() => {
return { /** 处理单个购买请求 */
title: state.goodsDetailData.name, const handleSingleQuery = async (productId : number, nums : number) => {
imageUrl: state.goodsDetailData.image, const addCart : Response<number> = await queryAddCart({
path: state.shareUrl ProductId: productId,
} Nums: nums,
}); type: PaymentTypeEnum.pinTuan,
cartType: PaymentTypeEnum.common,
});
if (addCart.status) {
handleRouteNavigateTo(`/pages/order/submit/submit?cartIds=${addCart.data}`)
/** 关闭sku弹框 */
handleChangePopup(false);
} else {
handleShowToast(addCart.msg);
}
}
/** 处理拼团购买请求 */
const handleMultipleQuery = async (productId : number, nums : number) => {
const addCart : Response<number> = await queryAddCart({
ProductId: productId,
Nums: nums,
type: PaymentTypeEnum.pinTuan,
cartType: PaymentTypeEnum.pinTuan,
objectId: state.id,
teamId: state.teamId
});
if (addCart.status) {
handleRouteNavigateTo(`/pages/order/submit/submit?cartIds=${addCart.data}&orderType=${PaymentTypeEnum.pinTuan}&objectId=${state.id}${state.teamId != 0 ? `&teamId=${state.teamId}` : ''}`)
/** 关闭sku弹框 */
handleChangePopup(false);
} else {
handleShowToast(addCart.msg);
}
}
/** 分享 */
onShareAppMessage(() => {
return {
title: state.goodsDetailData.name,
imageUrl: state.goodsDetailData.image,
path: state.shareUrl
}
});
onShareTimeline(() => {
return {
title: state.goodsDetailData.name,
imageUrl: state.goodsDetailData.image,
path: state.shareUrl
}
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import './detail.scss'; @import './detail.scss';
</style> </style>

View File

@@ -99,10 +99,10 @@
<script setup lang="ts"> <script setup lang="ts">
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { onLoad, onShareAppMessage, onShareTimeline, onPullDownRefresh } from '@dcloudio/uni-app'; import { onLoad, onShareAppMessage, onShareTimeline, onPullDownRefresh } from '@dcloudio/uni-app';
import { querySolitaireDetail, queryShare, queryAddCart, queryRemoveCart } from '@/core/api'; import { querySolitaireDetail, queryAddCart, queryRemoveCart } from '@/core/api';
import { ShareClientEnum, ShareModelEnum, ShareEnum, EmptyEnum, PaymentTypeEnum, AddCartEnum } from '@/core/enum'; import { ShareClientEnum, ShareModelEnum, ShareEnum, EmptyEnum, PaymentTypeEnum, AddCartEnum } from '@/core/enum';
import type { Response } from '@/core/models'; import type { Response } from '@/core/models';
import { UserToken, shareUrl } from '@/core/consts' import { shareUrl } from '@/core/consts'
import { useShopConfigStore, useLoginStore } from '@/core/store'; import { useShopConfigStore, useLoginStore } from '@/core/store';
import { handleShowToast, handleRouteNavigateTo, getShareUrl } from '@/core/utils'; import { handleShowToast, handleRouteNavigateTo, getShareUrl } from '@/core/utils';
import { timeFormat } from '@/uni_modules/uv-ui-tools/libs/function/index.js'; import { timeFormat } from '@/uni_modules/uv-ui-tools/libs/function/index.js';