Ver código fonte

修改追问内容

yangg 4 semanas atrás
pai
commit
10d8f12315

+ 74 - 65
pages/demo/demo.vue

@@ -436,7 +436,7 @@ export default {
       },
       resetFollowUpAskedCount(jobPositionQuestionId) {
         if (!jobPositionQuestionId) return;
-        this.followUpAskedCountMap[jobPositionQuestionId] = 0;
+        this.followUpAskedCountMap[jobPositionQuestionId] = 1;
         console.log(`重置问题 ${jobPositionQuestionId} 的追问次数为: 0`);
       },
       incrementFollowUpCount(jobPositionQuestionId) {
@@ -2692,10 +2692,10 @@ export default {
           // 注意:这里应该使用从后端返回的job_position_question_id,而不是前端的questionId
           // parentJobPositionQuestionId应该在提交视频成功后就已经设置好了
           if (this.parentJobPositionQuestionId) {
-            // 从题目读取追问上限(若后端提供),否则使用默认
+            // 从题目读取追问上限(使用follow_up_count字段),否则使用默认
             const currentQuestion = this.getCurrentQuestionByIndex(this.currentVideoIndex);
-            if (currentQuestion && typeof currentQuestion.follow_up_limit !== 'undefined') {
-              this.setFollowUpLimit(this.parentJobPositionQuestionId, currentQuestion.follow_up_limit);
+            if (currentQuestion && typeof currentQuestion.follow_up_count !== 'undefined') {
+              this.setFollowUpLimit(this.parentJobPositionQuestionId, currentQuestion.follow_up_count);
             } else if (typeof this.defaultFollowUpLimit !== 'undefined') {
               this.setFollowUpLimit(this.parentJobPositionQuestionId, this.defaultFollowUpLimit);
             }
@@ -3019,6 +3019,7 @@ export default {
                 this.parentJobPositionQuestionId = res.data.data.job_position_question_id;
                 console.log('保存父问题ID:', this.parentJobPositionQuestionId);
                 // 初始化该题的追问上限与已问次数
+                // 注意:这里使用服务器返回的follow_up_limit字段,如果服务器返回的是follow_up_count,需要相应修改
                 const limitFromServer = res.data.data.follow_up_limit;
                 if (typeof limitFromServer !== 'undefined') {
                   this.setFollowUpLimit(this.parentJobPositionQuestionId, limitFromServer);
@@ -3270,10 +3271,10 @@ export default {
       
       // 检查是否已经是最后一个视频
       if (this.currentVideoIndex + 1 >= this.videoList.length) {
-        // 所有视频都播放完毕,显示完成页面或返回
-        console.log('所有视频已播放完毕');
+        // 所有视频都播放完毕,立即跳转到下一页面
+        console.log('所有视频已播放完毕,立即跳转');
         
-        // 清理资源
+        // 异步清理资源,不阻塞跳转
         this.stopUserCamera();
         this.clearCountdown();
         
@@ -3282,6 +3283,7 @@ export default {
         console.log('当前职位ID:', currentJobDetail);
         const jobId = currentJobDetail ? currentJobDetail.id : null;
         
+        // 立即跳转,不等待资源清理完成
         this.handleVideoCompletion(jobId);
         return;
       }
@@ -4061,6 +4063,13 @@ export default {
           
           // 存储字幕映射
           this.subtitleMap[question.digital_human_video_url] = subtitleArray;
+          
+          // 设置追问次数限制 - 使用问题列表中的follow_up_count字段
+          if (question.job_position_question_id) {
+            const followUpCount = question.follow_up_count || 0;
+            this.setFollowUpLimit(question.job_position_question_id, followUpCount);
+            console.log(`设置问题 ${question.job_position_question_id} 的追问次数限制为: ${followUpCount}`);
+          }
         }
       });
       
@@ -5105,64 +5114,64 @@ export default {
     handleVideoCompletion(jobId) {
       this.isVideoSwitching = false; // 重置切换状态锁
       
-      // 延迟执行跳转,确保资源清理完成
-     /*  setTimeout(() => { */
-        // 如果职位ID为9,跳转到interview-question页面
-        if (jobId === 9) {
-          uni.navigateTo({
-            url: '/pages/interview-question/interview-question',
-            success: () => {
-              console.log('成功跳转到interview-question页面');
-            },
-            fail: (err) => {
-              console.error('跳转到interview-question页面失败:', err);
-              // 如果跳转失败,尝试使用redirectTo
-              uni.redirectTo({
-                url: '/pages/interview-question/interview-question',
-                fail: (redirectErr) => {
-                  console.error('重定向到interview-question页面也失败:', redirectErr);
-                  // 如果所有跳转方式都失败,尝试返回上一页
-                  uni.navigateBack({
-                    delta: 1
-                  });
-                }
-              });
-            }
-          });
-        } else {
-          // 其他职位ID跳转到camera页面
-          uni.navigateTo({
-            url: '/pages/camera/camera',
-            success: () => {
-              console.log('成功跳转到camera页面');
-            },
-            fail: (err) => {
-              console.error('跳转到camera页面失败:', err);
-              
-              // 如果跳转失败,尝试使用redirectTo
-              uni.redirectTo({
-                url: '/pages/camera/camera',
-                fail: (redirectErr) => {
-                  console.error('重定向到camera页面也失败:', redirectErr);
-                  
-                  // 最后尝试使用switchTab(如果camera是tabBar页面)
-                  uni.switchTab({
-                    url: '/pages/camera/camera',
-                    fail: (switchErr) => {
-                      console.error('所有跳转方式都失败:', switchErr);
-                      
-                      // 如果所有跳转方式都失败,尝试返回上一页
-                      uni.navigateBack({
-                        delta: 1
-                      });
-                    }
-                  });
-                }
-              });
-            }
-          });
-        }
-      /* }, 200); */
+      console.log('所有问题完成,立即跳转到下一页面');
+      
+      // 立即执行跳转,不添加任何延迟
+      if (jobId === 9) {
+        // 职位ID为9,跳转到interview-question页面
+        uni.navigateTo({
+          url: '/pages/interview-question/interview-question',
+          success: () => {
+            console.log('成功跳转到interview-question页面');
+          },
+          fail: (err) => {
+            console.error('跳转到interview-question页面失败:', err);
+            // 如果跳转失败,尝试使用redirectTo
+            uni.redirectTo({
+              url: '/pages/interview-question/interview-question',
+              fail: (redirectErr) => {
+                console.error('重定向到interview-question页面也失败:', redirectErr);
+                // 如果所有跳转方式都失败,尝试返回上一页
+                uni.navigateBack({
+                  delta: 1
+                });
+              }
+            });
+          }
+        });
+      } else {
+        // 其他职位ID跳转到camera页面
+        uni.navigateTo({
+          url: '/pages/camera/camera',
+          success: () => {
+            console.log('成功跳转到camera页面');
+          },
+          fail: (err) => {
+            console.error('跳转到camera页面失败:', err);
+            
+            // 如果跳转失败,尝试使用redirectTo
+            uni.redirectTo({
+              url: '/pages/camera/camera',
+              fail: (redirectErr) => {
+                console.error('重定向到camera页面也失败:', redirectErr);
+                
+                // 最后尝试使用switchTab(如果camera是tabBar页面)
+                uni.switchTab({
+                  url: '/pages/camera/camera',
+                  fail: (switchErr) => {
+                    console.error('所有跳转方式都失败:', switchErr);
+                    
+                    // 如果所有跳转方式都失败,尝试返回上一页
+                    uni.navigateBack({
+                      delta: 1
+                    });
+                  }
+                });
+              }
+            });
+          }
+        });
+      }
     },
   },
   computed: {

+ 133 - 23
pages/identity-verify/identity-verify.vue

@@ -327,6 +327,11 @@ export default {
       currentFollowUpQuestion: null, // 添加当前追问问题的完整信息
       lastQuestionWasFollowUp: false,
       lastFollowUpQuestionId: null,
+      // 追问次数控制 - 统一使用job_position_question_id作为key
+      defaultFollowUpLimit: 1, // 默认每个主题目最多1次追问
+      followUpLimitMap: {}, // { job_position_question_id: limit }
+      followUpAskedCountMap: {}, // { job_position_question_id: askedCount }
+      followUpRequestInFlight: {}, // { job_position_question_id: boolean }
       lastUpdateTime: Date.now(), // 添加最后更新时间戳
       subtitleMap: {}, // 用于存储字幕和翻译的映射
       progressPercent: 0, // 录制进度百分比
@@ -419,6 +424,78 @@ export default {
     this.cleanupPersonDetectionWebSocket();
   },
       methods: {
+      // ===== 追问次数控制:工具方法 =====
+      getFollowUpLimit(jobPositionQuestionId) {
+        if (!jobPositionQuestionId) return this.defaultFollowUpLimit;
+        return this.followUpLimitMap[jobPositionQuestionId] || this.defaultFollowUpLimit;
+      },
+      setFollowUpLimit(jobPositionQuestionId, limit) {
+        if (!jobPositionQuestionId) return;
+        const parsed = parseInt(limit);
+        this.followUpLimitMap[jobPositionQuestionId] = Number.isFinite(parsed) && parsed > 0 ? parsed : this.defaultFollowUpLimit;
+        console.log(`设置问题 ${jobPositionQuestionId} 的追问上限为: ${this.followUpLimitMap[jobPositionQuestionId]}`);
+      },
+      resetFollowUpAskedCount(jobPositionQuestionId) {
+        if (!jobPositionQuestionId) return;
+        this.followUpAskedCountMap[jobPositionQuestionId] = 1;
+        console.log(`重置问题 ${jobPositionQuestionId} 的追问次数为: 1`);
+      },
+      incrementFollowUpCount(jobPositionQuestionId) {
+        if (!jobPositionQuestionId) return;
+        const current = this.followUpAskedCountMap[jobPositionQuestionId] || 0;
+        this.followUpAskedCountMap[jobPositionQuestionId] = current + 1;
+        console.log(`问题 ${jobPositionQuestionId} 的追问次数增加到: ${this.followUpAskedCountMap[jobPositionQuestionId]}`);
+      },
+      canAskMoreFollowUps(jobPositionQuestionId) {
+        if (!jobPositionQuestionId) return false;
+        const asked = this.followUpAskedCountMap[jobPositionQuestionId] || 0;
+        const limit = this.getFollowUpLimit(jobPositionQuestionId);
+        const canAsk = asked < limit;
+        console.log(`检查问题 ${jobPositionQuestionId} 是否可以继续追问: ${canAsk} (已问${asked}次/上限${limit}次)`);
+        return canAsk;
+      },
+      async maybeRequestNextFollowUp(jobPositionQuestionId) {
+        if (!jobPositionQuestionId) {
+          console.log('缺少job_position_question_id,直接进入下一题');
+          this.proceedToNextQuestion();
+          return;
+        }
+        
+        console.log(`检查是否需要继续追问,问题ID: ${jobPositionQuestionId}`);
+        
+        if (this.canAskMoreFollowUps(jobPositionQuestionId)) {
+          // 避免重复触发并发请求
+          if (this.followUpRequestInFlight[jobPositionQuestionId]) {
+            console.log('已有追问请求进行中,跳过重复触发');
+            return;
+          }
+          // 交由 callInterviewInteraction 统一处理并发标记
+          const ok = await this.callInterviewInteraction(jobPositionQuestionId);
+          if (!ok) {
+            console.log('未获取到下一条追问或调用失败,进入下一题');
+            this.isFollowUpMode = false;
+            this.isFollowUpQuestion = false;
+            this.currentFollowUpQuestion = null;
+            this.proceedToNextQuestion();
+          }
+        } else {
+          // 已达上限,进入下一题
+          console.log(`问题 ${jobPositionQuestionId} 追问次数已达上限,进入下一题`);
+          this.isFollowUpMode = false;
+          this.isFollowUpQuestion = false;
+          this.currentFollowUpQuestion = null;
+          this.proceedToNextQuestion();
+        }
+      },
+      
+      // 获取当前问题信息
+      getCurrentQuestionByIndex(index) {
+        // 这里需要根据实际的问题数据结构来实现
+        // 如果问题数据存储在某个数组中,返回对应索引的问题
+        // 暂时返回null,需要根据实际数据结构调整
+        return null;
+      },
+      
       // 处理音频播放完成
       handleAudioEnd() {
         console.log('音频播放完成');
@@ -558,7 +635,16 @@ export default {
         this.handleAudioEnd();
       },
       // 调用面试互动接口
-      async callInterviewInteraction(questionId, retryCount = 0, maxRetries = 3) {
+      async callInterviewInteraction(jobPositionQuestionId, retryCount = 0, maxRetries = 3) {
+        // 防重入:同一父问题并发保护
+        /* if (jobPositionQuestionId && this.followUpRequestInFlight[jobPositionQuestionId]) {
+          console.log('追问请求已在进行中,跳过本次调用');
+          return false;
+        }
+        if (jobPositionQuestionId) {
+          this.followUpRequestInFlight[jobPositionQuestionId] = true;
+        } */
+        
         const userInfo = JSON.parse(uni.getStorageSync('userInfo'));
         const appId = uni.getStorageSync('appId');
         const positionConfigId = JSON.parse(uni.getStorageSync('configData')).id;
@@ -566,13 +652,13 @@ export default {
         try {
           // 显示思考中loading
           this.showThinkingLoading();
-          console.log('开始调用面试互动接口', { questionId, appId });
+          console.log('开始调用面试互动接口', { jobPositionQuestionId, appId });
           const res = await uni.request({
             url: `${apiBaseUrl}/api/voice_interview_interaction/`,
             method: 'POST',
             data: {
               tenant_id: userInfo.tenant_id || 1,
-              question_id: questionId,
+              question_id: jobPositionQuestionId,
               position_config_id: positionConfigId,
               application_id: appId
             },
@@ -588,7 +674,7 @@ export default {
               console.log(`视频转写未完成,${retryCount + 1}次重试中...`);
               // 等待3秒后重试
               await new Promise(resolve => setTimeout(resolve, 3000));
-              return this.callInterviewInteraction(questionId, retryCount + 1, maxRetries);
+              return this.callInterviewInteraction(jobPositionQuestionId, retryCount + 1, maxRetries);
             } else {
               console.log('达到最大重试次数,视频转写仍未完成');
               uni.showToast({
@@ -601,7 +687,11 @@ export default {
           }
           
           if (res.data.success) {
-            // 等待处理追问问题完成
+            // 成功获取到一条追问,计数 +1(表示"已请求"这条追问)
+            if (jobPositionQuestionId) {
+              this.incrementFollowUpCount(jobPositionQuestionId);
+            }
+            // 处理本次追问(即便已达到上限,也应该播放本次追问)
             await this.handleFollowUpQuestion(res.data);
             this.hideThinkingLoading();
             return true;
@@ -614,7 +704,12 @@ export default {
           console.error('调用面试互动接口失败:', error);
           this.hideThinkingLoading();
           return false;
-        }
+        } /* finally {
+          // 清除并发标记
+          if (jobPositionQuestionId) {
+            this.followUpRequestInFlight[jobPositionQuestionId] = false;
+          }
+        } */
       },
       
       // 播放追问音频
@@ -2597,19 +2692,34 @@ export default {
         this.playLowScoreVideo();
         this.needPlayLowScoreVideo = false;
       } else {
-        // 如果是追问问题的回答,直接进入下一个问题
+        // 如果是追问问题的回答,检查是否继续追问
         if (task.isFollowUp) {
-          console.log('追问问题回答完成,进入下一个问题');
+          console.log('追问问题回答完成,检查是否继续追问');
           this.retryCount = 0; // 重置重试次数
           this.isFollowUpQuestion = false; // 重置追问标记
           this.currentFollowUpQuestion = null; // 清除当前追问问题信息
           this.videoUrl=''
-          this.proceedToNextQuestion();
+          // 若未达到上限则继续请求下一条追问,否则进入下一题
+          this.maybeRequestNextFollowUp(this.parentJobPositionQuestionId);
         } else {
-          // 如果是常规问题,记录父问题ID并检查追问问题
-          this.currentParentQuestionId = task.questionId;
-          console.log('检查常规问题的追问,父问题ID:', this.currentParentQuestionId);
-          this.checkAndPlayFollowUpQuestion(this.currentParentQuestionId);
+          // 如果是常规问题,检查追问问题
+          console.log('常规问题回答完成,准备检查追问,父问题ID:', this.parentJobPositionQuestionId);
+          // 注意:这里应该使用从后端返回的job_position_question_id,而不是前端的questionId
+          // parentJobPositionQuestionId应该在提交视频成功后就已经设置好了
+          if (this.parentJobPositionQuestionId) {
+            // 从题目读取追问上限(使用follow_up_count字段),否则使用默认
+            const currentQuestion = this.getCurrentQuestionByIndex(this.currentVideoIndex);
+            if (currentQuestion && typeof currentQuestion.follow_up_count !== 'undefined') {
+              this.setFollowUpLimit(this.parentJobPositionQuestionId, currentQuestion.follow_up_count);
+            } else if (typeof this.defaultFollowUpLimit !== 'undefined') {
+              this.setFollowUpLimit(this.parentJobPositionQuestionId, this.defaultFollowUpLimit);
+            }
+            this.resetFollowUpAskedCount(this.parentJobPositionQuestionId);
+            this.checkAndPlayFollowUpQuestion(this.parentJobPositionQuestionId);
+          } else {
+            console.error('缺少parentJobPositionQuestionId,无法检查追问,直接进入下一题');
+            this.proceedToNextQuestion();
+          }
         }
       }
     },
@@ -2924,6 +3034,16 @@ export default {
                 this.parentJobPositionQuestionId = res.data.data.job_position_question_id;
                 console.log('保存父问题ID:', this.parentJobPositionQuestionId);
                 
+                // 初始化该题的追问上限与已问次数
+                // 注意:这里使用服务器返回的follow_up_limit字段,如果服务器返回的是follow_up_count,需要相应修改
+                const limitFromServer = res.data.data.follow_up_limit;
+                if (typeof limitFromServer !== 'undefined') {
+                  this.setFollowUpLimit(this.parentJobPositionQuestionId, limitFromServer);
+                } else {
+                  this.setFollowUpLimit(this.parentJobPositionQuestionId, this.defaultFollowUpLimit);
+                }
+                this.resetFollowUpAskedCount(this.parentJobPositionQuestionId);
+                
                 await this.callInterviewInteraction(res.data.data.job_position_question_id);
                 console.log('面试互动接口调用成功');
               } catch (error) {
@@ -3167,18 +3287,12 @@ export default {
       
       // 检查是否已经是最后一个视频
       if (this.currentVideoIndex + 1 >= this.videoList.length) {
-        // 所有视频都播放完毕,显示完成页面或返回
-        console.log('所有视频已播放完毕');
-        
         // 清理资源
         this.stopUserCamera();
         this.clearCountdown();
-        
         // 获取当前职位ID
         const currentJobDetail = JSON.parse(uni.getStorageSync('selectedJob'));
-        console.log('当前职位ID:', currentJobDetail);
         const jobId = currentJobDetail ? currentJobDetail.id : null;
-        
         this.handleVideoCompletion(jobId);
         return;
       }
@@ -4723,7 +4837,6 @@ export default {
     },
 
     handlePersonDetectionResult(data) {
-      console.log('data', data);
       /* console.log(data.data.detection.has_person);
       console.log(data.data.identity.status);//identity_verified */
       
@@ -5015,9 +5128,7 @@ export default {
     // 处理视频完成
     handleVideoCompletion(jobId) {
       this.isVideoSwitching = false; // 重置切换状态锁
-      
       // 延迟执行跳转,确保资源清理完成
-     /*  setTimeout(() => { */
         // 如果职位ID为9,跳转到interview-question页面
         if (jobId === 9) {
           uni.navigateTo({
@@ -5124,7 +5235,6 @@ export default {
             }
           });
         }
-      /* }, 200); */
     },
   },
   computed: {

+ 2 - 1
unpackage/dist/dev/mp-weixin/pages/demo/demo.js

@@ -2321,7 +2321,7 @@ const _sfc_main = {
         this.videoPlaying = false;
       }
       if (this.currentVideoIndex + 1 >= this.videoList.length) {
-        console.log("所有视频已播放完毕");
+        console.log("所有视频已播放完毕,立即跳转");
         this.stopUserCamera();
         this.clearCountdown();
         const currentJobDetail = JSON.parse(common_vendor.index.getStorageSync("selectedJob"));
@@ -3648,6 +3648,7 @@ const _sfc_main = {
     // 处理视频完成
     handleVideoCompletion(jobId) {
       this.isVideoSwitching = false;
+      console.log("所有问题完成,立即跳转到下一页面");
       if (jobId === 9) {
         common_vendor.index.navigateTo({
           url: "/pages/interview-question/interview-question",

+ 106 - 12
unpackage/dist/dev/mp-weixin/pages/identity-verify/identity-verify.js

@@ -176,6 +176,15 @@ const _sfc_main = {
       // 添加当前追问问题的完整信息
       lastQuestionWasFollowUp: false,
       lastFollowUpQuestionId: null,
+      // 追问次数控制 - 统一使用job_position_question_id作为key
+      defaultFollowUpLimit: 1,
+      // 默认每个主题目最多1次追问
+      followUpLimitMap: {},
+      // { job_position_question_id: limit }
+      followUpAskedCountMap: {},
+      // { job_position_question_id: askedCount }
+      followUpRequestInFlight: {},
+      // { job_position_question_id: boolean }
       lastUpdateTime: Date.now(),
       // 添加最后更新时间戳
       subtitleMap: {},
@@ -290,6 +299,73 @@ const _sfc_main = {
     this.cleanupPersonDetectionWebSocket();
   },
   methods: {
+    // ===== 追问次数控制:工具方法 =====
+    getFollowUpLimit(jobPositionQuestionId) {
+      if (!jobPositionQuestionId)
+        return this.defaultFollowUpLimit;
+      return this.followUpLimitMap[jobPositionQuestionId] || this.defaultFollowUpLimit;
+    },
+    setFollowUpLimit(jobPositionQuestionId, limit) {
+      if (!jobPositionQuestionId)
+        return;
+      const parsed = parseInt(limit);
+      this.followUpLimitMap[jobPositionQuestionId] = Number.isFinite(parsed) && parsed > 0 ? parsed : this.defaultFollowUpLimit;
+      console.log(`设置问题 ${jobPositionQuestionId} 的追问上限为: ${this.followUpLimitMap[jobPositionQuestionId]}`);
+    },
+    resetFollowUpAskedCount(jobPositionQuestionId) {
+      if (!jobPositionQuestionId)
+        return;
+      this.followUpAskedCountMap[jobPositionQuestionId] = 1;
+      console.log(`重置问题 ${jobPositionQuestionId} 的追问次数为: 1`);
+    },
+    incrementFollowUpCount(jobPositionQuestionId) {
+      if (!jobPositionQuestionId)
+        return;
+      const current = this.followUpAskedCountMap[jobPositionQuestionId] || 0;
+      this.followUpAskedCountMap[jobPositionQuestionId] = current + 1;
+      console.log(`问题 ${jobPositionQuestionId} 的追问次数增加到: ${this.followUpAskedCountMap[jobPositionQuestionId]}`);
+    },
+    canAskMoreFollowUps(jobPositionQuestionId) {
+      if (!jobPositionQuestionId)
+        return false;
+      const asked = this.followUpAskedCountMap[jobPositionQuestionId] || 0;
+      const limit = this.getFollowUpLimit(jobPositionQuestionId);
+      const canAsk = asked < limit;
+      console.log(`检查问题 ${jobPositionQuestionId} 是否可以继续追问: ${canAsk} (已问${asked}次/上限${limit}次)`);
+      return canAsk;
+    },
+    async maybeRequestNextFollowUp(jobPositionQuestionId) {
+      if (!jobPositionQuestionId) {
+        console.log("缺少job_position_question_id,直接进入下一题");
+        this.proceedToNextQuestion();
+        return;
+      }
+      console.log(`检查是否需要继续追问,问题ID: ${jobPositionQuestionId}`);
+      if (this.canAskMoreFollowUps(jobPositionQuestionId)) {
+        if (this.followUpRequestInFlight[jobPositionQuestionId]) {
+          console.log("已有追问请求进行中,跳过重复触发");
+          return;
+        }
+        const ok = await this.callInterviewInteraction(jobPositionQuestionId);
+        if (!ok) {
+          console.log("未获取到下一条追问或调用失败,进入下一题");
+          this.isFollowUpMode = false;
+          this.isFollowUpQuestion = false;
+          this.currentFollowUpQuestion = null;
+          this.proceedToNextQuestion();
+        }
+      } else {
+        console.log(`问题 ${jobPositionQuestionId} 追问次数已达上限,进入下一题`);
+        this.isFollowUpMode = false;
+        this.isFollowUpQuestion = false;
+        this.currentFollowUpQuestion = null;
+        this.proceedToNextQuestion();
+      }
+    },
+    // 获取当前问题信息
+    getCurrentQuestionByIndex(index) {
+      return null;
+    },
     // 处理音频播放完成
     handleAudioEnd() {
       console.log("音频播放完成");
@@ -383,19 +459,19 @@ const _sfc_main = {
       this.handleAudioEnd();
     },
     // 调用面试互动接口
-    async callInterviewInteraction(questionId, retryCount = 0, maxRetries = 3) {
+    async callInterviewInteraction(jobPositionQuestionId, retryCount = 0, maxRetries = 3) {
       const userInfo = JSON.parse(common_vendor.index.getStorageSync("userInfo"));
       const appId = common_vendor.index.getStorageSync("appId");
       const positionConfigId = JSON.parse(common_vendor.index.getStorageSync("configData")).id;
       try {
         this.showThinkingLoading();
-        console.log("开始调用面试互动接口", { questionId, appId });
+        console.log("开始调用面试互动接口", { jobPositionQuestionId, appId });
         const res = await common_vendor.index.request({
           url: `${common_config.apiBaseUrl}/api/voice_interview_interaction/`,
           method: "POST",
           data: {
             tenant_id: userInfo.tenant_id || 1,
-            question_id: questionId,
+            question_id: jobPositionQuestionId,
             position_config_id: positionConfigId,
             application_id: appId
           },
@@ -408,7 +484,7 @@ const _sfc_main = {
           if (retryCount < maxRetries) {
             console.log(`视频转写未完成,${retryCount + 1}次重试中...`);
             await new Promise((resolve) => setTimeout(resolve, 3e3));
-            return this.callInterviewInteraction(questionId, retryCount + 1, maxRetries);
+            return this.callInterviewInteraction(jobPositionQuestionId, retryCount + 1, maxRetries);
           } else {
             console.log("达到最大重试次数,视频转写仍未完成");
             common_vendor.index.showToast({
@@ -420,6 +496,9 @@ const _sfc_main = {
           }
         }
         if (res.data.success) {
+          if (jobPositionQuestionId) {
+            this.incrementFollowUpCount(jobPositionQuestionId);
+          }
           await this.handleFollowUpQuestion(res.data);
           this.hideThinkingLoading();
           return true;
@@ -1806,16 +1885,27 @@ const _sfc_main = {
         this.needPlayLowScoreVideo = false;
       } else {
         if (task.isFollowUp) {
-          console.log("追问问题回答完成,进入下一个问题");
+          console.log("追问问题回答完成,检查是否继续追问");
           this.retryCount = 0;
           this.isFollowUpQuestion = false;
           this.currentFollowUpQuestion = null;
           this.videoUrl = "";
-          this.proceedToNextQuestion();
+          this.maybeRequestNextFollowUp(this.parentJobPositionQuestionId);
         } else {
-          this.currentParentQuestionId = task.questionId;
-          console.log("检查常规问题的追问,父问题ID:", this.currentParentQuestionId);
-          this.checkAndPlayFollowUpQuestion(this.currentParentQuestionId);
+          console.log("常规问题回答完成,准备检查追问,父问题ID:", this.parentJobPositionQuestionId);
+          if (this.parentJobPositionQuestionId) {
+            const currentQuestion = this.getCurrentQuestionByIndex(this.currentVideoIndex);
+            if (currentQuestion && typeof currentQuestion.follow_up_count !== "undefined") {
+              this.setFollowUpLimit(this.parentJobPositionQuestionId, currentQuestion.follow_up_count);
+            } else if (typeof this.defaultFollowUpLimit !== "undefined") {
+              this.setFollowUpLimit(this.parentJobPositionQuestionId, this.defaultFollowUpLimit);
+            }
+            this.resetFollowUpAskedCount(this.parentJobPositionQuestionId);
+            this.checkAndPlayFollowUpQuestion(this.parentJobPositionQuestionId);
+          } else {
+            console.error("缺少parentJobPositionQuestionId,无法检查追问,直接进入下一题");
+            this.proceedToNextQuestion();
+          }
         }
       }
     },
@@ -2043,6 +2133,13 @@ const _sfc_main = {
               try {
                 this.parentJobPositionQuestionId = res.data.data.job_position_question_id;
                 console.log("保存父问题ID:", this.parentJobPositionQuestionId);
+                const limitFromServer = res.data.data.follow_up_limit;
+                if (typeof limitFromServer !== "undefined") {
+                  this.setFollowUpLimit(this.parentJobPositionQuestionId, limitFromServer);
+                } else {
+                  this.setFollowUpLimit(this.parentJobPositionQuestionId, this.defaultFollowUpLimit);
+                }
+                this.resetFollowUpAskedCount(this.parentJobPositionQuestionId);
                 await this.callInterviewInteraction(res.data.data.job_position_question_id);
                 console.log("面试互动接口调用成功");
               } catch (error) {
@@ -2222,11 +2319,9 @@ const _sfc_main = {
         this.videoPlaying = false;
       }
       if (this.currentVideoIndex + 1 >= this.videoList.length) {
-        console.log("所有视频已播放完毕");
         this.stopUserCamera();
         this.clearCountdown();
         const currentJobDetail = JSON.parse(common_vendor.index.getStorageSync("selectedJob"));
-        console.log("当前职位ID:", currentJobDetail);
         const jobId = currentJobDetail ? currentJobDetail.id : null;
         this.handleVideoCompletion(jobId);
         return;
@@ -3345,7 +3440,6 @@ const _sfc_main = {
       }
     },
     handlePersonDetectionResult(data) {
-      console.log("data", data);
       if (data.data.identity.status == "no_face") {
         this.showPageWarning = true;
         common_vendor.index.showToast({

+ 1 - 1
unpackage/dist/dev/mp-weixin/project.config.json

@@ -18,7 +18,7 @@
     }
   },
   "compileType": "miniprogram",
-  "libVersion": "3.9.2",
+  "libVersion": "3.10.2",
   "appid": "wxc9655eeaa3223b75",
   "projectname": "interview_uni",
   "condition": {

+ 7 - 0
unpackage/dist/dev/mp-weixin/project.private.config.json

@@ -7,6 +7,13 @@
   "condition": {
     "miniprogram": {
       "list": [
+        {
+          "name": "pages/index/index",
+          "pathName": "pages/index/index",
+          "query": "scene=1",
+          "launchMode": "default",
+          "scene": 1047
+        },
         {
           "name": "pages/demo/demo",
           "pathName": "pages/demo/demo",