提交 679b78fa authored 作者: 王鹏飞's avatar 王鹏飞

chore: 新增RFM模型标签

上级 e877c464
<script setup lang="ts">
import RFMRuleItem from './RFMRuleItem.vue'
const form = defineModel<any>({
default: {
R: {},
F: {},
M: {}
}
})
</script>
<template>
<RFMRuleItem label="R" v-model="form.R" />
<RFMRuleItem label="F" v-model="form.F" style="margin-top: 20px" />
<RFMRuleItem label="M" v-model="form.M" style="margin-top: 20px" />
</template>
<script setup lang="ts">
import { useUserAttr, useMetaEvent } from '@/composables/useAllData'
defineProps<{ label: string }>()
const form = defineModel<any>()
const ruleList = [
{ label: '属性值平均法', value: '101', basis: ['1'] },
{ label: '属性值分类法', value: '102', basis: ['1'] },
{ label: '事件发生次数平均法', value: '201', basis: ['2'] }
]
const defaultLevel = [
{ level: '高', value: '' },
{ level: '低', value: '' }
]
const defaultScore = [
{ score: 1, min_value: '', max_value: '' },
{ score: 2, min_value: '', max_value: '' },
{ score: 3, min_value: '', max_value: '' },
{ score: 4, min_value: '', max_value: '' },
{ score: 5, min_value: '', max_value: '' }
]
onMounted(() => {
form.value = Object.assign({ basis: '1', rule: '101', event_id: '0', attr_id: '', attr_type: '', config: [...defaultScore] }, form.value)
})
const { userAttrList } = useUserAttr()
const { metaEventList } = useMetaEvent()
const currentRuleList = computed(() => {
return ruleList.filter(item => item.basis.includes(form.value.basis))
})
const currentAttrList = computed(() => {
let list = userAttrList.value
if (form.value.basis === '2') {
list = metaEventList.value.find(item => item.id === form.value.event_id)?.event_attrs || []
}
return list.filter(item => {
if (form.value.rule === '101') {
return ['2', '3', '4', '5'].includes(item.type)
} else if (form.value.rule === '102') {
return ['1'].includes(item.type)
}
return true
})
})
function handleBasisChange(value: any) {
if (value === '1') {
form.value.rule = '101'
} else {
form.value.rule = '201'
}
form.value.attr_id = ''
handleRuleChange(form.value.rule)
}
function handleRuleChange(value: any) {
if (value === '102') {
form.value.config = [...defaultLevel]
} else {
form.value.config = [...defaultScore]
}
}
function handleAttrChange(value: any) {
form.value.attr_type = currentAttrList.value.find(item => item.id === value)?.type
}
</script>
<template>
<el-card shadow="never">
<template #header>
<el-button circle type="primary" style="width: 32px; margin-right: 10px">{{ label }}</el-button>
{{ label }}值计算规则
</template>
<div class="rfm-header">
<p style="margin-right: 20px">{{ label }}值计算依据</p>
<el-radio-group v-model="form.basis" @change="handleBasisChange">
<el-radio label="1">用户属性</el-radio>
<el-radio label="2">事件属性</el-radio>
</el-radio-group>
<p style="margin-left: 10px">计算规则:</p>
<el-select v-model="form.rule" style="width: 170px" @change="handleRuleChange">
<el-option v-for="item in currentRuleList" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
<el-select v-model="form.event_id" placeholder="选择事件" style="width: 160px" v-if="form.basis === '2'">
<el-option v-for="item in metaEventList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
<el-select v-model="form.attr_id" placeholder="选择属性" style="width: 160px" @change="handleAttrChange">
<el-option v-for="item in currentAttrList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
<div class="rfm-body">
<template v-if="form.rule === '102'">
<div class="rfm-box" v-for="item in form.config" :key="item.level">
<div class="rfm-box-header">
<b>{{ item.level }}</b>
</div>
<div class="rfm-box-body">
<el-input placeholder="选择属性值" v-model="item.value"></el-input>
</div>
</div>
</template>
<template v-else>
<div class="rfm-box" v-for="item in form.config" :key="item.score">
<div class="rfm-box-header">
<b>{{ item.score }}</b
>
</div>
<div class="rfm-box-body">
<el-input v-model="item.min_value" class="rfm-box-input"></el-input>
~
<el-input v-model="item.max_value" class="rfm-box-input"></el-input>
</div>
</div>
</template>
</div>
</el-card>
</template>
<style lang="scss">
.rfm-header {
display: flex;
align-items: center;
.el-radio {
margin-right: 10px;
}
.el-select {
margin-right: 10px;
}
}
.rfm-body {
margin-top: 20px;
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 20px;
}
.rfm-box {
padding: 10px;
text-align: center;
border-radius: 4px;
background-color: rgb(240, 240, 240);
}
.rfm-box-header {
color: var(--main-color);
margin-bottom: 10px;
b {
font-weight: bold;
font-size: 18px;
}
}
.rfm-box-input {
width: 63px;
.el-input__inner {
text-align: center;
}
}
</style>
......@@ -9,6 +9,7 @@ import { getLabelRule, updateLabelRule } from '../api'
import LevelRule from '@/components/rule/LevelRule.vue'
import EventPreferenceRule from '@/components/rule/EventPreferenceRule.vue'
import EventTargetRule from '@/components/rule/EventTargetRule.vue'
import RFMRule from '@/components/rule/RFMRule.vue'
const props = defineProps<{
data: Label
......@@ -67,6 +68,9 @@ function fetchInfo() {
tag_rule: { way: '' }
}
}
if (detail.label === '4') {
rules = { R: {}, F: {}, M: {} }
}
}
Object.assign(form, { id: props.data.id, rules })
})
......@@ -104,7 +108,7 @@ function handleUpdate() {
</script>
<template>
<el-dialog title="标签规则管理" :close-on-click-modal="false" width="800px" @update:modelValue="$emit('update:modelValue')">
<el-dialog title="标签规则管理" :close-on-click-modal="false" width="980px" @update:modelValue="value => $emit('update:modelValue', value)">
<el-form label-suffix=":" label-width="82px">
<el-row>
<el-col :span="12">
......@@ -134,6 +138,8 @@ function handleUpdate() {
<EventPreferenceRule v-model="form.rules" v-if="data.label == '2'"></EventPreferenceRule>
<!-- 事件指标 -->
<EventTargetRule v-model="form.rules" v-if="data.label == '3'"></EventTargetRule>
<!-- RFM模型 -->
<RFMRule v-model="form.rules" v-if="data.label == '4'"></RFMRule>
<!-- 用户属性规则 -->
<!-- <UserRule></UserRule> -->
<!-- 事件属性规则 -->
......
......@@ -98,7 +98,8 @@ export const triggerInfoList = [{ label: '触发次数', value: '触发次数' }
export const labelList = [
{ label: '自定义分层标签 ', value: '1' },
{ label: '事件偏好标签 ', value: '2' },
{ label: '事件指标标签 ', value: '3' }
{ label: '事件指标标签 ', value: '3' },
{ label: 'RFM模型标签 ', value: '4' }
]
export const wayList = [
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论