“mitao”
2026-04-29 c3b9e353e75815c5a6e2cde170f09b63906246a2
fix:课程领取修改
2个文件已修改
67 ■■■■■ 已修改文件
tcm-training-admin-backend/src/main/resources/static/app-download/index.html 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traditionalApp/pages/courseDetail/courseDetail.vue 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/resources/static/app-download/index.html
@@ -279,6 +279,7 @@
    const OPEN_CONFIRM_DELAY_MS = 1200
    const RESUME_WATCH_INTERVAL_MS = 1200
    const RESUME_WATCH_DURATION_MS = 15000
    const PENDING_OPEN_EXPIRE_MS = 10 * 60 * 1000
    /**
     * 页面初始化。
@@ -641,7 +642,7 @@
                return null
            }
            const parsedValue = JSON.parse(rawValue)
            if (!parsedValue || Date.now() - Number(parsedValue.createdAt || 0) > 24 * 60 * 60 * 1000) {
            if (!isPendingOpenValid(parsedValue)) {
                window.localStorage.removeItem(PENDING_OPEN_STORAGE_KEY)
                return null
            }
@@ -649,6 +650,17 @@
        } catch (error) {
            return null
        }
    }
    /**
     * 校验安装后继续打开状态是否仍在本次下载短窗口内。
     */
    function isPendingOpenValid(pendingOpen) {
        if (!pendingOpen) {
            return false
        }
        const startedAt = Number(pendingOpen.downloadStartedAt || pendingOpen.createdAt || 0)
        return startedAt > 0 && Date.now() - startedAt <= PENDING_OPEN_EXPIRE_MS
    }
    /**
@@ -683,6 +695,7 @@
            primaryActionBtn.textContent = '已安装,点此打开 APP'
            return
        }
        document.getElementById('flowTip').textContent = '点击下方按钮,已安装将直接打开 APP;未安装会自动下载。'
        primaryActionBtn.textContent = state.bindTicketLoading ? '正在准备注册信息...' : '打开 APP 继续注册'
    }
traditionalApp/pages/courseDetail/courseDetail.vue
@@ -1023,43 +1023,37 @@
    }
    /**
     * 打开整课购买支付弹窗。
     * 直接领取整课,不展示支付方式弹窗。
     */
    function handleCoursePurchase() {
        if (isReadonlyDisplayMode) {
            return
        }
        if (!courseId.value || courseDetail.value.courseOwned || memberJoinSubmitting.value) {
        if (!courseId.value || courseDetail.value.courseOwned || memberJoinSubmitting.value || purchaseSubmitting.value) {
            return
        }
        if (courseDetail.value.isMember) {
            submitMemberJoin()
            return
        }
        if (isIosApp) {
            selectedPaymentMethod.value = 'appleiap'
        }
        activePurchaseTarget.value = 'COURSE'
        activePurchaseVideoId.value = null
        showPaymentPopup.value = true
        void submitZeroPricePurchase()
    }
    /**
     * 处理付费小节点击,未购买时进入对应支付弹窗。
     * 处理付费小节点击,未购买时直接走 0 元领取流程。
     */
    function handlePaidVideoTap(item : CourseVideo) {
        if (isReadonlyDisplayMode) {
            return
        }
        if (!courseId.value || courseDetail.value.courseOwned || item.purchased) {
        if (!courseId.value || courseDetail.value.courseOwned || item.purchased || purchaseSubmitting.value) {
            return
        }
        if (isIosApp) {
            selectedPaymentMethod.value = 'appleiap'
        }
        activePurchaseTarget.value = 'VIDEO'
        activePurchaseVideoId.value = item.id
        showPaymentPopup.value = true
        void submitZeroPricePurchase()
    }
    /**
@@ -1139,6 +1133,30 @@
     * 提交当前购买目标的直付订单。
     */
    async function submitPurchase() {
        const payload = selectedPaymentMethod.value === 'appleiap'
            ? await buildAppleIapPurchasePayload()
            : {
                paymentMethod: selectedPaymentMethod.value === 'wechat' ? 'WECHAT' : 'ALIPAY',
            }
        if (!payload) {
            return
        }
        await submitPurchaseWithPayload(payload, '购买成功')
    }
    /**
     * 提交当前领取目标的 0 元订单,占位支付方式仅用于兼容后端校验。
     */
    async function submitZeroPricePurchase() {
        await submitPurchaseWithPayload({
            paymentMethod: 'WECHAT',
        }, '领取成功')
    }
    /**
     * 使用指定支付载荷提交当前购买或领取目标。
     */
    async function submitPurchaseWithPayload(payload : Record<string, unknown>, successTitle : string) {
        if (isReadonlyDisplayMode) {
            return
        }
@@ -1150,14 +1168,6 @@
        }
        purchaseSubmitting.value = true
        try {
            const payload = selectedPaymentMethod.value === 'appleiap'
                ? await buildAppleIapPurchasePayload()
                : {
                    paymentMethod: selectedPaymentMethod.value === 'wechat' ? 'WECHAT' : 'ALIPAY',
                }
            if (!payload) {
                return
            }
            const response = activePurchaseTarget.value === 'VIDEO' && activePurchaseVideoId.value !== null
                ? await purchaseHealthCourseVideo(courseId.value, activePurchaseVideoId.value, payload)
                : await purchaseHealthCourse(courseId.value, payload)
@@ -1169,7 +1179,7 @@
            activePurchaseTarget.value = 'COURSE'
            activePurchaseVideoId.value = null
            uni.showToast({
                title: '购买成功',
                title: successTitle,
                icon: 'none',
            })
        } finally {