Răsfoiți Sursa

修复支付成功后的按钮展示问题

jialuyu 1 lună în urmă
părinte
comite
feb4bed061

+ 28 - 2
pages/assessment/detail.vue

@@ -107,10 +107,11 @@
 
 <script setup>
 import { ref, onMounted, computed } from 'vue';
-import { onLoad } from '@dcloudio/uni-app';
+import { onLoad, onShow } from '@dcloudio/uni-app';
 import { addCollection, delCollection, checkCollection } from '../../api/collection.js';
 import { createOrGetSession } from '../../api/message.js';
 import { getAssessmentDetail, getAssessmentRecordList } from '../../api/assessment.js';
+import { listOrder } from '../../api/order.js';
 
 const statusBarHeight = ref(20);
 const isFavorited = ref(false);
@@ -167,6 +168,12 @@ onLoad((options) => {
         checkExamRecord(options.id);
     }
 });
+ 
+onShow(() => {
+    if (assessmentId.value) {
+        checkExamRecord(assessmentId.value);
+    }
+});
 
 // 加载测评详情数据
 const loadAssessmentDetail = async (id) => {
@@ -267,9 +274,28 @@ const checkExamRecord = async (id) => {
     const studentId = userInfo.studentId;
     if (!studentId) return;
     
-    // 检查是否已付款
+    // 1. 先查缓存
     hasPaid.value = uni.getStorageSync(`audit_paid_${id}`) === true;
     
+    // 2. 缓存为 false,则调用后端订单列表,防止跨页面或换机丢失缓存
+    if (!hasPaid.value) {
+        try {
+            const orderRes = await listOrder({ 
+                orderStatus: 1, 
+                buyerId: studentId 
+            });
+            if (orderRes.code === 200 && orderRes.rows) {
+                const evalName = assessmentData.value?.evaluationName || '';
+                hasPaid.value = orderRes.rows.some(order => {
+                    const remark = order.remark || '';
+                    return evalName && remark.includes(evalName);
+                });
+            }
+        } catch (e) {
+            console.error('[AssessmentDetail] 订单校验失败:', e);
+        }
+    }
+    
     try {
         const res = await getAssessmentRecordList(studentId);
         if (res.code === 200 && res.data) {

+ 4 - 1
pages/assessment/training.vue

@@ -64,9 +64,12 @@ import { ref } from 'vue';
 import { onLoad } from '@dcloudio/uni-app';
 
 const title = ref('审计员一级');
+const assessmentId = ref('');
 
 onLoad((options) => {
     if (options.title) title.value = options.title;
+    if (options.assessmentId) assessmentId.value = options.assessmentId;
+    else if (options.id) assessmentId.value = options.id;
 });
 
 const goBack = () => uni.navigateBack();
@@ -74,7 +77,7 @@ const goBack = () => uni.navigateBack();
 const goToAssessment = () => {
     // 进入测评提醒页面,带上 source=training 参数以便在结果页识别
     uni.navigateTo({
-        url: '/pages/assessment/remind?family=audit&source=training'
+        url: `/pages/assessment/remind?family=audit&source=training&id=${assessmentId.value}`
     });
 };
 </script>

+ 24 - 5
pages/chat/chat.vue

@@ -424,10 +424,17 @@ onLoad(async (options) => {
       const { getAssessmentList } = require('../../api/assessment.js');
       const evalRes = await getAssessmentList({ positionId: positionId.value, pageNum: 1, pageSize: 1 });
       if (evalRes.code === 200 && evalRes.rows && evalRes.rows.length > 0) {
+        const firstEval = evalRes.rows[0];
+        // 🔴 关键修复:将岗位关联的第一个测评ID赋给assessmentId
+        // 这样支付成功后写入的 storage key(audit_paid_${assessmentId})
+        // 才能与 jobdetail/checkState 读取的 key 一致
+        if (!assessmentId.value) {
+          assessmentId.value = String(firstEval.id);
+          console.log('[Chat] 岗位关联测评ID:', assessmentId.value);
+        }
         setTimeout(async () => {
           try {
             const userInfo = uni.getStorageSync('userInfo') || {};
-            const firstEval = evalRes.rows[0];
             const res = await autoCreateOrderCard({
               sessionId: sessionId.value,
               studentId: userInfo.studentId || fromUserId.value,
@@ -796,9 +803,19 @@ async function handlePay(msg) {
           msg.isPaid = true;
           uni.showToast({ title: '支付成功', icon: 'success' });
           
-          // 标记支付状态到storage(供其他页面检测,按positionId区分)
-          const paidKey = `audit_paid_${assessmentId.value || ''}`;
-          uni.setStorageSync(paidKey, true);
+          // 标记支付状态到storage(供其他页面检测)
+          // 按测评ID写入(assessmentId 已在 onLoad 查询关联测评时赋值)
+          if (assessmentId.value) {
+            const paidKey = `audit_paid_${assessmentId.value}`;
+            uni.setStorageSync(paidKey, true);
+            console.log('[Chat] 支付成功,写入 key:', paidKey);
+          }
+          // 🔴 兜底:按 positionId 额外写一条,防止 assessmentId 仍为空
+          if (chatType.value === 'job' && positionId.value) {
+            const fallbackKey = `audit_paid_pos_${positionId.value}`;
+            uni.setStorageSync(fallbackKey, true);
+            console.log('[Chat] 兜底写入 key:', fallbackKey);
+          }
           
           // 更新消息payload
           msg.payload = {
@@ -812,13 +829,15 @@ async function handlePay(msg) {
           uni.$emit('payment_done', {
             orderCardId,
             orderId: payRes.data.orderId,
+            assessmentId: assessmentId.value,
+            positionId: positionId.value,
             paid: true
           });
           
           // 支付成功后跳转
           if (chatType.value === 'assessment') {
             setTimeout(() => {
-              uni.navigateTo({ url: `/pages/assessment/training?title=${encodeURIComponent(assessmentTitle.value)}` });
+              uni.navigateTo({ url: `/pages/assessment/training?title=${encodeURIComponent(assessmentTitle.value)}&assessmentId=${assessmentId.value}` });
             }, 1200);
           }
         },

+ 45 - 5
pages/jobdetail/index.vue

@@ -114,6 +114,7 @@ import { getPositionDetail } from '../../api/position.js';
 import { createOrGetSession } from '../../api/message.js';
 import { addCollection, delCollection, checkCollection } from '../../api/collection.js';
 import { getAssessmentRecordList, getAssessmentList } from '../../api/assessment.js';
+import { listOrder } from '../../api/order.js';
 
 const isCollected = ref(false);
 const collectionId = ref(null);
@@ -151,12 +152,47 @@ const checkState = async () => {
     }
 
     try {
+        // 先确保岗位基础信息已加载,避免异步竞态导致提取 postName 失败
+        if (!jobInfo.value || !jobInfo.value.postName) {
+            const jobRes = await getPositionDetail(positionId.value);
+            if (jobRes.code === 200 && jobRes.data) {
+                jobInfo.value = jobRes.data;
+            }
+        }
+
         // ② 查询该岗位关联的测评列表
         const evalRes = await getAssessmentList({ positionId: positionId.value, pageNum: 1, pageSize: 100 });
-        // 检查该岗位下是否有测评已支付(按evaluationId区分)
-        const isAnyEvalPaid = evalRes.code === 200 && evalRes.rows
-            ? evalRes.rows.some(e => uni.getStorageSync(`audit_paid_${e.id}`))
-            : uni.getStorageSync(`audit_paid_${positionId.value}`);
+
+        // 兜底 key:chat.vue 在 assessmentId 为空时会写入此 key
+        const fallbackPaidKey = `audit_paid_pos_${positionId.value}`;
+        const isFallbackPaid = !!uni.getStorageSync(fallbackPaidKey);
+
+        // 检查该岗位下是否有测评已支付:
+        let isAnyEvalPaid = (evalRes.code === 200 && evalRes.rows)
+            ? evalRes.rows.some(e => uni.getStorageSync(`audit_paid_${e.id}`)) || isFallbackPaid
+            : isFallbackPaid || !!uni.getStorageSync(`audit_paid_${positionId.value}`);
+
+        // 【新增后端订单校验】如果缓存没有记录为支付,调用后端订单接口二次确认,防止由于换机或缓存释放造成的遗漏
+        if (!isAnyEvalPaid) {
+            try {
+                const orderRes = await listOrder({ 
+                    orderStatus: 1, 
+                    buyerId: userInfo.studentId 
+                });
+                if (orderRes.code === 200 && orderRes.rows) {
+                    isAnyEvalPaid = orderRes.rows.some(order => {
+                        const remark = order.remark || '';
+                        const matchPost = jobInfo.value?.postName && remark.includes(jobInfo.value.postName);
+                        const matchEval = evalRes.rows && evalRes.rows.some(e => e.evaluationName && remark.includes(e.evaluationName));
+                        return matchPost || matchEval;
+                    });
+                }
+            } catch (e) {
+                console.error('[JobDetail] 订单校验失败:', e);
+            }
+        }
+
+        console.log('[JobDetail] 支付状态最终综合判定:', isAnyEvalPaid);
 
         if (evalRes.code !== 200 || !evalRes.rows || evalRes.rows.length === 0) {
             // 无关联测评,检查是否已支付
@@ -164,6 +200,10 @@ const checkState = async () => {
             return;
         }
 
+        // 保存第一个关联测评ID(用于“开始测评”跳转时传参,避免 remind 页匹配错误)
+        linkedAssessmentId.value = evalRes.rows[0].id;
+        console.log('[JobDetail] 关联测评ID:', linkedAssessmentId.value);
+
         // ③ 获取用户的测评记录
         const recordRes = await getAssessmentRecordList(userInfo.studentId);
         if (recordRes.code !== 200 || !recordRes.data) {
@@ -413,7 +453,7 @@ const handleMainAction = async () => {
     }
   } else if (jobState.value === 'paid') {
     uni.navigateTo({
-      url: '/pages/assessment/remind?family=audit'
+      url: `/pages/assessment/remind?family=audit&id=${linkedAssessmentId.value || ''}`
     });
   } else if (jobState.value === 'assessed') {
     // 投递简历:跳转到选择简历页面

+ 3 - 2
pages/jobs/detail.vue

@@ -145,7 +145,8 @@ const requirements = ref([
 
 onShow(() => {
     // 检查是否已支付 (由 chat 页面设置)
-    if (uni.getStorageSync('job_0_paid')) {
+    const isPaid = uni.getStorageSync('job_0_paid') || uni.getStorageSync(`audit_paid_pos_${job.value?.id || 0}`);
+    if (isPaid) {
         if (jobState.value === 'initial') {
             jobState.value = 'paid';
         }
@@ -177,7 +178,7 @@ const handleMainAction = async () => {
       if (res.data) {
         const session = res.data;
         uni.navigateTo({
-          url: `/pages/chat/chat?sessionId=${session.sessionId}&sessionNo=${session.sessionNo || ''}&fromUserId=${userId || ''}&userName=${encodeURIComponent(userName)}`
+          url: `/pages/chat/chat?sessionId=${session.sessionId}&sessionNo=${session.sessionNo || ''}&fromUserId=${userId || ''}&userName=${encodeURIComponent(userName)}&type=job&positionId=${job.value?.id || 0}`
         });
       } else {
         uni.showToast({ title: '创建会话失败', icon: 'none' });

Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/assessment/detail.js.map


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/assessment/training.js.map


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/chat/chat.js.map


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/jobdetail/index.js.map


+ 30 - 6
unpackage/dist/dev/mp-weixin/pages/assessment/detail.js

@@ -4,6 +4,7 @@ const common_assets = require("../../common/assets.js");
 const api_collection = require("../../api/collection.js");
 const api_message = require("../../api/message.js");
 const api_assessment = require("../../api/assessment.js");
+const api_order = require("../../api/order.js");
 const _sfc_main = {
   __name: "detail",
   setup(__props) {
@@ -56,6 +57,11 @@ const _sfc_main = {
         checkExamRecord(options.id);
       }
     });
+    common_vendor.onShow(() => {
+      if (assessmentId.value) {
+        checkExamRecord(assessmentId.value);
+      }
+    });
     const loadAssessmentDetail = async (id) => {
       try {
         loading.value = true;
@@ -80,7 +86,7 @@ const _sfc_main = {
           common_vendor.index.showToast({ title: "获取测评详情失败", icon: "none" });
         }
       } catch (err) {
-        common_vendor.index.__f__("error", "at pages/assessment/detail.vue:200", "获取测评详情失败:", err);
+        common_vendor.index.__f__("error", "at pages/assessment/detail.vue:207", "获取测评详情失败:", err);
         common_vendor.index.showToast({ title: "网络错误,请重试", icon: "none" });
       } finally {
         loading.value = false;
@@ -100,7 +106,7 @@ const _sfc_main = {
           collectionId.value = null;
         }
       } catch (err) {
-        common_vendor.index.__f__("error", "at pages/assessment/detail.vue:222", "检查收藏状态失败", err);
+        common_vendor.index.__f__("error", "at pages/assessment/detail.vue:229", "检查收藏状态失败", err);
       }
     };
     const formatDateRange = (startTime, endTime) => {
@@ -135,11 +141,29 @@ const _sfc_main = {
       });
     };
     const checkExamRecord = async (id) => {
+      var _a;
       const userInfo = common_vendor.index.getStorageSync("userInfo") || {};
       const studentId = userInfo.studentId;
       if (!studentId)
         return;
       hasPaid.value = common_vendor.index.getStorageSync(`audit_paid_${id}`) === true;
+      if (!hasPaid.value) {
+        try {
+          const orderRes = await api_order.listOrder({
+            orderStatus: 1,
+            buyerId: studentId
+          });
+          if (orderRes.code === 200 && orderRes.rows) {
+            const evalName = ((_a = assessmentData.value) == null ? void 0 : _a.evaluationName) || "";
+            hasPaid.value = orderRes.rows.some((order) => {
+              const remark = order.remark || "";
+              return evalName && remark.includes(evalName);
+            });
+          }
+        } catch (e) {
+          common_vendor.index.__f__("error", "at pages/assessment/detail.vue:295", "[AssessmentDetail] 订单校验失败:", e);
+        }
+      }
       try {
         const res = await api_assessment.getAssessmentRecordList(studentId);
         if (res.code === 200 && res.data) {
@@ -156,7 +180,7 @@ const _sfc_main = {
           isApplied.value = common_vendor.index.getStorageSync(`candidate_applied_${assessmentData.value.positionId}`) === true;
         }
       } catch (err) {
-        common_vendor.index.__f__("error", "at pages/assessment/detail.vue:294", "检查测评记录失败", err);
+        common_vendor.index.__f__("error", "at pages/assessment/detail.vue:320", "检查测评记录失败", err);
       }
     };
     const handleConsult = async () => {
@@ -167,7 +191,7 @@ const _sfc_main = {
         const userId = userInfo.studentId || null;
         const userName = userInfo.name || "用户";
         const userAvatar = userInfo.avatarUrl || "/static/images/user_avatar.svg";
-        common_vendor.index.__f__("log", "at pages/assessment/detail.vue:305", "创建会话参数:", {
+        common_vendor.index.__f__("log", "at pages/assessment/detail.vue:331", "创建会话参数:", {
           sessionType: 1,
           fromUserId: userId,
           fromUserName: userName,
@@ -195,7 +219,7 @@ const _sfc_main = {
         }
       } catch (err) {
         common_vendor.index.hideLoading();
-        common_vendor.index.__f__("error", "at pages/assessment/detail.vue:333", "创建会话失败:", err);
+        common_vendor.index.__f__("error", "at pages/assessment/detail.vue:359", "创建会话失败:", err);
         common_vendor.index.showToast({ title: "连接失败,请重试", icon: "none" });
       }
     };
@@ -249,7 +273,7 @@ const _sfc_main = {
           }
         }
       } catch (err) {
-        common_vendor.index.__f__("error", "at pages/assessment/detail.vue:394", "操作收藏失败", err);
+        common_vendor.index.__f__("error", "at pages/assessment/detail.vue:420", "操作收藏失败", err);
         common_vendor.index.showToast({ title: "操作失败", icon: "none" });
       } finally {
         common_vendor.index.hideLoading();

+ 6 - 1
unpackage/dist/dev/mp-weixin/pages/assessment/training.js

@@ -5,14 +5,19 @@ const _sfc_main = {
   __name: "training",
   setup(__props) {
     const title = common_vendor.ref("审计员一级");
+    const assessmentId = common_vendor.ref("");
     common_vendor.onLoad((options) => {
       if (options.title)
         title.value = options.title;
+      if (options.assessmentId)
+        assessmentId.value = options.assessmentId;
+      else if (options.id)
+        assessmentId.value = options.id;
     });
     const goBack = () => common_vendor.index.navigateBack();
     const goToAssessment = () => {
       common_vendor.index.navigateTo({
-        url: "/pages/assessment/remind?family=audit&source=training"
+        url: `/pages/assessment/remind?family=audit&source=training&id=${assessmentId.value}`
       });
     };
     return (_ctx, _cache) => {

+ 38 - 24
unpackage/dist/dev/mp-weixin/pages/chat/chat.js

@@ -121,10 +121,14 @@ const _sfc_main = {
           const { getAssessmentList } = require("../../api/assessment.js");
           const evalRes = await getAssessmentList({ positionId: positionId.value, pageNum: 1, pageSize: 1 });
           if (evalRes.code === 200 && evalRes.rows && evalRes.rows.length > 0) {
+            const firstEval = evalRes.rows[0];
+            if (!assessmentId.value) {
+              assessmentId.value = String(firstEval.id);
+              common_vendor.index.__f__("log", "at pages/chat/chat.vue:433", "[Chat] 岗位关联测评ID:", assessmentId.value);
+            }
             setTimeout(async () => {
               try {
                 const userInfo = common_vendor.index.getStorageSync("userInfo") || {};
-                const firstEval = evalRes.rows[0];
                 const res = await api_message.autoCreateOrderCard({
                   sessionId: sessionId.value,
                   studentId: userInfo.studentId || fromUserId.value,
@@ -136,14 +140,14 @@ const _sfc_main = {
                   pushOrderCardMsg(res.data);
                 }
               } catch (err) {
-                common_vendor.index.__f__("error", "at pages/chat/chat.vue:441", "岗位结算单异常:", err);
+                common_vendor.index.__f__("error", "at pages/chat/chat.vue:448", "岗位结算单异常:", err);
               }
             }, 800);
           } else {
-            common_vendor.index.__f__("log", "at pages/chat/chat.vue:444", "[Chat] 该岗位无关联测评,不发送结算单");
+            common_vendor.index.__f__("log", "at pages/chat/chat.vue:451", "[Chat] 该岗位无关联测评,不发送结算单");
           }
         } catch (e) {
-          common_vendor.index.__f__("error", "at pages/chat/chat.vue:447", "[Chat] 查询关联测评失败:", e);
+          common_vendor.index.__f__("error", "at pages/chat/chat.vue:454", "[Chat] 查询关联测评失败:", e);
         }
       }
     });
@@ -189,7 +193,7 @@ const _sfc_main = {
           }
         }
       } catch (e) {
-        common_vendor.index.__f__("error", "at pages/chat/chat.vue:499", "[Chat] 加载历史消息失败:", e);
+        common_vendor.index.__f__("error", "at pages/chat/chat.vue:506", "[Chat] 加载历史消息失败:", e);
       } finally {
         loading.value = false;
       }
@@ -204,7 +208,7 @@ const _sfc_main = {
             }
           }
         } catch (e) {
-          common_vendor.index.__f__("warn", "at pages/chat/chat.vue:517", "[Chat] 获取学员头像失败:", e);
+          common_vendor.index.__f__("warn", "at pages/chat/chat.vue:524", "[Chat] 获取学员头像失败:", e);
         }
       }
     }
@@ -213,16 +217,16 @@ const _sfc_main = {
       utils_chatSocket.connectChat({
         token,
         onConnect: () => {
-          common_vendor.index.__f__("log", "at pages/chat/chat.vue:528", "[Chat] WebSocket 已连接,订阅会话消息");
+          common_vendor.index.__f__("log", "at pages/chat/chat.vue:535", "[Chat] WebSocket 已连接,订阅会话消息");
           if (sessionId.value) {
             wsSubId = utils_chatSocket.subscribe(`/topic/session/${sessionId.value}`, (data) => {
-              common_vendor.index.__f__("log", "at pages/chat/chat.vue:532", "[Chat] 收到 WebSocket 消息:", data);
+              common_vendor.index.__f__("log", "at pages/chat/chat.vue:539", "[Chat] 收到 WebSocket 消息:", data);
               onWsMessage(data);
             });
           }
         },
         onDisconnect: () => {
-          common_vendor.index.__f__("log", "at pages/chat/chat.vue:538", "[Chat] WebSocket 已断开");
+          common_vendor.index.__f__("log", "at pages/chat/chat.vue:545", "[Chat] WebSocket 已断开");
         }
       });
     }
@@ -356,7 +360,7 @@ const _sfc_main = {
         (m) => m.msgType === "order_card" && m.payload && m.payload.orderCardId === card.orderCardId
       );
       if (hasOrderCard) {
-        common_vendor.index.__f__("log", "at pages/chat/chat.vue:689", "[Chat] 已存在相同结算单消息,跳过推送");
+        common_vendor.index.__f__("log", "at pages/chat/chat.vue:696", "[Chat] 已存在相同结算单消息,跳过推送");
         return;
       }
       messages.value.push({
@@ -393,24 +397,24 @@ const _sfc_main = {
         return;
       const orderCardId = msg.payload ? msg.payload.orderCardId || msg.payload.id : null;
       const userInfo = common_vendor.index.getStorageSync("userInfo") || {};
-      common_vendor.index.__f__("log", "at pages/chat/chat.vue:731", "🔥 开始支付流程");
-      common_vendor.index.__f__("log", "at pages/chat/chat.vue:732", "🔥 orderCardId:", orderCardId, "类型:", typeof orderCardId);
-      common_vendor.index.__f__("log", "at pages/chat/chat.vue:733", "🔥 fromUserId:", fromUserId.value, "类型:", typeof fromUserId.value);
-      common_vendor.index.__f__("log", "at pages/chat/chat.vue:734", "🔥 userInfo:", JSON.stringify(userInfo));
-      common_vendor.index.__f__("log", "at pages/chat/chat.vue:735", "🔥 msg.payload:", JSON.stringify(msg.payload));
+      common_vendor.index.__f__("log", "at pages/chat/chat.vue:738", "🔥 开始支付流程");
+      common_vendor.index.__f__("log", "at pages/chat/chat.vue:739", "🔥 orderCardId:", orderCardId, "类型:", typeof orderCardId);
+      common_vendor.index.__f__("log", "at pages/chat/chat.vue:740", "🔥 fromUserId:", fromUserId.value, "类型:", typeof fromUserId.value);
+      common_vendor.index.__f__("log", "at pages/chat/chat.vue:741", "🔥 userInfo:", JSON.stringify(userInfo));
+      common_vendor.index.__f__("log", "at pages/chat/chat.vue:742", "🔥 msg.payload:", JSON.stringify(msg.payload));
       if (!orderCardId) {
         common_vendor.index.showToast({ title: "无效的结算单", icon: "none" });
         return;
       }
       try {
         common_vendor.index.showLoading({ title: "创建支付订单..." });
-        common_vendor.index.__f__("log", "at pages/chat/chat.vue:765", "🔥 调用支付接口,参数:", { orderCardId, userId: fromUserId.value });
+        common_vendor.index.__f__("log", "at pages/chat/chat.vue:772", "🔥 调用支付接口,参数:", { orderCardId, userId: fromUserId.value });
         const payRes = await api_message.createWxPayOrder(orderCardId, fromUserId.value);
-        common_vendor.index.__f__("log", "at pages/chat/chat.vue:767", "🔥 支付接口响应:", payRes);
+        common_vendor.index.__f__("log", "at pages/chat/chat.vue:774", "🔥 支付接口响应:", payRes);
         if (!(payRes.code === 200 || payRes.code === 0)) {
           common_vendor.index.hideLoading();
           common_vendor.index.showToast({ title: payRes.msg || "创建支付订单失败", icon: "none" });
-          common_vendor.index.__f__("log", "at pages/chat/chat.vue:772", "🔥 支付接口调用失败:", payRes);
+          common_vendor.index.__f__("log", "at pages/chat/chat.vue:779", "🔥 支付接口调用失败:", payRes);
           return;
         }
         if (payRes.data && payRes.data.wechatPayParams) {
@@ -426,11 +430,19 @@ const _sfc_main = {
             paySign: wxPayParams.paySign,
             success: (res) => {
               common_vendor.index.hideLoading();
-              common_vendor.index.__f__("log", "at pages/chat/chat.vue:793", "微信支付成功:", res);
+              common_vendor.index.__f__("log", "at pages/chat/chat.vue:800", "微信支付成功:", res);
               msg.isPaid = true;
               common_vendor.index.showToast({ title: "支付成功", icon: "success" });
-              const paidKey = `audit_paid_${assessmentId.value || ""}`;
-              common_vendor.index.setStorageSync(paidKey, true);
+              if (assessmentId.value) {
+                const paidKey = `audit_paid_${assessmentId.value}`;
+                common_vendor.index.setStorageSync(paidKey, true);
+                common_vendor.index.__f__("log", "at pages/chat/chat.vue:811", "[Chat] 支付成功,写入 key:", paidKey);
+              }
+              if (chatType.value === "job" && positionId.value) {
+                const fallbackKey = `audit_paid_pos_${positionId.value}`;
+                common_vendor.index.setStorageSync(fallbackKey, true);
+                common_vendor.index.__f__("log", "at pages/chat/chat.vue:817", "[Chat] 兜底写入 key:", fallbackKey);
+              }
               msg.payload = {
                 ...msg.payload || {},
                 orderCardId,
@@ -441,17 +453,19 @@ const _sfc_main = {
               common_vendor.index.$emit("payment_done", {
                 orderCardId,
                 orderId: payRes.data.orderId,
+                assessmentId: assessmentId.value,
+                positionId: positionId.value,
                 paid: true
               });
               if (chatType.value === "assessment") {
                 setTimeout(() => {
-                  common_vendor.index.navigateTo({ url: `/pages/assessment/training?title=${encodeURIComponent(assessmentTitle.value)}` });
+                  common_vendor.index.navigateTo({ url: `/pages/assessment/training?title=${encodeURIComponent(assessmentTitle.value)}&assessmentId=${assessmentId.value}` });
                 }, 1200);
               }
             },
             fail: (err) => {
               common_vendor.index.hideLoading();
-              common_vendor.index.__f__("error", "at pages/chat/chat.vue:827", "微信支付失败:", err);
+              common_vendor.index.__f__("error", "at pages/chat/chat.vue:846", "微信支付失败:", err);
               if (err.errMsg && err.errMsg.includes("cancel")) {
                 common_vendor.index.showToast({ title: "支付已取消", icon: "none" });
               } else {
@@ -470,7 +484,7 @@ const _sfc_main = {
         }
       } catch (e) {
         common_vendor.index.hideLoading();
-        common_vendor.index.__f__("error", "at pages/chat/chat.vue:850", "支付失败:", e);
+        common_vendor.index.__f__("error", "at pages/chat/chat.vue:869", "支付失败:", e);
         common_vendor.index.showToast({ title: "支付失败:" + (e.message || "网络错误"), icon: "none" });
       }
     }

+ 60 - 29
unpackage/dist/dev/mp-weixin/pages/jobdetail/index.js

@@ -5,6 +5,7 @@ const api_position = require("../../api/position.js");
 const api_message = require("../../api/message.js");
 const api_collection = require("../../api/collection.js");
 const api_assessment = require("../../api/assessment.js");
+const api_order = require("../../api/order.js");
 const _sfc_main = {
   __name: "index",
   setup(__props) {
@@ -29,7 +30,7 @@ const _sfc_main = {
     });
     const positionId = common_vendor.ref(null);
     const checkState = async () => {
-      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:139", "Checking job state for position:", positionId.value);
+      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:140", "Checking job state for position:", positionId.value);
       const userInfo = common_vendor.index.getStorageSync("userInfo");
       if (!userInfo || !userInfo.studentId || !positionId.value) {
         jobState.value = "initial";
@@ -41,12 +42,42 @@ const _sfc_main = {
         return;
       }
       try {
+        if (!jobInfo.value || !jobInfo.value.postName) {
+          const jobRes = await api_position.getPositionDetail(positionId.value);
+          if (jobRes.code === 200 && jobRes.data) {
+            jobInfo.value = jobRes.data;
+          }
+        }
         const evalRes = await api_assessment.getAssessmentList({ positionId: positionId.value, pageNum: 1, pageSize: 100 });
-        const isAnyEvalPaid = evalRes.code === 200 && evalRes.rows ? evalRes.rows.some((e) => common_vendor.index.getStorageSync(`audit_paid_${e.id}`)) : common_vendor.index.getStorageSync(`audit_paid_${positionId.value}`);
+        const fallbackPaidKey = `audit_paid_pos_${positionId.value}`;
+        const isFallbackPaid = !!common_vendor.index.getStorageSync(fallbackPaidKey);
+        let isAnyEvalPaid = evalRes.code === 200 && evalRes.rows ? evalRes.rows.some((e) => common_vendor.index.getStorageSync(`audit_paid_${e.id}`)) || isFallbackPaid : isFallbackPaid || !!common_vendor.index.getStorageSync(`audit_paid_${positionId.value}`);
+        if (!isAnyEvalPaid) {
+          try {
+            const orderRes = await api_order.listOrder({
+              orderStatus: 1,
+              buyerId: userInfo.studentId
+            });
+            if (orderRes.code === 200 && orderRes.rows) {
+              isAnyEvalPaid = orderRes.rows.some((order) => {
+                var _a;
+                const remark = order.remark || "";
+                const matchPost = ((_a = jobInfo.value) == null ? void 0 : _a.postName) && remark.includes(jobInfo.value.postName);
+                const matchEval = evalRes.rows && evalRes.rows.some((e) => e.evaluationName && remark.includes(e.evaluationName));
+                return matchPost || matchEval;
+              });
+            }
+          } catch (e) {
+            common_vendor.index.__f__("error", "at pages/jobdetail/index.vue:191", "[JobDetail] 订单校验失败:", e);
+          }
+        }
+        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:195", "[JobDetail] 支付状态最终综合判定:", isAnyEvalPaid);
         if (evalRes.code !== 200 || !evalRes.rows || evalRes.rows.length === 0) {
           jobState.value = isAnyEvalPaid ? "paid" : "initial";
           return;
         }
+        linkedAssessmentId.value = evalRes.rows[0].id;
+        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:205", "[JobDetail] 关联测评ID:", linkedAssessmentId.value);
         const recordRes = await api_assessment.getAssessmentRecordList(userInfo.studentId);
         if (recordRes.code !== 200 || !recordRes.data) {
           jobState.value = isAnyEvalPaid ? "paid" : "initial";
@@ -64,7 +95,7 @@ const _sfc_main = {
           jobState.value = "initial";
         }
       } catch (err) {
-        common_vendor.index.__f__("error", "at pages/jobdetail/index.vue:191", "检查状态失败:", err);
+        common_vendor.index.__f__("error", "at pages/jobdetail/index.vue:231", "检查状态失败:", err);
         jobState.value = "initial";
       }
     };
@@ -72,11 +103,11 @@ const _sfc_main = {
     const longitude = common_vendor.ref(121.45039);
     const markers = common_vendor.ref([]);
     const fetchDetail = async (id) => {
-      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:201", "fetchDetail called with id:", id);
+      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:241", "fetchDetail called with id:", id);
       common_vendor.index.showLoading({ title: "加载中..." });
       try {
         const res = await api_position.getPositionDetail(id);
-        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:205", "getPositionDetail响应:", res);
+        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:245", "getPositionDetail响应:", res);
         if (res.code === 200 && res.data) {
           jobInfo.value = res.data;
           positionId.value = res.data.id;
@@ -117,46 +148,46 @@ const _sfc_main = {
             t.push(...data.welfareTags.split(",").filter(Boolean));
           }
           tags.value = t;
-          common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:249", "准备检查收藏状态, id:", id);
+          common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:289", "准备检查收藏状态, id:", id);
           checkCollectionStatus(id);
         }
       } catch (err) {
-        common_vendor.index.__f__("error", "at pages/jobdetail/index.vue:253", "获取岗位详情失败:", err);
+        common_vendor.index.__f__("error", "at pages/jobdetail/index.vue:293", "获取岗位详情失败:", err);
       } finally {
         common_vendor.index.hideLoading();
       }
     };
     const checkCollectionStatus = async (id) => {
-      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:261", "checkCollectionStatus called with id:", id);
+      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:301", "checkCollectionStatus called with id:", id);
       const userInfo = common_vendor.index.getStorageSync("userInfo");
-      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:263", "checkCollectionStatus userInfo:", userInfo);
+      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:303", "checkCollectionStatus userInfo:", userInfo);
       if (!userInfo || !userInfo.studentId) {
-        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:265", "checkCollectionStatus: 用户未登录");
+        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:305", "checkCollectionStatus: 用户未登录");
         return;
       }
       try {
-        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:270", "调用checkCollection API, studentId:", userInfo.studentId, "targetId:", id, "type: job");
+        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:310", "调用checkCollection API, studentId:", userInfo.studentId, "targetId:", id, "type: job");
         const res = await api_collection.checkCollection(userInfo.studentId, id, "job");
-        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:272", "checkCollection API响应:", res);
+        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:312", "checkCollection API响应:", res);
         if (res.code === 200 && res.data) {
           isCollected.value = true;
           collectionId.value = res.data.id;
-          common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:276", "设置为已收藏, collectionId:", res.data.id);
+          common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:316", "设置为已收藏, collectionId:", res.data.id);
         } else {
           isCollected.value = false;
           collectionId.value = null;
-          common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:280", "设置为未收藏");
+          common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:320", "设置为未收藏");
         }
       } catch (err) {
-        common_vendor.index.__f__("error", "at pages/jobdetail/index.vue:283", "检查收藏状态失败", err);
+        common_vendor.index.__f__("error", "at pages/jobdetail/index.vue:323", "检查收藏状态失败", err);
       }
     };
     const toggleCollect = async () => {
-      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:289", "toggleCollect clicked");
+      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:329", "toggleCollect clicked");
       const userInfo = common_vendor.index.getStorageSync("userInfo");
-      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:291", "userInfo:", userInfo);
+      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:331", "userInfo:", userInfo);
       if (!userInfo || !userInfo.studentId) {
-        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:294", "用户未登录");
+        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:334", "用户未登录");
         common_vendor.index.showToast({ title: "请先登录", icon: "none" });
         setTimeout(() => {
           common_vendor.index.navigateTo({ url: "/pages/login/login" });
@@ -164,17 +195,17 @@ const _sfc_main = {
         return;
       }
       if (!jobInfo.value.id) {
-        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:303", "jobInfo.value.id 为空:", jobInfo.value);
+        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:343", "jobInfo.value.id 为空:", jobInfo.value);
         return;
       }
-      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:307", "准备发送收藏请求, jobInfo.value.id:", jobInfo.value.id);
+      common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:347", "准备发送收藏请求, jobInfo.value.id:", jobInfo.value.id);
       common_vendor.index.showLoading({ title: isCollected.value ? "取消收藏中..." : "收藏中..." });
       try {
         if (isCollected.value) {
-          common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:313", "取消收藏, collectionId:", collectionId.value);
+          common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:353", "取消收藏, collectionId:", collectionId.value);
           if (collectionId.value) {
             const res = await api_collection.delCollection(collectionId.value);
-            common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:316", "取消收藏响应:", res);
+            common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:356", "取消收藏响应:", res);
             if (res.code === 200) {
               isCollected.value = false;
               collectionId.value = null;
@@ -187,9 +218,9 @@ const _sfc_main = {
             targetId: jobInfo.value.id,
             type: "job"
           };
-          common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:330", "添加收藏请求数据:", requestData);
+          common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:370", "添加收藏请求数据:", requestData);
           const res = await api_collection.addCollection(requestData);
-          common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:332", "添加收藏响应:", res);
+          common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:372", "添加收藏响应:", res);
           if (res.code === 200) {
             isCollected.value = true;
             checkCollectionStatus(jobInfo.value.id);
@@ -199,7 +230,7 @@ const _sfc_main = {
           }
         }
       } catch (err) {
-        common_vendor.index.__f__("error", "at pages/jobdetail/index.vue:343", "操作收藏失败", err);
+        common_vendor.index.__f__("error", "at pages/jobdetail/index.vue:383", "操作收藏失败", err);
         common_vendor.index.showToast({ title: "操作失败", icon: "none" });
       } finally {
         common_vendor.index.hideLoading();
@@ -211,11 +242,11 @@ const _sfc_main = {
         fetchDetail(options.id);
       }
       common_vendor.index.$on("payment_done", (data) => {
-        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:357", "收到 payment_done 事件:", data);
+        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:397", "收到 payment_done 事件:", data);
         checkState();
       });
       common_vendor.index.$on("resume_delivered", (data) => {
-        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:362", "收到 resume_delivered 事件:", data);
+        common_vendor.index.__f__("log", "at pages/jobdetail/index.vue:402", "收到 resume_delivered 事件:", data);
         if (data && data.postId == positionId.value) {
           jobState.value = "added";
         }
@@ -256,12 +287,12 @@ const _sfc_main = {
           }
         } catch (err) {
           common_vendor.index.hideLoading();
-          common_vendor.index.__f__("error", "at pages/jobdetail/index.vue:411", "创建会话失败:", err);
+          common_vendor.index.__f__("error", "at pages/jobdetail/index.vue:451", "创建会话失败:", err);
           common_vendor.index.showToast({ title: "连接失败,请重试", icon: "none" });
         }
       } else if (jobState.value === "paid") {
         common_vendor.index.navigateTo({
-          url: "/pages/assessment/remind?family=audit"
+          url: `/pages/assessment/remind?family=audit&id=${linkedAssessmentId.value || ""}`
         });
       } else if (jobState.value === "assessed") {
         const userInfo = common_vendor.index.getStorageSync("userInfo") || {};

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff