Kaynağa Gözat

分类+底部

weixin_52219567 3 hafta önce
ebeveyn
işleme
4d8536a08d

+ 2 - 2
src/addon/shop/api/goods.ts

@@ -10,8 +10,8 @@ export function getGoodsCategoryConfig() {
 /**
  * 获取商品分类树结构
  */
-export function getGoodsCategoryTree() {
-    return request.get(`shop/goods/category/tree`)
+export function getGoodsCategoryTree(params:any) {
+    return request.get(`product/miniProduct/getProductCategoryTree`,params)
 }
 
 /**

+ 10 - 3
src/addon/shop/api/order.ts

@@ -43,6 +43,13 @@ export function getShopOrderDetail(order_id: any) {
     return request.get(`order/miniOrder/${ order_id }`)
 }
 
+/**
+ * 根据订单id查询发货订单
+ */
+export function selectOrderDeliverByOrderId(params: any) {
+    return request.get(`order/miniOrder/selectOrderDeliverByOrderId`,params)
+}
+
 /**
  * 关闭订单
  */
@@ -53,8 +60,8 @@ export function orderClose(params: any) {
 /**
  * 订单完成
  */
-export function orderFinish(order_id: number) {
-    return request.put(`shop/order/finish/${ order_id }`)
+export function orderFinish(params: any) {
+    return request.get(`order/miniOrder/batchConfirmation`,params)
 }
 
 /**
@@ -89,7 +96,7 @@ export function getStoreList(params: Record<string, any>) {
  * 查询物流信息
  */
 export function getMaterialflowList(params: Record<string, any>) {
-    return request.get('shop/order/logistics', params)
+    return request.get('order/miniOrder/queryTrack', params)
 }
 
 /**

+ 4 - 10
src/addon/shop/hooks/useGoods.ts

@@ -1,16 +1,10 @@
 export function useGoods(params: any = {}) {
 
-    const baseTagStyle = (data: any) => {
+    const baseTagStyle = () => {
         let style = "";
-        if (data.color_json && data.color_json.text_color) {
-            style += `color:${ data.color_json.text_color };`;
-        }
-        if (data.color_json && data.color_json.border_color) {
-            style += `border-color: ${ data.color_json.border_color };`;
-        }
-        if (data.color_json && data.color_json.bg_color) {
-            style += `background-color: ${ data.color_json.bg_color };`;
-        }
+        style += `color:${ 'rgba(255, 0, 0, 1)' };`;
+        style += `border-color: ${ 'rgba(255, 0, 0, 1)' };`;
+        style += `background-color: ${ 'rgba(255, 255, 255, 1)' };`;
         return style;
     }
 

+ 37 - 21
src/addon/shop/pages/goods/list.vue

@@ -22,18 +22,22 @@
                         :class="{ 'text-[var(--primary-color)] font-500': searchType == 'stock' }"
                         @click="searchTypeFn('stock')">
                         <text class="mr-[4rpx]">库存</text>
-                        <text v-if="searchType === 'stock' && currentSortOrder === 'Asc'" class="text-[16rpx] nc-iconfont nc-icon-a-xiangshangV6xx1"
+                        <text v-if="searchType === 'stock' && currentSortOrder === 'Asc'"
+                            class="text-[16rpx] nc-iconfont nc-icon-a-xiangshangV6xx1"
                             :class="{ 'text-[var(--primary-color)]': searchType == 'stock' }"></text>
-                        <text v-else-if="searchType === 'stock'" class="text-[16rpx] nc-iconfont nc-icon-a-xiangxiaV6xx1"
+                        <text v-else-if="searchType === 'stock'"
+                            class="text-[16rpx] nc-iconfont nc-icon-a-xiangxiaV6xx1"
                             :class="{ 'text-[var(--primary-color)]': searchType == 'stock' }"></text>
                     </view>
                     <view class="flex items-center text-[#333]"
                         :class="{ 'text-[var(--primary-color)] font-500': searchType == 'price' }"
                         @click="searchTypeFn('price')">
                         <text class="mr-[4rpx]">价格</text>
-                        <text v-if="searchType === 'price' && currentSortOrder === 'Asc'" class="text-[16rpx] nc-iconfont nc-icon-a-xiangshangV6xx1"
+                        <text v-if="searchType === 'price' && currentSortOrder === 'Asc'"
+                            class="text-[16rpx] nc-iconfont nc-icon-a-xiangshangV6xx1"
                             :class="{ 'text-[var(--primary-color)]': searchType == 'price' }"></text>
-                        <text v-else-if="searchType === 'price'" class="text-[16rpx] nc-iconfont nc-icon-a-xiangxiaV6xx1"
+                        <text v-else-if="searchType === 'price'"
+                            class="text-[16rpx] nc-iconfont nc-icon-a-xiangxiaV6xx1"
                             :class="{ 'text-[var(--primary-color)]': searchType == 'price' }"></text>
                     </view>
                     <view class="flex items-center"
@@ -48,18 +52,18 @@
         <u-popup :show="labelPopup" mode="top" @close="labelPopup = false">
             <view @touchmove.prevent.stop class="h-[50vh] overflow-auto mt-[30rpx]">
                 <view v-for="(item, index) in categoryList" :key="index">
-                    <view class="text-[28rpx] px-[20rpx] mt-[10rpx]">{{ item.category_name }}</view>
+                    <view class="text-[28rpx] px-[20rpx] mt-[10rpx]">{{ item.label }}</view>
                     <view class="flex flex-wrap pl-[20rpx] pt-[20rpx]">
-                        <text @click="loadCategory(item.category_id)" :key="item.category_id"
-                            :class="{ 'label-select': currGoodsCategory == item.category_id }"
+                        <text @click="loadCategory(item.id, '')" :key="item.id"
+                            :class="{ 'label-select': mediumCategoryId == '' && item.id == topCategoryId }"
                             class="truncate text-[#333] border-[2rpx] border-solid border-transparent w-[162rpx] h-[56rpx] flex items-center justify-center mr-[20rpx] mb-[30rpx] box-border bg-[var(--temp-bg)] rounded-[50rpx] text-[24rpx]">
                             全部
                         </text>
-                        <text @click="loadCategory(subItem.category_id)" v-for="(subItem, index) in item.child_list"
-                            :key="subItem.category_id"
-                            :class="{ 'label-select': currGoodsCategory == subItem.category_id }"
+                        <text @click="loadCategory(item.id, subItem.id)"
+                            v-for="(subItem, index) in item.children" :key="subItem.id"
+                            :class="{ 'label-select': mediumCategoryId == subItem.id }"
                             class="truncate text-[#333] border-[2rpx] border-solid border-transparent w-[162rpx] h-[56rpx] flex items-center justify-center mr-[20rpx] mb-[30rpx] box-border bg-[var(--temp-bg)] rounded-[50rpx] text-[24rpx]">
-                            {{ subItem.category_name }}
+                            {{ subItem.label }}
                         </text>
                     </view>
                 </view>
@@ -126,7 +130,8 @@
                                         {{ item.itemName }}
                                     </view>
                                     <view class="flex flex-wrap">
-                                        <view class="base-tag" :style="diyGoods.baseTagStyle()">起订{{ item.minOrderQuantity || 1 }}{{ item.unitName || '件' }}
+                                        <view class="base-tag" :style="diyGoods.baseTagStyle()">起订{{
+                                            item.minOrderQuantity || 1 }}{{ item.unitName || '件' }}
                                         </view>
                                     </view>
                                     <view class="flex justify-between flex-wrap items-end">
@@ -139,7 +144,8 @@
                                                     diyGoods.goodsPrice(item).toFixed(2).split('.')[1] }}</text>
                                             </view>
                                         </view>
-                                        <text class="text-[22rpx] text-[var(--text-color-light9)] mt-[20rpx]"> 库存:{{ item.totalInventory || 0 }}</text>
+                                        <text class="text-[22rpx] text-[var(--text-color-light9)] mt-[20rpx]"> 库存:{{
+                                            item.totalInventory || 0 }}</text>
                                     </view>
                                 </view>
                             </view>
@@ -177,7 +183,8 @@
                                                     diyGoods.goodsPrice(item).toFixed(2).split('.')[1] }}</text>
                                             </view>
                                         </view>
-                                        <text class="mt-[20rpx] text-[22rpx] text-[var(--text-color-light9)]">库存:{{ item.totalInventory || 0 }}</text>
+                                        <text class="mt-[20rpx] text-[22rpx] text-[var(--text-color-light9)]">库存:{{
+                                            item.totalInventory || 0 }}</text>
                                     </view>
                                 </view>
                             </view>
@@ -206,11 +213,13 @@ import { useGoods } from '@/addon/shop/hooks/useGoods'
 
 const { mescrollInit, downCallback, getMescroll } = useMescroll(onPageScroll, onReachBottom);
 const diyGoods = useGoods();
-const categoryList = ref<Array<Object>>([]);
+const categoryList = ref<any>([]);
 const goodsList = ref<Array<any>>([]);
 const currGoodsCategory = ref<number | string>('');
 const mescrollRef = ref(null);
 const loading = ref<boolean>(false);
+const topCategoryId = ref<any>(null);
+const mediumCategoryId = ref<any>(null);
 // 标签
 const labelPopup = ref(false);
 const goods_name = ref("");
@@ -228,8 +237,8 @@ onLoad(async (option: any) => {
     // #endif
     currGoodsCategory.value = option.curr_goods_category || ''
     goods_name.value = option.goods_name ? decodeURIComponent(option.goods_name) : ''
-    await getGoodsCategoryTree().then((res: any) => {
-        const initData = { category_name: "全部", category_id: '' };
+    await getGoodsCategoryTree({ platform: 0 }).then((res: any) => {
+        const initData = { label: "全部", id: '' };
         categoryList.value.push(initData);
         categoryList.value = categoryList.value.concat(res.data);
     });
@@ -260,7 +269,8 @@ const getAllAppListFn = (mescroll: mescrollStructure) => {
     }
 
     let data: object = {
-        goods_category: currGoodsCategory.value,
+        topCategoryId: mediumCategoryId.value,
+        mediumCategoryId: mediumCategoryId.value,
         pageNum: mescroll.num,
         pageSize: mescroll.size,
         searchKeyword: goods_name.value,
@@ -288,8 +298,14 @@ onPageScroll((e) => {
     // uni.$emit('scroll')
 })
 
-const loadCategory = (id: string) => {
-    currGoodsCategory.value = id;
+const loadCategory = (id: string, cid: any) => {
+    if(cid == ''){
+        topCategoryId.value = id;
+        mediumCategoryId.value = '';
+    }else{
+        topCategoryId.value = id;
+        mediumCategoryId.value = cid;
+    }
     goodsList.value = [];
     getMescroll().resetUpScroll();
     labelPopup.value = false;
@@ -325,7 +341,7 @@ const toDetail = (id: string | number) => {
 }
 onMounted(() => {
     setTimeout(() => {
-        getMescroll().optUp.textNoMore = t("end");
+        getMescroll().optUp.textNoMore = '-- 到底了 --';
     }, 500)
 });
 </script>

+ 30 - 44
src/addon/shop/pages/order/components/logistics-tracking/logistics-tracking.vue

@@ -1,52 +1,34 @@
 <template>
     <view @touchmove.prevent.stop>
-        <u-popup :show="showpop" mode="bottom" :round="10" @close="close" :closeable="true" :safeAreaInsetBottom="true" @touchmove.prevent.stop>
-            <view class="h-[70vh] px-[24rpx] bg-page pb-[20rpx]" @touchmove.prevent.stop v-if="Object.keys(showList).length">
-                <view class="font-500 text-center text-[32rpx] leading-[104rpx] box-border h-[104rpx]">{{ t('detailedInformation') }}</view>
-                <scroll-view :scroll-x="true" scroll-with-animation :scroll-into-view="'id' + (subActive>3 ? subActive - 2 : 0)">
+        <u-popup :show="showpop" mode="bottom" :round="10" @close="close" :closeable="true" :safeAreaInsetBottom="true"
+            @touchmove.prevent.stop>
+            <view class="h-[70vh] px-[24rpx] bg-page pb-[20rpx]" @touchmove.prevent.stop>
+                <view class="font-500 text-center text-[32rpx] leading-[104rpx] box-border h-[104rpx]">详细信息</view>
+                <scroll-view :scroll-x="true" scroll-with-animation
+                    :scroll-into-view="'id' + (subActive > 3 ? subActive - 2 : 0)">
                     <view class="flex py-[22rpx] whitespace-nowrap" v-if="packageList.length > 1">
                         <view :id="'id' + index" class="text-[26rpx] leading-[36rpx] mr-[30rpx] text-[#626779]"
-                              :class="{'!text-primary class-select': item.id ==  current}"
-                              v-for="(item,index) in packageList" :key="index" @click="handleClick(item,index)">
-                            {{ item.name }}
+                            :class="{ '!text-primary class-select': item.id == current }"
+                            v-for="(item, index) in packageList" :key="index" @click="handleClick(item, index)">
+                            包裹{{ Number(index) + 1 }}
                         </view>
                     </view>
                 </scroll-view>
-                <view class="text-[28rpx] mt-[20rpx] ">
-                    <view class="flex justify-between mb-[20rpx]">
-                        <template v-if="showList.sub_delivery_type == 'none_express'">
-                            <text class="mr-[20rpx]">无需物流</text>
-                        </template>
-                        <template v-else>
-                            <text class="mr-[20rpx]">{{ showList.company.company_name }}</text>
-                            <view>
-                                <text class="mr-[14rpx]">{{ showList.express_number }}</text>
-                                <text @click="copy(showList.express_number)">{{ t('copy') }}</text>
-                            </view>
-                        </template>
-                    </view>
-                </view>
-                <view class="parcel" style="height: 53vh;" v-if="showList.sub_delivery_type == 'express'">
+                <view class="parcel" style="height: 53vh;">
                     <view class="h-[56vh] flex flex-col items-center justify-center"
-                          v-if="!Object.keys(showList.traces).length || showList.traces.success == false">
+                        v-if="!showList.data">
                         <text class="nc-iconfont nc-icon-daishouhuoV6xx text-[180rpx] text-[#bfbfbf]"></text>
                         <view class="text-[28rpx] text-[#bfbfbf] leading-8">暂无物流信息~~</view>
                     </view>
                     <scroll-view v-else :scroll-y="true" style="height:53vh;padding: 20rpx;box-sizing: border-box;"
-                                 class="bg-white rounded-md">
+                        class="bg-white rounded-md">
                         <u-steps :current="0" dot direction="column" activeColor="var(--primary-color)">
-                            <template v-for="(item,index) in showList.traces.list" :key="index + 'id'">
-                                <u-steps-item :title="item.remark" :desc="item.datetime"></u-steps-item>
+                            <template v-for="(item, index) in showList.data" :key="index + 'id'">
+                                <u-steps-item :title="item.context" :desc="item.time"></u-steps-item>
                             </template>
                         </u-steps>
                     </scroll-view>
                 </view>
-                <view style="height: 53vh;" v-else-if="showList.sub_delivery_type == 'none_express'">
-                    <view class="h-[56vh] flex-col flex items-center justify-center">
-                        <text class="nc-iconfont nc-icon-daishouhuoV6xx text-[180rpx] text-[#bfbfbf]"></text>
-                        <view class="text-[28rpx] text-[#bfbfbf] leading-8">无需物流~~</view>
-                    </view>
-                </view>
             </view>
         </u-popup>
     </view>
@@ -54,37 +36,42 @@
 
 <script setup lang="ts">
 import { ref } from 'vue'
-import { t } from '@/locale'
-import { img, redirect, copy } from '@/utils/common';
 import { getMaterialflowList } from '@/addon/shop/api/order';
 
 const showpop = ref(false)
-const packageList = ref([])
+const packageList = ref<any>([])
 const showList = ref<any>({})
-const loadList = async(params: any) => {
+const loadList = async (params: any) => {
     let data: any = await getMaterialflowList(params)
-    showList.value = data.data
+    if(data.data){
+        showList.value = data
+    }
 }
 const current = ref(0)
 const subActive = ref(0)
 
 const open = (params: any) => {
     current.value = params.id
-    loadList(params)
+    if (params.logisticNo) {
+        loadList({ logisticNo: params.logisticNo })
+    }
     showpop.value = true
 }
 
 const close = () => {
     showpop.value = false
 }
-const handleClick = (item: any, index: number) => {
+const handleClick = (item: any, index: any) => {
     current.value = item.id
     subActive.value = index
-    let params = {
-        id: item.id,
-        mobile: item.mobile
+    if (item.logisticNo) {
+        let params = {
+            logisticNo: item.logisticNo
+        }
+        loadList(params)
+    }else{
+        showList.value = {}
     }
-    loadList(params)
 }
 defineExpose({
     packageList,
@@ -118,4 +105,3 @@ defineExpose({
     }
 }
 </style>
-

+ 163 - 188
src/addon/shop/pages/order/detail.vue

@@ -8,31 +8,39 @@
                     <!-- #endif -->
                     <view class="flex justify-between items-center pt-[40rpx]">
                         <view class="flex flex-col">
-                            <image class="w-[28rpx] h-[20rpx] mb-[10rpx] ml-[4rpx]"
-                                :src="img('https://v6.site.niucloud.com/addon/shop/detail/head_001.png')"
-                                mode="aspectFit" />
+                            <image class="w-[28rpx] h-[20rpx] mb-[10rpx] ml-[4rpx]" :src="img(
+                                'https://v6.site.niucloud.com/addon/shop/detail/head_001.png'
+                            )
+                                " mode="aspectFit" />
                             <view class="text-[#fff] text-[36rpx] font-500 leading-[42rpx]">{{
-                                getStatusText(detail.orderStatus) }}</view>
+                                getStatusText(detail.orderStatus)
+                            }}</view>
                         </view>
                         <view class="flex items-end relative -bottom-[6rpx]">
-                            <image v-if="detail.orderStatus == 1" class="w-[160rpx] h-[140rpx]"
-                                :src="img('https://v6.site.niucloud.com/addon/shop/detail/payment.png')"
-                                mode="aspectFit" />
-                            <image v-if="detail.orderStatus == 2" class="w-[160rpx] h-[140rpx]"
-                                :src="img('https://v6.site.niucloud.com/addon/shop/detail/deliver_goods.png')"
-                                mode="aspectFit" />
-                            <image v-if="detail.orderStatus == 3" class="w-[160rpx] h-[140rpx]"
-                                :src="img('https://v6.site.niucloud.com/addon/shop/detail/receive.png')"
-                                mode="aspectFit" />
-                            <image v-if="detail.orderStatus == 5" class="w-[160rpx] h-[140rpx]"
-                                :src="img('https://v6.site.niucloud.com/addon/shop/detail/complete.png')"
-                                mode="aspectFit" />
-                            <image v-if="detail.orderStatus == -1" class="w-[160rpx] h-[140rpx]"
-                                :src="img('https://v6.site.niucloud.com/addon/shop/detail/close.png')"
-                                mode="aspectFit" />
-                            <image class="w-[8rpx] h-[30rpx] mb-[20rpx]"
-                                :src="img('https://v6.site.niucloud.com/addon/shop/detail/head_002.png')"
-                                mode="aspectFit" />
+                            <image v-if="detail.orderStatus == 1" class="w-[160rpx] h-[140rpx]" :src="img(
+                                'https://v6.site.niucloud.com/addon/shop/detail/payment.png'
+                            )
+                                " mode="aspectFit" />
+                            <image v-if="detail.orderStatus == 2" class="w-[160rpx] h-[140rpx]" :src="img(
+                                'https://v6.site.niucloud.com/addon/shop/detail/deliver_goods.png'
+                            )
+                                " mode="aspectFit" />
+                            <image v-if="detail.orderStatus == 3" class="w-[160rpx] h-[140rpx]" :src="img(
+                                'https://v6.site.niucloud.com/addon/shop/detail/receive.png'
+                            )
+                                " mode="aspectFit" />
+                            <image v-if="detail.orderStatus == 5" class="w-[160rpx] h-[140rpx]" :src="img(
+                                'https://v6.site.niucloud.com/addon/shop/detail/complete.png'
+                            )
+                                " mode="aspectFit" />
+                            <image v-if="detail.orderStatus == -1" class="w-[160rpx] h-[140rpx]" :src="img(
+                                'https://v6.site.niucloud.com/addon/shop/detail/close.png'
+                            )
+                                " mode="aspectFit" />
+                            <image class="w-[8rpx] h-[30rpx] mb-[20rpx]" :src="img(
+                                'https://v6.site.niucloud.com/addon/shop/detail/head_002.png'
+                            )
+                                " mode="aspectFit" />
                         </view>
                     </view>
                 </view>
@@ -47,14 +55,18 @@
                                 </view>
                                 <view
                                     class="mt-[12rpx] text-[24rpx] text-[var(--text-color-light6)] using-hidden leading-[26rpx]">
-                                    {{ addressInfo.provincialCityCountry }}{{ addressInfo.address }}</view>
+                                    {{ addressInfo.provincialCityCountry
+                                    }}{{ addressInfo.address }}</view>
                             </view>
                         </view>
                     </view>
                 </view>
-                <view class="sidebar-margin card-template p-[0] py-[var(--pad-top-m)] overflow-hidden"
-                    :class="{ 'pb-[var(--pad-top-m)]': detail.orderProductList.length <= 0 }"
-                    :style="detail.delivery_type == 'virtual' || detail.taker_name == '' ? 'margin-top: -86rpx' : 'margin-top: 20rpx'">
+                <view class="sidebar-margin card-template p-[0] py-[var(--pad-top-m)] overflow-hidden" :class="{
+                    'pb-[var(--pad-top-m)]': detail.orderProductList.length <= 0,
+                }" :style="detail.delivery_type == 'virtual' || detail.taker_name == ''
+                    ? 'margin-top: -86rpx'
+                    : 'margin-top: 20rpx'
+                    ">
                     <view v-for="(goodsItem, goodsIndex) in detail.orderProductList" :key="goodsIndex"
                         class="px-[var(--pad-sidebar-m)]">
                         <view class="order-goods-item flex justify-between flex-wrap mb-[20rpx]">
@@ -82,9 +94,13 @@
                                     <view class="price-font">
                                         <text class="text-[24rpx]">¥</text>
                                         <text class="text-[40rpx] font-500">{{
-                                            parseFloat(goodsItem.orderPrice).toFixed(2).split('.')[0] }}</text>
+                                            parseFloat(goodsItem.orderPrice).toFixed(2).split(".")[0]
+                                        }}</text>
                                         <text class="text-[24rpx] font-500">.{{
-                                            parseFloat(goodsItem.orderPrice).toFixed(2).split('.')[1] }}</text>
+                                            parseFloat(goodsItem.orderPrice)
+                                                .toFixed(2)
+                                                .split(".")[1]
+                                        }}</text>
                                     </view>
                                     <text class="text-right text-[26rpx]">x{{ goodsItem.orderQuantity }}</text>
                                 </view>
@@ -113,21 +129,21 @@
                 <view class="sidebar-margin mt-[var(--top-m)] card-template">
                     <view class="justify-between card-template-item">
                         <view class="text-[28rpx]">配送时间</view>
-                        <view class="text-[28rpx]">{{ detail.expectedDeliveryTime || '-'}}
+                        <view class="text-[28rpx]">{{ detail.expectedDeliveryTime || "-" }}
                         </view>
                     </view>
                     <view class="justify-between card-template-item">
                         <view class="text-[28rpx]">采购事由</view>
-                        <view class="text-[28rpx]">{{ detail.purchaseReason || '-' }}
+                        <view class="text-[28rpx]">{{ detail.purchaseReason || "-" }}
                         </view>
                     </view>
                     <view class="justify-between card-template-item">
                         <view class="text-[28rpx]">费用类型</view>
                         <view class="text-[28rpx]">日常物资采购</view>
                     </view>
-                    <view class=" card-template-item justify-between">
+                    <view class="card-template-item justify-between">
                         <view class="text-[28rpx]">订单备注</view>
-                        <view class="text-[28rpx]">{{ detail.remark || '-' }}</view>
+                        <view class="text-[28rpx]">{{ detail.remark || "-" }}</view>
                     </view>
                 </view>
                 <view class="sidebar-margin mt-[var(--top-m)] card-template">
@@ -136,42 +152,46 @@
                         <view class="price-font font-500">
                             <template v-if="parseFloat(detail.totalAmount)">
                                 <text class="text-[28rpx]">¥</text>
-                                <text class="text-[28rpx]">{{ parseFloat(detail.totalAmount).toFixed(2).split('.')[0]
+                                <text class="text-[28rpx]">{{
+                                    parseFloat(detail.totalAmount).toFixed(2).split(".")[0]
                                 }}</text>
-                                <text class="text-[28rpx]">.{{ parseFloat(detail.totalAmount).toFixed(2).split('.')[1]
+                                <text class="text-[28rpx]">.{{
+                                    parseFloat(detail.totalAmount).toFixed(2).split(".")[1]
                                 }}</text>
                             </template>
                         </view>
                     </view>
-                    <view class=" card-template-item justify-between">
+                    <view class="card-template-item justify-between">
                         <view class="text-[28rpx]">配送费用</view>
                         <view class="price-font font-500 text-[28rpx]">¥{{ detail.shippingFee }}</view>
                     </view>
-                    <view class=" card-template-item justify-between items-baseline">
+                    <view class="card-template-item justify-between items-baseline">
                         <view class="text-[28rpx]">实付金额</view>
                         <view class="text-[var(--price-text-color)] price-font">
-                            <text v-if="parseFloat(detail.order_money) || !parseFloat(detail.point)"
-                                class="text-[28rpx]">¥{{
-                                    parseFloat(detail.totalAmount).toFixed(2) }}</text>
+                            <text v-if="
+                                parseFloat(detail.order_money) || !parseFloat(detail.point)
+                            " class="text-[28rpx]">¥{{ parseFloat(detail.totalAmount).toFixed(2) }}</text>
                         </view>
                     </view>
                 </view>
 
                 <view
-                    class="flex z-2 justify-between items-center bg-[#fff] fixed left-0 right-0 bottom-0 min-h-[100rpx] pl-[30rpx] pr-[20rpx] flex-wrap  pb-ios">
+                    class="flex z-2 justify-between items-center bg-[#fff] fixed left-0 right-0 bottom-0 min-h-[100rpx] pl-[30rpx] pr-[20rpx] flex-wrap pb-ios">
                     <view class="flex justify-end">
                         <view @click="orderBtnFn('index')" class="order-grey-hollow-btn ml-[20rpx]">首页</view>
                         <view
-                            class="px-[35rpx]  box-border  text-[24rpx]  h-[60rpx] flex-center text-center border-[2rpx] border-solid border-[#ccc] rounded-full ml-[20rpx] text-[var(--text-color-light3)]"
-                            @click="orderBtnFn('logistics')" v-if="detail.isNeedCheck == '0' && detail.checkStatus != '0'">查看物流
+                            class="px-[35rpx] box-border text-[24rpx] h-[60rpx] flex-center text-center border-[2rpx] border-solid border-[#ccc] rounded-full ml-[20rpx] text-[var(--text-color-light3)]"
+                            @click="orderBtnFn('logistics')"
+                            v-if="detail.isNeedCheck == '0' && detail.checkStatus != '0'">查看物流
                         </view>
-                        <view class="order-grey-hollow-btn ml-[20rpx]" v-if="detail.orderStatus == 1 ||detail.orderStatus == 0 "
-                            @click="orderBtnFn('close')">取消订单</view>
-                        <view
-                            class="px-[35rpx] box-border  text-[24rpx] h-[60rpx] flex-center text-center text-[#fff] primary-btn-bg rounded-full ml-[20rpx]"
-                            v-if="detail.status == 1" @click="orderBtnFn('pay')">去支付</view>
+                        <view class="order-grey-hollow-btn ml-[20rpx]"
+                            v-if="detail.orderStatus == 1 || detail.orderStatus == 0" @click="orderBtnFn('close')">取消订单
+                        </view>
+                        <view v-if="detail.orderStatus == 1"
+                            class="px-[35rpx] box-border text-[24rpx] h-[60rpx] flex-center text-center text-[#fff] primary-btn-bg rounded-full ml-[20rpx]"
+                            @click="orderBtnFn('pay')">去支付</view>
                         <view v-if="detail.orderStatus == 4"
-                            class="px-[35rpx] box-border  text-[24rpx] h-[60rpx] flex-center text-center  text-[#fff]  primary-btn-bg rounded-full ml-[20rpx]"
+                            class="px-[35rpx] box-border text-[24rpx] h-[60rpx] flex-center text-center text-[#fff] primary-btn-bg rounded-full ml-[20rpx]"
                             @click="orderBtnFn('finish')">确认收货</view>
                     </view>
                 </view>
@@ -186,28 +206,31 @@
 </template>
 
 <script setup lang="ts">
-import { ref, reactive, computed, nextTick } from 'vue';
-import { onLoad } from '@dcloudio/uni-app'
-import { img, redirect, copy, goback } from '@/utils/common';
-import { getShopOrderDetail, orderClose, orderFinish, getAddressInfo } from '@/addon/shop/api/order';
-import { getVerifyCode } from '@/app/api/verify';
-import logisticsTracking from '@/addon/shop/pages/order/components/logistics-tracking/logistics-tracking.vue'
+import { ref, reactive, computed, nextTick } from "vue";
+import { onLoad } from "@dcloudio/uni-app";
+import { img, redirect, copy, goback } from "@/utils/common";
+import {
+    getShopOrderDetail,
+    orderClose,
+    orderFinish,
+    getAddressInfo,
+    selectOrderDeliverByOrderId,
+} from "@/addon/shop/api/order";
+import logisticsTracking from "@/addon/shop/pages/order/components/logistics-tracking/logistics-tracking.vue";
 import useConfigStore from "@/stores/config";
-import { topTabar } from '@/utils/topTabbar';
-import { cloneDeep } from 'lodash-es';
+import { topTabar } from "@/utils/topTabbar";
 
 /********* 自定义头部 - start ***********/
-const topTabarObj = topTabar()
-let topTabbarData = topTabarObj.setTopTabbarParam({ title: '订单详情' })
+const topTabarObj = topTabar();
+let topTabbarData = topTabarObj.setTopTabbarParam({ title: "订单详情" });
 /********* 自定义头部 - end ***********/
 
 const detail: any = ref<Object>({});
 const addressInfo = ref<any>({});
 const loading = ref<boolean>(true);
-const orderId = ref('')
-const manjianShowRef: any = ref(null); //满减送
+const orderId = ref("");
 
-const wxPrivacyPopupRef: any = ref(null)
+const wxPrivacyPopupRef: any = ref(null);
 
 onLoad((option: any) => {
     if (option.order_id) {
@@ -216,168 +239,120 @@ onLoad((option: any) => {
         // #ifdef MP
         nextTick(() => {
             if (wxPrivacyPopupRef.value) wxPrivacyPopupRef.value.proactive();
-        })
+        });
         // #endif
     } else {
         let parameter = {
-            url: '/addon/shop/pages/order/list',
-            title: '缺少订单id'
+            url: "/addon/shop/pages/order/list",
+            title: "缺少订单id",
         };
-        goback(parameter)
+        goback(parameter);
     }
 });
 
 const orderDetailFn = (id: any) => {
     loading.value = true;
-    getShopOrderDetail(id).then((res: any) => {
-        detail.value = res.data;
+    getShopOrderDetail(id)
+        .then((res: any) => {
+            detail.value = res.data;
 
-        getAddressInfo(res.data.shippingAddressId).then((res1: any) => {
-            addressInfo.value = res1.data
-        })
+            getAddressInfo(res.data.shippingAddressId).then((res1: any) => {
+                addressInfo.value = res1.data;
+            });
 
-        loading.value = false;
-    }).catch(() => {
-        loading.value = false;
-    })
-}
+            loading.value = false;
+        })
+        .catch(() => {
+            loading.value = false;
+        });
+};
 
 //关闭订单
-const close = (item: any) => {
+const close = () => {
     uni.showModal({
-        title: '提示',
-        content: '您确定要关闭该订单吗?',
-        confirmColor: useConfigStore().themeColor['--primary-color'],
-        success: res => {
+        title: "提示",
+        content: "您确定要关闭该订单吗?",
+        confirmColor: useConfigStore().themeColor["--primary-color"],
+        success: (res) => {
             if (res.confirm) {
-                orderClose(item.order_id).then((data) => {
-                    orderDetailFn(item.order_id);
-                })
+                orderClose({ id: orderId.value }).then((data) => {
+                    orderDetailFn(orderId.value);
+                });
             }
-        }
-    })
-}
+        },
+    });
+};
 
 //订单完成
-const finish = (item: any) => {
-    // 如果不在微信小程序中
-    // #ifndef MP-WEIXIN
+const finish = () => {
     uni.showModal({
-        title: '提示',
-        content: '您确定物品已收到吗?',
-        confirmColor: useConfigStore().themeColor['--primary-color'],
-        success: res => {
+        title: "提示",
+        content: "您确定物品已收到吗?",
+        confirmColor: useConfigStore().themeColor["--primary-color"],
+        success: (res) => {
             if (res.confirm) {
-                orderFinish(item.order_id).then((data) => {
-                    orderDetailFn(item.order_id);
-                })
-            }
-        }
-    })
-    // #endif
-
-    // #ifdef MP-WEIXIN
-    // 检测微信小程序是否已开通发货信息管理服务
-    if (item.pay && item.pay.type == 'wechatpay' && item.is_trade_managed && wx.openBusinessView) {
-        wx.openBusinessView({
-            businessType: 'weappOrderConfirm',
-            extraData: {
-                merchant_id: item.mch_id,
-                merchant_trade_no: item.out_trade_no
-            },
-            success: (res: any) => {
-                orderFinish(item.order_id).then((data) => {
-                    orderDetailFn(item.order_id);
-                })
-            },
-            fail: (res: any) => {
-                console.log('小程序确认收货组件打开失败 fail', res);
+                orderFinish({ id: orderId.value }).then((data) => {
+                    orderDetailFn(orderId.value);
+                });
             }
-        })
-    } else {
-        uni.showModal({
-            title: '提示',
-            content: '您确定物品已收到吗?',
-            confirmColor: useConfigStore().themeColor['--primary-color'],
-            success: res => {
-                if (res.confirm) {
-                    orderFinish(item.order_id).then((data) => {
-                        orderDetailFn(item.order_id);
-                    })
-                }
-            }
-        })
-    }
-    // #endif
-}
+        },
+    });
+};
 
 const goodsEvent = (id: number) => {
     redirect({
-        url: '/addon/shop/pages/goods/detail',
+        url: "/addon/shop/pages/goods/detail",
         param: {
-            goodsId: id
-        }
-    })
-}
+            goodsId: id,
+        },
+    });
+};
 
