yeg
2 天以前 f2cca8fe463efe96ad8d949a40bbee52baf89d8c
fix(admin): 精简纳管对话框的文字

去掉对话框顶部整段说明与「卡号不用填」提示:点开这个入口的人已经知道在做什么,那些字只占位置。
同一类噪音一并收掉:

- 「该商户号已绑给」从两行折成一行,不再单独说「可以继续纳管」——表单就在下面,能提交本身
就说明了这一点。
- 门店名与商家名相同时不再重复印一遍(多数门店名就是商家名,原样会显示成「某某商户(某某商户)」)。
- 商户端登录的提示直接用正文,不再套一层「商户端登录」标题。
- 确认框文案收短,避免在 640px 宽的对话框里被截断。
3个文件已修改
40 ■■■■■ 已修改文件
talent-card-admin/src/views/MerchantSettlementView.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
talent-card-server/src/main/java/com/talentcard/server/business/admin/MerchantManagedOnboardingService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
talent-card-server/src/test/java/com/talentcard/server/business/admin/MerchantManagedOnboardingTests.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
talent-card-admin/src/views/MerchantSettlementView.vue
@@ -473,10 +473,6 @@
      :close-on-click-modal="false"
      destroy-on-close
    >
      <p class="adopt-hint">
        用于把<b>已在汇付侧完成进件</b>的商户接到我方某个商家上。纳管全程只查询、不下发:不会补开微信、
        不会绑定人才端、不会改动支付场景与延迟入账。
      </p>
      <el-form label-width="120px" class="adopt-form">
        <el-form-item label="我方商家" required>
          <el-select
@@ -506,14 +502,14 @@
        </el-form-item>
        <el-form-item label=" ">
          <el-button type="primary" plain :loading="adoptPreviewing" @click="runAdoptPreview">核验通道商户</el-button>
          <span class="adopt-tip">卡号不用填,从通道查回来。</span>
        </el-form-item>
      </el-form>
      <template v-if="adoptPreview">
        <el-descriptions :column="1" border size="small" class="adopt-preview">
          <el-descriptions-item label="我方商家">
            {{ adoptPreview.merchantName }}<span class="muted">(门店:{{ adoptPreview.storeName }})</span>
            {{ adoptPreview.merchantName
            }}<span v-if="adoptPreview.storeName && adoptPreview.storeName !== adoptPreview.merchantName" class="muted">(门店:{{ adoptPreview.storeName }})</span>
          </el-descriptions-item>
          <el-descriptions-item label="通道商户注册名称">{{ adoptPreview.channelMerchantName }}</el-descriptions-item>
          <el-descriptions-item label="通道商户简称">{{ adoptPreview.channelShortName }}</el-descriptions-item>
@@ -526,22 +522,20 @@
            <span v-if="adoptPreview.settlementBankName" class="muted">({{ adoptPreview.settlementBankName }})</span>
          </el-descriptions-item>
        </el-descriptions>
        <!-- 只提示不拦截:连锁各门店共用一个收款主体是允许的,这里列出已绑的商家让运营自己确认。 -->
        <!-- 只提示不拦截:连锁各门店共用一个收款主体是允许的,列出已绑的商家让运营自己确认。 -->
        <el-alert
          v-if="adoptPreview.alreadyManaged"
          class="adopt-alert"
          type="success"
          :closable="false"
          title="该商家已纳管过这个汇付商户号"
          description="重复纳管是幂等的,提交会直接返回原来那条进件记录,不会产生第二条。"
          title="该商家已纳管过这个汇付商户号,提交会返回原进件记录,不会新建"
        />
        <el-alert
          v-if="adoptPreview.boundMerchants?.length"
          class="adopt-alert"
          type="info"
          :closable="false"
          :title="`该汇付商户号已绑给:${adoptPreview.boundMerchants.join('、')}`"
          description="可以继续纳管(连锁各门店共用一个收款主体)。"
          :title="`该汇付商户号已绑给:${adoptPreview.boundMerchants.join('、')},可继续纳管`"
        />
        <el-alert
          v-if="adoptPreview.nameWarning"
