提交 37cd14b1 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 850d249d
......@@ -2,6 +2,7 @@
import { QuestionFilled } from '@element-plus/icons-vue'
import { useUserAttr, useMetaEvent, useUserAttrRange } from '@/composables/useRFMData'
import { searchMetaMemberAttrs } from '@/api/base'
import { cloneDeep } from 'lodash-es'
defineProps<{ label: string }>()
const form = defineModel<any>()
......@@ -9,12 +10,12 @@ const form = defineModel<any>()
const ruleList = [
{ label: '属性值平均法', value: '101', basis: ['1'] },
{ label: '属性值分类法', value: '102', basis: ['1'] },
{ label: '事件发生次数平均法', value: '201', basis: ['2'] }
{ label: '事件发生次数平均法', value: '201', basis: ['2'] },
]
const defaultLevel = [
{ level: '高', value: '' },
{ level: '低', value: '' }
{ level: '低', value: '' },
]
const defaultScore = [
......@@ -22,7 +23,7 @@ const defaultScore = [
{ score: 2, min_value: '', max_value: '' },
{ score: 3, min_value: '', max_value: '' },
{ score: 4, min_value: '', max_value: '' },
{ score: 5, min_value: '', max_value: '' }
{ score: 5, min_value: '', max_value: '' },
]
onMounted(() => {
......@@ -33,8 +34,8 @@ onMounted(() => {
event_id: '-1',
attr_id: '',
attr_type: '',
config: [...defaultScore],
extend_config: { default_score_config: { switch: false, score: undefined } }
config: cloneDeep(defaultScore),
extend_config: { default_score_config: { switch: false, score: undefined } },
},
form.value
)
......@@ -45,7 +46,7 @@ const { metaEventList, fetchMetaEventList } = useMetaEvent()
const { userAttrRange, fetchUserAttrRange } = useUserAttrRange()
const currentRuleList = computed(() => {
return ruleList.filter(item => item.basis.includes(form.value.basis))
return ruleList.filter((item) => item.basis.includes(form.value.basis))
})
const currentMetaEventList = computed(() => {
......@@ -58,21 +59,31 @@ function handleBasisChange(value: any) {
} else {
form.value.rule = '201'
}
form.value.attr_id = ''
// 清空数据
Object.assign(
form.value,
cloneDeep({
event_id: '-1',
attr_id: '',
attr_type: '',
config: defaultScore,
extend_config: { default_score_config: { switch: false, score: undefined } },
})
)
handleRuleChange(form.value.rule)
}
function handleRuleChange(value: any) {
if (value === '102') {
form.value.config = [...defaultLevel]
form.value.config = cloneDeep(defaultLevel)
} else {
form.value.config = [...defaultScore]
form.value.config = cloneDeep(defaultScore)
}
form.value.attr_id = ''
}
function handleAttrChange(value: any) {
form.value.attr_type = userAttrList.value.find(item => item.id === value)?.type
form.value.attr_type = userAttrList.value.find((item) => item.id === value)?.type
}
const options = ref<{ label: string; value: string }[]>([])
......@@ -81,7 +92,7 @@ async function remoteMethod(search: string = '') {
options.value = []
if (form.value.attr_id) {
loading.value = true
await searchMetaMemberAttrs({ search, member_meta_id: form.value.attr_id, per_page: 100 }).then(res => {
await searchMetaMemberAttrs({ search, member_meta_id: form.value.attr_id, per_page: 100 }).then((res) => {
options.value = res.data.list.map((item: any) => {
return { label: item.attr_value, value: item.attr_value }
})
......@@ -96,7 +107,7 @@ function querySearch(queryString: string, cb: any) {
watch(
() => form.value.attr_id,
attrId => {
(attrId) => {
if (form.value.rule === '102') {
remoteMethod()
} else {
......@@ -120,7 +131,7 @@ const a = [
{ id: '002', label: '1500' },
{ id: '003', label: '3000' },
{ id: '004', label: '2200' },
{ id: '005', label: '1800' }
{ id: '005', label: '1800' },
]
const defaultOptions = Array.from({ length: 5 }).map((_, index) => ({ value: index + 1, label: index + 1 }))
......@@ -147,11 +158,23 @@ const defaultOptions = Array.from({ length: 5 }).map((_, index) => ({ value: ind
</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-option
v-for="item in currentRuleList"
:key="item.value"
:label="item.label"
:value="item.value"></el-option>
</el-select>
<div class="rfm-tips">
<el-popover popper-class="rfm-popover" placement="right" title="属性值平均法" :width="400" trigger="hover" v-if="form.rule == '101'">
<p>用于计算选中属性的平均值,通过对选定的字段中的所有记录进行数值相加,然后除以记录的数量来计算的。主要针对“数字”和“整数”两种字段类型。</p>
<el-popover
popper-class="rfm-popover"
placement="right"
title="属性值平均法"
:width="400"
trigger="hover"
v-if="form.rule == '101'">
<p>
用于计算选中属性的平均值,通过对选定的字段中的所有记录进行数值相加,然后除以记录的数量来计算的。主要针对“数字”和“整数”两种字段类型。
</p>
<p>举例:</p>
<el-table :data="a" border>
<el-table-column prop="id" label="用户ID" />
......@@ -162,13 +185,25 @@ const defaultOptions = Array.from({ length: 5 }).map((_, index) => ({ value: ind
<el-icon><QuestionFilled /></el-icon>
</template>
</el-popover>
<el-popover popper-class="rfm-popover" placement="right" title="属性值分类法" :width="400" trigger="hover" v-if="form.rule == '102'">
<el-popover
popper-class="rfm-popover"
placement="right"
title="属性值分类法"
:width="400"
trigger="hover"
v-if="form.rule == '102'">
<p>将数据的属性值按照一定的规则或特性进行分类,本系统中分了“高”和“低”两类。主要针对“字符串”的字段类型。</p>
<template #reference>
<el-icon><QuestionFilled /></el-icon>
</template>
</el-popover>
<el-popover popper-class="rfm-popover" placement="right" title="事件发生次数平均法" :width="400" trigger="hover" v-if="form.rule == '201'">
<el-popover
popper-class="rfm-popover"
placement="right"
title="事件发生次数平均法"
:width="400"
trigger="hover"
v-if="form.rule == '201'">
<p>分析事件发生频率的方法,即通过计算用户事件发生的平均次数。</p>
<template #reference>
<el-icon><QuestionFilled /></el-icon>
......@@ -177,19 +212,37 @@ const defaultOptions = Array.from({ length: 5 }).map((_, index) => ({ value: ind
</div>
<el-select v-model="form.event_id" placeholder="选择事件" style="width: 160px" v-if="form.basis === '2'">
<el-option v-for="item in currentMetaEventList" :key="item.event_id" :label="item.event_name" :value="item.event_id"></el-option>
<el-option
v-for="item in currentMetaEventList"
:key="item.event_id"
:label="item.event_name"
:value="item.event_id"></el-option>
</el-select>
<el-select v-model="form.attr_id" placeholder="选择属性" style="width: 160px" @change="handleAttrChange" v-else>
<el-option v-for="item in userAttrList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
<div style="flex: 1; display: flex; justify-content: space-between" v-if="form.basis == 1 && form.rule != '102' && form.attr_id">
<p>最小值:{{ userAttrRange.min }}<br />最大值:{{ userAttrRange.max }}<br />"0"值数量:{{ userAttrRange.zero_count }}</p>
<p>平均值:{{ userAttrRange.avg }}<br />中位数:{{ userAttrRange.median }}<br />中位数(不含0):{{ userAttrRange.no_zero_median }}</p>
<div
style="flex: 1; display: flex; justify-content: space-between"
v-if="form.basis == 1 && form.rule != '102' && form.attr_id">
<p>
最小值:{{ userAttrRange.min }}<br />最大值:{{ userAttrRange.max }}<br />"0"值数量:{{
userAttrRange.zero_count
}}
</p>
<p>
平均值:{{ userAttrRange.avg }}<br />中位数:{{ userAttrRange.median }}<br />中位数(不含0):{{
userAttrRange.no_zero_median
}}
</p>
</div>
</div>
<div class="rfm-header-extra" v-if="form.rule === '101' && form.extend_config">
<p>未匹配数据默认赋值</p>
<el-select-v2 v-model="form.extend_config.default_score_config.score" :options="defaultOptions" style="width: 100px; margin: 0 10px" clearable />
<el-select-v2
v-model="form.extend_config.default_score_config.score"
:options="defaultOptions"
style="width: 100px; margin: 0 10px"
clearable />
<el-switch v-model="form.extend_config.default_score_config.switch"></el-switch>
</div>
<div class="rfm-body">
......
......@@ -31,13 +31,13 @@ const statusList = useMapStore().getMapValuesByKey('system_status')
const formRef = $ref<FormInstance>()
const form = reactive({
const form: any = reactive({
id: '',
rules: undefined
rules: undefined,
})
function fetchInfo() {
getLabelRule({ id: props.data.id }).then(res => {
getLabelRule({ id: props.data.id }).then((res) => {
const { detail } = res.data
let rules = detail.rules
......@@ -47,9 +47,9 @@ function fetchInfo() {
event_attr_rule: {
current_logic_operate: 'and',
happen_info: { is_happened: true, event_id: '-1', event_name: '所有事件', attr_list: [] },
trigger_info: { operate: '', operate_name: '', value: '' }
trigger_info: { operate: '', operate_name: '', value: '' },
},
tag_rule: { event_id: '', event_name: '', attr_id: '', attr_name: '', type: 1, value: undefined }
tag_rule: { event_id: '', event_name: '', attr_id: '', attr_name: '', type: 1, value: undefined },
}
}
if (detail.label == '3') {
......@@ -57,9 +57,9 @@ function fetchInfo() {
event_attr_rule: {
current_logic_operate: 'and',
happen_info: { is_happened: true, event_id: '-1', event_name: '所有事件', attr_list: [] },
trigger_info: { operate: '', operate_name: '', value: '' }
trigger_info: { operate: '', operate_name: '', value: '' },
},
tag_rule: { way: '' }
tag_rule: { way: '' },
}
}
if (detail.label === '4') {
......@@ -75,7 +75,7 @@ function fetchInfo() {
rules = {
user_attr_rule: { current_logic_operate: 'and', items: [] },
event_attr_rule: { current_logic_operate: 'and', items: [] },
user_action_rule: { current_logic_operate: 'and', items: [] }
user_action_rule: { current_logic_operate: 'and', items: [] },
}
}
}
......@@ -100,9 +100,15 @@ function handleUpdate() {
// item.value = Array.isArray(item.value) ? item.value.join(',') : item.value
// return item
// })
let rules = form.rules
if (props.data.label == '1' && rules?.length > 0) {
rules = rules.map((item: any, index: number) => {
return { ...item, level: index }
})
}
const params = {
id: form.id,
rules: JSON.stringify(form.rules)
rules: JSON.stringify(rules),
// user_attr_rule: JSON.stringify([{ ...form.user_attr_rule, items: attrRuleItems }]),
// event_attr_rule: JSON.stringify([{ ...form.event_attr_rule, items: eventRuleItems }])
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论