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
179b482d
Commit
179b482d
authored
Jul 26, 2022
by
crushh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update: dist
parent
d93b434a
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
86 additions
and
20 deletions
+86
-20
index.vue
src/components/member-info/index.vue
+5
-1
filterAvater.js
src/mixins/filterAvater.js
+3
-0
aiApi.js
src/service/api/aiApi.js
+3
-0
form.vue
src/views/ai/task/form.vue
+61
-10
info.vue
src/views/ai/task/info.vue
+1
-1
task.vue
src/views/ai/task/task.vue
+11
-6
current-list.vue
src/views/ecm/current-list.vue
+2
-2
No files found.
src/components/member-info/index.vue
View file @
179b482d
...
...
@@ -41,7 +41,7 @@
</div>
<span
slot=
"reference"
>
<a
:href=
"'/member/#/wechatmemberDetail?memberId=' + row.memberId"
target=
"_blank"
>
<img
class=
"vertical-middle table__avatar--40"
:src=
"filterAvatar(row.imageUrl)"
width=
"40"
height=
"40"
alt=
""
srcset=
""
/>
<img
v-if=
"showImg"
class=
"vertical-middle table__avatar--40"
:src=
"filterAvatar(row.imageUrl)"
width=
"40"
height=
"40"
alt=
""
srcset=
""
/>
<div
class=
"inline-block vertical-middle"
>
<p
class=
"table-name--ellipsis"
>
{{
row
.
memberName
||
'--'
}}
</p>
<p
class=
"table-name--ellipsis fz13"
>
{{
row
.
cardNum
||
'--'
}}
</p>
...
...
@@ -63,6 +63,10 @@ export default {
default
()
{
return
{};
}
},
showImg
:{
type
:
Boolean
,
default
:
true
}
},
data
()
{
...
...
src/mixins/filterAvater.js
View file @
179b482d
...
...
@@ -21,6 +21,9 @@ export default {
case
4
:
str
=
'客户复购'
;
break
;
case
5
:
str
=
'开卡场景'
;
break
;
case
0
:
str
=
'其它场景'
;
break
;
...
...
src/service/api/aiApi.js
View file @
179b482d
...
...
@@ -129,3 +129,6 @@ export const continueActivityPlan = params => requests('/api-marketing/ai/contin
// 【Ai活动计划】手动暂停活动计划
export
const
suspendActivityPlan
=
params
=>
requests
(
'/api-marketing/ai/suspend-activity-plan'
,
params
,
true
,
false
,
'get'
);
// 【Ai活动计划】非会员开卡 - 导入Excel
export
const
importAiCallPhone
=
params
=>
requests
(
'/api-marketing/ai/import-ai-call-phone'
,
params
,
true
);
src/views/ai/task/form.vue
View file @
179b482d
...
...
@@ -21,10 +21,10 @@
<div
class=
"section"
>
<birthSense
ref=
"activeTime1"
:data=
"birthTimeData"
v-show=
"form.scene == 1"
@
change=
"getMemberCount"
/>
<holidaySense
ref=
"activeTime2"
:data=
"holidayTimeData"
v-show=
"form.scene == 2"
@
change=
"getMemberCount"
/>
<activeTime
ref=
"activeTime"
:data=
"activeTimeData"
v-show=
"form.scene == 3 || form.scene == 4 || form.scene == 0"
:scene=
"scene"
@
change=
"getMemberCount"
/>
<activeTime
ref=
"activeTime"
:data=
"activeTimeData"
v-show=
"form.scene == 3 || form.scene == 4 || form.scene == 0
|| form.scene == 5
"
:scene=
"scene"
@
change=
"getMemberCount"
/>
</div>
<dm-sub-title
type=
"line"
>
人群规则
<span
class=
"tips ml20"
>
针对选择的客户仅会执行一次外呼任务。
</span></dm-sub-title>
<div
class=
"section"
>
<div
class=
"section"
v-if=
"form.scene != 5"
>
<el-form-item
prop=
"memberType"
required
>
<template
slot=
"label"
>
<span>
参与人群
</span>
...
...
@@ -65,16 +65,20 @@
<span
class=
"tips ml10"
>
勾选消费条件后,添加规则不支持选择【金字塔分层】
</span>
</div>
</el-form-item>
<el-form-item
label=
"预计覆盖人数"
>
<span
class=
"bold"
>
{{ planMemberCountShow }}
</span>
<span
class=
"tips ml20"
>
不包含无手机号的客户,以最终活动覆盖人数为准
</span>
</el-form-item>
</div>
<div
class=
"section"
v-else
>
<el-form-item
label=
"号码导入"
prop=
"phoneList"
>
<dm-import-file
ref=
"importFile"
:options=
"importFileOption"
></dm-import-file>
</el-form-item>
</div>
<dm-sub-title
type=
"line"
>
外呼规则配置
</dm-sub-title>
<div
class=
"section"
style=
"padding-bottom: 40px;"
>
<!--根据客户意向打标签 -->
<div
class=
"card"
>
<div
class=
"card"
v-if=
"form.scene != 5"
>
<div
class=
"tagHead"
>
<div
class=
"left"
>
<div
class=
"title"
>
根据客户意向打标签
</div>
...
...
@@ -257,6 +261,7 @@
</div>
</div>
<dm-form-bottom>
<el-button
@
click=
"handleImport"
>
test
</el-button>
<el-button
type=
"primary"
@
click=
"handleSubmit"
:loading=
"btnLoading"
>
保 存
</el-button>
</dm-form-bottom>
</el-form>
...
...
@@ -279,7 +284,7 @@
<
script
>
import
filterAvater
from
'@/mixins/filterAvater.js'
;
import
{
templateList
,
aiDictList
,
initActivity
,
getActivityDetail
,
getMemberCount
,
getAiCalcSingle
,
rechargeCenter
}
from
'@/service/api/aiApi.js'
;
import
{
templateList
,
aiDictList
,
initActivity
,
getActivityDetail
,
getMemberCount
,
getAiCalcSingle
,
rechargeCenter
,
importAiCallPhone
}
from
'@/service/api/aiApi.js'
;
import
birthSense
from
'@/views/ai/task/components/birthActiveTime.vue'
;
import
holidaySense
from
'@/views/ai/task/components/holidayActiveTime.vue'
;
import
LibMessage
from
'@/views/ecm/marketing-event/components/lib-message.vue'
;
...
...
@@ -314,6 +319,13 @@ export default {
cb
();
}
});
const
phoneListVal
=
(
rule
,
value
,
callback
)
=>
{
if
(
this
.
form
.
scene
==
5
&&
!
this
.
form
.
phoneList
.
length
)
{
return
callback
(
new
Error
(
'请上传文件'
));
}
callback
();
};
return
{
validateOption
,
validateVal
,
...
...
@@ -338,7 +350,8 @@ export default {
recallFlag
:
0
,
//是否根据未接通状态设置重拨
planMemberCount
:
'- -'
,
//覆盖人数
analyseDays
:
14
,
//分析天数
analyseAmount
:
''
//销售额
analyseAmount
:
''
,
//销售额
phoneList
:
[]
},
birthTimeData
:
{
// 生日场景 活动时间的回显
...
...
@@ -385,7 +398,8 @@ export default {
{
required
:
true
,
message
:
'活动目标不能为空'
},
{
type
:
'number'
,
message
:
'请输入长度不超过五位的正整数'
,
max
:
99999
,
min
:
1
}
],
memberType
:
{
required
:
true
,
validator
:
memberType
}
memberType
:
{
required
:
true
,
validator
:
memberType
},
phoneList
:
{
required
:
true
,
validator
:
phoneListVal
}
},
tagMatchList
:
[
// 打标签列表
...
...
@@ -427,6 +441,18 @@ export default {
3
:
'默认为未添加企微好友'
,
4
:
'默认为权限范围内'
,
0
:
'默认为权限范围内'
},
importFileOption
:
{
desc
:
'手机号数量单次最多不超过5000条,上传文件不能大于2M,支持格式:.xlsx、.xls、.csv'
,
maxSize
:
2097152
,
maxSizeDesc
:
'2M'
,
downloadTemplate
:
[
{
url
:
'/api-marketing/ai/download-import-ai-temp?requestProject=gic-web'
,
name
:
'下载模板'
}
]
}
};
},
...
...
@@ -605,10 +631,10 @@ export default {
});
}
}
this
.
handleImport
();
this
.
$refs
.
form
.
validate
(
async
(
val
,
obj
)
=>
{
console
.
log
(
val
,
obj
);
if
(
val
)
{
let
{
activityName
,
scene
,
analyseFlag
,
analyseDays
,
analyseAmount
,
planName
,
memberType
,
aiTemplateId
,
labelFlag
,
smsFlag
,
recallFlag
,
activityId
,
planId
,
aiEventId
,
eventId
,
planMemberCount
,
consume_days_flag
,
consume_days
,
consume_times_flag
,
consume_times
,
consume_amount_flag
,
consume_amount
}
=
this
.
form
;
let
{
phoneList
,
activityName
,
scene
,
analyseFlag
,
analyseDays
,
analyseAmount
,
planName
,
memberType
,
aiTemplateId
,
labelFlag
,
smsFlag
,
recallFlag
,
activityId
,
planId
,
aiEventId
,
eventId
,
planMemberCount
,
consume_days_flag
,
consume_days
,
consume_times_flag
,
consume_times
,
consume_amount_flag
,
consume_amount
}
=
this
.
form
;
let
sceneJson
=
{};
if
(
isNaN
(
planMemberCount
))
{
planMemberCount
=
0
;
...
...
@@ -642,6 +668,7 @@ export default {
startDate
,
endDate
,
analyseFlag
,
phoneList
:
scene
==
5
?
phoneList
:
undefined
,
analyseDays
:
analyseFlag
==
1
?
analyseDays
:
undefined
,
analyseAmount
:
analyseFlag
==
1
?
analyseAmount
:
undefined
,
activityPlanList
:
[
...
...
@@ -813,7 +840,31 @@ export default {
this
.
unitPrice
=
(
result
.
unit
/
1000
).
toFixed
(
2
);
console
.
log
(
this
.
unitPrice
);
},
async
handleImport
()
{
this
.
$refs
.
importFile
.
getFileData
().
then
(({
files
})
=>
{
const
[
file
]
=
files
;
const
formData
=
new
FormData
();
formData
.
append
(
'file'
,
file
);
formData
.
append
(
'requestProject'
,
'gic-web'
);
if
(
this
.
extendData
)
{
Object
.
keys
(
this
.
extendData
).
forEach
(
k
=>
{
formData
[
k
]
=
this
.
extendData
[
k
];
formData
.
append
(
k
,
this
.
extendData
[
k
]);
});
}
importAiCallPhone
(
formData
).
then
(
res
=>
{
const
{
phoneList
,
phoneCount
,
errorPhoneList
}
=
res
.
result
;
if
(
res
.
errorCode
==
0
)
{
this
.
form
.
phoneList
=
phoneList
;
if
(
errorPhoneList
&&
errorPhoneList
.
length
)
{
this
.
$message
.
error
(
`导入数据
${
phoneCount
}
条,其中
${
errorPhoneList
.
length
}
条号码格式有误,已过滤`
);
}
}
else
{
this
.
$message
.
error
(
res
.
data
.
message
);
}
});
});
},
handleChangeNum
:
_debounce
(
function
(
val
)
{
val
&&
this
.
getMemberCount
();
},
600
),
...
...
src/views/ai/task/info.vue
View file @
179b482d
...
...
@@ -29,7 +29,7 @@
<el-descriptions-item
label=
"外呼周期"
>
{{
holidayTimeData
.
activeTime
}}
</el-descriptions-item>
</el-descriptions>
</div>
<div
class=
"section"
v-if=
"form.scene == 3 || form.scene == 4 || form.scene == 0"
>
<div
class=
"section"
v-if=
"form.scene == 3 || form.scene == 4 || form.scene == 0
|| form.scene == 5
"
>
<el-descriptions
column=
"4"
>
<el-descriptions-item
label=
"外呼时段"
>
{{
activeTimeData
.
callTime
}}
</el-descriptions-item>
<el-descriptions-item
label=
"外呼周期"
>
{{
activeTimeData
.
activeTime
}}
</el-descriptions-item>
...
...
src/views/ai/task/task.vue
View file @
179b482d
...
...
@@ -242,6 +242,12 @@ export default {
scene
:
0
,
iconName
:
'icon-qitachangjing'
,
content
:
'自定义营销场景'
},
{
title
:
'开卡场景'
,
scene
:
5
,
iconName
:
'icon-kaika'
,
content
:
'针对非会员营销,提升开卡率'
}
],
optionScenes
:
[
...
...
@@ -489,7 +495,7 @@ export default {
});
},
handleSuspend
({
planId
})
{
this
.
$confirm
(
'任务正在进行中,暂停任务后,计划将
中止
'
,
'提示'
,
{
this
.
$confirm
(
'任务正在进行中,暂停任务后,计划将
暂停
'
,
'提示'
,
{
confirmButtonText
:
'暂停'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
...
...
@@ -562,17 +568,15 @@ export default {
margin
:
0
20px
;
.cardList
{
display
:
flex
;
flex-wrap
:
wrap
;
gap
:
12px
;
.card
{
width
:
20%
;
min-width
:
224px
;
height
:
140px
;
background
:
#f0f3fd
;
border-radius
:
4px
;
padding
:
12px
16px
;
box-sizing
:
border-box
;
margin-right
:
12px
;
&:last-child
{
margin-right
:
0
;
}
}
.cardTitle
{
i
{
...
...
@@ -592,6 +596,7 @@ export default {
font-size
:
14px
;
line-height
:
20px
;
height
:
40px
;
width
:
192px
;
color
:
#606266
;
}
}
...
...
src/views/ecm/current-list.vue
View file @
179b482d
...
...
@@ -76,7 +76,7 @@
<el-table-column
v-for=
"(v, i) in tableHeader"
:fixed=
"v.fixed"
:show-overflow-tooltip=
"v.tooltip"
:width=
"v.width"
:min-width=
"v.minWidth"
:align=
"v.align"
:key=
"i"
:prop=
"v.prop"
:label=
"v.label"
:formatter=
"v.formatter"
>
<
template
slot-scope=
"scope"
>
<span
v-if=
"v.formatter"
v-html=
"v.formatter(scope.row)"
></span>
<component
v-else-if=
"v.component"
:is=
"v.component"
:row=
"scope.row"
></component>
<component
v-else-if=
"v.component"
:is=
"v.component"
:row=
"scope.row"
:showImg=
"v.showImg"
></component>
<span
v-else
>
{{
scope
.
row
[
v
.
prop
]
||
'--'
}}
</span>
</
template
>
</el-table-column>
...
...
@@ -167,7 +167,7 @@ export default {
return
row
.
title
||
'--'
;
}
},
{
label
:
'会员信息'
,
prop
:
'marketingType'
,
minWidth
:
'120'
,
align
:
'left'
,
component
:
'member-info'
},
{
label
:
'会员信息'
,
prop
:
'marketingType'
,
minWidth
:
'120'
,
align
:
'left'
,
component
:
'member-info'
,
showImg
:
0
},
{
label
:
'手机号码'
,
prop
:
'phoneNumber'
,
minWidth
:
'120'
,
align
:
'left'
},
{
label
:
'主门店'
,
prop
:
'mainStoreName'
,
minWidth
:
'120'
,
align
:
'left'
},
{
label
:
'专属导购'
,
prop
:
'mainClerkName'
,
minWidth
:
'120'
,
align
:
'left'
},
...
...
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