wenminjie
2026-08-07 d9265b935272e772064a5d8953085f1dbd1ab811
对接小程序、后台
3个文件已修改
41 ■■■■■ 已修改文件
rencaika/pages/car-wash-merchant/car-wash-merchant.uvue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rencaika/pages/external-webview/external-webview.uvue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
talent-card-server/src/main/java/com/talentcard/server/business/portal/CarWashMerchantPortalService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rencaika/pages/car-wash-merchant/car-wash-merchant.uvue
@@ -18,8 +18,11 @@
                    <text class="service-title">{{merchantName}}</text>
                </view>
                <view class="talent-tag"><text>{{applicableCards}}</text></view>
                <text class="service-desc">{{servicePointText}}</text>
                <text class="service-tip">{{tipText}}</text>
                <view class="rights-card">
                    <text class="rights-label">权益详情</text>
                    <text class="rights-content">{{rightsText}}</text>
                </view>
                <text v-if="tipText != ''" class="service-tip">{{tipText}}</text>
                <view v-if="!available" class="unavailable-note"><text>{{unavailableReason}}</text></view>
            </view>
@@ -61,6 +64,7 @@
    const merchantName = ref('自助洗车服务')
    const applicableCards = ref('')
    const servicePointText = ref('')
    const rightsText = ref('')
    const tipText = ref('')
    const available = ref(false)
    const unavailableReason = ref('洗车服务当前不可用')
@@ -87,11 +91,15 @@
        navRight.value = info.windowWidth - capsule.right
        // #endif
        if (options != null && options['merchantId'] != null) merchantId.value = options['merchantId'] as string
        if (options != null && options['name'] != null && merchantName.value == '自助洗车服务') merchantName.value = options['name'] as string
        if (options != null && options['name'] != null && merchantName.value == '自助洗车服务') merchantName.value = decodeURIComponent(options['name'] as string)
        const session = getSession()
        if (session != null && session.talentId != null) talentId.value = session.talentId as string
        if (talentId.value != '') {
            getTalentCardProfile(talentId.value, (data: any) => { const card = data != null ? data.card : null; if (card != null && card.id != null) cardId.value = '' + card.id; loadMerchantDetail() }, () => { loadMerchantDetail() })
            getTalentCardProfile(talentId.value, (data: any) => {
                const card = data != null ? data.card : null
                cardId.value = card != null && card.id != null ? '' + card.id : ''
                loadMerchantDetail()
            }, () => { loadMerchantDetail() })
        } else {
            loadMerchantDetail()
        }
