Explorar el Código

fix(fee): 问卷超时调整 + 加载文案优化

- questionnaire接口超时从130s调整为90/60/30s(按实际耗时分层)
- 问卷加载提示改为"AI正在根据双方情况生成问卷,请稍候(约需1-2分钟)..."
- 家庭成员添加页/列表页适配关系类型展示优化
Sisyphus hace 1 mes
padre
commit
0a9052afa0

+ 32 - 14
cfc-frontend/pages/action-detail/interaction-log.vue

@@ -24,11 +24,18 @@
       <view class="type-grid">
       <view class="type-grid">
         <view class="type-item" v-for="(name, key) in interactionTypes" :key="key"
         <view class="type-item" v-for="(name, key) in interactionTypes" :key="key"
               :class="{selected: selectedType === key}"
               :class="{selected: selectedType === key}"
-              @click="selectedType = key">
+              @click="selectType(key)">
           <text class="type-icon">{{ typeIcons[key] || '💬' }}</text>
           <text class="type-icon">{{ typeIcons[key] || '💬' }}</text>
           <text class="type-name">{{ name }}</text>
           <text class="type-name">{{ name }}</text>
         </view>
         </view>
+        <view class="type-item" :class="{selected: selectedType === 'custom'}"
+              @click="selectType('custom')">
+          <text class="type-icon">✨</text>
+          <text class="type-name">自定义</text>
+        </view>
       </view>
       </view>
+      <input v-if="selectedType === 'custom'" class="custom-type-input" v-model="customTypeName"
+             placeholder="请输入自定义活动名称(如:一起读书)" maxlength="20" />
     </view>
     </view>
 
 
     <!-- 互动描述 -->
     <!-- 互动描述 -->
