Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
marketing
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
marketing-web
marketing
Commits
b8db235a
Commit
b8db235a
authored
Sep 21, 2022
by
黄冷
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update: dist
parent
336b6020
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
7 additions
and
778 deletions
+7
-778
index.js
src/components/dm-new-member-group/index.js
+0
-13
index.vue
src/components/dm-new-member-group/index.vue
+0
-384
readme.md
src/components/dm-new-member-group/readme.md
+0
-20
table.vue
src/components/dm-new-member-group/table.vue
+0
-239
createParams.js
src/components/dm-new-rule/createParams.js
+0
-77
new-rule.vue
src/components/dm-new-rule/new-rule.vue
+0
-14
readme.md
src/components/dm-new-rule/readme.md
+0
-18
ruleFilter.vue
src/components/dm-new-rule/ruleFilter.vue
+0
-0
activity-info.vue
src/views/ai/ai-data-report/activity-info.vue
+2
-3
form.vue
src/views/ai/task/form.vue
+4
-5
info.vue
src/views/ai/task/info.vue
+1
-5
No files found.
src/components/dm-new-member-group/index.js
deleted
100644 → 0
View file @
336b6020
import
gicNewMemberGroup
from
'./index.vue'
;
// 导入组件
// gicNewMemberGroup.install = function(Vue) {
// Vue.component(gicNewMemberGroup.name, gicNewMemberGroup);
// };
// if (typeof window !== 'undefined' && window.Vue) {
// window.Vue.use(gicNewMemberGroup);
// }
export
let
baseUrl
=
''
;
export
default
gicNewMemberGroup
;
src/components/dm-new-member-group/index.vue
deleted
100644 → 0
View file @
336b6020
<
template
>
<div
class=
"member-group-container"
>
<div
class=
"echo-member-group"
v-if=
"echoFlag"
>
<div
class=
"mini-sub-title"
>
<div
class=
"line"
></div>
<div
class=
"text"
>
<div
class=
"space-between"
>
已选分组
<span
v-if=
"!onlyRead"
><el-button
type=
"text"
class=
"delBtn"
@
click=
"del"
>
删除
</el-button><el-button
type=
"text"
@
click=
"edit"
>
编辑
</el-button></span>
</div>
</div>
</div>
<div
class=
"echoLine"
v-for=
"item in defaultSelected"
:key=
"item.memberTagGroupId"
>
<div
class=
"dot"
></div>
<el-tag
size=
"mini"
v-if=
"item.isRealTime"
>
实时
</el-tag>
<el-tag
size=
"mini"
type=
"warning"
v-else
>
非实时
</el-tag>
<span
class=
"groupName"
>
{{
item
.
groupName
}}
</span>
</div>
</div>
<el-dialog
title=
"选择客户分组"
:visible
.
sync=
"visiable"
width=
"1000px"
:before-close=
"close"
custom-class=
"custom-class-dialog"
class=
"dialog-wrap"
>
<div
class=
"member-group"
>
<div
class=
"left"
>
<el-tabs
v-model=
"activeName"
>
<el-tab-pane
:label=
"item.label"
v-for=
"item in options"
:name=
"item.name"
:key=
"item.name"
>
<tableComponent
:ref=
"`table$
{item.name}`" :name="item.name" :creatorId="creatorId" :key="visiable" :realTimeType="realTimeType" :activeName="activeName" :selected="selectedArray" @handleSelectionChange="handleSelectionChange" @deleteRow="deleteRow" />
</el-tab-pane>
</el-tabs>
</div>
<div
class=
"right"
>
<div
class=
"right-top"
>
已选分组
</div>
<ul
class=
"right-content"
>
<li
class=
"contact-li"
v-for=
"item in selectedArray"
:key=
"item.memberTagGroupId"
>
<div
class=
"li-cell cursor-pointer"
>
<div>
<el-tag
size=
"mini"
v-if=
"item.isRealTime"
>
实时
</el-tag>
<el-tag
size=
"mini"
type=
"warning"
v-else
>
非实时
</el-tag>
<span
class=
"groupName"
>
{{
item
.
groupName
}}
</span>
</div>
<i
class=
"el-icon-close"
@
click=
"deleteRow(item)"
></i>
</div>
</li>
</ul>
</div>
</div>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"close"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"confirm"
>
确定
</el-button>
</div>
</el-dialog>
</div>
</
template
>
<
script
>
import
{
baseUrl
}
from
'./index.js'
;
import
table
from
'./table'
;
export
default
{
name
:
'gic-new-member-group'
,
props
:
{
selectedIds
:
{
type
:
String
,
default
:
''
},
visiable
:
{
type
:
Boolean
,
default
:
false
},
projectName
:
{
type
:
String
,
default
:
'memberTag'
},
creatorId
:
{
type
:
String
,
default
:
''
// require: true
},
maxLimit
:
{
type
:
Number
,
default
:
5
},
showTabs
:
{
// 展示哪些tab
type
:
Array
,
default
:
()
=>
[
0
,
1
,
2
]
},
realTimeType
:
{
// 实时与非实时分组的可选
// 0:可选非实时分组 1:可选实时分组
type
:
Array
,
default
:
()
=>
[
0
,
1
]
},
onlyRead
:
{
type
:
Boolean
,
default
:
false
}
},
components
:
{
tableComponent
:
table
},
data
()
{
return
{
activeName
:
0
,
//0 我的客户分组 1固化分组 2金字塔会员分层
baseUrl
,
echoFlag
:
false
,
selected
:
{},
optionsVal
:
[
{
name
:
0
,
label
:
'我的客户分组'
},
{
name
:
1
,
label
:
'固化分组'
},
{
name
:
2
,
label
:
'金字塔会员分层'
}
],
options
:
[
{
name
:
0
,
label
:
'我的客户分组'
},
{
name
:
1
,
label
:
'固化分组'
},
{
name
:
2
,
label
:
'金字塔会员分层'
}
]
};
},
mounted
()
{
document
.
addEventListener
(
'visibilitychange'
,
()
=>
{
if
(
!
document
.
hidden
)
{
try
{
this
.
$refs
[
`table
${
this
.
activeName
}
`
][
0
].
getGroupList
();
}
catch
(
e
)
{
return
null
;
}
}
});
},
computed
:
{
selectedArray
()
{
let
arr
=
[];
Object
.
keys
(
this
.
selected
).
forEach
(
item
=>
{
arr
.
push
(
this
.
selected
[
item
]);
});
return
arr
;
}
},
watch
:
{
selectedIds
:
{
immediate
:
true
,
handler
(
val
)
{
if
(
val
.
length
)
{
this
.
echoFlag
=
true
;
this
.
getDefaultSelected
(
val
);
}
}
},
visiable
(
val
)
{
if
(
val
&&
this
.
selectedIds
)
{
this
.
getDefaultSelected
(
this
.
selectedIds
);
}
},
showTabs
:
{
immediate
:
true
,
handler
(
val
)
{
console
.
log
(
val
);
let
arr
=
this
.
optionsVal
;
if
(
val
&&
val
.
length
)
{
arr
=
this
.
optionsVal
.
filter
(
item
=>
val
.
includes
(
item
.
name
));
}
this
.
options
=
arr
;
}
}
},
methods
:
{
getDefaultSelected
(
val
)
{
this
.
axios
.
get
(
`
${
this
.
baseUrl
}
/gic-member-tag-web/member-tag-group/queryGroupByIds?requestProject=
${
this
.
projectName
}
&memberTagGroupIds=
${
val
}
`
).
then
(
res
=>
{
if
(
res
.
data
.
errorCode
==
0
)
{
this
.
defaultSelected
=
res
.
data
.
result
;
this
.
handleSelectionChange
(
this
.
defaultSelected
);
}
});
},
confirm
()
{
if
(
!
Object
.
keys
(
this
.
selected
).
length
)
{
this
.
$message
.
warning
(
'请选择分组'
);
return
;
}
let
arr
=
[];
Object
.
keys
(
this
.
selected
).
forEach
(
key
=>
{
arr
.
push
(
this
.
selected
[
key
]);
});
const
str
=
arr
.
map
(
item
=>
item
.
memberTagGroupId
).
join
(
','
);
if
(
arr
.
length
)
{
this
.
echoFlag
=
true
;
}
else
{
this
.
echoFlag
=
false
;
}
this
.
initPage
();
this
.
$emit
(
'change'
,
arr
,
str
);
// 被选中数组,数组id的字符串
},
close
()
{
Object
.
keys
(
this
.
selected
).
forEach
(
key
=>
{
this
.
deleteRow
(
this
.
selected
[
key
]);
});
this
.
initPage
();
},
initPage
()
{
this
.
activeName
=
'0'
;
this
.
$emit
(
'update:visiable'
,
false
);
},
del
()
{
this
.
selected
=
{};
this
.
$emit
(
'change'
,
[],
''
);
this
.
echoFlag
=
false
;
},
edit
()
{
this
.
$emit
(
'update:visiable'
,
true
);
},
handleSelectionChange
(
val
)
{
const
obj
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
selected
));
if
(
val
.
length
)
{
val
.
forEach
(
item
=>
{
obj
[
item
.
memberTagGroupId
]
=
item
;
});
if
(
Object
.
keys
(
obj
).
length
>
this
.
maxLimit
)
{
this
.
deleteRow
(
val
[
val
.
length
-
1
]);
this
.
$message
.
error
(
`最多支持选择
${
this
.
maxLimit
}
个分组`
);
return
false
;
}
}
this
.
selected
=
obj
;
},
deleteRow
(
row
)
{
console
.
log
(
this
.
activeName
);
console
.
log
(
this
.
$refs
);
delete
this
.
selected
[
row
.
memberTagGroupId
];
this
.
selected
=
Object
.
assign
({},
this
.
selected
);
this
.
$refs
[
`table
${
this
.
activeName
}
`
][
0
].
$refs
.
table
.
toggleRowSelection
(
row
,
false
);
}
}
};
</
script
>
<
style
lang=
"scss"
scoped
>
.delBtn
{
color
:
#f5222d
;
}
.space-between
{
display
:
flex
;
justify-content
:
space-between
;
}
.subTitle
{
width
:
100%
;
height
:
40px
;
display
:
flex
;
box-sizing
:
border-box
;
align-items
:
center
;
margin-bottom
:
5px
;
.line
{
width
:
2px
;
height
:
14px
;
background
:
#2f54eb
;
margin-right
:
8px
;
}
.text
{
font-size
:
14px
;
color
:
#303133
;
width
:
100%
;
}
}
.member-group-container
{
width
:
400px
;
}
.echo-member-group
{
width
:
100%
;
background
:
#f7f8fa
;
border-radius
:
4px
;
padding
:
0
16px
16px
;
box-sizing
:
border-box
;
.echoLine
{
margin-bottom
:
8px
;
line-height
:
20px
;
.dot
{
display
:
inline-block
;
width
:
6px
;
height
:
6px
;
background
:
#2f54eb
;
border-radius
:
3px
;
margin-right
:
6px
;
}
.groupName
{
font-weight
:
400
;
}
&
:last-child
{
margin-bottom
:
0
;
}
}
}
.member-group
{
background
:
#ffffff
;
display
:
flex
;
.left
{
width
:
666px
;
height
:
560px
;
border-radius
:
4px
;
border
:
1px
solid
#dcdfe6
;
padding
:
5px
17px
;
box-sizing
:
border-box
;
/deep/
.el-table
th.el-table__cell
{
line-height
:
1
;
}
}
.right
{
width
:
274px
;
//
height
:
582px
;
border-radius
:
4px
;
border
:
1px
solid
#dcdfe6
;
margin-left
:
12px
;
.right-top
{
padding
:
20px
15px
;
display
:
flex
;
justify-content
:
space-between
;
color
:
#303133
;
box-sizing
:
border-box
;
line-height
:
20px
;
background
:
#fff
;
}
.right-content
{
color
:
#303133
;
overflow-y
:
auto
;
height
:
89%
;
}
.contact-li
{
padding
:
0
12px
0
16px
;
margin-top
:
4px
;
&:hover
{
background
:
#f7f8fa
;
}
&
:first-child
{
margin-top
:
0
;
}
.li-cell
{
border-radius
:
2px
;
line-height
:
32px
;
display
:
inline-flex
;
width
:
100%
;
justify-content
:
space-between
;
align-items
:
center
;
box-sizing
:
border-box
;
i
{
width
:
20px
;
height
:
20px
;
border-radius
:
10px
;
cursor
:
pointer
;
font-size
:
12px
;
display
:
inline-flex
;
justify-content
:
center
;
align-items
:
center
;
&:hover
{
background
:
#e5e6eb
;
}
}
}
}
.contact-li
+
.contact-li
{
margin-top
:
4px
;
}
}
}
</
style
>
src/components/dm-new-member-group/readme.md
deleted
100644 → 0
View file @
336b6020
客户分组
# 业务props
| 参数 | 说明 | 类型 | 默认值 | 是否必传 |
| - | - | - | - | - |
| selectedIds | 所选择的分组id | String | '' | 否 |
| visiable | 是否展示筛选器弹窗 | Boolean | false | 否 |
| projectName | 项目名称 | String | 'memberTag' | 否 |
| creatorId |创建人id | String | '' | 是 |
| maxLimit | 最大可选择分组个数 | Number | 5 | 否 |
| showTabs | 展示哪些tab 1:我的客户分组,2:固化分组,3:金字塔会员分层 | Array |
[
1,2,3
]
| 否 |
| onlyRead | 是否只读 | Boolean | false | 否 |
| realTimeType | 实时与非实时分组的可选
[
0:可选非实时分组 1:可选实时分组
]
| Array |
[
] | 否 |
```
```
# 更新日志:
v 1.0.0 新增筛选器 by黄冷
\ No newline at end of file
src/components/dm-new-member-group/table.vue
deleted
100644 → 0
View file @
336b6020
<
template
>
<div>
<div
class=
"leftHead"
>
<div
class=
"tips"
>
<li><span
class=
"dots"
></span>
选择多个分组时,会自动去重分组下的客户;
</li>
<li><span
class=
"dots"
></span>
非实时分组到期后,客户数据会清空,任务将不在继续执行;
</li>
</div>
<div
class=
"searchWrap"
>
<div><el-input
prefix-icon=
"el-icon-search"
v-model=
"dataSearch"
placeholder=
"请输入分组名称"
@
keyup
.
enter
.
native=
"search"
clearable
@
clear=
"search"
></el-input></div>
<div
class=
"btn"
><el-button
size=
"small"
type=
"primary"
@
click=
"addGroup"
>
新增分组
</el-button></div>
</div>
</div>
<el-table
:data=
"tableData"
ref=
"table"
style=
"width:100%"
v-loading=
"loading"
@
select=
"handleSelect"
height=
"355px"
@
selection-change=
"handleSelectionChange"
row-key=
"memberTagGroupId"
@
row-click=
"selectRow"
>
<el-table-column
type=
"selection"
width=
"55"
:selectable=
"selectable"
>
</el-table-column>
<el-table-column
label=
"分组名称"
min-width=
"180px"
prop=
"groupName"
>
<template
slot-scope=
"
{ row }">
<el-tooltip
:disabled=
"row.readyStatus == 1"
content=
"当前分组还未更新完成"
>
<div>
<el-tag
size=
"mini"
v-show=
"activeName != 2"
:type=
"!row.isRealTime ? 'warning' : ''"
>
{{
!
row
.
isRealTime
?
'非实时'
:
'实时'
}}
</el-tag>
{{
row
.
groupName
}}
</div>
</el-tooltip>
</
template
>
</el-table-column>
<el-table-column
label=
"最近更新时间"
v-if=
"activeName != 2"
min-width=
"120px"
prop=
"latestUpdateTime"
>
<
template
slot-scope=
"scope"
>
<p
class=
"h-18"
>
{{
scope
.
row
.
latestUpdateTime
|
formatTimeYMD
}}
</p>
<p
class=
"h-18"
>
{{
scope
.
row
.
latestUpdateTime
|
formatTimeHMS
}}
</p>
</
template
>
</el-table-column>
<el-table-column
label=
"到期时间"
v-if=
"activeName != 2"
min-width=
"120px"
>
<
template
slot-scope=
"{ row }"
>
<p
class=
"h-18"
v-if=
"!row.isRealTime"
>
{{
row
.
effectiveDate
|
formatTimeYMD
}}
</p>
<p
class=
"h-18"
v-else
>
--
</p>
<p
class=
"h-18"
v-if=
"!row.isRealTime"
>
{{
row
.
effectiveDate
|
formatTimeHMS
}}
</p>
<p
class=
"h-18"
v-else
>
--
</p>
</
template
>
</el-table-column>
</el-table>
<div
class=
"pageBtn"
>
<el-pagination
layout=
"prev, pager, next"
v-if=
"totalCount"
:total=
"totalCount"
:page-size=
"pageSize"
:current-page
.
sync=
"currentPage"
@
current-change=
"getGroupList"
>
</el-pagination>
</div>
</div>
</template>
<
script
>
import
{
baseUrl
}
from
'./index.js'
;
export
default
{
props
:
{
realTimeType
:
{
type
:
Array
,
default
:
()
=>
[
0
,
1
]
},
selected
:
{
type
:
Array
,
default
:
()
=>
[]
},
activeName
:
{
type
:
String
,
default
:
''
},
projectName
:
{
type
:
String
,
default
:
'memberTag'
},
creatorId
:
{
type
:
String
,
default
:
''
},
maxLimit
:
{
type
:
Number
},
name
:
{
type
:
[
String
,
Number
],
default
:
0
}
},
data
()
{
return
{
baseUrl
,
loading
:
false
,
tableData
:
[],
totalCount
:
0
,
pageSize
:
20
,
currentPage
:
1
,
dataSearch
:
''
,
fixedType
:
0
// 0普通的分组, 1固化分组 3固化分组分堆
};
},
filters
:
{
formatTimeYMD
(
data
)
{
return
data
&&
data
!=
'- -'
?
String
(
data
).
split
(
' '
)[
0
]
:
'--'
;
},
formatTimeHMS
(
data
)
{
return
data
&&
data
!=
'- -'
?
String
(
data
).
split
(
' '
)[
1
]
:
'--'
;
}
},
mounted
()
{
console
.
log
(
'mounted'
);
},
watch
:
{
tableData
(
val
)
{
if
(
!
val
.
length
)
return
;
this
.
$nextTick
(()
=>
{
if
(
!
this
.
selected
.
length
)
return
;
const
obj
=
{};
val
.
forEach
(
item
=>
{
obj
[
item
.
memberTagGroupId
]
=
item
;
});
this
.
selected
.
forEach
(
item
=>
{
obj
[
item
.
memberTagGroupId
]
&&
this
.
$refs
.
table
.
toggleRowSelection
(
obj
[
item
.
memberTagGroupId
]);
});
});
},
activeName
:
{
handler
(
val
)
{
if
(
val
==
'0'
&&
this
.
name
==
'0'
)
{
this
.
fixedType
=
0
;
this
.
getGroupList
();
}
else
if
(
val
==
'1'
&&
this
.
name
==
'1'
)
{
this
.
fixedType
=
1
;
this
.
getGroupList
();
}
else
if
(
val
==
'2'
&&
this
.
name
==
'2'
)
{
this
.
getGroupList
();
}
},
immediate
:
true
}
},
methods
:
{
selectable
(
row
)
{
return
row
.
readyStatus
==
1
&&
this
.
realTimeType
.
includes
(
row
.
isRealTime
);
},
addGroup
()
{
let
str
=
window
.
location
.
host
.
includes
(
'localhost'
)
?
'http://www.gicdev.com'
:
''
;
window
.
open
(
`
${
str
}
/member-tag/#/memberGroupEdit?refresh`
,
'_blank'
);
},
selectRow
(
row
)
{
if
(
this
.
realTimeType
.
some
(
el
=>
el
==
row
.
isRealTime
)
&&
row
.
readyStatus
==
1
)
{
if
(
this
.
selected
.
length
&&
this
.
selected
.
find
(
item
=>
item
.
memberTagGroupId
==
row
.
memberTagGroupId
))
{
this
.
$emit
(
'deleteRow'
,
row
);
}
else
{
this
.
$refs
.
table
.
toggleRowSelection
(
row
);
}
}
},
handleSelectionChange
(
val
)
{
if
(
val
.
length
)
{
this
.
$emit
(
'handleSelectionChange'
,
val
);
}
},
handleSelect
(
selection
,
row
)
{
if
(
this
.
selected
.
length
&&
this
.
selected
.
find
(
item
=>
item
.
memberTagGroupId
==
row
.
memberTagGroupId
))
{
this
.
$emit
(
'deleteRow'
,
row
);
}
},
search
()
{
this
.
currentPage
=
1
;
this
.
getGroupList
();
},
/**
* 获取 列表数据
*/
getGroupList
()
{
this
.
loading
=
true
;
this
.
tableData
=
[];
this
.
totalCount
=
0
;
let
url
=
`
${
this
.
baseUrl
}
/gic-member-tag-web/member-tag-group/findList.json?requestProject=
${
this
.
projectName
}
&fixedType=
${
this
.
fixedType
}
&creatorId=
${
this
.
creatorId
}
&pageSize=
${
this
.
pageSize
}
&pageNum=
${
this
.
currentPage
}
&groupName=
${
this
.
dataSearch
}
&effectiveStatus=1&permissionType=1`
;
if
(
this
.
activeName
==
'2'
)
{
url
=
`
${
this
.
baseUrl
}
/gic-member-tag-web/memberTagGrade/gradeGroupListV2?requestProject=
${
this
.
projectName
}
&pageSize=
${
this
.
pageSize
}
&pageNum=
${
this
.
currentPage
}
&groupName=
${
this
.
dataSearch
}
`
;
}
this
.
axios
.
get
(
url
)
.
then
(
res
=>
{
if
(
res
.
data
.
errorCode
==
0
)
{
res
.
data
.
result
.
result
.
forEach
(
item
=>
(
item
.
activeName
=
this
.
activeName
));
this
.
tableData
=
res
.
data
.
result
.
result
;
this
.
totalCount
=
res
.
data
.
result
.
totalCount
;
return
;
}
this
.
$message
.
error
({
duration
:
2000
,
message
:
res
.
data
.
message
});
})
.
catch
(
error
=>
{
this
.
$message
.
error
({
duration
:
2000
,
message
:
error
.
message
});
})
.
finally
(()
=>
{
this
.
loading
=
false
;
});
}
}
};
</
script
>
<
style
lang=
"scss"
scoped
>
.leftHead
{
.tips
{
padding-bottom
:
15px
;
li
{
display
:
flex
;
align-items
:
center
;
line-height
:
17px
;
&:last-child
{
margin-top
:
4px
;
}
}
.dots
{
width
:
5px
;
height
:
5px
;
background
:
#c4c6cf
;
display
:
inline-block
;
border-radius
:
2.5px
;
margin-right
:
6px
;
}
}
.searchWrap
{
display
:
flex
;
justify-content
:
space-between
;
margin-bottom
:
15px
;
/deep/
.el-input__inner
{
border-color
:
#dcdfe6
!important
;
}
}
}
.pageBtn
{
float
:
right
;
margin-top
:
5px
;
}
.h-18
{
line-height
:
18px
;
}
/
deep
/
.el-table__header
.el-checkbox
{
display
:
none
;
}
</
style
>
src/components/dm-new-rule/createParams.js
deleted
100644 → 0
View file @
336b6020
/**
* 解析property
* @param {Number | String} val property值,也可能是多个对应值之和
* @return {Object} map
* @return {Boolean} map.isCompute 是否是计算属性
* @return {Boolean} map.isField 是否是字段属性
* @return {Boolean} map.isValue 是否是值属性
* @return {Boolean} map.isCategray 是否是不是属性
* @return {Boolean} map.notProperty 是否是类别属性
*/
function
parseProperty
(
val
)
{
// 用二进制对应位上的1表示对应属性的开启状态
// {
// 1: '0001', // 计算属性
// 2: '0010', // 字段属性
// 4: '0100', // 值属性
// 8: '1000', // 不是属性
// 16: '00010000', // 类别属性
// }
// 将val转为二进制,来处理值之和的情况,例如:3 = 1 + 2 = 0001 + 0010 = 0011
// 然后再把二进制值的字符串转为数字,调转顺序,0 1转为bool
const
status
=
Number
(
val
)
.
toString
(
2
)
.
split
(
''
)
.
reverse
()
.
map
(
i
=>
i
==
1
);
// 根据上面的键值对表,从二进制最末一位开始,对应在数组里
const
keys
=
[
'isCompute'
,
'isField'
,
'isValue'
,
'isCategray'
,
'notProperty'
];
// 根据数组转换出状态结果
return
keys
.
reduce
((
map
,
key
,
index
)
=>
({
...
map
,
[
key
]:
!!
status
[
index
]
}),
{});
}
function
getParamsData
(
node
)
{
const
result
=
{
key
:
''
,
compute
:
''
,
value
:
''
};
const
property
=
parseProperty
(
node
.
property
);
if
(
property
.
isField
)
{
result
.
key
=
node
.
columnKey
;
// console.log(result.key)
}
// isCompute 是否是计算属性
// 计算属性的值来源:computeCharacter或是选择的值
if
(
property
.
isCompute
)
{
result
.
compute
=
node
.
computeCharacter
;
}
// notProperty 是否是类别属性
// 类别属性 dealkey有值就带上,和value key同级,如果没值要删掉
if
(
property
.
notProperty
&&
node
.
dealKey
)
{
result
.
dealKey
=
node
.
dealKey
;
}
result
.
value
=
node
.
value
;
return
{
type
:
'data'
,
data
:
result
};
}
/**
* @description 将数据转换成后端需要的数据、缩略信息数据
* @param {Object} data 选择好的筛选条件数据
* @return {Array} result.filterJson 后端需要的查询条件
* @return {Array} result.filterFrontShow 前端回显的数据
*/
const
transform
=
(
data
,
scenes
)
=>
{
const
result
=
{
filterJson
:
[],
// 后台需要的查询条件
filterFrontShow
:
[],
// 前端回显的数据
scenes
// 场景值 member02
};
const
obj
=
{
list
:
[],
type
:
'and'
};
let
filterFrontShow
=
[];
data
.
forEach
(
item
=>
{
if
(
!
item
.
value
)
return
;
obj
.
list
.
push
({
type
:
'or'
,
list
:
[
getParamsData
(
item
)]
});
filterFrontShow
.
push
(
item
);
});
result
.
filterJson
=
JSON
.
stringify
(
obj
);
result
.
filterFrontShow
=
JSON
.
stringify
(
filterFrontShow
);
return
{
data
:
result
,
bool
:
filterFrontShow
.
length
>
0
};
};
export
default
transform
;
src/components/dm-new-rule/new-rule.vue
deleted
100644 → 0
View file @
336b6020
<
template
>
<ruleFilter
:visiable
.
sync=
"ruleVisible"
@
save=
"handleRuleFilterSave"
:memberCrowdWidgetId=
"memberCrowdWidgetId"
/>
</
template
>
<
script
>
export
default
{
methods
:
{
/**id:筛选器id,data:保存筛选器时提交的参数 data.filterJson 后端需要的查询条件 data.filterFrontShow 前端回显的数据 */
handleRuleFilterSave
(
id
,
data
)
{
this
.
memberCrowdWidgetId
=
id
;
console
.
log
(
id
,
data
);
}
}
};
</
script
>
src/components/dm-new-rule/readme.md
deleted
100644 → 0
View file @
336b6020
规则筛选器
筛选条件:会员等级,金字塔会员分层,会员服务门店,会员类型
# 业务props
| 参数 | 说明 | 类型 | 默认值 | 是否必传 |
| - | - | - | - | - |
| visiable | 是否展示筛选器弹窗 | Boolean | false | 否 |
| memberCrowdWidgetId | 筛选器id | String | '' | 否 |
| hideId | get-screening-init-data返回的esScreeningWidgetChainId, 传入则隐藏该节点 | Array | '' | 否 |
| onlyRead | 是否只读 | Boolean | false | 否 |
| requestProject | 弹窗可见与否 | Boolean | false | 否 |
```
```
# 更新日志:
v 1.0.0 新增规则筛选器 by黄冷
\ No newline at end of file
src/components/dm-new-rule/ruleFilter.vue
deleted
100644 → 0
View file @
336b6020
This diff is collapsed.
Click to expand it.
src/views/ai/ai-data-report/activity-info.vue
View file @
b8db235a
...
...
@@ -30,7 +30,7 @@
</div>
<div
class=
"member-rule"
v-if=
"scene != 5"
>
<div
class=
"member-rule-title"
>
人群规则:
</div>
<
ruleFilter
class=
"member-rule-list"
v-if=
"activityInfo.memberType == 0"
:memberCrowdWidgetId=
"activityInfo.filterJson"
/>
<
gic-new-rule
class=
"member-rule-list"
v-if=
"activityInfo.memberType == 0"
:memberCrowdWidgetId=
"activityInfo.filterJson"
/>
<gic-new-member-group
class=
"member-rule-list"
v-if=
"activityInfo.memberType == 1"
:selected-ids=
"activityInfo.filterJson"
></gic-new-member-group>
</div>
<div
class=
"member-rule"
v-else
>
...
...
@@ -46,11 +46,10 @@
<
script
>
import
{
formatDateTimeByType
}
from
'@/utils/index.js'
;
import
{
getActivityInfo
}
from
'@/service/api/aiApi.js'
;
import
ruleFilter
from
'@/components/dm-new-rule/ruleFilter.vue'
;
export
default
{
name
:
'ActivityInfo'
,
components
:
{
ruleFilter
},
data
()
{
return
{
activityInfo
:
{},
...
...
src/views/ai/task/form.vue
View file @
b8db235a
...
...
@@ -40,7 +40,7 @@
<div
class=
"tips"
style=
"margin-bottom: 12px;"
v-if=
"form.scene == 1"
>
{{ memberCrowdWidgetId || selectedGroupIds ? '默认客户范围并且满足以下条件的客户' : form.memberType == 0 ? '默认为权限范围内,生日时间为生日范围内的全部客户' : '' }}
</div>
<div>
<el-button
v-if=
"form.memberType == 0 && !memberCrowdWidgetId && form.scene != 4"
size=
"small"
@
click=
"ruleVisible = true"
:disabled=
"disabled"
><i
class=
"iconfont fz14 icon-Plus"
></i>
添加其他条件
</el-button>
<
ruleFilter
:onlyRead=
"disabled"
v-show=
"form.memberType == 0 && form.scene != 4"
:visiable
.
sync=
"ruleVisible"
@
save=
"handleRuleFilterSave"
:memberCrowdWidgetId=
"memberCrowdWidgetId"
/>
<
gic-new-rule
:onlyRead=
"disabled"
v-show=
"form.memberType == 0 && form.scene != 4"
:visiable
.
sync=
"ruleVisible"
@
save=
"handleRuleFilterSave"
:memberCrowdWidgetId=
"memberCrowdWidgetId"
/>
<el-button
v-if=
"form.memberType == 1 && !selectedGroupIds"
size=
"small"
@
click=
"groupVisible = true"
:disabled=
"disabled"
>
添加分组
</el-button>
<gic-new-member-group
v-show=
"form.memberType == 1"
:showTabs=
"showTabs"
:onlyRead=
"disabled"
:visiable
.
sync=
"groupVisible"
:selectedIds=
"selectedGroupIds"
:realTimeType=
"[0, 1]"
@
change=
"confirmGroupDialog"
/>
</div>
...
...
@@ -61,7 +61,7 @@
<span
class=
"tips ml16"
>
输入100则查询有效消费次数大于等于 100 的客户
</span>
</div>
<el-button
size=
"small"
@
click=
"ruleVisible2 = true"
v-if=
"!memberCrowdWidgetId"
:disabled=
"disabled"
>
添加其它条件
</el-button>
<
ruleFilter
:onlyRead=
"disabled"
:visiable
.
sync=
"ruleVisible2"
@
save=
"handleRuleFilterSave"
:memberCrowdWidgetId=
"memberCrowdWidgetId"
:hideId=
"hideId"
/>
<
gic-new-rule
:onlyRead=
"disabled"
:visiable
.
sync=
"ruleVisible2"
@
save=
"handleRuleFilterSave"
:memberCrowdWidgetId=
"memberCrowdWidgetId"
:hideId=
"hideId"
/>
<span
class=
"tips ml10"
>
勾选消费条件后,添加规则不支持选择【金字塔分层】
</span>
</div>
</el-form-item>
...
...
@@ -289,7 +289,7 @@ import LibMessage from '@/views/ecm/marketing-event/components/lib-message.vue';
import
activeTime
from
'@/views/ai/task/components/activeTime.vue'
;
import
{
formatDateTimeByType
,
_debounce
}
from
'@/utils/index'
;
import
ruleFilter
from
'@/components/dm-new-rule/ruleFilter.vue'
;
export
default
{
mixins
:
[
filterAvater
],
data
()
{
...
...
@@ -520,8 +520,7 @@ export default {
birthSense
,
holidaySense
,
activeTime
,
LibMessage
,
ruleFilter
LibMessage
},
methods
:
{
async
getActivityDetail
(
activityId
)
{
...
...
src/views/ai/task/info.vue
View file @
b8db235a
...
...
@@ -49,7 +49,7 @@
>
条
</el-descriptions-item
>
</el-descriptions>
<
ruleFilter
v-show=
"form.memberType == 0 && memberCrowdWidgetId"
:memberCrowdWidgetId=
"memberCrowdWidgetId"
onlyRead
style=
"width:100%"
/>
<
gic-new-rule
v-show=
"form.memberType == 0 && memberCrowdWidgetId"
:memberCrowdWidgetId=
"memberCrowdWidgetId"
onlyRead
style=
"width:100%"
/>
<gic-new-member-group
v-show=
"form.memberType == 1"
:selectedIds=
"selectedGroupIds"
onlyRead
style=
"width:100%"
/>
</div>
<dm-sub-title
type=
"line"
>
外呼规则配置
</dm-sub-title>
...
...
@@ -146,7 +146,6 @@
</
template
>
<
script
>
import
ruleFilter
from
'@/components/dm-new-rule/ruleFilter.vue'
;
import
filterAvater
from
'@/mixins/filterAvater.js'
;
import
{
formatDateTimeByType
}
from
'@/utils/index.js'
;
import
{
getActivityDetail
,
aiDictList
,
templateList
,
getSmsTemplateEcho
}
from
'@/service/api/aiApi.js'
;
...
...
@@ -198,9 +197,6 @@ export default {
// this.getAiDictList();
this
.
getActivityDetail
(
this
.
$route
.
params
.
id
);
},
components
:
{
ruleFilter
},
filters
:
{
birthTypeFilter
(
val
)
{
let
str
=
''
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment