From b36f4c2800e88f8c5060ae926d3eb25d4bcb69c0 Mon Sep 17 00:00:00 2001
From: shinnosuke <tantao@1hoper.com>
Date: 星期五, 11 九月 2026 11:06:36 +0800
Subject: [PATCH] 又又更新

---
 talent-card-admin/src/views/MerchantView.vue |   63 +++++++++++++++++++++++++++++++
 1 files changed, 62 insertions(+), 1 deletions(-)

diff --git a/talent-card-admin/src/views/MerchantView.vue b/talent-card-admin/src/views/MerchantView.vue
index ea28e35..c9925f5 100644
--- a/talent-card-admin/src/views/MerchantView.vue
+++ b/talent-card-admin/src/views/MerchantView.vue
@@ -97,6 +97,67 @@
 }
 const drawerTitle = computed(() => (editingId.value ? '编辑商家' : '新建商家'))
 
+const merchantTypeAliases: Record<string, string> = {
+  '餐饮服务': 'food', food: 'food',
+  '景区服务': 'scenic', scenic: 'scenic',
+  '酒店服务': 'hotel', hotel: 'hotel',
+  '公寓租赁': 'apartment', apartment: 'apartment',
+  '自助洗车': 'carWash', '自助洗车服务': 'carWash', carWash: 'carWash',
+  '免费体检': 'medical', medical: 'medical', healthCheck: 'medical',
+  '停车服务': 'parking', parking: 'parking',
+  '加油服务': 'fuel', fuel: 'fuel',
+  '子女托管': 'children', children: 'children',
+  '学生托付': 'children', '学生托管': 'children', '子女托管服务': 'children',
+  '金融服务': 'finance', finance: 'finance',
+  '配偶推荐就业': 'employment', employment: 'employment',
+  '行政审批': 'approval', approval: 'approval',
+  '观影服务': 'cinema', cinema: 'cinema', theatre: 'cinema', '电影院': 'cinema', '影院': 'cinema', '影城': 'cinema', '剧院': 'cinema',
+  '购房优惠': 'housing', housing: 'housing',
+  '购车服务': 'car', car: 'car',
+  '家电服务': 'appliance', appliance: 'appliance',
+  '数码服务': 'digital', digital: 'digital',
+  '文化服务': 'culture', culture: 'culture', book: 'culture',
+  '电信服务': 'telecom', telecom: 'telecom',
+  '口腔治疗保健': 'dental', dental: 'dental',
+}
+const productTabTypeCodes = new Set(['food', 'scenic', 'hotel', 'dental', 'medical'])
+
+function resolveMerchantTypeCode(row: Merchant) {
+  const raw = String(row.merchantTypeCode || row.merchantType || '').trim()
+  return merchantTypeAliases[raw] || raw
+}
+
+function parseMerchantRights(config: Merchant['merchantRightsConfig']) {
+  if (Array.isArray(config)) return config
+  if (typeof config !== 'string' || !config.trim()) return []
+  try {
+    const parsed = JSON.parse(config)
+    return Array.isArray(parsed) ? parsed : []
+  } catch {
+    return []
+  }
+}
+
+function isCarWashMiniProgramJump(row: Merchant) {
+  const linkType = String(row.carWashExternalLinkType || '').trim()
+  if (linkType === 'miniProgram') return true
+  if (linkType === 'normal') return false
+  const jump = parseMerchantRights(row.merchantRightsConfig).find((entry) => (
+    entry?.externalLinkType
+    || entry?.externalMiniProgramShortLink
+    || entry?.externalMiniProgramPath
+    || entry?.externalWebUrl
+  ))
+  if (!jump) return false
+  return jump.externalLinkType === 'miniProgram' || Boolean(String(jump.externalMiniProgramShortLink || '').trim())
+}
+
+function supportsGroupBuying(row: Merchant) {
+  const code = resolveMerchantTypeCode(row)
+  if (code === 'carWash') return !isCarWashMiniProgramJump(row)
+  return productTabTypeCodes.has(code)
+}
+
 function resetForm() {
   Object.assign(form, emptyForm())
   editingId.value = undefined
@@ -335,7 +396,7 @@
             <el-button v-permission="'admin.merchants.disable'" link :type="row.status === 0 ? 'success' : 'danger'" @click="toggleStatus(row)">
               {{ row.status === 0 ? '启用' : '禁用' }}
             </el-button>
-            <el-button link type="primary" :icon="Goods" @click="openProducts(row)">团购管理</el-button>
+            <el-button v-if="supportsGroupBuying(row)" link type="primary" :icon="Goods" @click="openProducts(row)">团购管理</el-button>
             <el-button v-permission="'admin.merchants.edit'" link type="primary" :icon="Edit" @click="openEdit(row)">编辑</el-button>
           </template>
         </el-table-column>

--
Gitblit v1.7.1