Pārlūkot izejas kodu

小程序bug优化

张田田 8 mēneši atpakaļ
vecāks
revīzija
d4bbe1864b
28 mainītis faili ar 669 papildinājumiem un 295 dzēšanām
  1. 5 3
      miniprogram/app.config.ts
  2. 14 3
      miniprogram/module/article/pages/add-address/add-address.scss
  3. 1 1
      miniprogram/module/article/pages/add-address/add-address.wxml
  4. 3 3
      miniprogram/module/article/pages/manage-address/manage-address.json
  5. 7 0
      miniprogram/module/article/pages/manage-address/manage-address.scss
  6. 4 0
      miniprogram/module/article/pages/manage-address/manage-address.ts
  7. 5 4
      miniprogram/module/article/pages/manage-address/manage-address.wxml
  8. 14 0
      miniprogram/module/article/pages/order-detail/order-detail.scss
  9. 53 23
      miniprogram/module/article/pages/order-detail/order-detail.ts
  10. 6 2
      miniprogram/module/article/pages/order-detail/order-detail.wxml
  11. 29 0
      miniprogram/module/article/pages/order-list/order-list.scss
  12. 115 47
      miniprogram/module/article/pages/order-list/order-list.ts
  13. 4 4
      miniprogram/module/article/pages/order-list/order-list.wxml
  14. 9 2
      miniprogram/module/care/pages/careDetail/careDetail.scss
  15. 67 34
      miniprogram/module/care/pages/careDetail/careDetail.ts
  16. 2 4
      miniprogram/module/care/pages/careDetail/careDetail.wxml
  17. 7 0
      miniprogram/module/care/pages/offlineTreatment/offlineTreatment.scss
  18. 25 18
      miniprogram/module/care/pages/offlineTreatment/offlineTreatment.ts
  19. 44 39
      miniprogram/module/care/pages/offlineTreatment/offlineTreatment.wxml
  20. 1 0
      miniprogram/module/charts/record-care/record-care.ts
  21. 156 56
      miniprogram/module/chats/components/message-select/message-select.ts
  22. 1 1
      miniprogram/module/health/components/follow-evaluation/follow-evaluation.wxml
  23. 10 1
      miniprogram/module/health/components/follow-record/follow-record.scss
  24. 2 2
      miniprogram/module/health/components/follow-record/follow-record.wxml
  25. 1 1
      miniprogram/module/health/components/horizontal-scrollable/horizontal-scrollable.ts
  26. 1 0
      miniprogram/module/health/pages/status/status.ts
  27. 78 42
      miniprogram/pages/home/home.ts
  28. 5 5
      miniprogram/pages/home/home.wxml

+ 5 - 3
miniprogram/app.config.ts

@@ -4,10 +4,12 @@ const miniProgram = getAccountInfoSync();
 // 测试环境
 let BaseURL = "";
 let UploadURL = "";
-const url = "https://test.hzliuzhi.com/manager/";
+// const url = "https://test.hzliuzhi.com/manager/";
 if (miniProgram.envVersion === "trial") {
-  BaseURL = url + "fdhb-mobile";
-  UploadURL = url + "file";
+  // BaseURL = url + "fdhb-mobile";
+  // UploadURL = url + "file";
+  BaseURL = `https://wx.hzliuzhi.com:4433/manager/fdhb-mobile` as const;
+  UploadURL = `https://wx.hzliuzhi.com:4433/manager/file` as const;
 } else {
   const port = miniProgram.envVersion === "release" ? 433 : 4433;
   BaseURL = `https://wx.hzliuzhi.com:${port}/manager/fdhb-mobile` as const;

+ 14 - 3
miniprogram/module/article/pages/add-address/add-address.scss

@@ -159,19 +159,30 @@
 
 .address-detail-item {
   align-items: flex-start;
+  min-height: 110rpx;
+  height: auto;
+  padding: 16rpx 32rpx;
+  
   .form-label {
     margin-top: 16rpx;
+    flex-shrink: 0;
   }
+  
   .form-detail {
     width: 100%;
     font-size: 28rpx;
-    line-height: 1.2;
-    padding: 8rpx 16rpx;
+    line-height: 1.4;
+    padding: 12rpx 16rpx;
     box-sizing: border-box;
     background: #fff !important;
     border-radius: 8rpx;
     color: black !important;
-    min-height: 60rpx;  
+    min-height: 80rpx;
+    max-height: 220rpx;
+    overflow-y: auto;
+    word-wrap: break-word;
+    word-break: break-all;
+    white-space: pre-wrap;
   }
 }
 

+ 1 - 1
miniprogram/module/article/pages/add-address/add-address.wxml

@@ -79,7 +79,7 @@
         class="form-detail"
         placeholder="如道路、门牌号、小区、楼栋号、单元等"
         value="{{formData.detailAddress}}"
-        maxlength="200"
+        maxlength="50"
         data-field="formData.detailAddress"
         bind:change="onInput"
         show-limit

+ 3 - 3
miniprogram/module/article/pages/manage-address/manage-address.json

@@ -8,7 +8,7 @@
     "t-icon": "tdesign-miniprogram/icon/icon",
     "t-search": "tdesign-miniprogram/search/search",
     "t-cell": "tdesign-miniprogram/cell/cell",
-    "t-cell-group": "tdesign-miniprogram/cell-group/cell-group"
-
+    "t-cell-group": "tdesign-miniprogram/cell-group/cell-group",
+    "t-empty": "tdesign-miniprogram/empty/empty"
   }
-}
+}

+ 7 - 0
miniprogram/module/article/pages/manage-address/manage-address.scss

@@ -102,4 +102,11 @@
   margin-right: 8rpx;
   font-size: 32rpx;
   color: green;
+}
+
+.no-result-tip{
+  margin-top: 20px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
 }

+ 4 - 0
miniprogram/module/article/pages/manage-address/manage-address.ts