@@ -110,9 +118,10 @@
        getCarWashMerchantDetail(merchantId.value, cardId.value, (data: any) => {
            if (data == null) { merchantLoading.value = false; merchantError.value = true; return }
            merchantName.value = data.merchantName != null && data.merchantName != '' ? data.merchantName as string : merchantName.value
            applicableCards.value = data.applicableCards != null ? data.applicableCards as string : '请咨询商家'
            servicePointText.value = data.servicePointText != null ? data.servicePointText as string : '请咨询商家'
            tipText.value = data.tipText != null ? data.tipText as string : '请按现场指引操作'
            applicableCards.value = data.applicableCards != null && data.applicableCards != '' ? data.applicableCards as string : '请咨询商家'
            servicePointText.value = data.servicePointText != null && data.servicePointText != '' ? data.servicePointText as string : '请咨询商家'
            rightsText.value = data.rightsText != null && data.rightsText != '' ? data.rightsText as string : servicePointText.value
            tipText.value = data.tipText != null ? data.tipText as string : ''
            available.value = data.available === true
            unavailableReason.value = data.unavailableReason != null && data.unavailableReason != '' ? data.unavailableReason as string : '洗车服务当前不可用'
            externalLinkType.value = data.externalLinkType != null ? data.externalLinkType as string : ''
@@ -161,7 +170,7 @@
            return
        }
        if (externalLinkType.value == 'web' && externalWebUrl.value.startsWith('https://')) {
            uni.navigateTo({ url: '/pages/external-webview/external-webview?source=carWash&merchantId=' + encodeURIComponent(merchantId.value) })
            uni.navigateTo({ url: '/pages/external-webview/external-webview?source=carWash&merchantId=' + encodeURIComponent(merchantId.value) + '&talentCardId=' + encodeURIComponent(cardId.value) })
            return
        }
        showPhoneForm.value = true
@@ -192,6 +201,9 @@
    .talent-tag { display: flex; max-width: 100%; width: fit-content; min-height: 47rpx; margin-top: 25rpx; box-sizing: border-box; padding: 8rpx 17rpx; border-radius: 24rpx; background-image: linear-gradient(90deg, #FFF0E5 0%, #FFE8D7 100%); justify-content: center; align-items: center; }
    .talent-tag text { max-width: 540rpx; color: #D86B35; font-size: 23rpx; line-height: 31rpx; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
    .service-desc { display: block; margin-top: 24rpx; color: #6F7887; font-size: 25rpx; line-height: 39rpx; }
    .rights-card { display: flex; margin-top: 24rpx; box-sizing: border-box; padding: 24rpx; border-radius: 20rpx; background-color: #FFF8F2; flex-direction: column; }
    .rights-label { color: #D86B35; font-size: 24rpx; line-height: 34rpx; font-weight: 700; }
    .rights-content { margin-top: 10rpx; color: #4D5663; font-size: 26rpx; line-height: 40rpx; }
    .service-tip { display: block; margin-top: 16rpx; color: #9CA6B5; font-size: 22rpx; line-height: 34rpx; }
    .unavailable-note { margin-top: 16rpx; text-align: center; }
    .unavailable-note text { color: #D86B35; font-size: 23rpx; line-height: 34rpx; }
rencaika/pages/external-webview/external-webview.uvue
@@ -21,6 +21,7 @@
    const source = ref('')
    const merchantId = ref('')
    const talentId = ref('')
    const talentCardId = ref('')
    const stateTitle = ref('正在打开服务')
    const stateDescription = ref('请稍候')
@@ -28,6 +29,7 @@
        source.value = options != null && options['source'] != null ? options['source'] as string : ''
        merchantId.value = options != null && options['merchantId'] != null ? options['merchantId'] as string : ''
        talentId.value = options != null && options['talentId'] != null ? options['talentId'] as string : ''
        talentCardId.value = options != null && options['talentCardId'] != null ? options['talentCardId'] as string : ''
        if (!isValidSource()) {
            showInvalid('服务地址无效', '请从已配置的服务入口重新进入')
            return
@@ -46,7 +48,7 @@
        stateTitle.value = '正在打开服务'
        stateDescription.value = '请稍候'
        if (source.value == 'advisor') { loadAdvisorService(); return }
        getCarWashMerchantDetail(merchantId.value, '', (data: any) => {
        getCarWashMerchantDetail(merchantId.value, talentCardId.value, (data: any) => {
            if (data == null || data.available !== true) {
                showInvalid('服务暂不可用', data != null && data.unavailableReason != null ? data.unavailableReason as string : '请稍后重试')
                return
talent-card-server/src/main/java/com/talentcard/server/business/portal/CarWashMerchantPortalService.java
@@ -52,9 +52,12 @@
                order by id asc limit 1
                """, merchantId);
        String cardLevel = talentCardId == null ? "" : talentCardLevel(talentCardId);
        Map<String, Object> right = matchingRight(merchant.get("merchantRightsConfig"), cardLevel);
        List<Map<String, Object>> rights = parseList(merchant.get("merchantRightsConfig"));
        Map<String, Object> right = matchingRight(rights, cardLevel);
        boolean hasCardRightsConfig = !rights.isEmpty() && !cardLevel.isBlank();
        boolean available = number(merchant.get("status")) == 1
                && number(service.get("status")) == 1
                && (!hasCardRightsConfig || right != null)
                && (right == null || booleanValue(right.get("enabled")));
        Map<String, Object> result = new LinkedHashMap<>();
        result.put("merchantId", merchant.get("id"));
@@ -144,12 +147,10 @@
        return "洗车权益当前不可用";
    }
    private Map<String, Object> matchingRight(Object rightsConfig, String cardLevel) {
        List<Map<String, Object>> rights = parseList(rightsConfig);
    private Map<String, Object> matchingRight(List<Map<String, Object>> rights, String cardLevel) {
        if (rights.isEmpty() || cardLevel == null || cardLevel.isBlank()) return null;
        String normalizedCardLevel = normalizedCardLevel(cardLevel);
        for (Map<String, Object> right : rights) {
            if (!booleanValue(right.get("enabled"))) continue;
            if (normalizedCardLevel.equals(normalizedCardLevel(text(right.get("level"), "")))) return right;
        }
        return null;