@@ -129,6 +136,7 @@ export default {
       preselectedMemberId: null, // URL传入的memberId,不显示成员选择器
       preselectedMemberId: null, // URL传入的memberId,不显示成员选择器
       currentMemberId: null,     // 当前登录用户的家庭成员ID(fromMemberId)
       currentMemberId: null,     // 当前登录用户的家庭成员ID(fromMemberId)
       selectedType: '',
       selectedType: '',
+      customTypeName: '',
       description: '',
       description: '',
       timeType: 'now',
       timeType: 'now',
       customTime: '',
       customTime: '',
@@ -180,24 +188,19 @@ export default {
         var res = await getFamilyMemberList()
         var res = await getFamilyMemberList()
         if (res.code === 200 && res.data) {
         if (res.code === 200 && res.data) {
           var all = res.data || []
           var all = res.data || []
-          // 确定"我"的成员ID:优先从成员列表中匹配当前登录用户
-          var userInfo = uni.getStorageSync('userInfo')
-          var uid = (userInfo && userInfo.id) || 0
-          var self = this
+          // 使用后端返回的 isSelf 标记(比匹配 userId 更可靠)
           var found = null
           var found = null
-          if (uid) {
-            for (var i = 0; i < all.length; i++) {
-              var m = all[i]
-              if (m && m.userId && Number(m.userId) === Number(uid)) {
-                found = m
-                break
-              }
+          for (var i = 0; i < all.length; i++) {
+            var m = all[i]
+            if (m && m.isSelf === true) {
+              found = m
+              break
             }
             }
           }
           }
           this.currentMemberId = found ? found.id : null
           this.currentMemberId = found ? found.id : null
           // 互动对象列表过滤掉"我"(from==to 后端会拒绝)
           // 互动对象列表过滤掉"我"(from==to 后端会拒绝)
           this.members = all.filter(function(m) {
           this.members = all.filter(function(m) {
-            return !(m && m.userId && found && Number(m.userId) === Number(found.userId))
+            return !(m && m.isSelf === true)
           })
           })
         }
         }
       } catch (e) {
       } catch (e) {
@@ -207,6 +210,12 @@ export default {
     selectMember(member) {
     selectMember(member) {
       this.selectedMemberId = member.id
       this.selectedMemberId = member.id
     },
     },
+    selectType(type) {
+      this.selectedType = type
+      if (type !== 'custom') {
+        this.customTypeName = ''
+      }
+    },
     onTimeChange(e) {
     onTimeChange(e) {
       this.customTime = e.detail.value
       this.customTime = e.detail.value
     },
     },
@@ -374,10 +383,11 @@ export default {
         this.uploading = false
         this.uploading = false
 
 
         // 保存互动记录
         // 保存互动记录
+        var interactionType = this.selectedType === 'custom' ? this.customTypeName : this.selectedType
         var res = await addInteraction({
         var res = await addInteraction({
           fromMemberId: fromId,
           fromMemberId: fromId,
           toMemberId: this.selectedMemberId,
           toMemberId: this.selectedMemberId,
-          interactionType: this.selectedType,
+          interactionType: interactionType,
           description: this.description,
           description: this.description,
           happenedAt: happenedAt,
           happenedAt: happenedAt,
           photoUrls: photoUrls.join(','),
           photoUrls: photoUrls.join(','),
@@ -471,6 +481,14 @@ export default {
   border-color: #F97316;
   border-color: #F97316;
   background: #FFF7ED;
   background: #FFF7ED;
 }
 }
+.custom-type-input {
+  margin-top: 20rpx;
+  border: 2rpx solid #e0e0e0;
+  border-radius: 12rpx;
+  padding: 16rpx 20rpx;
+  font-size: 28rpx;
+  background: #fafafa;
+}
 .type-icon {
 .type-icon {
   font-size: 40rpx;
   font-size: 40rpx;
   display: block;
   display: block;

+ 1 - 1
cfc-frontend/pages/action-detail/relationship-questionnaire.vue

@@ -7,7 +7,7 @@
 
 
     <!-- 加载状态 -->
     <!-- 加载状态 -->
     <view v-if="loading" class="loading-wrap">
     <view v-if="loading" class="loading-wrap">
-      <text class="loading-text">正在生成问卷...</text>
+      <text class="loading-text">AI正在根据双方情况生成问卷,请稍候(约需1-2分钟)...</text>
     </view>
     </view>
 
 
     <!-- 问卷表单 -->
     <!-- 问卷表单 -->

+ 5 - 0
cfc-frontend/pages/family/add-member.vue

@@ -175,6 +175,8 @@ onLoad(options) {
     if (options.gender) this.form.gender = options.gender
     if (options.gender) this.form.gender = options.gender
     if (options.phone) this.form.phone = options.phone
     if (options.phone) this.form.phone = options.phone
     if (options.birthday) this.form.birthday = options.birthday
     if (options.birthday) this.form.birthday = options.birthday
+    if (options.generationLevel) this.form.generationLevel = options.generationLevel
+    if (options.peerType) this.form.peerType = options.peerType
   }
   }
 },
 },
 methods: {
 methods: {
@@ -261,6 +263,9 @@ if (this.isEdit) {
   if (this.form.gender) updatePayload.gender = this.form.gender
   if (this.form.gender) updatePayload.gender = this.form.gender
   if (this.form.birthday) updatePayload.birthday = this.form.birthday
   if (this.form.birthday) updatePayload.birthday = this.form.birthday
   if (this.form.phone) updatePayload.phone = this.form.phone
   if (this.form.phone) updatePayload.phone = this.form.phone
+  var editGen = (this.$refs.generationPicker && this.$refs.generationPicker.selectedGen) || this.form.generationLevel
+  if (editGen) updatePayload.generationLevel = editGen
+  if (this.form.peerType) updatePayload.peerType = this.form.peerType
   var res = await updateFamilyMember(updatePayload)
   var res = await updateFamilyMember(updatePayload)
   if (res.code === 200) {
   if (res.code === 200) {
     uni.showToast({ title: '已更新', icon: 'success' })
     uni.showToast({ title: '已更新', icon: 'success' })

+ 10 - 1
cfc-frontend/pages/profile-extra/family-members.vue

@@ -313,7 +313,6 @@ export default {
     },
     },
     canEditMember(member) {
     canEditMember(member) {
       if (!this.isAdmin) return false
       if (!this.isAdmin) return false
-      if (member.userId) return false
       return member.source === 'family_member'
       return member.source === 'family_member'
     },
     },
     onAddMember() {
     onAddMember() {
@@ -514,12 +513,22 @@ export default {
         }, self)
         }, self)
       })
       })
     },
     },
+    // 根据辈分值生成辈分等级字符串(与 utils/generationLevel.js 对应)
+    generationToLevel(gen) {
+      var map = { 3: 'great_grandparent', 2: 'grandparent', 1: 'parent', 0: 'peer', -1: 'child', -2: 'grandchild', -3: 'great_grandchild' }
+      return map[gen] || ''
+    },
     onEditRelation(member) {
     onEditRelation(member) {
       this.showMemberDetailModal = false
       this.showMemberDetailModal = false
       var params = 'memberId=' + member.id + '&nickname=' + encodeURIComponent(member.nickname || '')
       var params = 'memberId=' + member.id + '&nickname=' + encodeURIComponent(member.nickname || '')
       if (member.gender) params += '&gender=' + member.gender
       if (member.gender) params += '&gender=' + member.gender
       if (member.phone) params += '&phone=' + member.phone
       if (member.phone) params += '&phone=' + member.phone
       if (member.birthday) params += '&birthday=' + member.birthday
       if (member.birthday) params += '&birthday=' + member.birthday
+      // 传递辈分关系,编辑页可回显并修改
+      if (member.generation !== null && member.generation !== undefined) {
+        params += '&generationLevel=' + this.generationToLevel(member.generation)
+      }
+      if (member.isSpouse) params += '&peerType=spouse'
       uni.navigateTo({ url: '/pages/family/add-member?' + params })
       uni.navigateTo({ url: '/pages/family/add-member?' + params })
     },
     },
     doQuestionnaire(member) {
     doQuestionnaire(member) {

+ 4 - 4
cfc-frontend/utils/api.js

@@ -2468,19 +2468,19 @@ export const getInteractionTypes = () => {
 
 
 // ===== 鍏崇郴闂嵎 =====
 // ===== 鍏崇郴闂嵎 =====
 export const generateQuestionnaire = (memberId) => {
 export const generateQuestionnaire = (memberId) => {
-  return request('/api/family/questionnaire/generate', 'POST', { memberId }, { timeout: 130000 })
+  return request('/api/family/questionnaire/generate', 'POST', { memberId }, { timeout: 90000 })
 }
 }
 
 
 export const submitQuestionnaire = (data) => {
 export const submitQuestionnaire = (data) => {
-  return request('/api/family/questionnaire/submit', 'POST', data, { timeout: 130000 })
+  return request('/api/family/questionnaire/submit', 'POST', data, { timeout: 60000 })
 }
 }
 
 
 export const getQuestionnaireSnapshot = (memberId) => {
 export const getQuestionnaireSnapshot = (memberId) => {
-  return request('/api/family/questionnaire/snapshot/' + memberId, 'POST', {}, { timeout: 130000 })
+  return request('/api/family/questionnaire/snapshot/' + memberId, 'POST', {}, { timeout: 30000 })
 }
 }
 
 
 export const getQuestionnaireHistory = (memberId) => {
 export const getQuestionnaireHistory = (memberId) => {
-  return request('/api/family/questionnaire/history/' + memberId, 'POST', {}, { timeout: 130000 })
+  return request('/api/family/questionnaire/history/' + memberId, 'POST', {}, { timeout: 30000 })
 }
 }
 
 
 // ===== 五维家庭自检(P0-1)=====
 // ===== 五维家庭自检(P0-1)=====