Przeglądaj źródła

feat(wealth): replace service grid with insurance policy list

asus 1 miesiąc temu
rodzic
commit
d017b04c1f
1 zmienionych plików z 95 dodań i 9 usunięć
  1. 95 9
      cfc-frontend/pages/wealth/index.vue

+ 95 - 9
cfc-frontend/pages/wealth/index.vue

@@ -171,19 +171,34 @@
         </view>
       </view>
 
-      <!-- 财富服务 8 宫格 -->
-      <view class="section">
+      <!-- 保单管理 -->
+      <view class="section" v-if="insuranceLoaded">
         <view class="section-header">
-          <text class="section-title">🚀 财富服务</text>
+          <text class="section-title">🛡️ 保单管理</text>
+          <text class="section-more" @click="goToInsuranceList">查看更多 ›</text>
+        </view>
+        <view class="insurance-card" v-if="insuranceList.length === 0">
+          <view class="insurance-empty">
+            <text class="insurance-empty-icon">📋</text>
+            <text class="insurance-empty-text">暂无保单</text>
+          </view>
         </view>
-        <view class="service-grid">
-          <view class="service-item" v-for="item in serviceList" :key="item.label" @click="onServiceClick(item.action)">
-              <view class="service-icon-wrap">
-                <text class="service-icon">{{ item.icon }}</text>
-              </view>
-              <text class="service-label">{{ item.label }}</text>
+        <view class="insurance-card" v-else>
+          <view class="insurance-item" v-for="(item, idx) in insuranceList" :key="idx" @click="goToInsuranceList">
+            <view class="insurance-item-header">
+              <text class="insurance-item-name">{{ item.policyName }}</text>
+              <text class="insurance-item-status" :class="'status-' + item.status">{{ getPolicyStatusLabel(item.status) }}</text>
+            </view>
+            <view class="insurance-item-row">
+              <text class="insurance-item-label">保险公司</text>
+              <text class="insurance-item-value">{{ item.insuranceCompany || '未知' }}</text>
+            </view>
+            <view class="insurance-item-row">
+              <text class="insurance-item-label">被保人</text>
+              <text class="insurance-item-value">{{ item.insuredPerson }}</text>
             </view>
           </view>
+        </view>
       </view>
 
             <!-- 富维度介绍卡片 -->
@@ -208,6 +223,7 @@ import {
   getReferralSummary,
   getCommissionSummary,
   getFamilyMemberList,
+  getInsuranceList,
   productList
 } from '../../utils/api.js'
 import nav from '../../utils/nav.js'
@@ -267,6 +283,9 @@ export default {
       familyMembersVisible: [],
       selectedMemberId: null,
       guestProducts: [],
+      // 保单列表
+      insuranceList: [],
+      insuranceLoaded: false,
     }
   },
   computed: {
@@ -312,6 +331,7 @@ export default {
     this.loadWealthDetail()
     this.loadWealthData()
     this.loadFamilyMembersVisible()
+    this.loadInsuranceList()
     this._watchPageReady()
   },
     /** 每月引导语 */
@@ -346,6 +366,22 @@ export default {
         self.familyMembersVisible = []
       })
     },
+    loadInsuranceList() {
+      var self = this
+      this.insuranceLoaded = false
+      getInsuranceList({}).then(function(res) {
+        if (res && res.code === 200) {
+          self.insuranceList = (res.data || []).slice(0, 3)
+        }
+        self.insuranceLoaded = true
+      }).catch(function() {
+        self.insuranceLoaded = true
+      })
+    },
+    getPolicyStatusLabel: function(status) {
+      var map = { active: '有效', expired: '已过期', cancelled: '已取消' }
+      return map[status] || status || '未知'
+    },
     goLogin() {
       uni.navigateTo({ url: '/pages/login/login' })
     },
@@ -465,6 +501,9 @@ export default {
     goToInsurance() {
       uni.navigateTo({ url: '/pages/wealth-sub/insurance-list' })
     },
+    goToInsuranceList: function() {
+      uni.navigateTo({ url: '/pages/wealth-sub/insurance-list' })
+    },
     goToCreator() {
       uni.navigateTo({ url: '/pages/promotion/index' })
     },
@@ -946,6 +985,53 @@ export default {
   font-weight: bold;
   color: #F59E0B;
 }
+
+/* 保单管理 */
+.insurance-card {
+  background: #fff;
+  border-radius: 20rpx;
+  padding: 24rpx;
+  box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.08);
+}
+.insurance-empty {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  padding: 40rpx 0;
+}
+.insurance-empty-icon { font-size: 60rpx; }
+.insurance-empty-text { font-size: 24rpx; color: #999; margin-top: 12rpx; }
+.insurance-item {
+  padding: 16rpx 0;
+  border-bottom: 1rpx solid #f5f5f5;
+}
+.insurance-item:last-child { border-bottom: none; }
+.insurance-item-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 8rpx;
+}
+.insurance-item-name {
+  font-size: 26rpx;
+  font-weight: 600;
+  color: #333;
+}
+.insurance-item-status {
+  font-size: 20rpx;
+  padding: 4rpx 12rpx;
+  border-radius: 8rpx;
+}
+.insurance-item-status.status-active { background: #DCFCE7; color: #16A34A; }
+.insurance-item-status.status-expired { background: #FEF2F2; color: #DC2626; }
+.insurance-item-status.status-cancelled { background: #F5F5F5; color: #999; }
+.insurance-item-row {
+  display: flex;
+  justify-content: space-between;
+  padding: 4rpx 0;
+}
+.insurance-item-label { font-size: 22rpx; color: #999; }
+.insurance-item-value { font-size: 22rpx; color: #666; }
 </style>
 
 /* 月度引导语 */