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
8a33b5a2
Commit
8a33b5a2
authored
Apr 16, 2022
by
crushh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update: dist
parent
ec4ddc04
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
69 additions
and
72 deletions
+69
-72
index.html
index.html
+1
-1
defineTime.vue
src/views/ai/task/components/defineTime.vue
+1
-13
holidayActiveTime.vue
src/views/ai/task/components/holidayActiveTime.vue
+4
-3
form.vue
src/views/ai/task/form.vue
+17
-22
tagPop.vue
src/views/ai/task/tagPop.vue
+6
-1
task.vue
src/views/ai/task/task.vue
+40
-32
No files found.
index.html
View file @
8a33b5a2
...
...
@@ -13,7 +13,7 @@
<script
src=
"//at.alicdn.com/t/font_3229694_vfjtu9hqyrc.js"
></script>
<!--GIC3.0营销-->
<link
rel=
"stylesheet"
href=
"//at.alicdn.com/t/font_2996579_875h3lycepk.css"
>
<!-- 3.0企业 -->
<script
src=
"//at.alicdn.com/t/font_2996579_875h3lycepk.js"
></script>
<!-- 3.0企业 -->
<script
src=
"//at.alicdn.com/t/font_2859043_
i7b45sfe90d.j
s"
></script>
<!--3.0组件库-->
<script
src=
"//at.alicdn.com/t/font_2859043_
udehp133w1.cs
s"
></script>
<!--3.0组件库-->
<!-- <link rel="stylesheet" href="//web-1251519181.file.myqcloud.com/components/element.2.12.0.css"> -->
<!-- element 皮肤 -->
<!-- <link rel="stylesheet" type="text/css" href="http://web-1251519181.file.myqcloud.com/lib/elementUI/theme.1.0.1/index.css"> -->
...
...
src/views/ai/task/components/defineTime.vue
View file @
8a33b5a2
...
...
@@ -130,7 +130,6 @@ export default {
this
.
form
.
timeRangeList
.
forEach
(
item
=>
{
let
end
=
new
Date
(
new
Date
().
toLocaleDateString
()
+
' '
+
item
.
endTime
).
getTime
();
let
start
=
new
Date
(
new
Date
().
toLocaleDateString
()
+
' '
+
item
.
startTime
).
getTime
();
console
.
log
(
start
,
end
);
minutes
=
(
end
-
start
)
/
60000
+
minutes
;
});
if
(
minutes
<
240
)
{
...
...
@@ -140,18 +139,7 @@ export default {
},
submit
()
{
return
new
Promise
(
resolve
=>
{
let
minutes
=
0
;
this
.
form
.
timeRangeList
.
forEach
(
item
=>
{
let
end
=
new
Date
(
new
Date
().
toLocaleDateString
()
+
' '
+
item
.
endTime
).
getTime
();
let
start
=
new
Date
(
new
Date
().
toLocaleDateString
()
+
' '
+
item
.
startTime
).
getTime
();
console
.
log
(
start
,
end
);
minutes
=
(
end
-
start
)
/
60000
+
minutes
;
});
if
(
minutes
<
240
)
{
this
.
$message
.
error
(
'自定义时段不少于4个小时'
);
resolve
(
false
);
return
;
}
this
.
handleCallTime
();
this
.
$refs
.
defineTime
.
validate
(
val
=>
{
if
(
val
)
{
resolve
(
this
.
form
);
...
...
src/views/ai/task/components/holidayActiveTime.vue
View file @
8a33b5a2
...
...
@@ -46,7 +46,7 @@
仅支持选择节日日期为最近1-60天内的节日
</div>
<div
class=
"holiday"
v-for=
"item in holidayData"
:key=
"item.id"
>
<dm-sub-title>
{{
item
.
name
}}
级
</dm-sub-title>
<dm-sub-title>
{{
item
.
name
}}
</dm-sub-title>
<div
class=
"radioLine"
>
<el-radio
v-model=
"selectedData"
:disabled=
"val.disabled"
:label=
"val"
v-for=
"val in item.holidaysList"
:key=
"val.id"
>
{{
val
.
name
}}
</el-radio>
</div>
...
...
@@ -94,7 +94,7 @@ export default {
holiday_date1
:
''
,
//节日活动场景特有值 节日日期
holiday_name2
:
''
,
// 节日活动场景特有值 节日名称
holiday_date2
:
''
,
//节日活动场景特有值 节日日期
holiday_day
:
' '
,
// 外呼时间
holiday_day
:
5
,
// 外呼时间
callFlag
:
0
,
//外呼时段 0 默认 1 自定义
callTime
:
[{}]
// 自定义时段
},
...
...
@@ -169,8 +169,9 @@ export default {
},
methods
:
{
handleHolidayDay
()
{
console
.
log
(
getTimesByReq
(
this
.
form
.
holiday_date
));
// 回显时 根据外呼周期和节日日期 算出外呼时间
this
.
form
.
holiday_day
=
(
(
getTimesByReq
(
this
.
form
.
holiday_date
)
-
this
.
form
.
startDate
)
/
24
)
*
60
*
60
*
1000
;
this
.
form
.
holiday_day
=
(
getTimesByReq
(
this
.
form
.
holiday_date
)
-
this
.
form
.
startDate
)
/
(
24
*
60
*
60
*
1000
)
;
},
hanldeHolidayDay
(
val
)
{
const
{
holiday_type
,
holiday_date1
,
holiday_date2
}
=
this
.
form
;
...
...
src/views/ai/task/form.vue
View file @
8a33b5a2
...
...
@@ -25,7 +25,13 @@
</div>
<dm-sub-title
type=
"line"
>
人群规则
<span
class=
"tips ml20"
>
针对选择的客户仅会执行一次外呼任务。
</span></dm-sub-title>
<div
class=
"section"
>
<el-form-item
label=
"参与人群"
prop=
"memberType"
required
>
<el-form-item
prop=
"memberType"
required
>
<template
slot=
"label"
>
<span>
参与人群
</span>
<el-tooltip
width=
"400"
placement=
"top-start"
content=
"系统每天凌晨根据此处配置来查询当天需要进行外呼的客户数据并固化下来。因此,若是在当天凌晨系统固化完外呼客户之后人群发生变化则不会已经固化的客户;"
>
<i
style=
"cursor:pointer;color:#c0c4cc;font-size:14px;"
class=
"el-icon-question"
></i>
</el-tooltip>
</
template
>
<el-radio-group
v-model=
"form.memberType"
@
change=
"getMemberCount"
>
<el-radio
:label=
"0"
>
客户筛选
</el-radio>
<el-radio
:label=
"1"
>
客户分组
</el-radio>
...
...
@@ -44,37 +50,23 @@
<el-form-item
v-if=
"form.scene == 4 && form.memberType == 0"
>
<div
class=
"consumeLine"
>
<el-checkbox
v-model=
"form.consume_days_flag"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledCheck"
@
change=
"handleLastconsume"
>
最近消费间隔 ≥
</el-checkbox>
<el-input-number
v-model=
"form.consume_days"
@
change=
"handleChangeNum(form.consume_days_flag)"
controls-position=
"right"
:max=
"730"
:min=
"30"
:precision=
"0"
size=
"small"
style=
"margin:0 10px;"
/>
天
<el-input-number
v-model=
"form.consume_days"
@
change=
"handleChangeNum(form.consume_days_flag)"
controls-position=
"right"
:max=
"730"
:min=
"30"
placeholder=
"30-730"
:precision=
"0"
size=
"small"
style=
"margin:0 10px;"
/>
天
<span
class=
"tips ml16"
>
输入30则查询30天以上未消费的客户
</span>
</div>
<div
class=
"consumeLine"
>
<el-checkbox
v-model=
"form.consume_times_flag"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledCheck"
@
change=
"handleLastconsume"
>
有效消费次数 ≥
</el-checkbox>
<el-input-number
v-model=
"form.consume_times"
@
change=
"handleChangeNum(form.consume_times_flag)"
controls-position=
"right"
:max=
"100"
:min=
"1"
:precision=
"0"
size=
"small"
style=
"margin:0 10px;"
/>
次
<el-input-number
v-model=
"form.consume_times"
@
change=
"handleChangeNum(form.consume_times_flag)"
controls-position=
"right"
:max=
"100"
:min=
"1"
placeholder=
"请输入1-100"
:precision=
"0"
size=
"small"
style=
"margin:0 10px;"
/>
次
<span
class=
"tips ml16"
>
输入1则查询有效消费次数大于等于 1 的客户
</span>
</div>
<div
class=
"consumeLine"
>
<el-checkbox
v-model=
"form.consume_amount_flag"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledCheck"
@
change=
"handleLastconsume"
>
累计消费金额 ≥
</el-checkbox>
<el-input-number
v-model=
"form.consume_amount"
@
change=
"handleChangeNum(form.consume_amount_flag)"
controls-position=
"right"
:precision=
"0"
:max=
"100000"
:min=
"1"
size=
"small"
style=
"margin:0 10px;"
/>
元
<el-input-number
v-model=
"form.consume_amount"
@
change=
"handleChangeNum(form.consume_amount_flag)"
controls-position=
"right"
placeholder=
"请输入1-100000"
:precision=
"0"
:max=
"100000"
:min=
"1"
size=
"small"
style=
"margin:0 10px;"
/>
元
<span
class=
"tips ml16"
>
输入100则查询有效消费次数大于等于 100 的客户
</span>
</div>
<el-button
size=
"small"
@
click=
"ruleVisible2 = true"
v-if=
"!memberCrowdWidgetId"
>
添加其它条件
</el-button>
<ruleFilter
:visiable
.
sync=
"ruleVisible2"
@
save=
"handleRuleFilterSave"
:memberCrowdWidgetId=
"memberCrowdWidgetId"
:hideId=
"hideId"
/>
<span
class=
"tips ml10"
>
勾选消费条件后,添加规则不支持选择【金字塔分层】
</span>
</el-form-item>
<!--
<el-form-item
label=
"消费条件"
v-if=
"form.scene == 4 && form.memberType == 1"
>
<div
class=
"consumeLine"
>
<el-checkbox
v-model=
"form.consume_days_flag1"
@
change=
"getMemberCount"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledCheck"
>
最近消费间隔
</el-checkbox>
<el-input-number
v-model=
"form.consume_days1"
@
change=
"handleChangeNum(form.consume_days_flag1)"
controls-position=
"right"
:max=
"730"
:precision=
"0"
:min=
"30"
size=
"small"
style=
"margin:0 10px;"
/>
天
</div>
<div
class=
"consumeLine"
>
<el-checkbox
v-model=
"form.consume_times_flag1"
@
change=
"getMemberCount"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledCheck"
>
有效消费次数
</el-checkbox>
<el-input-number
v-model=
"form.consume_times1"
@
change=
"handleChangeNum(form.consume_times_flag1)"
controls-position=
"right"
:max=
"100"
:precision=
"0"
:min=
"1"
size=
"small"
style=
"margin:0 10px;"
/>
次
</div>
<div
class=
"consumeLine"
>
<el-checkbox
v-model=
"form.consume_amount_flag1"
@
change=
"getMemberCount"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledCheck"
>
累计消费金额
</el-checkbox>
<el-input-number
v-model=
"form.consume_amount1"
@
change=
"handleChangeNum(form.consume_amount1)"
controls-position=
"right"
:max=
"100000"
:precision=
"0"
:min=
"1"
size=
"small"
style=
"margin:0 10px;"
/>
元
</div>
</el-form-item>
-->
<el-form-item
label=
"预计覆盖人数"
>
<span
class=
"bold"
>
{{ form.planMemberCount }}
</span>
<span
class=
"tips ml20"
>
不包含无手机号的客户,以最终活动覆盖人数为准
</span>
...
...
@@ -310,7 +302,6 @@ export default {
const
validateOption
=
(
item
,
bool
)
=>
({
required
:
true
,
validator
:
(
rule
,
_
,
cb
)
=>
{
console
.
log
(
item
);
if
(
bool
&&
item
&&
!
item
.
length
)
{
cb
(
new
Error
(
'请选择'
));
}
...
...
@@ -320,7 +311,6 @@ export default {
const
validateVal
=
(
item
,
bool
)
=>
({
required
:
true
,
validator
:
(
rule
,
_
,
cb
)
=>
{
console
.
log
(
item
);
if
(
bool
&&
!
item
)
{
cb
(
new
Error
(
'请选择'
));
}
...
...
@@ -586,7 +576,12 @@ export default {
const
{
startDate
,
endDate
,
callFlag
,
callTime
,
birth_type
,
birth_days
,
holiday_date
,
holiday_type
,
holiday_name
}
=
activeTimeData
;
if
(
new
Date
(
startDate
).
getFullYear
()
==
new
Date
().
getFullYear
()
&&
new
Date
(
startDate
).
getMonth
()
+
1
==
new
Date
().
getMonth
()
+
1
&&
new
Date
(
startDate
).
getDate
()
==
new
Date
().
getDate
())
{
if
(
callFlag
==
1
)
{
if
(
callFlag
==
0
)
{
if
(
new
Date
(
new
Date
().
toLocaleDateString
()
+
' '
+
'20:00'
).
getTime
()
<
new
Date
().
getTime
())
{
this
.
$message
.
error
(
'外呼时段的结束时间早于当前时间,今日营销人群无法执行外呼任务,请修改外呼时段'
);
return
;
}
}
else
if
(
callFlag
==
1
)
{
let
arr
=
callTime
.
map
(
item
=>
item
.
split
(
'-'
)[
1
]);
let
endTime
=
arr
.
reduce
((
p
,
v
)
=>
(
p
<
v
?
v
:
p
));
if
(
new
Date
(
new
Date
().
toLocaleDateString
()
+
' '
+
endTime
).
getTime
()
<
new
Date
().
getTime
())
{
...
...
@@ -903,7 +898,7 @@ export default {
padding
:
20px
0
18px
0
;
}
.card
{
width
:
730px
;
width
:
65%
;
background
:
#f7f8fa
;
border-radius
:
4px
;
box-sizing
:
border-box
;
...
...
src/views/ai/task/tagPop.vue
View file @
8a33b5a2
...
...
@@ -12,7 +12,7 @@
<div
class=
"radioContainer"
>
<div
v-for=
"item in valueList"
:key=
"item.tagId"
class=
"radioLine"
>
<div
class=
"lineTitle"
>
{{
item
.
tagName
}}
</div>
<el-radio
v-for=
"value in item.itemList"
:key=
"value.tagItemId"
:label=
"value"
v-model=
"select
edTag
"
>
{{
value
.
tagItemName
}}
</el-radio>
<el-radio
v-for=
"value in item.itemList"
:key=
"value.tagItemId"
:label=
"value"
v-model=
"select
Val"
@
change=
"val => handleChange(item.tagName, val)
"
>
{{
value
.
tagItemName
}}
</el-radio>
</div>
</div>
<dm-pagination
class=
"fr"
layout=
"prev, pager, next"
v-if=
"totalCount"
:total=
"totalCount"
:page-size=
"pageSize"
:current-page
.
sync=
"currentPage"
@
current-change=
"getPageMemberTagDetail"
>
</dm-pagination>
...
...
@@ -53,6 +53,7 @@ export default {
tagTwoLevelGroupId
:
''
,
isSync
:
false
},
selectVal
:
''
,
selectedTag
:
''
};
},
...
...
@@ -69,6 +70,10 @@ export default {
ManualTagEdit
},
methods
:
{
handleChange
(
val
,
label
)
{
this
.
selectedTag
=
JSON
.
parse
(
JSON
.
stringify
(
label
));
this
.
selectedTag
.
tagItemName
=
val
+
'-'
+
this
.
selectedTag
.
tagItemName
;
},
confirm
()
{
if
(
!
this
.
selectedTag
)
{
this
.
$message
.
waring
(
'请选择标签'
);
...
...
src/views/ai/task/task.vue
View file @
8a33b5a2
...
...
@@ -34,7 +34,7 @@
</el-select>
</el-form-item>
<el-form-item>
<el-date-picker
v-model=
"form.time"
value-format=
"yyyy-MM-dd"
@
change=
"search"
type=
"daterange"
range-separator=
"~"
start-placeholder=
"开始日期"
end-placeholder=
"结束日期"
clearable
>
</el-date-picker>
<el-date-picker
v-model=
"form.time"
:picker-options=
"pickerOptions"
value-format=
"yyyy-MM-dd"
@
change=
"search"
type=
"daterange"
range-separator=
"~"
start-placeholder=
"开始日期"
end-placeholder=
"结束日期"
clearable
>
</el-date-picker>
</el-form-item>
</el-form>
</div>
...
...
@@ -94,6 +94,8 @@ import { page, rechargeCenter, stopActivityPlan, startActivityPlan, pageStatisti
import
{
formatDateTimeByType
}
from
'@/utils/index.js'
;
import
filterAvater
from
'@/mixins/filterAvater.js'
;
import
dmDropdown
from
'@/components/dm-drop-down/dm-drop-down'
;
let
maxTime
=
null
;
let
minTime
=
null
;
export
default
{
mixins
:
[
filterAvater
],
data
()
{
...
...
@@ -110,6 +112,12 @@ export default {
pageSize
:
20
},
total
:
0
,
pickerOptions
:
{
disabledDate
:
time
=>
{
const
maxTimeRange
=
180
*
24
*
60
*
60
*
1000
;
// 6个月
return
time
.
getTime
()
<
new
Date
().
getTime
()
-
maxTimeRange
||
time
.
getTime
()
>
new
Date
().
getTime
()
+
maxTimeRange
;
}
},
btnArr
:
[
{
text
:
'查看'
,
...
...
@@ -405,43 +413,43 @@ export default {
params
.
endTime
=
params
.
time
[
1
];
}
delete
params
.
time
;
const
{
result
}
=
await
page
(
params
);
if
(
!
result
)
return
;
this
.
tableData
=
result
.
list
||
[];
const
ids
=
this
.
tableData
.
map
(
item
=>
item
.
activityId
).
join
(
','
);
this
.
total
=
result
.
total
;
this
.
pageStatistics
(
ids
);
},
async
pageStatistics
(
ids
)
{
try
{
const
{
result
}
=
await
page
(
params
);
const
{
result
}
=
await
page
Statistics
({
ids
}
);
if
(
!
result
)
return
;
this
.
tableData
=
result
.
list
||
[];
const
ids
=
this
.
tableData
.
map
(
item
=>
item
.
activityId
).
join
(
','
);
this
.
total
=
result
.
total
;
this
.
pageStatistics
(
ids
);
let
obj
=
{};
result
.
forEach
(
element
=>
{
obj
[
element
.
activityId
]
=
element
;
});
this
.
tableData
.
forEach
(
item
=>
{
if
(
obj
[
item
.
activityId
])
{
const
{
marketingNumber
,
outboundNumber
,
totalConnectionNumber
,
telephoneConnectionRate
,
connectionIntentionRate
}
=
obj
[
item
.
activityId
];
item
.
marketingNumber
=
marketingNumber
;
item
.
outboundNumber
=
outboundNumber
;
item
.
totalConnectionNumber
=
totalConnectionNumber
;
item
.
telephoneConnectionRate
=
telephoneConnectionRate
;
item
.
connectionIntentionRate
=
connectionIntentionRate
;
}
else
{
item
.
marketingNumber
=
'- -'
;
item
.
outboundNumber
=
'- -'
;
item
.
totalConnectionNumber
=
'- -'
;
item
.
telephoneConnectionRate
=
'- -'
;
item
.
connectionIntentionRate
=
'- -'
;
}
});
this
.
tableData
=
this
.
tableData
.
splice
(
0
);
}
finally
{
this
.
loading
=
false
;
}
},
async
pageStatistics
(
ids
)
{
const
{
result
}
=
await
pageStatistics
({
ids
});
if
(
!
result
)
return
;
let
obj
=
{};
result
.
forEach
(
element
=>
{
obj
[
element
.
activityId
]
=
element
;
});
this
.
tableData
.
forEach
(
item
=>
{
if
(
obj
[
item
.
activityId
])
{
const
{
marketingNumber
,
outboundNumber
,
totalConnectionNumber
,
telephoneConnectionRate
,
connectionIntentionRate
}
=
obj
[
item
.
activityId
];
item
.
marketingNumber
=
marketingNumber
;
item
.
outboundNumber
=
outboundNumber
;
item
.
totalConnectionNumber
=
totalConnectionNumber
;
item
.
telephoneConnectionRate
=
telephoneConnectionRate
;
item
.
connectionIntentionRate
=
connectionIntentionRate
;
}
else
{
item
.
marketingNumber
=
'- -'
;
item
.
outboundNumber
=
'- -'
;
item
.
totalConnectionNumber
=
'- -'
;
item
.
telephoneConnectionRate
=
'- -'
;
item
.
connectionIntentionRate
=
'- -'
;
}
});
this
.
tableData
=
this
.
tableData
.
splice
(
0
);
},
stopTask
(
row
)
{
this
.
$confirm
(
'任务终止后未外呼的客户将停止外呼任务,终止后不可重新启用任务,是否继续终止任务?'
,
'提示'
,
{
confirmButtonText
:
'终止'
,
...
...
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