-const payRef = ref(null)
-const materialRef: any = ref(null)
-const orderBtnFn = (type = '') => {
-    if (type == 'pay')
-        payRef.value?.open(detail.value.order_type, detail.value.order_id, `/addon/shop/pages/order/detail?order_id=${detail.value.order_id}`);
-    else if (type == 'close') {
-        close(detail.value);
-    } else if (type == 'finish') {
-        finish(detail.value);
-    } else if (type == 'index') {
+const payRef = ref<any>(null);
+const materialRef: any = ref(null);
+const orderBtnFn = (type = "") => {
+    if (type == "pay")
+        payRef.value?.open(
+            orderId.value,
+            `/addon/shop/pages/order/detail?order_id=${orderId.value}`
+        );
+    else if (type == "close") {
+        close();
+    } else if (type == "finish") {
+        finish();
+    } else if (type == "index") {
         redirect({
-            url: '/addon/shop/pages/index',
-            mode: 'reLaunch'
+            url: "/addon/shop/pages/index",
+            mode: "reLaunch",
         });
-    } else if (type == 'logistics') {
-        if (detail.value.order_delivery.length > 0) {
-            let list: any = []
-            detail.value.order_delivery.forEach((item: any, index: number) => {
-                if (item.delivery_type == 'express' && (item.sub_delivery_type == 'express' || item.sub_delivery_type == 'none_express')) {
-                    item.name = `包裹${index + 1}`
-                    list.push(item)
+    } else if (type == "logistics") {
+        selectOrderDeliverByOrderId({ orderId: orderId.value }).then(
+            (res1: any) => {
+                if (res1.rows.length > 0) {
+                    let list = res1.rows;
+                    materialRef.value.open(list[0]);
+                    materialRef.value.packageList = list;
                 }
-            })
-
-            let params = {
-                id: list[0].id,
-                mobile: detail.value.taker_mobile
             }
-            materialRef.value.open(params);
-            materialRef.value.packageList = list
-        }
-    } else if (type == 'evaluate') {
-        if (!detail.value.is_evaluate) {
-            redirect({ url: '/addon/shop/pages/evaluate/order_evaluate', param: { order_id: detail.value.order_id } })
-        } else {
-            redirect({
-                url: '/addon/shop/pages/evaluate/order_evaluate_view',
-                param: { order_id: detail.value.order_id }
-            })
-        }
+        );
     }
-}
+};
 // 根据订单状态获取状态文本
 const getStatusText = (status: string) => {
     const statusMap: Record<string, string> = {
-        '0': '待支付',
-        '1': '待确认',
-        '2': '待发货',
-        '3': '部分发货',
-        '4': '发货完成',
-        '5': '已完成',
-        '6': '已关闭',
-        '7': '已取消'
+        "0": "待支付",
+        "1": "待确认",
+        "2": "待发货",
+        "3": "部分发货",
+        "4": "发货完成",
+        "5": "已完成",
+        "6": "已关闭",
+        "7": "已取消",
     };
     return statusMap[status] || status;
 };
 
-const payClose =()=>{}
+const payClose = () => { };
 </script>
 <style lang="scss" scoped>
 .text-item {
@@ -401,7 +376,7 @@ const payClose =()=>{}
 }
 
 .bg-linear {
-    background: linear-gradient(90deg, #FF0000 0%, #FF7800 100%);
+    background: linear-gradient(90deg, #ff0000 0%, #ff7800 100%);
 }
 
 .triangle {
@@ -415,7 +390,7 @@ const payClose =()=>{}
         position: absolute;
         bottom: -40rpx;
         border: 20rpx solid transparent;
-        border-top-color: #EEF3FF;
+        border-top-color: #eef3ff;
     }
 }
 
@@ -430,7 +405,7 @@ const payClose =()=>{}
 
 .friend-pay {
     &::after {
-        content: '';
+        content: "";
         display: block;
         width: 20rpx;
         height: 20rpx;

+ 14 - 63
src/addon/shop/pages/order/list.vue

@@ -82,18 +82,18 @@
                                 class="text-[24rpx] font-500 leading-[52rpx] h-[56rpx] min-w-[150rpx] text-center border-[2rpx] border-solid border-[#ccc] rounded-full text-[var(--text-color-light3)] box-border"
                                 v-if="item.orderStatus == 1 || item.orderStatus == 0" @click.stop="orderBtnFn(item, 'close')">取消订单
                             </view>
-                            <!-- <view
+                            <view
                                 class="text-[24rpx] font-500 flex-center h-[56rpx] min-w-[150rpx] text-center border-[0] text-[#fff] primary-btn-bg rounded-full ml-[20rpx] box-border"
-                                v-if="item.status == 1" @click.stop="orderBtnFn(item, 'pay')">去支付</view> -->
+                                v-if="item.orderStatus == 1" @click.stop="orderBtnFn(item, 'pay')">去支付</view>
                             <view
                                 class="text-[24rpx] font-500 flex-center h-[56rpx] min-w-[150rpx] text-center border-[0] text-[#fff] primary-btn-bg rounded-full ml-[20rpx] box-border"
                                 v-if="item.orderStatus == 4" @click.stop="orderBtnFn(item, 'finish')">确认收货
                             </view>
-                            <view
+                            <!-- <view
                                 class="text-[24rpx] font-500 leading-[52rpx] h-[56rpx] min-w-[150rpx] text-center border-[2rpx] border-solid border-[#ccc] rounded-full ml-[20rpx]  text-[var(--text-color-light3)] box-border"
                                 v-if="item.isNeedCheck == '0' && item.checkStatus != '0'"
                                 @click.stop="orderBtnFn(item, 'evaluate')">查看物流
-                            </view>
+                            </view> -->
                         </view>
                     </view>
                 </template>
@@ -110,10 +110,8 @@
 
 <script setup lang="ts">
 import { ref, nextTick } from 'vue';
-import { t } from '@/locale'
 import { img, redirect, copy } from '@/utils/common'
 import { getShopOrderStatus, getShopOrder, orderClose, orderFinish, getproducts } from '@/addon/shop/api/order';
-import { getEvaluateConfig } from '@/addon/shop/api/shop';
 import MescrollBody from '@/components/mescroll/mescroll-body/mescroll-body.vue';
 import MescrollEmpty from '@/components/mescroll/mescroll-empty/mescroll-empty.vue';
 import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
@@ -131,10 +129,6 @@ const orderStateList: any = ref([
     { key: '5', name: '已完成' },
     { key: '7', name: '已取消' }
 ]);
-const evaluateConfig = ref("")
-
-const mch_id = ref('')
-const isTradeManaged = ref(false)
 
 const wxPrivacyPopupRef: any = ref(null)
 
@@ -242,20 +236,14 @@ const toLink = (data: any) => {
 }
 
 // 支付
-const payRef = ref(null)
+const payRef =  ref<any>(null);
 const orderBtnFn = (data: any, type = '') => {
     if (type == 'pay')
-        payRef.value?.open(data.order_type, data.order_id, `/addon/shop/pages/order/detail?order_id=${data.order_id}`);
+        payRef.value?.open(data.id, `/addon/shop/pages/order/detail?order_id=${data.id}`);
     else if (type == 'close') {
         close(data);
     } else if (type == 'finish') {
         finish(data);
-    } else if (type == 'evaluate') {
-        if (!data.is_evaluate) {
-            redirect({ url: '/addon/shop/pages/evaluate/order_evaluate', param: { order_id: data.order_id } })
-        } else {
-            redirect({ url: '/addon/shop/pages/evaluate/order_evaluate_view', param: { order_id: data.order_id } })
-        }
     }
 }
 
@@ -277,55 +265,18 @@ const close = (item: any) => {
 
 //订单完成
 const finish = (item: any) => {
-    // 如果不在微信小程序中
-    // #ifndef MP-WEIXIN
     uni.showModal({
-        title: '提示',
-        content: '您确定物品已收到吗?',
-        confirmColor: useConfigStore().themeColor['--primary-color'],
-        success: res => {
+        title: "提示",
+        content: "您确定物品已收到吗?",
+        confirmColor: useConfigStore().themeColor["--primary-color"],
+        success: (res) => {
             if (res.confirm) {
-                orderFinish(item.order_id).then((data) => {
-                    getMescroll().resetUpScroll();
-                })
-            }
-        }
-    })
-    // #endif
-
-    // #ifdef MP-WEIXIN
-    // 检测微信小程序是否已开通发货信息管理服务
-    if (item.pay && item.pay.type == 'wechatpay' && isTradeManaged.value && wx.openBusinessView) {
-        wx.openBusinessView({
-            businessType: 'weappOrderConfirm',
-            extraData: {
-                merchant_id: mch_id.value,
-                merchant_trade_no: item.out_trade_no
-            },
-            success: (res: any) => {
-                orderFinish(item.order_id).then((data) => {
+                orderFinish({id:item.id}).then((data) => {
                     getMescroll().resetUpScroll();
-                })
-            },
-            fail: (res: any) => {
-                console.log('小程序确认收货组件打开失败 fail', res);
-            }
-        })
-    } else {
-        uni.showModal({
-            title: '提示',
-            content: '您确定物品已收到吗?',
-            confirmColor: useConfigStore().themeColor['--primary-color'],
-            success: res => {
-                if (res.confirm) {
-                    orderFinish(item.order_id).then((data) => {
-                        getMescroll().resetUpScroll();
-                    })
-                }
+                });
             }
-        })
-    }
-    // #endif
+        },
+    });
 }
 
 const payClose =()=>{}

+ 8 - 1
src/components/tabbar/tabbar.vue

@@ -6,7 +6,14 @@
             <template v-for="item in tabbar.value.navItems">
                 <up-tabbar-item class="py-[5rpx]" :custom-style="{ 'background-color': tabbar.value.bottomNavBgColor }"
                     :text="item.text" :icon="img(value == item.linkUrl ? item.iconSelected : item.iconNormal)"
-                    @click="itemBtn"></up-tabbar-item>
+                    :name="item.linkUrl" v-if="tabbar.value.navStyle == 'icon_text'"
+                    @click="itemBtn(item.linkUrl)"></up-tabbar-item>
+                <u-tabbar-item class="py-[5rpx]" :custom-style="{ 'background-color': tabbar.value.bottomNavBgColor }"
+                    :icon="img(value == item.linkUrl ? item.iconSelected : item.iconNormal)" :name="item.linkUrl"
+                    v-if="tabbar.value.navStyle == 'icon'" @click="itemBtn(item.linkUrl)"></u-tabbar-item>
+                <u-tabbar-item class="py-[5rpx]" :custom-style="{ 'background-color': tabbar.value.backgroundColor }"
+                    :text="item.text" :name="item.linkUrl" v-if="tabbar.value.navStyle == 'text'"
+                    @click="itemBtn(item.linkUrl)"></u-tabbar-item>
             </template>
         </up-tabbar>
         <view class="tab-bar-placeholder"></view>

+ 15 - 10
src/utils/request.ts

@@ -41,7 +41,7 @@ class Request {
     private requestInterceptors() {
         // 携带token
         try {
-            getToken() && (this.config.header[import.meta.env.VITE_REQUEST_HEADER_TOKEN_KEY] = 'Bearer '+ getToken())
+            getToken() && (this.config.header[import.meta.env.VITE_REQUEST_HEADER_TOKEN_KEY] = 'Bearer ' + getToken())
             this.config.header[import.meta.env.VITE_REQUEST_HEADER_CHANNEL_KEY] = getAppChannel()
             this.config.header.clientId = 'e5cd7e4891bf95d1d19206ce24a7b32e'
         } catch (e) {
@@ -101,7 +101,7 @@ class Request {
     /**
      * 发送请求
      */
-    private request(method: string, url: string, data ?: AnyObject, config: RequestConfig = {}) {
+    private request(method: string, url: string, data?: AnyObject, config: RequestConfig = {}) {
         this.requestInterceptors()
 
         const params = Object.assign(uni.$u.deepClone(this.config), config, {
@@ -118,21 +118,26 @@ class Request {
 
         return new Promise((resolve, reject) => {
             uni.request({
-                withCredentials:true,
+                withCredentials: true,
                 ...params,
                 success: res => {
                     const data = res.data
-                    if (data.code == 200) {
-                        config.showSuccessMessage && uni.showToast({ title: data.msg, icon: 'none' })
+                    if (url == 'order/miniOrder/queryTrack') {
                         resolve(data)
-                    } else {
-                        if (data.code == 0 || data.code == 500) {
-                            if (config.showErrorMessage !== false) uni.showToast({ title: data.msg, icon: 'none' })
+                    }else{
+                        if (data.code == 200) {
+                            config.showSuccessMessage && uni.showToast({ title: data.msg, icon: 'none' })
+                            resolve(data)
                         } else {
-                            this.handleAuthError(data.code)
+                            if (data.code == 0 || data.code == 500) {
+                                if (config.showErrorMessage !== false) uni.showToast({ title: data.msg, icon: 'none' })
+                            } else {
+                                this.handleAuthError(data.code)
+                            }
+                            reject(data)
                         }
-                        reject(data)
                     }
+
                 },
                 fail: res => {
                     reject(res)