@@ -160,6 +160,7 @@ 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}`;
@@ -171,8 +172,11 @@ Page({
           allAddressList: res, // 原始
         });
       } else {
+        console.log(111);
         this.setData({
           noResult: true,
+          addressList: [],
+          allAddressList: [],
         });
       }
     } catch (error: any) {

+ 5 - 4
miniprogram/module/article/pages/manage-address/manage-address.wxml

@@ -16,10 +16,11 @@
 
 <!-- 地址列表 -->
 <scroll-view class="address-list" scroll-y>
-  <view wx:if="{{noResult}}" class="no-result-tip"><t-empty icon="info-circle-filled" description="暂无数据" />
-</view>
-  <block wx:for="{{addressList}}" wx:key="id">
-    <view class="address-item" bindtap="selectAddress" data-item="{{item}}" >
+  <view wx:if="{{noResult}}" class="no-result-tip">
+    <t-empty icon="info-circle-filled" description="暂无数据" />
+  </view>
+  <block wx:else>
+    <view wx:for="{{addressList}}" wx:key="id" class="address-item" bindtap="selectAddress" data-item="{{item}}" >
       <view class="address-header">
         <text class="name">{{item.liaison}}</text>
         <text class="phone">{{item.phone}}</text>

+ 14 - 0
miniprogram/module/article/pages/order-detail/order-detail.scss

@@ -216,6 +216,20 @@
     font-size: 30rpx;
     border-radius: 12rpx;
     height: 88rpx;
+    
+    // loading状态下的置灰样式
+    &.t-button--loading {
+      opacity: 0.6;
+      background-color: #f5f5f5 !important;
+      color: #999 !important;
+    }
+    
+    // disabled状态下的置灰样式
+    &.t-button--disabled {
+      opacity: 0.6;
+      background-color: #f5f5f5 !important;
+      color: #999 !important;
+    }
   }
 }
 

+ 53 - 23
miniprogram/module/article/pages/order-detail/order-detail.ts

@@ -24,12 +24,15 @@ Page({
     url: "https://pic.nximg.cn/file/20190718/28170468_214109363000_2.jpg",
     dialogKey: "",
     totalPrice: 0,
-    orderStatus: "pending", // 'pending' | 'received' | 'completed'
+    orderStatus: "", // 'pending' | 'received' | 'completed' | ''
     orderDetail: {},
     address: "",
     name: "",
     phone: "",
     // selectedAddress: null,
+    // 节流控制
+    isPaymentLoading: false,
+    isConfirmLoading: false,
   },
   // 切换收货地址
   changeAddress() {
@@ -42,10 +45,15 @@ Page({
   },
   // 订单支付
   async payment() {
-    console.log(this.data.id, "立即支付");
+    // 节流控制:如果正在处理中,直接返回
+    if (this.data.isPaymentLoading) {
+      return;
+    }
+
+    this.setData({ isPaymentLoading: true });
+
     try {
       const res = await orderPayMethod(this.data.id);
-      console.log(res, "订单支付");
       wx.navigateTo({
         url: "/module/article/pages/success-page/success-page?title=订单支付成功",
       });
@@ -55,10 +63,15 @@ Page({
         title: error.errMsg,
         icon: "none",
       });
+    } finally {
+      // 无论成功还是失败,都要重置loading状态
+      this.setData({ isPaymentLoading: false });
     }
   },
-  statusType(status: string) {
-    switch (status) {
+  statusType(status: any) {
+    // 规范化后端返回:将 null/undefined 转为空字符串,其它转换为字符串
+    const code = status == null ? "" : String(status);
+    switch (code) {
       case "0":
         this.setData({ orderStatus: "pending" });
         break;
@@ -72,7 +85,8 @@ Page({
         this.setData({ orderStatus: "completed" });
         break;
       default:
-        console.log("其他状态");
+        // 未知或空状态,重置为安全空串,避免默认展示为待付款
+        this.setData({ orderStatus: "" });
         break;
     }
   },
@@ -81,23 +95,33 @@ Page({
     wx.showLoading({ title: "加载中" });
     try {
       const res = await getOrderDetailMethod(id);
-      console.log(res.data, "订单详情");
       if (res && res.data) {
         this.setData({ orderDetail: res.data });
-        if(!res.data.liaison || !res.data.phone || !res.data.provinceName || !res.data.cityName || !res.data.areaName || !res.data.detailAddress){
+        if (
+          !res.data.liaison ||
+          !res.data.phone ||
+          !res.data.provinceName ||
+          !res.data.cityName ||
+          !res.data.areaName ||
+          !res.data.detailAddress
+        ) {
           this.setData({
-           showDetail: true,
+            showDetail: true,
           });
-        }else{
+        } else {
           this.setData({
             showDetail: false,
           });
-        this.setData({
-          name: res.data.liaison?`${res.data.liaison}`:"",
-          phone: res.data.phone?`${res.data.phone}`:"",
-          address: `${res.data.provinceName}${res.data.cityName?`${res.data.cityName}`:""}${res.data.areaName?`${res.data.areaName}`:""}${res.data.detailAddress?`${res.data.detailAddress}`:""}`,
-        });
-      }
+          this.setData({
+            name: res.data.liaison ? `${res.data.liaison}` : "",
+            phone: res.data.phone ? `${res.data.phone}` : "",
+            address: `${res.data.provinceName}${
+              res.data.cityName ? `${res.data.cityName}` : ""
+            }${res.data.areaName ? `${res.data.areaName}` : ""}${
+              res.data.detailAddress ? `${res.data.detailAddress}` : ""
+            }`,
+          });
+        }
         // 0:待付款
         // 2 交易关闭
         // 6 待收货
@@ -168,10 +192,23 @@ Page({
   },
   // 确认收货
   async confirmReceipt() {
+    // 节流控制
+    if (this.data.isConfirmLoading) {
+      return;
+    }
+
+    this.setData({ isConfirmLoading: true });
+
     const orderId = this.data.id;
     wx.navigateTo({
       url: `/module/article/pages/confirm-receiving/confirm-receiving?orderId=${orderId}`,
     });
+
+    // 延迟重置loading状态,给页面跳转一些时间
+    setTimeout(() => {
+      this.setData({ isConfirmLoading: false });
+    }, 2000);
+
     // let that = this;
     // wx.showModal({
     //   title: "提示",
@@ -202,13 +239,6 @@ Page({
     }
   },
   onShow() {
-    // if (JSON.stringify(this.data.selectedAddress) !== "{}") {
-    //   this.setData({
-    //     name: this.data.selectedAddress?.liaison,
-    //     phone: this.data.selectedAddress?.phone,
-    //     address: this.data.selectedAddress?.fullAddress,
-    //   });
-    // }
     this.load(this.data.id);
   },
 });

+ 6 - 2
miniprogram/module/article/pages/order-detail/order-detail.wxml

@@ -69,12 +69,16 @@
   <!-- 待付款 -->
   <block wx:if="{{orderStatus === 'pending'}}">
     <t-button theme="default" block class="footer-btn" bindtap="cancelOrder">取消订单</t-button>
-    <t-button theme="primary" block class="footer-btn" bindtap="payment">立即支付</t-button>
+    <t-button theme="primary" block class="footer-btn" bindtap="payment" loading="{{isPaymentLoading}}" disabled="{{isPaymentLoading}}">
+      立即支付
+    </t-button>
   </block>
   <!-- 待收货 -->
   <block wx:elif="{{orderStatus === 'received'}}">
     <t-button theme="default" block class="footer-btn" bindtap="viewLogistics">查看物流</t-button>
-    <t-button theme="primary" block class="footer-btn" bindtap="confirmReceipt">确认收货</t-button>
+    <t-button theme="primary" block class="footer-btn" bindtap="confirmReceipt" loading="{{isConfirmLoading}}" disabled="{{isConfirmLoading}}">
+      确认收货
+    </t-button>
   </block>
   <!-- 交易成功 -->
   <block wx:elif="{{orderStatus === 'completed'}}">

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

@@ -162,6 +162,23 @@
 
 .order-actions .t-button {
   margin: 0 !important;
+  min-width: 120rpx !important;
+  width: 120rpx !important;
+}
+
+// 为立即支付按钮设置固定宽度,防止loading状态时宽度变化
+.order-actions .t-button[data-id] {
+  min-width: 120rpx !important;
+  width: 120rpx !important;
+}
+
+// 节流状态下的按钮样式
+.order-actions .t-button[disabled] {
+  opacity: 1 !important;
+  cursor: not-allowed !important;
+  background-color: #f5f5f5 !important;
+  border-color: #e5e5e5 !important;
+  color: #c0c0c0 !important;
 }
 
 // 针对 t-design 按钮的自定义样式
@@ -175,6 +192,18 @@
   // margin-right: 20rpx !important;
 }
 
+// 让按钮内的 loading 和文字显式为品牌蓝
+.outline-btn .t-loading__spinner,
+.outline-btn .t-loading__text {
+  color: #1890ff !important;
+}
+.outline-btn .t-loading__spinner .t-loading__dot::before,
+.outline-btn .t-loading__spinner--dots .t-loading__dot,
+.outline-btn .t-loading__circular {
+  color: #1890ff !important;
+  background-color: #1890ff !important;
+}
+
 .outline-btn.cancel {
   border-color: #ccc !important;
   color: black !important;

+ 115 - 47
miniprogram/module/article/pages/order-list/order-list.ts

@@ -32,9 +32,39 @@ Page({
     },
     selectedAddress: null,
     paying: false,
+    payingId: '',
     showAddress: false,
+    // 节流控制
+    throttleTimers: {} 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;
+      }
+
+      // 设置节流定时器
+      this.setData({
+        [`throttleTimers.${key}`]: true,
+      });
+
+      // 执行函数
+      const result = func.apply(this, args);
+
+      // 延迟清除节流状态
+      setTimeout(() => {
+        this.setData({
+          [`throttleTimers.${key}`]: false,
+        });
+      }, delay);
+
+      return result;
+    };
+  },
   onLoad(options: any) {
     // 读取 tab 参数,默认为 all
     console.log(options, "options");
@@ -119,52 +149,82 @@ Page({
     }
   },
   // 订单支付
-  async onPay(event: any) {
-    if (this.data.paying) return; // 防重复
-    this.setData({ paying: true });
-    try {
-      const orderId = event.currentTarget.dataset.id;
-      const res = await orderPayMethod(orderId);
-      wx.navigateTo({
-        url: "/module/article/pages/success-page/success-page?title=订单支付成功",
-      });
-    } catch (error: any) {
-      this.setData({ paying: false });
-      getTickleContext.call(this).showWarnMessage(error.errMsg);
-    }
+  onPay: function (event: any) {
+    return this.throttle(
+      async (e: any) => {
+        const orderId = e.currentTarget.dataset.id;
+        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=订单支付成功",
+          });
+        } catch (error: any) {
+          this.setData({ paying: false, payingId: '' });
+          // getTickleContext.call(this).showWarnMessage(error.errMsg);
+          wx.showToast({
+            title: error.errMsg,
+            icon: "none",
+          });
+        } finally {
+          this.setData({ paying: false, payingId: '' });
+        }
+      },
+      2000,
+      "pay"
+    )(event);
   },
   // 查看物流
-  onSeeLogistics(e: any) {
-    console.log(e, "查看物流");
-    wx.showToast({
-      title: "暂未开通",
-      icon: "none",
-    });
-    // const id = e.currentTarget.dataset.id;
-    // wx.navigateTo({
-    //   url: `/module/article/pages/see-logistics/see-logistics?id=${id}`,
-    // });
+  onSeeLogistics: function (e: any) {
+    return this.throttle(
+      (event: any) => {
+        console.log(event, "查看物流");
+        wx.showToast({
+          title: "暂未开通",
+          icon: "none",
+        });
+        // const id = event.currentTarget.dataset.id;
+        // wx.navigateTo({
+        //   url: `/module/article/pages/see-logistics/see-logistics?id=${id}`,
+        // });
+      },
+      2000,
+      "logistics"
+    )(e);
   },
   // 切换地址
-  changeAddress(e: any) {
-    const orderStatus = e.currentTarget.dataset.status;
-    const id = e.currentTarget.dataset.id;
-    console.log(orderStatus, "切换地址");
-    // 根据订单状态判断是否可以切换地址. 待支付状态下可以切换地址
-    if (orderStatus === "0") {
-      wx.navigateTo({
-        url:
-          "/module/article/pages/manage-address/manage-address?type=orderList&orderId=" +
-          id,
-      });
-    }
+  changeAddress: function (e: any) {
+    return this.throttle(
+      (event: any) => {
+        const orderStatus = event.currentTarget.dataset.status;
+        const id = event.currentTarget.dataset.id;
+        console.log(orderStatus, "切换地址");
+        // 根据订单状态判断是否可以切换地址. 待支付状态下可以切换地址
+        if (orderStatus === "0") {
+          wx.navigateTo({
+            url:
+              "/module/article/pages/manage-address/manage-address?type=orderList&orderId=" +
+              id,
+          });
+        }
+      },
+      2000,
+      "changeAddress"
+    )(e);
   },
   // 打开取消订单弹窗
-  async onCancel(event: any) {
-    const orderId = event.currentTarget.dataset.id;
-    // 处理订单取消逻辑
-    this.setData({ id: orderId });
-    this.setData({ showConfirm: true });
+  onCancel: function (event: any) {
+    return this.throttle(
+      (e: any) => {
+        const orderId = e.currentTarget.dataset.id;
+        // 处理订单取消逻辑
+        this.setData({ id: orderId });
+        this.setData({ showConfirm: true });
+      },
+      2000,
+      "cancel"
+    )(event);
   },
   // 取消订单
   async cancelOrder(id: string) {
@@ -189,12 +249,18 @@ Page({
     this.setData({ showConfirm: false });
   },
   // 确认收货
-  onConfirmReceiving(e: any) {
-    console.log(e, "确认收货");
-    const orderId = e.currentTarget.dataset.id;
-    wx.navigateTo({
-      url: `/module/article/pages/confirm-receiving/confirm-receiving?orderId=${orderId}`,
-    });
+  onConfirmReceiving: function (e: any) {
+    return this.throttle(
+      (event: any) => {
+        console.log(event, "确认收货");
+        const orderId = event.currentTarget.dataset.id;
+        wx.navigateTo({
+          url: `/module/article/pages/confirm-receiving/confirm-receiving?orderId=${orderId}`,
+        });
+      },
+      2000,
+      "confirmReceiving"
+    )(e);
   },
   // 切换地址
   onChangeAddress(e: any) {
@@ -204,7 +270,9 @@ Page({
     wx.chooseAddress({
       success: (res) => {
         // 假设你有 orders 数组
-        const idx = this.data.orders.findIndex((o) => o.orderId === orderId);
+        const idx = this.data.orders.findIndex(
+          (o: any) => o.orderId === orderId
+        );
         if (idx !== -1) {
           this.setData({
             [`orders[${idx}].address`]: res.detailInfo,

+ 4 - 4
miniprogram/module/article/pages/order-list/order-list.wxml

@@ -44,16 +44,16 @@
 
         <view class="order-actions">
           <!-- 按状态显示不同按钮 -->
-          <t-button wx:if="{{item.orderStatus==='0'}}" size="small" type="default" class="outline-btn cancel" bindtap="onCancel" data-id="{{item.id}}">
+          <t-button wx:if="{{item.orderStatus==='0'}}" size="small" type="default" class="outline-btn cancel" bindtap="onCancel" data-id="{{item.id}}" disabled="{{throttleTimers.cancel}}">
             取消订单
           </t-button>
-          <t-button wx:if="{{item.orderStatus==='0'}}" size="small" type="primary" bindtap="onPay" class="outline-btn" data-id="{{item.id}}" loading="{{paying}}" disabled="{{paying}}">
+          <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}}">
+          <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}}">
+          <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>
 

+ 9 - 2
miniprogram/module/care/pages/careDetail/careDetail.scss

@@ -85,11 +85,18 @@
 .address-block {
   background: #EBEEF4;
   border-radius: 10rpx;
-  padding: 12rpx;
+  padding: 20rpx;
   color: #666;
   margin-bottom: 12rpx;
   font-size: 28rpx;
-  line-height: 1.6;
+  line-height: 0.9;
+}
+// 紧凑地址与联系人两行间距
+.address-block > view {
+  margin: 0;
+}
+.address-block > view + view {
+  margin-top: 6rpx;
 }
 .status-card {
   // border-radius: 16px;

+ 67 - 34
miniprogram/module/care/pages/careDetail/careDetail.ts

@@ -1,3 +1,4 @@
+import { show } from "tdesign-miniprogram/miniprogram_dist/action-sheet/show";
 import { Post } from "../../../../lib/request/method";
 import { fromHealthReportSymptom } from "../../../../utils/util";
 Page({
@@ -8,10 +9,10 @@ Page({
     }
     // 设置页面标题
     if (options.name) {
-    this.setData({
-      name: options.name,
-    });
-    }else{
+      this.setData({
+        name: options.name,
+      });
+    } else {
       this.setData({
         name: "服务包详情",
       });
@@ -25,81 +26,91 @@ Page({
     // }
   },
   data: {
+    address: "",
     name: "",
     // patientName: "",
+    showAddress: false,
     careDetail: {},
     healthReports: [] as any[],
-    symptomCellWidth: '300rpx',
+    symptomCellWidth: "300rpx",
     statusText: "未知状态",
     loading: true,
     isShowDelivery: false,
     carouselLoading: {} as Record<string | number, boolean>, // 用于跟踪每个轮播图的加载状态
   },
-  
+
   // 处理症状数据,按症状名称分组,使相同症状在同一列显示
   processSymptomData(healthReports: any[]) {
     // 收集所有唯一的症状名称
     const symptomSet = new Set<string>();
-    healthReports.forEach(report => {
+    healthReports.forEach((report) => {
       if (report.symptoms && Array.isArray(report.symptoms)) {
         report.symptoms.forEach((symptom: any) => {
           symptomSet.add(symptom.name);
         });
       }
     });
-    
+
     const allSymptomNames = Array.from(symptomSet);
-    
+
     // 重新组织每个报告的症状数据,确保症状顺序一致
-    const processedReports = healthReports.map(report => {
+    const processedReports = healthReports.map((report) => {
       const orderedSymptoms: any[] = [];
-      
+
       // 按照所有症状名称的顺序,为每个报告创建症状数组
-      allSymptomNames.forEach(symptomName => {
+      allSymptomNames.forEach((symptomName) => {
         // 查找当前报告中是否有这个症状
-        const existingSymptom = report.symptoms?.find((s: any) => s.name === symptomName);
+        const existingSymptom = report.symptoms?.find(
+          (s: any) => s.name === symptomName
+        );
         if (existingSymptom) {
           // 如果存在,添加症状信息
           orderedSymptoms.push({
             name: existingSymptom.name,
-            label: existingSymptom.label?`(${existingSymptom.label})`:'',
-            value: existingSymptom.value
+            label: existingSymptom.label ? `(${existingSymptom.label})` : "",
+            value: existingSymptom.value,
           });
         } else {
           // 如果不存在,添加空占位符
           orderedSymptoms.push({
-            name: '',
-            label: '',
-            value: 0
+            name: "",
+            label: "",
+            value: 0,
           });
         }
       });
-      
+
       return {
         ...report,
-        symptoms: orderedSymptoms
+        symptoms: orderedSymptoms,
       };
     });
     // 计算每条报告相对于上一条的趋势(上升/下降)
     for (let i = 0; i < processedReports.length; i++) {
       const previousReport = i > 0 ? processedReports[i - 1] : null;
       const currentReport = processedReports[i];
-      currentReport.symptoms = currentReport.symptoms.map((sym: any, idx: number) => {
-        const previousSymptom = previousReport ? previousReport.symptoms[idx] : null;
-        let trend: '' | 'up' | 'down' = '';
-        if (previousReport && sym && sym.name) {
-          const currentValue = Number(sym.value) || 0;
-          const previousValue = previousSymptom ? (Number(previousSymptom.value) || 0) : 0;
-          if (currentValue > previousValue) trend = 'up';
-          else if (currentValue < previousValue) trend = 'down';
+      currentReport.symptoms = currentReport.symptoms.map(
+        (sym: any, idx: number) => {
+          const previousSymptom = previousReport
+            ? previousReport.symptoms[idx]
+            : null;
+          let trend: "" | "up" | "down" = "";
+          if (previousReport && sym && sym.name) {
+            const currentValue = Number(sym.value) || 0;
+            const previousValue = previousSymptom
+              ? Number(previousSymptom.value) || 0
+              : 0;
+            if (currentValue > previousValue) trend = "up";
+            else if (currentValue < previousValue) trend = "down";
+          }
+          return { ...sym, trend };
         }
-        return { ...sym, trend };
-      });
+      );
     }
 
     return processedReports;
   },
-  
+
   onCardRecord(e: any) {
     const id = e.currentTarget.dataset.id;
     wx.navigateTo({
@@ -179,8 +190,30 @@ Page({
           },
         }
       );
+
       if (res) {
         wx.hideLoading();
+        this.setData({
+          address: `${res?.provinceName ?? ""}${res?.cityName ?? ""}${
+            res?.areaName ?? ""
+          }${res?.detailAddress ?? ""}`,
+        });
+        if (
+          !res?.provinceName &&
+          !res?.cityName &&
+          !res?.areaName &&
+          !res?.detailAddress &&
+          (!res?.liaison || !res.patientName) &&
+          !res?.phone
+        ) {
+          this.setData({
+            showAddress: false,
+          });
+        } else {
+          this.setData({
+            showAddress: true,
+          });
+        }
         // 设置状态文本
         const statusMap: Record<string, string> = {
           "0": "待付款",
@@ -191,7 +224,7 @@ Page({
           "5": "已完结",
         };
         const statusText = statusMap[res.progress] || "未知状态";
-        
+
         let isShowDelivery = false;
         if (res && res.items && res.items.length > 0) {
           res.items.forEach((item: any) => {
@@ -264,10 +297,10 @@ Page({
                 symptoms: fromHealthReportSymptom(report).items,
               };
             });
-            
+
             // 处理症状数据,按症状名称分组,使相同症状在同一列显示
             const processedReports = this.processSymptomData(items);
-            
+
             this.setData({
               healthReports: processedReports,
             });

+ 2 - 4
miniprogram/module/care/pages/careDetail/careDetail.wxml

@@ -16,10 +16,8 @@
                 <text class="label">配送:</text>
                 <text>是</text>
               </view>
-              <view class="address-block">
-                <view>
-                  {{careDetail.provinceName}}{{careDetail.cityName}}{{careDetail.areaName}}{{careDetail.detailAddress}}
-                </view>
+              <view class="address-block" wx:if="{{showAddress}}">
+                <view>{{address}}</view>
                 <view>
                   <text style="margin-right:10px" wx:if="{{careDetail.patientName || careDetail.liaison}}">
                     {{careDetail.patientName || careDetail.liaison}}</text>

+ 7 - 0
miniprogram/module/care/pages/offlineTreatment/offlineTreatment.scss

@@ -4,6 +4,8 @@
   height: calc(100vh - 44px);
   box-sizing: border-box;
   -webkit-overflow-scrolling: touch;
+  /* 兼容底部安全区,增加额外内边距防遮挡 */
+  padding-bottom: calc(env(safe-area-inset-bottom) + 24rpx);
 }
 
 .offline-treatment-page {
@@ -94,4 +96,9 @@
 }
 .sub-label {
   color: #bbb;
+}
+
+/* 底部安全区占位,确保列表最后一项不被遮挡 */
+.safe-bottom-spacer {
+  height: calc(env(safe-area-inset-bottom) + 24rpx);
 }

+ 25 - 18
miniprogram/module/care/pages/offlineTreatment/offlineTreatment.ts

@@ -2,35 +2,42 @@ import { getOfflineTreatmentListMethod } from "../../request";
 
 Page({
   data: {
-    currentTab: '',
-    treatmentList: [ ],
+    currentTab: "",
+    treatmentList: [],
+    isLoading: false,
   },
   onLoad() {
-    this.getOfflineTreatmentList('');
+    this.getOfflineTreatmentList("");
   },
   // 跳转到核销记录
-  switchVerifyRecode(){
+  switchVerifyRecode() {
     wx.navigateTo({
-      url: '/pages/care/verifyRecode',
-    })
+      url: "/pages/care/verifyRecode",
+    });
   },
   onTabChange(e: any) {
     const progress = e.detail.value;
     this.setData({
-      currentTab: progress
-    })
+      currentTab: progress,
+    });
+    // 不立即清空数据,避免空状态闪烁
     this.getOfflineTreatmentList(progress);
   },
   // 获取线下非药物治疗记录列表
-   async getOfflineTreatmentList(progress: string) {
-    this.setData({
-     treatmentList: []
-    })
-    const res =  await getOfflineTreatmentListMethod(progress);
-    if(res && res.data && res.data.length > 0) {
-      this.setData({
-        treatmentList: res.data
-      })
+  async getOfflineTreatmentList(progress: string) {
+    // 启用加载态,保留当前列表,避免空态闪烁
+    this.setData({ isLoading: true });
+    try {
+      const res = await getOfflineTreatmentListMethod(progress);
+      const list = res && res.data ? res.data : [];
+      // 只有在数据加载完成后才更新列表
+      this.setData({ treatmentList: list, isLoading: false });
+    } catch (error: any) {
+      wx.showToast({
+        title: error.errMsg || "获取数据失败",
+        icon: "none",
+      });
+      this.setData({ treatmentList: [], isLoading: false });
     }
-  }
+  },
 });

+ 44 - 39
miniprogram/module/care/pages/offlineTreatment/offlineTreatment.wxml

@@ -6,47 +6,52 @@
     <t-tab-panel label="治疗完成" value="1"></t-tab-panel>
   </t-tabs>
   <scroll-view class="page-container" scroll-y>
-  <view wx:if="{{treatmentList.length>0}}">
-    <block wx:for="{{treatmentList}}" wx:key="id">
-      <view class="treatment-detail-card" bind:tap="switchVerifyRecode">
-      <view> 
-        <view class="row between">
-          <text class="label bold">项目:{{item.conditioningProgramName}}</text>
-        </view>
-        <view class="row">
-         <text class="sub-label">开具人:</text>
-        {{item.operateBy}}</view>
-          <view class="row">
-           <text class="sub-label">开始时间:</text>
-           {{item.estimatedStartDate}}
-        </view>
-        <view class="row">
-         <text class="sub-label">频次:</text>
-         每{{item.frequencyType}}天{{item.frequencyMeasure}}{{item.convertUnit}}
-        </view>
-        <view class="row" wx:if="{{tem.arrangeDate}}">
-          <text class="sub-label">下次时间:</text>
-          {{item.arrangeDate}}
-        </view>
-        <view class="row" wx:if="{{item.conditioningProgramSupplierName}}">
-           <text class="sub-label">机构:</text>
-          {{item.conditioningProgramSupplierName}}
-        </view>
-        <view class="divider"></view>
-      </view>
-      <view style="margin-top:-80px">
-       <view class="status" style="color:{{item.status === 'doing' ? '#F44336' : '#43A047'}}">
-       {{item.progress === '0' ? '进行中' : '已完成'}}
+    <view wx:if="{{isLoading}}">
+      <t-loading theme="spinner" text="加载中..." size="24" />
+    </view>
+    <view wx:elif="{{treatmentList.length>0}}">
+      <block wx:for="{{treatmentList}}" wx:key="id">
+        <view class="treatment-detail-card" bind:tap="switchVerifyRecode">
+          <view>
+            <view class="row between">
+              <text class="label bold">项目:{{item.conditioningProgramName}}</text>
+            </view>
+            <view class="row">
+              <text class="sub-label">开具人:</text>
+              {{item.operateBy}}
+            </view>
+            <view class="row">
+              <text class="sub-label">开始时间:</text>
+              {{item.estimatedStartDate}}
+            </view>
+            <view class="row">
+              <text class="sub-label">频次:</text>
+              每{{item.frequencyType}}天{{item.frequencyMeasure}}{{item.convertUnit}}
+            </view>
+            <view class="row" wx:if="{{item.arrangeDate}}">
+              <text class="sub-label">下次时间:</text>
+              {{item.arrangeDate}}
+            </view>
+            <view class="row" wx:if="{{item.conditioningProgramSupplierName}}">
+              <text class="sub-label">机构:</text>
+              {{item.conditioningProgramSupplierName}}
+            </view>
+            <view class="divider"></view>
+          </view>
+          <view style="margin-top:-80px">
+            <view class="status" style="color:{{item.status === 'doing' ? '#F44336' : '#43A047'}}">
+              {{item.progress === '0' ? '进行中' : '已完成'}}
+            </view>
+            <view>{{item.finishCount}}/{{item.totalMeasure}}</view>
           </view>
-          <view>{{item.finishCount}}/{{item.totalMeasure}}</view>
-      </view>
-</view>
-    </block>
+        </view>
+      </block>
+      <!-- 底部安全区占位 -->
+      <view class="safe-bottom-spacer"></view>
+    </view>
+    <view wx:elif="{{!isLoading && treatmentList.length === 0}}">
+      <t-empty icon="info-circle-filled" description="暂无数据" />
     </view>
 
-<view wx:else>
-   <t-empty icon="info-circle-filled" description="暂无数据" />
-</view>
-    
   </scroll-view>
 </view>

+ 1 - 0
miniprogram/module/charts/record-care/record-care.ts

@@ -27,6 +27,7 @@ Component({
         {},
         {
           transform({ data }: any) {
+            console.log(data, "获取健康评分数据");
             return data;
           },
         }

+ 156 - 56
miniprogram/module/chats/components/message-select/message-select.ts

@@ -7,15 +7,20 @@ interface Option {
 }
 interface HandleEvent {
   mark: {
-    type: 'sub' | 'options';
+    type: "sub" | "options";
     index: number;
     item: Option;
-  }
+  };
 }
 
 Component({
   properties: {
-    payload: { type: Object, value: { title: '', multiple: false, options: [] }, result: '', belongNew: null },
+    payload: {
+      type: Object,
+      value: { title: "", multiple: false, options: [] },
+      result: "",
+      belongNew: null,
+    },
     active: { type: Boolean, value: false },
   },
   data: {
@@ -23,104 +28,199 @@ Component({
     subOptions: [] as Option[],
     subMultiple: false,
     itemHeight: 48,
-    result: '', hasSelected: false,
-    leftTitle: '都没有',
-    rightTitle: '提交'
+    result: "",
+    hasSelected: false,
+    leftTitle: "都没有",
+    rightTitle: "提交",
   },
   lifetimes: {
     attached() {
-      console.log("attached",this.data.payload.belongNew)
-      if(this.data.payload.belongNew){
+      console.log("attached", this.data.payload.belongNew,this.data.payload);
+      if (this.data.payload.belongNew) {
         this.setData({
-          leftTitle: '都没有',
-          rightTitle: '提交'
-        })
-      }else{
+          leftTitle: "都没有",
+          rightTitle: "提交",
+        });
+      } else {
         this.setData({
-          leftTitle: '无变化',
-          rightTitle: '完成'
-        })
+          leftTitle: "无变化",
+          rightTitle: "完成",
+        });
       }
-    }
+    },
   },
   observers: {
-    'payload.options'(options) {
+    "payload.options"(options) {
       this.setData({ options });
     },
-    'options'(options: AnyArray) {
-      this.setData({ hasSelected: options.filter(option => !option.hide).some(option => option.checked) });
-    }
+    options(options: AnyArray) {
+      this.setData({
+        hasSelected: options
+          .filter((option) => !option.hide)
+          .some((option) => option.checked),
+      });
+    },
   },
   methods: {
     handleTop(event: HandleEvent) {
-      const { mark: { item } } = event;
+      const {
+        mark: { item },
+      } = event;
+      console.log("handleTop", item, this.data.active);
       if (!item || !this.data.active) return;
-      console.log("handleTop",item)
-      const index = this.data.options.findIndex(option => option.id === item.id);
+      console.log("handleTop", this.data.subOptions);
+      const index = this.data.options.findIndex(
+        (option) => option.id === item.id
+      );
+      // 如果当前项已选中且已有已选中的子项,则直接弹出子项程度选择弹窗以便修改
+      const itemInState: any = this.data.options[index];
+      const hasSubOptions = itemInState?.options?.filter(
+        (o: any) => !o?.hide
+      ).length;
+      const hasAnySubChecked = itemInState?.options?.some(
+        (o: any) => o?.checked
+      );
+      if (itemInState?.checked && hasSubOptions && hasAnySubChecked) {
+        this.setData({
+          subTitle: itemInState.name,
+          subOptions: itemInState.options,
+          subMultiple: itemInState.css === "checkbox",
+        });
+        this.onCancel = () => {
+          this.setData({ subOptions: [] });
+        };
+        this.onConfirm = () => {
+          if (!this.data.subOptions.some((option) => option.checked)) {
+            wx.showToast({ title: "请至少选择一项", icon: "error" });
+          } else {
+            const options = this.data.options;
+            options[index].options = this.data.subOptions;
+            this.setData({ subOptions: [], options });
+            // 单选场景:选择/修改子程度后直接提交
+            if (!this.data.payload.multiple) {
+              this.onSubmit();
+            }
+          }
+        };
+        return;
+      }
       const multiple = this.data.payload.multiple;
       const checked = !item.checked;
       const options = this._handle(this.data.options, item, index, multiple);
       this.setData({ options });
-      if (checked && !multiple) { this.onSubmit(); }
+      // 注释掉自动提交的逻辑,让用户可以继续选择症状程度
+      if (checked && !multiple) {
+        this.onSubmit();
+      }
     },
     handleSub(event: HandleEvent) {
-      const { mark: { item } } = event;
+      const {
+        mark: { item },
+      } = event;
+      console.log("handleSub", item, this.data.active);
       if (!item || !this.data.active) return;
-      const index = this.data.subOptions.findIndex(option => option.id === item.id);
+      console.log("this.data.subOptions", this.data.subOptions);
+      const index = this.data.subOptions.findIndex(
+        (option) => option.id === item.id
+      );
+      console.log("index", index);
       const multiple = this.data.subMultiple;
       const checked = !item.checked;
-      const subOptions = this._handle(this.data.subOptions, item, index, multiple);
+      const subOptions = this._handle(
+        this.data.subOptions,
+        item,
+        index,
+        multiple
+      );
       this.setData({ subOptions });
+      console.log(this.data.subOptions, "suboptions111");
 
-      if (checked && !multiple) { this.onConfirm(); }
+      // 检查是否所有症状程度都被取消选中
+      const hasAnySubChecked = subOptions.some((option) => option.checked);
+      if (!hasAnySubChecked) {
+        // 如果没有任何症状程度被选中,则取消整个症状的选中状态
+        const mainIndex = this.data.options.findIndex(
+          (option) => option.name === this.data.subTitle
+        );
+        if (mainIndex !== -1) {
+          const options = this.data.options;
+          options[mainIndex].checked = false;
+          options[mainIndex].options = options[mainIndex].options?.map(
+            (option: any) => {
+              if (!option?.hide) option.checked = false;
+              return option;
+            }
+          );
+          // 关闭当前弹窗,避免遮挡导致切换其它症状时看起来未选中
+          this.setData({ options, subOptions: [], subTitle: "" });
+          return;
+        }
+      }
+
+      // 注释掉自动关闭弹窗的逻辑,让用户可以继续修改症状程度
+      if (checked && !multiple) {
+        this.onConfirm();
+      }
     },
-    _handle(options: Option[], item: Option, index: number, multiple?: boolean) {
+    _handle(
+      options: Option[],
+      item: Option,
+      index: number,
+      multiple?: boolean
+    ) {
       const checked = !item.checked;
       if (checked) {
         const fn = () => {
           if (multiple) {
             options[index].checked = checked;
           } else {
-            options.forEach(option => { option.checked = option.id === item.id; })
+            options.forEach((option) => {
+              option.checked = option.id === item.id;
+            });
           }
           return options;
-        }
-        if (item.options?.filter(option => !(<any>option)?.hide).length) {
+        };
+        if (item.options?.filter((option) => !(<any>option)?.hide).length) {
           this.setData({
             subTitle: item.name,
             subOptions: item.options,
-            subMultiple: (<any>item).css === 'checkbox'
-          })
+            subMultiple: (<any>item).css === "checkbox",
+          });
           this.onCancel = () => {
-            this.setData({ subOptions: [] })
-          }
+            this.setData({ subOptions: [] });
+          };
           this.onConfirm = () => {
-            if (!this.data.subOptions.some(option => option.checked)) {
-              wx.showToast({ title: '请至少选择一项', icon: 'error' })
+            if (!this.data.subOptions.some((option) => option.checked)) {
+              wx.showToast({ title: "请至少选择一项", icon: "error" });
             } else {
               const options = fn();
               options[index].options = this.data.subOptions;
-              this.setData({ subOptions: [], options })
+              this.setData({ subOptions: [], options });
+              // 单选场景:选择子程度“确定”后直接提交
+              if (!this.data.payload.multiple) {
+                this.onSubmit();
+              }
             }
-          }
+          };
         } else {
           return fn();
         }
       } else {
         options[index].checked = !item.checked;
-        if (item.options) options[index].options = item.options.map(option => {
-          if (!(<any>option)?.hide) option.checked = !item.checked;
-          return option;
-        })
+        if (item.options)
+          options[index].options = item.options.map((option) => {
+            if (!(<any>option)?.hide) option.checked = !item.checked;
+            return option;
+          });
       }
       return options;
     },
-    onCancel() { },
-    onConfirm() { },
+    onCancel() {},
+    onConfirm() {},
     onSubmit() {
       if (this.data.result) return;
       if (!this.data.hasSelected) {
-        wx.showToast({ title: '请至少选择一项', icon: 'error' })
+        wx.showToast({ title: "请至少选择一项", icon: "error" });
       } else {
         console.log(this.data.options);
         const result = this.data.options
@@ -129,20 +229,20 @@ Component({
             const sub = option.options
               ?.filter((item: any) => item?.checked && !item?.hide)
               .map((item: any) => item.name)
-              .join(', ');
-            return [option.name, sub].filter(Boolean).join(': ')
+              .join(", ");
+            return [option.name, sub].filter(Boolean).join(": ");
           })
-          .join('; ');
+          .join("; ");
         this.setData({ result });
-        this.triggerEvent('next', { options: this.data.options });
+        this.triggerEvent("next", { options: this.data.options });
       }
     },
     onSkip() {
       if (this.data.result || this.data.hasSelected) return;
       if (!this.data.payload.required) {
-        this.setData({ result: '都没有' });
-        this.triggerEvent('next', { options: this.data.options });
+        this.setData({ result: "都没有" });
+        this.triggerEvent("next", { options: this.data.options });
       }
-    }
-  }
-})
+    },
+  },
+});

+ 1 - 1
miniprogram/module/health/components/follow-evaluation/follow-evaluation.wxml

@@ -2,7 +2,7 @@
 
 </wxs>
 <!--module/health/components/follow-evaluation/follow-evaluation.wxml-->
-<view class="card-wrapper">
+<view class="card-wrapper" wx:if="{{followEvaluationList.length>0}}">
   <view class="constitution-container">
     <view class="card-header constitution-box">
       <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />

+ 10 - 1
miniprogram/module/health/components/follow-record/follow-record.scss

@@ -56,6 +56,7 @@
     height: 40px;
     line-height: 40px;
     border-radius: 8px 8px 0px 0px;
+    min-width: 0;
     
     &:last-child {
       border-bottom: none;
@@ -68,7 +69,9 @@
   }
   
   .table-cell {
-    flex: 1;
+    flex: 1 1 0;
+    min-width: 0;
+    max-width: 100%;
     padding: 0 16rpx;
     text-align: center;
     font-size: 28rpx;
@@ -82,6 +85,12 @@
     }
   }
 }
+.ellipsis {
+  display: block;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
 .table-box{
   padding: 0px 10px 10px 10px;
 }

+ 2 - 2
miniprogram/module/health/components/follow-record/follow-record.wxml

@@ -2,7 +2,7 @@
 
 </wxs>
 <!--module/health/components/follow-evaluation/follow-evaluation.wxml-->
-<view class="card-wrapper">
+<view class="card-wrapper" wx:if="{{followEvaluationList.length>0}}">
   <view class="constitution-container">
     <view class="card-header constitution-box">
       <t-loading wx:if="{{loading}}" theme="spinner" size="20px" class="loading" />
@@ -23,7 +23,7 @@
       </view>
       <view class="table-row" wx:for="{{followEvaluationList}}" wx:key="id" bindtap="goFollowRecord">
         <view class="table-cell">{{item.arrangeTime}}</view>
-        <view class="table-cell">{{item.followupPlanName}}</view>
+        <view class="table-cell"><view class="ellipsis">{{item.followupPlanName}}</view></view>
         <view class="table-cell">{{item.progress==='1'?'未完成':item.progress==='2'?'已完成':item.progress==='0'?'未开始':''}}</view>
       </view>
       </view>

+ 1 - 1
miniprogram/module/health/components/horizontal-scrollable/horizontal-scrollable.ts

@@ -19,7 +19,7 @@ Component({
     dataset: { type: Array, value: [] },
   },
   data: {
-
+  url:'https://wx.hzliuzhi.com/media/knowledge/sport/cover/八段锦.jpg'
   },
   methods: {
     handleHorizontalDrag(event: { deltaX: number }) {

+ 1 - 0
miniprogram/module/health/pages/status/status.ts

@@ -28,6 +28,7 @@ Component({
           }
         });
         this.setData({ health })
+        console.log(health, '指标数据health');
       } catch (error) {
         getTickleContext.call(this).showErrorMessage(error.errMsg, 0)
       }

+ 78 - 42
miniprogram/pages/home/home.ts

@@ -105,16 +105,18 @@ Page({
     const currentExpandedStates = this.data.displayList.map((item: any) => ({
       id: item.id,
       expanded: item.expanded,
-      _mediaLoaded: item._mediaLoaded
+      _mediaLoaded: item._mediaLoaded,
     }));
-    
+
     const res = await getCareList();
     if (res && res.length > 0) {
       res.forEach((item: any, index: number) => {
         item.carouselMediaList = [];
-        
+
         // 检查是否已经加载过媒体内容
-        const existingItem = currentExpandedStates.find(state => state.id === item.id);
+        const existingItem = currentExpandedStates.find(
+          (state) => state.id === item.id
+        );
         item._mediaLoaded = existingItem ? existingItem._mediaLoaded : false;
 
         // 确保 item.id 存在且为数字类型
@@ -257,25 +259,37 @@ Page({
     };
   },
 
-  async updateDisplayList(preserveExpandedStates?: Array<{id: number, expanded: boolean, _mediaLoaded?: boolean}>) {
+  async updateDisplayList(
+    preserveExpandedStates?: Array<{
+      id: number;
+      expanded: boolean;
+      _mediaLoaded?: boolean;
+    }>
+  ) {
     const { careList, allExpanded } = this.data;
-    let newDisplayList: any[] = allExpanded || careList.length <= 4 ? careList : careList.slice(0, 4);
-    
+    let newDisplayList: any[] =
+      allExpanded || careList.length <= 4 ? careList : careList.slice(0, 4);
+
     // 如果有保存的展开状态和媒体加载状态,则恢复它们
     if (preserveExpandedStates && preserveExpandedStates.length > 0) {
       newDisplayList = newDisplayList.map((item: any) => {
-        const savedState = preserveExpandedStates.find(state => state.id === item.id);
+        const savedState = preserveExpandedStates.find(
+          (state) => state.id === item.id
+        );
         if (savedState) {
-          return { 
-            ...item, 
+          return {
+            ...item,
             expanded: savedState.expanded,
-            _mediaLoaded: savedState._mediaLoaded !== undefined ? savedState._mediaLoaded : item._mediaLoaded
+            _mediaLoaded:
+              savedState._mediaLoaded !== undefined
+                ? savedState._mediaLoaded
+                : item._mediaLoaded,
           };
         }
         return item;
       });
     }
-    
+
     this.setData({
       displayList: newDisplayList,
     });
@@ -434,10 +448,23 @@ Page({
   },
 
   async _getHealthReport() {
+    console.log(1111);
     wx.showLoading({ title: "加载中" });
     this.setData({ "healthReport.loading": true });
     try {
+      console.log(2222);
       const data = await healthReportMethod();
+
+      console.log(data, "data===",!data);
+      if (!data ) {
+        this.setData({
+          isShowComplete: true,
+        });
+      }else{
+        this.setData({
+          isShowComplete: false,
+        });
+      }
       this.setData({
         "healthReport.data": data,
         "healthReport.loading": false,
@@ -478,12 +505,18 @@ Page({
       this.setData({
         statusList: arr2,
       });
-      if (!data?.healthAnalysisReportId) {
-        this.setData({
-          isShowComplete: true,
-        });
-      }
-    } catch (error) {
+
+      // if (!data?.healthAnalysisReportId) {
+      //   this.setData({
+      //     isShowComplete: true,
+      //   });
+      // }
+    } catch (error: any) {
+      console.log(error, "error===");
+      wx.showToast({
+        title: error.errMsg || "加载失败",
+        icon: "none",
+      });
       this.setData({
         "healthReport.data": [],
         "healthReport.loading": false,
@@ -503,7 +536,6 @@ Page({
           .filter(Boolean),
         "healthIndex.loading": false,
       });
-      console.log(this.data.healthIndex.data, "获取健康指数");
     } catch (error) {
       this.setData({
         "healthIndex.data": [],
@@ -837,7 +869,6 @@ Page({
   async isGoPunchcard(e: any) {
     const { id, signintime } = e.currentTarget.dataset;
     // 已经打卡了
-    console.log("signinTime=>>>", signintime);
     if (signintime) {
       // 已打卡 跳转到打卡页面
       wx.navigateTo({
@@ -846,7 +877,6 @@ Page({
     } else {
       //  todo 打卡
       const cardId = e.currentTarget.dataset.id;
-      console.log(cardId, "cardId");
       await addPatientOnlineRecordClockIn(cardId);
       wx.showToast({
         title: "打卡成功",
@@ -865,17 +895,19 @@ Page({
       id: item.id,
       expanded: item.expanded,
       _mediaLoaded: item._mediaLoaded,
-      carouselMediaList: item.carouselMediaList // 保存媒体列表,避免重新加载
+      carouselMediaList: item.carouselMediaList, // 保存媒体列表,避免重新加载
     }));
-    
+
     // 获取新数据
     const res = await getCareList();
     if (res && res.length > 0) {
       // 处理新数据,但保持媒体加载状态
       res.forEach((item: any) => {
         // 查找对应的旧数据
-        const oldItem = currentExpandedStates.find(state => state.id === item.id);
-        
+        const oldItem = currentExpandedStates.find(
+          (state) => state.id === item.id
+        );
+
         // 如果找到旧数据且媒体已加载,保持媒体状态
         if (oldItem && oldItem._mediaLoaded && oldItem.carouselMediaList) {
           // 保持原有的媒体列表,避免重新加载
@@ -885,68 +917,72 @@ Page({
           // 否则重新构建媒体列表
           item.carouselMediaList = [];
           item._mediaLoaded = false;
-          
+
           // 添加photo
           if (item.photo) {
             item.carouselMediaList.push({
               type: "image",
               src: item.photo,
-              cacheKey: `photo_${item.id}_${item.photo}` // 添加缓存键
+              cacheKey: `photo_${item.id}_${item.photo}`, // 添加缓存键
             });
           }
-          
+
           // 添加itemImgFirst
           if (item?.itemImgFirst) {
             item.carouselMediaList.push({
               type: "image",
               src: item.itemImgFirst,
-              cacheKey: `img_${item.id}_${item.itemImgFirst}` // 添加缓存键
+              cacheKey: `img_${item.id}_${item.itemImgFirst}`, // 添加缓存键
             });
           }
-          
+
           // 添加itemVideoFirst
           if (item?.itemVideoFirst) {
             item.carouselMediaList.push({
               type: "video",
               src: item.itemVideoFirst,
               poster: item.photo || item.itemImgFirst,
-              cacheKey: `video_${item.id}_${item.itemVideoFirst}` // 添加缓存键
+              cacheKey: `video_${item.id}_${item.itemVideoFirst}`, // 添加缓存键
             });
           }
-          
+
           // 如果没有媒体内容,直接标记为已加载
           if (item.carouselMediaList.length === 0) {
             item._mediaLoaded = true;
           }
         }
-        
+
         // 确保 id 是数字类型
         item.id = Number(item.id);
       });
-      
+
       // 更新 careList
       this.setData({
         careList: res,
       });
-      
+
       // 更新 displayList 并恢复展开状态
       const { allExpanded } = this.data;
-      let newDisplayList: any[] = allExpanded || res.length <= 4 ? res : res.slice(0, 4);
-      
+      let newDisplayList: any[] =
+        allExpanded || res.length <= 4 ? res : res.slice(0, 4);
+
       // 恢复展开状态
       newDisplayList = newDisplayList.map((item: any) => {
-        const savedState = currentExpandedStates.find(state => state.id === item.id);
+        const savedState = currentExpandedStates.find(
+          (state) => state.id === item.id
+        );
         if (savedState) {
-          return { 
-            ...item, 
+          return {
+            ...item,
             expanded: savedState.expanded,
             _mediaLoaded: savedState._mediaLoaded,
-            carouselMediaList: savedState.carouselMediaList || item.carouselMediaList
+            carouselMediaList:
+              savedState.carouselMediaList || item.carouselMediaList,
           };
         }
         return item;
       });
-      
+
       this.setData({
         displayList: newDisplayList,
       });

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

@@ -36,8 +36,10 @@
         </view>
       </view>
 
-
-      <view class="steps-container" wx:if="{{statusList.length>0}}">
+      <view class="healthyAnalyze" bindtap="goHealthAnalyze" wx:if="{{isShowComplete}}">
+        请完成健康评估
+      </view>
+      <view class="steps-container" wx:else>
         <vertical-steps statusList="{{statusList}}" dataset="{{healthReport.data}}" bind:position="onBodyModel" />
         <view class="warn-box" wx:if="{{healthIndex.data.length>0}}">
           <image src="../../assets/bg/icon_warning@3x.png" class="warn-img" />
@@ -46,9 +48,7 @@
           </view>
         </view>
       </view>
-      <view class="healthyAnalyze" bindtap="goHealthAnalyze" wx:if="{{isShowComplete}}">
-        请完成健康评估
-      </view>
+
       <view class="report-container" bind:tap="toReportPage" wx:if="{{healthReport.data.reportTime}}">
         <view class="report-box">
           <view>