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

chore: 新增RFM群组

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