Преглед изворни кода

发放计划:新增发放对象(客群/潜客单选),潜客时增加潜客类型多选,移除获取方式

- 发放对象改为单选 radio:客群(默认)/潜客,必选
- 选客群时展示「选择客群」(必填);选潜客时展示「潜客类型」多选(无客户号潜客/标签潜客,必选)
- 移除「获取方式」字段及列表/查看/审核详情对应展示
- View/审核详情同步展示发放对象与潜客类型;mock 持久化 targetType+prospectTypes

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
csk пре 3 недеља
родитељ
комит
733787076f

+ 10 - 0
工作空间/产研/权益/汇丰全行/产品原型/pc-demo/src/mock/index.js

@@ -996,6 +996,8 @@ const equityGrantCampaignList = [
     name: '夏日畅享权益月',
     startTime: '2026-05-01 00:00:00',
     endTime: '2026-08-31 23:59:59',
+    targetType: '潜客',
+    prospectTypes: ['无客户号潜客', '标签潜客'],
     crowdList: [],
     isAutoGrant: '是',
     grantMode: 'claim',
@@ -1012,6 +1014,8 @@ const equityGrantCampaignList = [
     name: '春季会员尊享礼遇',
     startTime: '2026-04-01 00:00:00',
     endTime: '2026-06-30 23:59:59',
+    targetType: '客群',
+    prospectTypes: [],
     crowdList: ['00000120251224'],
     isAutoGrant: '否',
     grantMode: 'direct',
@@ -1055,6 +1059,8 @@ Mock.mock(/\/api\/equity-grant-campaign\/save/, 'post', (options) => {
       name: body.name,
       startTime: body.startTime,
       endTime: body.endTime,
+      targetType: body.targetType || '客群',
+      prospectTypes: body.prospectTypes || [],
       crowdList: body.crowdList || [],
       isAutoGrant: body.isAutoGrant || '是',
       equityList: body.equityList || [],
@@ -1071,6 +1077,8 @@ Mock.mock(/\/api\/equity-grant-campaign\/save/, 'post', (options) => {
     name: body.name,
     startTime: body.startTime,
     endTime: body.endTime,
+    targetType: body.targetType || '客群',
+    prospectTypes: body.prospectTypes || [],
     crowdList: body.crowdList || [],
     isAutoGrant: body.isAutoGrant || '是',
     equityList: body.equityList || [],
@@ -1215,6 +1223,8 @@ Mock.mock(/\/api\/equity-grant-campaign\/end/, 'post', (options) => {
       startTime: cur.startTime,
       endTime: cur.endTime,
       grantMode: cur.grantMode,
+      targetType: cur.targetType || '客群',
+      prospectTypes: cur.prospectTypes || [],
       crowdList: cur.crowdList || [],
       equityList: cur.equityList || [],
       grantCycle: cur.grantCycle,

+ 19 - 6
工作空间/产研/权益/汇丰全行/产品原型/pc-demo/src/views/CampaignAuditDetail.vue

@@ -24,20 +24,17 @@
               {{ auditStatusLabel(audit.auditStatus) }}
             </el-tag>
           </el-descriptions-item>
-          <el-descriptions-item label="获取方式">
-            <el-tag :type="snapshot.grantMode === 'direct' ? 'warning' : 'success'" size="small">
-              {{ snapshot.grantMode === 'direct' ? '直接发放' : '用户领取' }}
-            </el-tag>
-          </el-descriptions-item>
           <el-descriptions-item label="单客户权益数量">{{ grantSummary }}</el-descriptions-item>
           <el-descriptions-item label="开始时间">{{ snapshot.startTime || '-' }}</el-descriptions-item>
           <el-descriptions-item label="结束时间">{{ snapshot.endTime || '-' }}</el-descriptions-item>
-          <el-descriptions-item label="选择客群" :span="2">
+          <el-descriptions-item label="发放对象" :span="2">{{ targetTypeText }}</el-descriptions-item>
+          <el-descriptions-item v-if="showCrowd" label="选择客群" :span="2">
             <template v-if="crowdTableData.length">
               <el-button type="text" @click="crowdDialogVisible = true">查看客群列表({{ crowdTableData.length }})</el-button>
             </template>
             <span v-else>-</span>
           </el-descriptions-item>
+          <el-descriptions-item v-if="showProspect" label="潜客类型" :span="2">{{ prospectTypeText }}</el-descriptions-item>
           <el-descriptions-item label="选择权益" :span="2">
             <template v-if="equityTableData.length">
               <el-button type="text" @click="equityDialogVisible = true">查看权益列表({{ equityTableData.length }})</el-button>
@@ -139,6 +136,22 @@ export default {
     snapshot() {
       return (this.audit && this.audit.snapshot) || {}
     },
+    targetType() {
+      return this.snapshot.targetType || ((this.snapshot.crowdList || []).length ? '客群' : '潜客')
+    },
+    targetTypeText() {
+      return this.targetType || '-'
+    },
+    showCrowd() {
+      return this.targetType === '客群'
+    },
+    showProspect() {
+      return this.targetType === '潜客'
+    },
+    prospectTypeText() {
+      const list = this.snapshot.prospectTypes || []
+      return list.length ? list.join('、') : '-'
+    },
     grantSummary() {
       const cycle = grantCycleLabelMap[this.snapshot.grantCycle] || '整个周期'
       return `${cycle} ${this.snapshot.grantQuantity || 0} 个`

+ 0 - 7
工作空间/产研/权益/汇丰全行/产品原型/pc-demo/src/views/EquityGrantCampaign.vue

@@ -92,13 +92,6 @@
             <el-tag :type="auditStatusTag(scope.row.auditStatus)" size="small">{{ scope.row.auditStatus }}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="获取方式" width="110" align="center">
-          <template #default="scope">
-            <el-tag :type="scope.row.grantMode === 'direct' ? 'warning' : 'success'" size="small">
-              {{ scope.row.grantMode === 'direct' ? '直接发放' : '用户领取' }}
-            </el-tag>
-          </template>
-        </el-table-column>
         <el-table-column label="单客户权益数量" width="150" align="center">
           <template #default="scope">
             {{ grantSummary(scope.row) }}

+ 33 - 12
工作空间/产研/权益/汇丰全行/产品原型/pc-demo/src/views/EquityGrantCampaignEdit.vue

@@ -38,7 +38,13 @@
             style="width:320px"
           />
         </el-form-item>
-        <el-form-item label="选择客群" prop="crowdList">
+        <el-form-item label="发放对象" prop="targetType" required>
+          <el-radio-group v-model="form.targetType" @change="handleTargetChange">
+            <el-radio label="客群">客群</el-radio>
+            <el-radio label="潜客">潜客</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item v-if="showCrowdSelect" label="选择客群" prop="crowdList">
           <el-select
             v-model="form.crowdList"
             multiple
@@ -55,11 +61,11 @@
             />
           </el-select>
         </el-form-item>
-        <el-form-item label="获取方式" prop="grantMode" required>
-          <el-radio-group v-model="form.grantMode" @change="handleGrantModeChange">
-            <el-radio label="claim">用户领取</el-radio>
-            <el-radio label="direct">直接发放</el-radio>
-          </el-radio-group>
+        <el-form-item v-if="showProspectType" label="潜客类型" prop="prospectTypes" required>
+          <el-checkbox-group v-model="form.prospectTypes">
+            <el-checkbox label="无客户号潜客">无客户号潜客</el-checkbox>
+            <el-checkbox label="标签潜客">标签潜客</el-checkbox>
+          </el-checkbox-group>
         </el-form-item>
         <el-form-item label="选择权益" prop="equityList" required>
           <el-select
@@ -171,7 +177,9 @@ function emptyForm() {
     name: '',
     startTime: '',
     endTime: '',
+    targetType: '客群',
     crowdList: [],
+    prospectTypes: [],
     isAutoGrant: '是',
     grantMode: 'claim',
     equityList: [],
@@ -202,11 +210,14 @@ export default {
         name: [{ required: true, message: '请输入发放计划名称', trigger: 'blur' }],
         startTime: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
         endTime: [{ required: true, message: '请选择结束时间', trigger: 'change' }],
+        targetType: [
+          { required: true, message: '请选择发放对象', trigger: 'change' }
+        ],
         crowdList: [
           { type: 'array', required: true, message: '请至少选择一个客群', trigger: 'change' }
         ],
-        grantMode: [
-          { required: true, message: '请选择获取方式', trigger: 'change' }
+        prospectTypes: [
+          { type: 'array', required: true, message: '请选择潜客类型', trigger: 'change' }
         ],
         equityList: [
           {
@@ -236,6 +247,12 @@ export default {
     crowdOptions() {
       return crowdTaskStore.list
     },
+    showCrowdSelect() {
+      return this.form.targetType === '客群'
+    },
+    showProspectType() {
+      return this.form.targetType === '潜客'
+    },
     isClaimMode() {
       return this.form.grantMode === 'claim'
     },
@@ -282,8 +299,10 @@ export default {
         name: this.isCopy ? row.name + '-副本' : row.name,
         startTime: row.startTime,
         endTime: row.endTime,
+        targetType: row.targetType || ((row.crowdList || []).length ? '客群' : '潜客'),
         crowdList: [...(row.crowdList || [])],
-        grantMode: row.grantMode || 'claim',
+        prospectTypes: [...(row.prospectTypes || [])],
+        grantMode: 'claim',
         equityList: [...(row.equityList || [])],
         claimStartTime: row.claimStartTime || '',
         claimEndTime: row.claimEndTime || '',
@@ -298,9 +317,11 @@ export default {
         smsTemplate: row.smsTemplate || ''
       }
     },
-    handleGrantModeChange(mode) {
-      if (mode === 'direct' && this.form.equityList.length > 1) {
-        this.form.equityList = [this.form.equityList[0]]
+    handleTargetChange(val) {
+      if (val === '客群') {
+        this.form.prospectTypes = []
+      } else {
+        this.form.crowdList = []
       }
     },
     handleSmsTemplateChange(id) {

+ 20 - 7
工作空间/产研/权益/汇丰全行/产品原型/pc-demo/src/views/EquityGrantCampaignView.vue

@@ -13,13 +13,11 @@
         <el-descriptions-item label="状态">
           <el-tag :type="statusTag" size="small">{{ statusLabel }}</el-tag>
         </el-descriptions-item>
-        <el-descriptions-item label="获取方式">
-          <el-tag :type="current.grantMode === 'direct' ? 'warning' : 'success'" size="small">{{ grantModeLabel }}</el-tag>
-        </el-descriptions-item>
         <el-descriptions-item label="单客户权益数量">{{ grantSummary }}</el-descriptions-item>
         <el-descriptions-item label="开始时间">{{ current.startTime || '-' }}</el-descriptions-item>
         <el-descriptions-item label="结束时间">{{ current.endTime || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="选择客群" :span="2">
+        <el-descriptions-item label="发放对象" :span="2">{{ targetTypeText }}</el-descriptions-item>
+        <el-descriptions-item v-if="showCrowd" label="选择客群" :span="2">
           <template v-if="(current.crowdList || []).length">
             <el-tag
               v-for="cid in current.crowdList"
@@ -31,6 +29,7 @@
           </template>
           <span v-else>-</span>
         </el-descriptions-item>
+        <el-descriptions-item v-if="showProspect" label="潜客类型" :span="2">{{ prospectTypeText }}</el-descriptions-item>
         <el-descriptions-item label="选择权益" :span="2">
           <template v-if="(current.equityList || []).length">
             <el-tag
@@ -86,6 +85,23 @@ export default {
     crowdOptions() {
       return crowdTaskStore.list
     },
+    targetType() {
+      if (!this.current) return ''
+      return this.current.targetType || ((this.current.crowdList || []).length ? '客群' : '潜客')
+    },
+    targetTypeText() {
+      return this.targetType || '-'
+    },
+    showCrowd() {
+      return this.targetType === '客群'
+    },
+    showProspect() {
+      return this.targetType === '潜客'
+    },
+    prospectTypeText() {
+      const list = (this.current && this.current.prospectTypes) || []
+      return list.length ? list.join('、') : '-'
+    },
     statusLabel() {
       if (!this.current) return ''
       const now = Date.now()
@@ -103,9 +119,6 @@ export default {
       const cycle = grantCycleLabelMap[this.current.grantCycle] || '整个周期'
       return `${cycle} ${this.current.grantQuantity || 0} 个`
     },
-    grantModeLabel() {
-      return this.current && this.current.grantMode === 'direct' ? '直接发放' : '用户领取'
-    },
     smsTemplateName() {
       if (!this.current) return '-'
       return SMS_TEMPLATE_NAME_MAP[this.current.smsTemplateId] || this.current.smsTemplateId || '-'