提交 70901e2e authored 作者: 王鹏飞's avatar 王鹏飞

chore: 新增RFM群组

上级 3e518ce7
import httpRequest from '@/utils/axios'
import type { GroupListRequest, StaticGroupCreateRequest, StaticGroupUpdateRequest, DynamicGroupCreateRequest, DynamicGroupUpdateRequest } from './types'
import type {
GroupListRequest,
StaticGroupCreateRequest,
StaticGroupUpdateRequest,
DynamicGroupCreateRequest,
DynamicGroupUpdateRequest,
RFMGroupCreateRequest,
RFMGroupUpdateRequest
} from './types'
// 获取群组列表
export function getGroupList(params?: GroupListRequest) {
......@@ -21,6 +29,16 @@ export function createDynamicGroup(data: DynamicGroupCreateRequest) {
return httpRequest.post('/api/lab/v1/experiment/group/bda-create-dynamic-group', data)
}
// 创建RFM群组
export function createRFMGroup(data: RFMGroupCreateRequest) {
return httpRequest.post('/api/lab/v1/experiment/group/bda-create-frm-group', data)
}
// 更新RFM群组
export function updateRFMGroup(data: RFMGroupUpdateRequest) {
return httpRequest.post('/api/lab/v1/experiment/group/bda-update-frm-group', data)
}
// 更新静态群组
export function updateStaticGroup(data: StaticGroupUpdateRequest) {
return httpRequest.post('/api/lab/v1/experiment/group/bda-update-static-group', data)
......
......@@ -56,7 +56,7 @@ function handleAdd() {
</script>
<template>
<el-dialog title="添加群组用户" width="800px" append-to-body @update:modelValue="value => $emit('update:modelValue', value)">
<el-dialog title="添加群组用户" width="980px" append-to-body @update:modelValue="value => $emit('update:modelValue', value)">
<el-form label-suffix=":" label-width="82px">
<el-row>
<el-col :span="8">
......
......@@ -2,12 +2,13 @@
import type { Group } from '../types'
import type { FormInstance, FormRules } from 'element-plus'
import { ElMessage } from 'element-plus'
import { updateStatusRuleList, dateUnitList, weekList } from '@/utils/dictionary'
import { createStaticGroup, updateStaticGroup, createDynamicGroup, updateDynamicGroup, getGroupInfo } from '../api'
import { getNameByValue, updateStatusRuleList, dateUnitList, weekList, groupTypeList } from '@/utils/dictionary'
import { createStaticGroup, updateStaticGroup, createDynamicGroup, updateDynamicGroup, getGroupInfo, createRFMGroup, updateRFMGroup } from '../api'
import UserRule from '@/components/rule/UserRule.vue'
import EventRule from '@/components/rule/EventRule.vue'
import LabelRule from '@/components/rule/LabelRule.vue'
import UserActionRule from '@/components/rule/UserActionRule.vue'
import RFMRule from '@/components/rule/RFMRule.vue'
import { pick } from 'lodash-es'
interface Props {
......@@ -20,16 +21,13 @@ const emit = defineEmits<{
(e: 'update:modelValue', visible: boolean): void
}>()
const isUpdate = $computed(() => !!props.data?.id)
const title = $computed(() => {
if (isUpdate) {
return props.data.type === '1' ? '修改静态群组' : '修改动态群组'
} else {
return props.data.type === '1' ? '新建静态群组' : '新建动态群组'
}
const isUpdate = computed(() => !!props.data?.id)
const title = computed(() => {
const typeName = getNameByValue(props.data.type as string, groupTypeList)
return isUpdate.value ? `修改${typeName}` : `新建${typeName}`
})
const formRef = $ref<FormInstance>()
const formRef = ref<FormInstance>()
const form: any = reactive({
id: '',
name: '',
......@@ -40,30 +38,20 @@ const form: any = reactive({
user_attr_rule: { current_logic_operate: 'and', items: [] },
event_attr_rule: { current_logic_operate: 'and', items: [] },
tag_rule: { current_logic_operate: 'and', items: [] },
user_action_rule: { current_logic_operate: 'and', items: [] }
})
watchEffect(() => {
if (props.data?.id) {
let updateRule = { type: 1, info: 1 }
try {
updateRule = JSON.parse(props.data.update_rule as string)
} catch (error) {
console.log(error)
}
Object.assign(form, props.data, { update_rule: updateRule })
}
user_action_rule: { current_logic_operate: 'and', items: [] },
rules: { R: {}, F: {}, M: {} }
})
function fetchInfo() {
if (!props.data.id) return
getGroupInfo({ id: props.data.id }).then(res => {
const { detail } = res.data
const [user_attr_rule = { current_logic_operate: 'and', items: [] }] = detail.user_attr_rule
const [event_attr_rule = { current_logic_operate: 'and', items: [] }] = detail.event_attr_rule
const [tag_rule = { current_logic_operate: 'and', items: [] }] = detail.tag_rule.map((item: any) => {
return { ...item, items: item.items.map((item: any) => item.id) }
})
const [user_attr_rule = { current_logic_operate: 'and', items: [] }] = detail.user_attr_rule || []
const [event_attr_rule = { current_logic_operate: 'and', items: [] }] = detail.event_attr_rule || []
const [tag_rule = { current_logic_operate: 'and', items: [] }] =
detail.tag_rule?.map((item: any) => {
return { ...item, items: item.items.map((item: any) => item.id) }
}) || []
const attrRuleItems = user_attr_rule.items.map((item: any) => {
item.value = ['in', 'not in'].includes(item.operate) ? item.value.split(',') : item.value
return item
......@@ -73,11 +61,10 @@ function fetchInfo() {
return item
})
Object.assign(form, {
Object.assign(form, detail, {
user_attr_rule: { ...user_attr_rule, attrRuleItems },
event_attr_rule: { ...event_attr_rule, eventRuleItems },
tag_rule,
user_action_rule: detail.user_action_rule
tag_rule
})
})
}
......@@ -85,13 +72,12 @@ function fetchInfo() {
watchEffect(() => fetchInfo())
const rules = ref<FormRules>({
name: [{ required: true, message: '请输入群组名称' }],
url: [{ required: true, message: '请选择标签类型图标' }]
name: [{ required: true, message: '请输入群组名称' }]
})
// 提交
function handleSubmit() {
formRef?.validate().then(() => (isUpdate ? handleUpdate() : handleCreate()))
formRef.value?.validate().then(() => (isUpdate.value ? handleUpdate() : handleCreate()))
}
// 新建
async function handleCreate() {
......@@ -99,7 +85,7 @@ async function handleCreate() {
// 静态群组
const params = pick(form, ['name', 'status'])
await createStaticGroup(params)
} else {
} else if (props.data.type === '2') {
// 动态群组
const params = pick(
{
......@@ -109,9 +95,20 @@ async function handleCreate() {
event_attr_rule: JSON.stringify([form.event_attr_rule]),
tag_rule: JSON.stringify([form.tag_rule])
},
['name', 'update_status', 'update_rule', 'user_attr_rule', 'event_attr_rule', 'tag_rule', 'user_action_rule', 'status']
['name', 'status', 'update_status', 'update_rule', 'user_attr_rule', 'event_attr_rule', 'tag_rule', 'user_action_rule']
)
await createDynamicGroup(params)
} else {
// RFM群组
const params = pick(
{
...form,
update_rule: JSON.stringify(form.update_rule),
rules: JSON.stringify(form.rules)
},
['name', 'status', 'update_status', 'update_rule', 'rules']
)
await createRFMGroup(params)
}
ElMessage({ message: '创建成功', type: 'success' })
emit('update')
......@@ -123,7 +120,8 @@ async function handleUpdate() {
// 静态群组
const params = pick(form, ['id', 'name', 'status'])
await updateStaticGroup(params)
} else {
} else if (props.data.type === '2') {
// 动态群组
const attrRuleItems = form.user_attr_rule.items.map((item: any) => {
item.value = Array.isArray(item.value) ? item.value.join(',') : item.value
return item
......@@ -142,9 +140,20 @@ async function handleUpdate() {
tag_rule: JSON.stringify([form.tag_rule]),
user_action_rule: JSON.stringify(form.user_action_rule)
},
['id', 'name', 'update_status', 'update_rule', 'user_attr_rule', 'event_attr_rule', 'tag_rule', 'user_action_rule', 'status']
['id', 'name', 'status', 'update_status', 'update_rule', 'user_attr_rule', 'event_attr_rule', 'tag_rule', 'user_action_rule']
)
await updateDynamicGroup(params)
} else {
// RFM群组
const params = pick({ ...form, update_rule: JSON.stringify(form.update_rule), rules: JSON.stringify(form.rules) }, [
'id',
'name',
'status',
'update_status',
'update_rule',
'rules'
])
await updateRFMGroup(params)
}
ElMessage({ message: '修改成功', type: 'success' })
emit('update')
......@@ -153,12 +162,12 @@ async function handleUpdate() {
</script>
<template>
<el-dialog :title="title" :close-on-click-modal="false" width="800px" @update:modelValue="value => $emit('update:modelValue', value)">
<el-dialog :title="title" :close-on-click-modal="false" width="980px" @update:modelValue="value => $emit('update:modelValue', value)">
<el-form ref="formRef" :model="form" :rules="rules" label-suffix=":" label-width="100px">
<el-form-item label="群组名称" prop="name">
<el-input v-model="form.name" placeholder="请输入" />
</el-form-item>
<template v-if="data.type === '2'">
<template v-if="data.type !== '1'">
<el-form-item label="更新频率" prop="update_status">
<el-radio-group v-model="form.update_status">
<el-radio v-for="item in updateStatusRuleList" :key="item.value" :value="item.value" :disabled="item.value === '1'">
......@@ -202,6 +211,9 @@ async function handleUpdate() {
<LabelRule v-model="form.tag_rule" style="margin-top: 20px"></LabelRule>
<UserActionRule v-model="form.user_action_rule" style="margin-top: 20px"></UserActionRule>
</template>
<template v-if="data.type === '3'">
<RFMRule v-model="form.rules"></RFMRule>
</template>
</el-form>
<template #footer>
<el-row justify="center">
......
......@@ -99,7 +99,7 @@ function handleRefresh() {
</script>
<template>
<el-dialog title="查看群组信息" width="800px" @update:modelValue="value => $emit('update:modelValue', value)">
<el-dialog title="查看群组信息" width="980px" @update:modelValue="value => $emit('update:modelValue', value)">
<el-form label-suffix=":" label-width="82px">
<el-row>
<el-col :span="12">
......
......@@ -3,9 +3,8 @@ import type { Operator } from '@/types'
export interface Group {
id: string
name: string
type_id: string
status: string
type: '1' | '2'
type: '1' | '2' | '3'
update_status: string // '1' | '2'
update_rule: string
created_time: string
......@@ -16,6 +15,7 @@ export interface Group {
event_attr_rule?: string
tag_rule?: string
record?: any
rules?: string
}
export type GroupListRequest = Pick<Group, 'id' | 'name'> & { experiment_id?: string }
......@@ -35,6 +35,11 @@ export type DynamicGroupUpdateRequest = Pick<
}
export type DynamicGroupCreateRequest = Omit<DynamicGroupUpdateRequest, 'id'>
// RFM群组
export type RFMGroupUpdateRequest = Pick<Group, 'id' | 'name' | 'update_status' | 'update_rule' | 'rules' | 'status'> & {
experiment_id?: string
}
export type RFMGroupCreateRequest = Omit<RFMGroupUpdateRequest, 'id'>
export interface GroupMember {
id: string
name: string
......
......@@ -82,7 +82,7 @@ let formVisible = $ref(false)
let currentRow = $ref<Partial<Group>>()
// 新建
function handleAdd(type: '1' | '2') {
function handleAdd(type: '1' | '2' | '3') {
currentRow = { type }
formVisible = true
}
......@@ -120,6 +120,7 @@ function handleView(row: Group) {
<el-dropdown-menu>
<el-dropdown-item @click="handleAdd('2')">新建动态群组</el-dropdown-item>
<el-dropdown-item @click="handleAdd('1')">新建静态群组</el-dropdown-item>
<el-dropdown-item @click="handleAdd('3')">新建RFM群组</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
......@@ -147,19 +148,13 @@ function handleView(row: Group) {
v-permission="['experiment_group_create_dynamic_group', 'experiment_group_update_static_group']"
>编辑</el-button
>
<el-button type="primary" plain @click="handleRemove([row])" v-permission="'experiment_group_delete'"
>删除</el-button
>
<el-button type="primary" plain @click="handleRemove([row])" v-permission="'experiment_group_delete'">删除</el-button>
</template>
</AppList>
</AppCard>
<!-- 新建/修改群组 -->
<FormDialog
v-model="formVisible"
:data="currentRow"
@update="handleRefresh"
v-if="formVisible && currentRow"></FormDialog>
<FormDialog v-model="formVisible" :data="currentRow" @update="handleRefresh" v-if="formVisible && currentRow"></FormDialog>
<!-- 查看 -->
<ViewDialog v-model="viewVisible" :data="(currentRow as Group)" v-if="viewVisible && currentRow"></ViewDialog>
</template>
......@@ -3,7 +3,8 @@ import { useMapStore } from '@/stores/map'
import { getNameByValue, materialMethodList } from '@/utils/dictionary'
import AppUpload from '@/components/base/AppUpload.vue'
import AIChat from './AIChat.vue'
import ChuangKitDesign from './ChuangKitDesign.vue'
const ChuangKitDesign = defineAsyncComponent(() => import('./ChuangKitDesign.vue'))
defineProps(['action'])
......@@ -62,7 +63,7 @@ const designVisible = ref(false)
<div>
<!-- 图片|二维码|小程序|卡券 -->
<AppUpload v-model="form.content" accept="image/*"></AppUpload>
<el-button type="primary" @click="designVisible = true" v-if="form.way == 3">打开编辑器</el-button>
<el-button type="primary" @click="designVisible = true" style="width: 178px" v-if="form.way == 3">打开编辑器</el-button>
</div>
</template>
<template v-if="form.type == 3">
......
......@@ -16,7 +16,8 @@ export const tripTemplateTypeList = [
// 群组类型
export const groupTypeList = [
{ label: '静态群组', value: '1' },
{ label: '动态群组', value: '2' }
{ label: '动态群组', value: '2' },
{ label: 'RFM群组', value: '3' }
]
// 更新方式
......@@ -101,8 +102,8 @@ export const labelList = [
{ label: '事件偏好标签 ', value: '2' },
{ label: '事件指标标签 ', value: '3' },
{ label: '自定义标签', value: '7' },
{ label: '分层标签 ', value: '1' },
{ label: 'RFM模型标签 ', value: '4' }
{ label: '分层标签 ', value: '1' }
// { label: 'RFM模型标签 ', value: '4' }
]
export const wayList = [
......@@ -113,7 +114,8 @@ export const wayList = [
export const materialMethodList = [
{ label: '离线上传 ', value: '2' },
{ label: '在线AI ', value: '1' }
{ label: '在线AI', value: '1' }
// { label: '在线设计', value: '3' }
]
// 使用场景
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论