张田田 3 месяцев назад
Родитель
Сommit
e3beb796c8

+ 9 - 0
miniprogram/app.json

@@ -85,6 +85,15 @@
         "pages/careDetail/careDetail",
         "pages/reportRecord/reportRecord"
       ]
+    },
+    {
+      "name": "order",
+      "root": "module/order",
+      "pages": [
+        "pages/select-goods/select-goods",
+        "pages/order-detail/order-detail",
+        "pages/other-detail/other-detail"
+      ]
     }
   ],
   "preloadRule": {

+ 9 - 47
miniprogram/module/article/pages/manage-address/manage-address.ts

@@ -40,9 +40,7 @@ Page({
       liaison: address.liaison,
       phone: address.phone,
     };
-    console.log(id, data, "更新订单地址");
-    const res = await orderPayAddressMethod(id, data);
-    console.log(res, "更新订单地址");
+   await orderPayAddressMethod(id, data);
   },
   // 选择地址
   async selectAddress(e: any) {
@@ -53,16 +51,17 @@ Page({
     const pages = getCurrentPages();
     console.log(pages, "pages");
     if (type === "orderDetail") {
+      console.log(orderId, "订单详情");
       // 订单详情 切换地址
       const orderPage = pages.find(
-        (page) =>
-          page.route === "module/article/pages/order-detail/order-detail"
+        (page:any) =>
+          // page.route === "module/article/pages/order-detail/order-detail"
+          page.route === "module/order/pages/order-detail/order-detail"
       );
-      console.log(orderPage, "orderPage");
+      console.log(orderPage, "orderPage===");
       try {
         await this.updataOrderAddress(orderId, item);
         if (orderPage) {
-          // orderPage.setData({ selectedAddress: item });
           wx.navigateBack();
         }
       } catch (error: any) {
@@ -73,52 +72,19 @@ Page({
       const findPage = pages.find(
         (page) => page.route === "module/article/pages/order-list/order-list"
       );
-      console.log(findPage, "orderPage", orderId,item);
       try {
         await this.updataOrderAddress(orderId, item);
         if (findPage) {
-          // orderPage.setData({ selectedAddress: item });
-          console.log("orderPage8888");
-          // wx.navigateBack({
-            // delta: 1,
-            // fail: () => {
-            //   console.log("orderPage9999");
-              wx.redirectTo({
-                url: "/"+findPage.route+"?tab=pending",
-              });
-            // },
-          // });
-        
+          wx.redirectTo({
+            url: "/" + findPage.route + "?tab=pending",
+          });
         }
       } catch (error: any) {
         getTickleContext.call(this).showWarnMessage(error.errMsg);
       }
     } else {
       // 其他页面 切换地址
-      console.log("其他页面");
     }
-    // 获取上一页的数据
-    // const pages = getCurrentPages();
-    // if (pages.length > 1) {
-    //   const prevPage = pages[pages.length - 2];
-    //   console.log(prevPage.route, "上一页");
-    //   // 订单详情 切换地址
-    //   if (prevPage.route === "module/article/pages/order-detail/order-detail") {
-    //     // 设置上一页的数据
-    //     prevPage.setData({ selectedAddress: item });
-    //     wx.navigateBack();
-    //     // 订单列表切换地址
-    //   } else if (
-    //     prevPage.route === "module/article/pages/order-list/order-list"
-    //   ) {
-    //     prevPage.setData({
-    //       selectedAddress: e.currentTarget.dataset.address,
-    //     });
-    //     wx.navigateBack();
-    //   } else {
-    //     console.log("其他页面不返回");
-    //   }
-    //   }
   },
   // 搜索
   onSearchChange(e: any) {
@@ -160,7 +126,6 @@ Page({
     try {
       // 获取所有的地址列表
       const res = await getAddressListMethod("", "");
-      console.log(res, "res====");
       if (res && res.length > 0) {
         res.forEach((item: any) => {
           item.fullAddress = `${item.provinceName} ${item.cityName} ${item.areaName} ${item.detailAddress}`;
@@ -172,7 +137,6 @@ Page({
           allAddressList: res, // 原始
         });
       } else {
-        console.log(111);
         this.setData({
           noResult: true,
           addressList: [],
@@ -188,7 +152,6 @@ Page({
   onImportWechatAddress() {
     wx.chooseAddress({
       success: (res) => {
-        console.log(res, "导入微信地址");
         // 拼接参数
         const params = encodeURIComponent(
           JSON.stringify({
@@ -202,7 +165,6 @@ Page({
             detailAddress: res.detailInfoNew,
           })
         );
-        console.log(params, "微信地址的拼接");
         wx.navigateTo({
           url: `/module/article/pages/add-address/add-address?imported=${params}`,
         });

+ 1 - 0
miniprogram/module/article/pages/order-detail/order-detail.ts

@@ -12,6 +12,7 @@ import {
 Page({
   behaviors: [PageContainerBehavior, tickleBehavior],
   onLoad(options: any) {
+    console.log(options, "options");
     if (options.id) {
       this.setData({ id: options.id });
     }

+ 120 - 0
miniprogram/module/article/pages/order-list/order-list.scss

@@ -228,4 +228,124 @@
 
 .name {
   margin-right: 20rpx;
+}
+
+/* 服务包列表样式 */
+.service-packages {
+  margin-bottom: 24rpx;
+}
+
+.service-package-item {
+  display: flex;
+  align-items: flex-start;
+  margin-bottom: 20rpx;
+  padding-bottom: 20rpx;
+  
+  &:not(:last-child) {
+    // border-bottom: 1px solid #f0f0f0;
+  }
+  
+  &:last-child {
+    margin-bottom: 0;
+    padding-bottom: 0;
+  }
+}
+
+.service-package-img {
+  width: 120rpx;
+  height: 120rpx;
+  border-radius: 8rpx;
+  margin-right: 20rpx;
+  flex-shrink: 0;
+  background-color: #f5f5f5;
+}
+
+.service-package-placeholder {
+  width: 120rpx;
+  height: 120rpx;
+  border-radius: 8rpx;
+  margin-right: 20rpx;
+  background-color: #f5f5f5;
+  border: 1px solid #e8e8e8;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-shrink: 0;
+}
+
+.placeholder-icon {
+  font-size: 40rpx;
+  opacity: 0.3;
+}
+
+.service-package-info {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  justify-content: flex-start;
+  min-height: 120rpx;
+}
+
+.service-package-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+  margin-bottom: 8rpx;
+  width: 100%;
+}
+
+.service-package-name {
+  font-size: 28rpx;
+  font-weight: 500;
+  color: #333;
+  line-height: 1.4;
+  flex: 1;
+}
+
+.service-package-price {
+  font-size: 28rpx;
+  color: #333;
+  font-weight: 500;
+  margin-left: 16rpx;
+  white-space: nowrap;
+}
+
+.service-package-detail {
+  font-size: 24rpx;
+  color: #666;
+  margin-bottom: 8rpx;
+  line-height: 1.5;
+}
+
+.service-package-quantity {
+  font-size: 24rpx;
+  color: #666;
+  text-align: right;
+  line-height: 1.5;
+}
+
+/* 展开/收起按钮 */
+.expand-toggle {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 16rpx 0;
+  color: #1890ff;
+  font-size: 26rpx;
+  cursor: pointer;
+  user-select: none;
+}
+
+.expand-text {
+  margin-right: 8rpx;
+}
+
+.expand-icon {
+  font-size: 20rpx;
+  transition: transform 0.3s ease;
+  transform: rotate(0deg);
+  
+  &.expanded {
+    transform: rotate(180deg);
+  }
 }

+ 95 - 37
miniprogram/module/article/pages/order-list/order-list.ts

@@ -2,11 +2,13 @@ import PageContainerBehavior from "../../../../core/behavior/page-container.beha
 import tickleBehavior, {
   getTickleContext,
 } from "../../../../core/behavior/tickle.behavior";
+import { handleWeChatPayment } from "../../../../utils/util";
 import {
   orderListMethod,
   orderCancelMethod,
   orderPayMethod,
 } from "../../request";
+
 // module/article/pages/order-list/order-list.ts
 Page({
   behaviors: [PageContainerBehavior, tickleBehavior],
@@ -20,7 +22,8 @@ Page({
     id: "",
     statusObj: {
       0: "待付款",
-      6: "待收货",
+      // 6: "待收货",
+      6: "已付款",
       345: "交易成功",
       2: "交易关闭",
     },
@@ -35,15 +38,15 @@ Page({
     payingId: '',
     showAddress: false,
     // 节流控制
-    throttleTimers: {} as Record<string, boolean>, // 存储各个按钮的节流定时器
+    throttleTimers: {} as Record<string, boolean>,
+    expandedItems: {} as Record<string, boolean>,
   },
   computed: {},
-  // 节流函数 - 防止短时间内重复点击
+  // 节流 - 防止短时间内重复点击
   throttle(func: Function, delay: number = 1000, key: string = "default") {
     return (...args: any[]) => {
       // 如果该按钮正在节流中,直接返回
       if (this.data.throttleTimers[key]) {
-        console.log(`按钮 ${key} 正在节流中,忽略点击`);
         return;
       }
 
@@ -70,18 +73,9 @@ Page({
     console.log(options, "options");
     const tab = options?.tab || "all";
     this.setData({ currentTab: tab });
-    // this.filterOrdersList(tab);
   },
   onShow() {
     this.filterOrdersList(this.data.currentTab);
-    // 读取地址
-    // if (JSON.stringify(this.data.selectedAddress) !== "{}") {
-    //   this.setData({
-    //     name: this.data.selectedAddress?.liaison,
-    //     phone: this.data.selectedAddress?.phone,
-    //     address: this.data.selectedAddress?.fullAddress,
-    //   });
-    // }
   },
   // 切换tab
   onTabChange(event: any) {
@@ -119,7 +113,35 @@ Page({
         } else {
           item.showAddress = true;
         }
+        console.log(item.items, "item============");
+        if (item.items && Array.isArray(item.items)) {
+          item.items = item.items.map((subItem: any) => {
+            return {
+              id: subItem.id || '',
+              name: subItem.conditioningProgramName || '',
+              description: (() => {
+                const dose = subItem?.convertDose ?? '';
+                const unit = subItem?.convertUnit ?? '次';
+                return `${dose} ${unit}`;
+              })(),
+              // isOffline: subItem?.isOffline,
+              photo: subItem.conditioningProgramPhoto || '',
+              price: subItem.totalPrice || 0,
+              quantity: subItem?.totalMeasure || 0,
+            }
+          });
+        }
+      });
+      // 批量初始化展开状态为false(默认折叠)
+      const expandedItems: Record<string, boolean> = {};
+      res.data.forEach((item: any) => {
+        if (!this.data.expandedItems[item.id]) {
+          expandedItems[item.id] = false;
+        }
       });
+      if (Object.keys(expandedItems).length > 0) {
+        this.setData({ expandedItems: { ...this.data.expandedItems, ...expandedItems } });
+      }
       this.setData({ orders: res.data });
     }
   },
@@ -136,14 +158,18 @@ Page({
       case "pending":
         this.getOrderList("0");
         break;
-      // 待收货订单
-      case "received":
+      // 已付款订单
+      case "paid":
         this.getOrderList("6");
         break;
       // 交易完成订单
       case "completed":
         this.getOrderList("345");
         break;
+      // 交易关闭订单
+      case "closed":
+        this.getOrderList("2");
+        break;
       default:
         break;
     }
@@ -156,13 +182,36 @@ Page({
         if (this.data.payingId) return; // 防重复
         this.setData({ paying: true, payingId: orderId });
         try {
-          await orderPayMethod(orderId);
-          wx.navigateTo({
-            url: "/module/article/pages/success-page/success-page?title=订单支付成功",
-          });
+          // 调用支付接口
+          const payResult = await orderPayMethod(orderId);
+          if (payResult && payResult.data) {
+            const paymentParams = payResult.data;
+            handleWeChatPayment(paymentParams, (res: any) => {
+              // 支付成功,跳转到成功页面
+              wx.redirectTo({
+                url: "/module/article/pages/success-page/success-page?title=订单支付成功",
+              });
+            }, (error: any) => {
+              this.setData({ paying: false, payingId: '' });
+              if (error.errMsg === 'requestPayment:fail cancel') {
+                wx.showToast({
+                  title: "支付已取消",
+                  icon: "none",
+                });
+              } else {
+                wx.showToast({
+                  title: error.errMsg || "支付失败,请重试",
+                  icon: "none",
+                });
+              }
+            });
+          } else {
+            wx.showToast({
+              title: payResult.errMsg,
+              icon: "none",
+            });
+          }
         } catch (error: any) {
-          this.setData({ paying: false, payingId: '' });
-          // getTickleContext.call(this).showWarnMessage(error.errMsg);
           wx.showToast({
             title: error.errMsg,
             icon: "none",
@@ -184,10 +233,6 @@ Page({
           title: "暂未开通",
           icon: "none",
         });
-        // const id = event.currentTarget.dataset.id;
-        // wx.navigateTo({
-        //   url: `/module/article/pages/see-logistics/see-logistics?id=${id}`,
-        // });
       },
       2000,
       "logistics"
@@ -199,8 +244,7 @@ Page({
       (event: any) => {
         const orderStatus = event.currentTarget.dataset.status;
         const id = event.currentTarget.dataset.id;
-        console.log(orderStatus, "切换地址");
-        // 根据订单状态判断是否可以切换地址. 待支付状态下可以切换地址
+        // 根据订单状态判断是否可以切换地址. 待付款状态下可以切换地址
         if (orderStatus === "0") {
           wx.navigateTo({
             url:
@@ -284,16 +328,30 @@ Page({
   // 订单详情
   onOrderDetail(e: any) {
     const id = e.currentTarget.dataset.id;
-    // const status = e.currentTarget.dataset.status;
-    wx.navigateTo({
-      url: `/module/article/pages/order-detail/order-detail?id=${id}`,
-    });
+    const status = e.currentTarget.dataset.status;
+    console.log(status, "status");
+    if (status === '0') {
+      wx.navigateTo({
+        url: `/module/order/pages/order-detail/order-detail?id=${id}&status=${status}`,
+      });
+    } else {
+      wx.navigateTo({
+        url: `/module/order/pages/other-detail/other-detail?id=${id}&status=${status}`,
+      });
+    }
   },
   //回到我的页面
-goMine() {
-  console.log("goMine");
-  wx.redirectTo({
-    url: "/pages/mine/mine",
-  });
-}
+  goMine() {
+    wx.redirectTo({
+      url: "/pages/mine/mine",
+    });
+  },
+  // 切换服务包展开/收起
+  toggleServicePackages(e: any) {
+    const orderId = e.currentTarget.dataset.id;
+    const currentExpanded = this.data.expandedItems[orderId] || false;
+    this.setData({
+      [`expandedItems[${orderId}]`]: !currentExpanded,
+    });
+  },
 });

+ 48 - 7
miniprogram/module/article/pages/order-list/order-list.wxml

@@ -3,16 +3,17 @@
 <t-tabs value="{{currentTab}}" bindchange="onTabChange">
   <t-tab-panel label="全部" value="all" />
   <t-tab-panel label="待付款" value="pending" />
-  <t-tab-panel label="待收货" value="received" />
+  <t-tab-panel label="已付款" value="paid" />
   <t-tab-panel label="交易成功" value="completed" />
+    <!-- <t-tab-panel label="交易关闭" value=closed" /> -->
 </t-tabs>
 
 <scroll-view class="page-scroll__container" scroll-y>
   <block wx:for="{{orders}}" wx:key="id">
-    <view class="order-card" bindtap="onOrderDetail" data-id="{{item.id}}" data-status="{{item.status}}">
+    <view class="order-card" bindtap="onOrderDetail" data-id="{{item.id}}" data-status="{{item.orderStatus}}">
       <view class="order-header">
         <view>
-          <text wx:if="{{false}}">订单编号:{{item.orderId}}</text>
+          <text wx:if="{{item.orderNo}}">订单编号:{{item.orderNo}}</text>
         </view>
         <text class="order-status {{statusClassObj[item.orderStatus]}}">{{statusObj[item.orderStatus]}}</text>
       </view>
@@ -31,6 +32,7 @@
       </view>
       <view class="order-body">
         <image src="{{item.photo}}" class="order-img" wx:if="{{item.photo}}" />
+        <image src="../../assets/servicePag.png" class="order-img" wx:else />
         <view class="order-info">
           <text class="order-title">{{item.conditioningWrapName || ''}}</text>
           <text class="order-doctor" wx:if="{{item.operateBy}}">开具医生:<text style="color:black">{{item.operateBy}}</text></text>
@@ -39,6 +41,45 @@
       </view>
 
       <view class="line"></view>
+      <!-- 服务包列表 -->
+      <view class="service-packages">
+        <view 
+          class="service-package-item" 
+          wx:for="{{item.items}}" 
+          wx:key="id"
+          wx:for-item="package"
+          wx:for-index="packageIndex"
+          wx:if="{{packageIndex < 2 || expandedItems[item.id]}}"
+        >
+          <image 
+            src="{{package.photo}}" 
+            class="service-package-img" 
+            wx:if="{{package.photo}}" 
+            mode="aspectFill"
+          />
+          <view class="service-package-placeholder" wx:else>
+            <text class="placeholder-icon">📦</text>
+          </view>
+          <view class="service-package-info">
+            <view class="service-package-header">
+              <text class="service-package-name">{{package.name}}</text>
+              <text class="service-package-price" wx:if="{{package.price > 0}}">¥{{package.price}}</text>
+            </view>
+            <text class="service-package-detail" wx:if="{{package.description}}">{{package.description}}</text>
+            <text class="service-package-quantity" wx:if="{{package.quantity > 0}}">x{{package.quantity}}</text>
+          </view>
+        </view>
+        <!-- 展开/收起按钮 -->
+        <view 
+          class="expand-toggle" 
+          wx:if="{{item.items && item.items.length > 2}}"
+          catchtap="toggleServicePackages"
+          data-id="{{item.id}}"
+        >
+          <text class="expand-text">{{expandedItems[item.id] ? '收起' : '展开'}}</text>
+          <text class="expand-icon {{expandedItems[item.id] ? 'expanded' : ''}}">▼</text>
+        </view>
+      </view>
       <view class="order-footer">
         <view class="order-price">订单金额:<text class="order-amount">¥{{item.cost}}</text></view>
 
@@ -50,12 +91,12 @@
           <t-button wx:if="{{item.orderStatus==='0'}}" size="small" type="primary" bindtap="onPay" class="outline-btn" data-id="{{item.id}}" disabled="{{(payingId===item.id) || throttleTimers.pay}}">
             立即支付
           </t-button>
-          <t-button wx:if="{{item.orderStatus==='6' || item.orderStatus==='345'}}" size="small" type="default" class="outline-btn cancel" bindtap="onSeeLogistics" data-id="{{item.id}}" disabled="{{throttleTimers.logistics}}">
+          <!-- <t-button wx:if="{{item.orderStatus==='6' || item.orderStatus==='345'}}" size="small" type="default" class="outline-btn cancel" bindtap="onSeeLogistics" data-id="{{item.id}}" disabled="{{throttleTimers.logistics}}">
             查看物流
-          </t-button>
-          <t-button wx:if="{{item.orderStatus==='6'}}" size="small" type="default" class="outline-btn" bindtap="onConfirmReceiving" data-id="{{item.id}}" disabled="{{throttleTimers.confirmReceiving}}">
+          </t-button> -->
+          <!-- <t-button wx:if="{{item.orderStatus==='6'}}" size="small" type="default" class="outline-btn" bindtap="onConfirmReceiving" data-id="{{item.id}}" disabled="{{throttleTimers.confirmReceiving}}">
             确认收货
-          </t-button>
+          </t-button> -->
 
         </view>
       </view>

+ 38 - 0
miniprogram/module/health/pages/scheme/scheme.scss

@@ -200,4 +200,42 @@
   width: 100%;
   max-width: 500rpx;
   height: 500rpx;
+}
+
+// 底部去购买按钮
+.scheme-bottom-buy-btn {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  width: 100%;
+  min-height: 98rpx;
+  // background: linear-gradient(90deg, #1d6ff6 0%, #4a90ff 100%);
+  background: white;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  z-index: 100;
+  box-shadow: 0 -4rpx 20rpx rgba(29, 111, 246, 0.2);
+  box-sizing: border-box;
+  padding-top: 24rpx;
+  padding-right: 32rpx;
+  
+  .buy-btn-text {
+    color: #ffffff;
+    font-size: 30rpx;
+    letter-spacing: 2rpx;
+    line-height: 1.2;
+    text-align: center;
+    background: #1d6ff6;
+    padding: 10px 30px;
+    border-radius: 5px;
+  }
+}
+
+// 底部占位,避免内容被按钮遮盖(98rpx按钮高度 + 安全区域)
+.scheme-bottom-placeholder {
+  height: 98rpx;
+  width: 100%;
+  box-sizing: border-box;
 }

+ 9 - 0
miniprogram/module/health/pages/scheme/scheme.ts

@@ -48,6 +48,15 @@ Component({
     toReportPage() {
       toReportPage(this.data.id);
     },
+    // 跳转到商品选择页面
+    goToProductPage() {
+      wx.navigateTo({
+        url: `/module/order/pages/select-goods/select-goods`,
+        fail: (err) => {
+          getTickleContext.call(this).showWarnMessage(err.errMsg || "跳转失败");
+        },
+      });
+    },
     // 去购买
     goBuy(this: any, e: any) {
       const item = e.currentTarget.dataset.item || {};

+ 7 - 0
miniprogram/module/health/pages/scheme/scheme.wxml

@@ -42,7 +42,14 @@
         </view>
       </view>
     </view>
+    <!-- 底部占位,避免内容被按钮遮盖 -->
+    <view class="scheme-bottom-placeholder"></view>
   </scroll-view>
+  
+  <!-- 底部固定去购买按钮 -->
+  <view class="scheme-bottom-buy-btn" style="padding-bottom: {{container.safeBottomOffset-10}}px;" bind:tap="goToProductPage" wx:if="{{false}}">
+    <view class="buy-btn-text">去购买</view>
+  </view>
 </view>
 <t-message id="{{$messageId}}"></t-message>
 

+ 6 - 1
miniprogram/pages/home/home.ts

@@ -37,6 +37,7 @@ Page({
       report: { title: '报告' },
       healthTeach: { title: '' },
     },
+    NoteTitle: "",
     isShowComplete: true,
     careList: [],
     displayList: [] as {
@@ -330,11 +331,14 @@ Page({
         this.setData({
           popupList: res,
           isShowPopup: true,
+          NoteTitle: res[0].title,
         });
+
       } else {
         this.setData({
           popupList: [],
           isShowPopup: false,
+          NoteTitle: "",
         });
       }
     });
@@ -389,8 +393,9 @@ Page({
           console.log(error);
         }
       } else {
+        const status = 'pending';
         // 随访
-        wx.redirectTo({ url: `${page}?id=${id}` });
+        wx.navigateTo({ url: `${page}?id=${id}&status=${status}` });
       }
     } finally {
       setTimeout(() => {

+ 1 - 1
miniprogram/pages/home/home.wxml

@@ -17,7 +17,7 @@
       <view class="follow-box" bind:tap="showFollowPopup">
         <image src="../../assets/bg/icon_notice@3x.png" mode="heightFix" class="notice-icon" />
         <view class="pieces">{{popupList.length}}</view>
-        <view class="follow-text" wx:if="{{isShowPopup}}">{{popupList[0].title}}</view>
+        <view class="follow-text" wx:if="{{NoteTitle}}">{{NoteTitle}}</view>
       </view>
       <view class="tool-bar-wrapper">
         <view class="tool" wx:if="{{location.description}}">

+ 1 - 1
miniprogram/pages/mine/mine.scss

@@ -89,7 +89,7 @@ background-color: #F5F6F7;
 .order-container{
   background: #fff;
   border-radius: 16rpx;
-  padding: 20rpx 40rpx 20rpx 0rpx;
+  padding: 20rpx 0 20rpx 0rpx;
 }
 .knowledge-box{
   background: #fff;

+ 14 - 6
miniprogram/pages/mine/mine.ts

@@ -33,10 +33,10 @@ Page({
       },
       {
         url: "../../assets/icon/delivery@3x.png",
-        name: "待收货",
+        name: "已付款",
         count: 0,
         type: 2,
-        tab: "received",
+        tab: "paid",
       },
       {
         url: "../../assets/icon/deal@3x.png",
@@ -45,11 +45,18 @@ Page({
         type: 3,
         tab: "completed",
       },
+      // {
+      //   url: "../../assets/icon/delivery@3x.png",
+      //   name: "交易关闭",
+      //   count: 0,
+      //   type: 4,
+      //   tab: "closed",
+      // },
       {
         url: "../../assets/icon/all@3x.png",
         name: "全部",
         count: 0,
-        type: 4,
+        type: 5,
         tab: "all",
       },
     ],
@@ -103,9 +110,10 @@ Page({
       if (res && res.data) {
         this.setData({
           "mineOrderList[0].count": res.data.pendingPayment,
-          "mineOrderList[1].count": res.data.pendingReceiptGoods,
-          // "mineOrderList[2].count": res.data.successTrade,
-          // "mineOrderList[3].count": res.data.total,
+          "mineOrderList[1].count": res.data.pendingReceiptGoods,//已付款
+          "mineOrderList[2].count": res.data.successTrade,//交易成功
+          // "mineOrderList[3].count": res.data.closeTrade,//交易关闭
+          "mineOrderList[3].count": res.data.total,//全部
         });
       }
     } catch (error: any) {

+ 64 - 0
miniprogram/utils/util.ts

@@ -110,4 +110,68 @@ export function fromHealthReportSymptom(data: Partial<HealthReportDTO>, config =
     }
   }
   return result;
+}
+
+/**
+ * 唤起微信支付
+ * @param {Object} paymentParams - 支付参数对象
+ * @param {string} paymentParams.timeStamp - 时间戳
+ * @param {string} paymentParams.packageVal - 统一下单接口返回的 prepay_id 参数值,格式为 "prepay_id=xxx"(兼容 packageValue)
+ * @param {string} paymentParams.packageValue - 统一下单接口返回的 prepay_id 参数值,格式为 "prepay_id=xxx"(API返回的字段名)
+ * @param {string} paymentParams.paySign - 支付签名
+ * @param {string} paymentParams.nonceStr - 随机字符串
+ * @param {string} paymentParams.signType - 签名类型,默认为 'RSA'
+ * @param {string} paymentParams.appId - 小程序 appId(可选)
+ * @param {Function} onSuccess - 支付成功回调函数
+ * @param {Function} onFail - 支付失败回调函数
+ */
+export const handleWeChatPayment = (paymentParams: any, onSuccess: any, onFail: any = () => {}) => {
+  // 兼容 packageValue 和 packageVal 两种字段名
+  const packageVal = paymentParams.packageValue || paymentParams.packageVal
+ 
+  // 验证支付参数
+  if (!paymentParams || !paymentParams.timeStamp || !packageVal || !paymentParams.paySign) {
+    const error = new Error('支付参数不完整')
+    console.error('支付参数错误:', error)
+    if (onFail) {
+      onFail(error)
+    }
+    return
+  }
+
+  // wx.showLoading({
+  //   title: '正在调起支付...',
+  //   mask: true
+  // })
+
+  wx.requestPayment({
+    provider: 'wxpay',
+    timeStamp: String(paymentParams.timeStamp), // 确保是字符串类型
+    nonceStr: paymentParams.nonceStr,
+    package: packageVal, // 兼容 packageValue 和 packageVal
+    signType: paymentParams.signType || 'RSA',
+    paySign: paymentParams.paySign,
+    success: (res) => {
+      wx.hideLoading()
+      console.log('支付成功:', res)
+      if (onSuccess) {
+        onSuccess(res)
+      }
+    },
+    fail: (err) => {
+      // wx.hideLoading()
+      if(err.errMsg==='requestPayment:fail cancel'){
+        // console.log('支付已取消')
+       wx.showToast({
+        title: '支付已取消',
+        icon: 'none'
+       })
+      }else{
+      console.error(onFail,'支付失败:', err)
+        if (onFail) {
+          onFail(err)
+        }
+      }
+    }
+  })
 }