@@ -556,8 +550,7 @@
          class="adopt-alert"
          type="warning"
          :closable="false"
          title="商户端登录"
          :description="adoptPreview.loginNotice"
          :title="adoptPreview.loginNotice"
        />
        <el-alert
          v-for="blocker in adoptPreview.blockers || []"
@@ -568,7 +561,7 @@
          :title="blocker"
        />
        <el-checkbox v-model="adoptConfirmed" :disabled="(adoptPreview.blockers || []).length > 0">
          我已把通道侧的商户注册名称与简称与所选商家核对一致(纳管后该商家的收款将进入这个收款主体)
          我已核对通道商户名称与所选商家一致(该商家的收款将进入这个收款主体)
        </el-checkbox>
      </template>
@@ -601,9 +594,7 @@
.query-actions { justify-content: flex-end; }
.query-actions :deep(.el-form-item__content) { justify-content: flex-end; }
.settlement-table-tools { margin: 0 0 12px; }
.adopt-hint { margin: 0 0 16px; color: #606266; font-size: 13px; line-height: 20px; }
.adopt-form :deep(.el-select) { width: 100%; }
.adopt-tip { margin-left: 12px; color: #909399; font-size: 12px; }
.adopt-preview { margin-bottom: 14px; }
.adopt-alert { margin-bottom: 12px; }
.table-panel { margin-top: 16px; padding: 0 20px 12px; }
talent-card-server/src/main/java/com/talentcard/server/business/admin/MerchantManagedOnboardingService.java
@@ -419,11 +419,20 @@
                where a.provider_huifu_id = ? and a.merchant_id <> ? and a.status in ('pending', 'approved')
                order by a.id
                """, huifuId, exceptMerchantId).stream()
                .map(row -> clean(row.get("merchantName")) + (clean(row.get("storeName")).isBlank() ? "" : "(" + clean(row.get("storeName")) + ")"))
                .map(row -> displayName(clean(row.get("merchantName")), clean(row.get("storeName"))))
                .distinct().toList();
    }
    /**
     * 「商家名(门店名)」的展示形式。门店名与商家名一样时不再重复一遍——多数门店名就是商家名,
     * 加上去只是把同一句话印两遍(列表里看起来像「某某商户(某某商户)」)。
     */
    private static String displayName(String merchantName, String storeName) {
        return storeName.isBlank() || storeName.equals(merchantName)
                ? merchantName : merchantName + "(" + storeName + ")";
    }
    /**
     * 通道侧两个名称与所选商家名**连一个字符都不重叠**时的警示。
     *
     * <p>刻意不做「名称是否对得上」的判定:形态不对应(工商全称 vs 品牌简称),规则化匹配必然误判。
talent-card-server/src/test/java/com/talentcard/server/business/admin/MerchantManagedOnboardingTests.java
@@ -159,9 +159,13 @@
        stubConvergedChannel(huifuId, "622200001234", "external-card-token");
        service.adopt(first.merchantId(), huifuId, APPLY_NO, true);
        // 门店名与商家名一样时不重复印一遍——多数门店就是这样,列表里不该出现「某某商户(某某商户)」。
        jdbc.update("update merchant_store set store_name = ? where id = ?", first.key(), first.storeId());
        Map<String, Object> preview = service.preview(second.merchantId(), huifuId);
        assertThat((List<?>) preview.get("boundMerchants")).anySatisfy(name -> assertThat(String.valueOf(name)).contains(first.key()));
        assertThat(preview.get("boundMerchants"))
                .asInstanceOf(org.assertj.core.api.InstanceOfAssertFactories.list(String.class))
                .containsExactly(first.key());
        assertThat((List<?>) preview.get("blockers")).as("已被其他商家绑定只是提示,不能拦").isEmpty();
        assertThat(service.adopt(second.merchantId(), huifuId, APPLY_NO, true)).containsEntry("status", "approved");
        assertThat(readinessService.requireCollectingMerchant(second.merchantId(), second.storeId()).huifuId()).isEqualTo(huifuId);