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
661fe815
Commit
661fe815
authored
Apr 25, 2019
by
chenxin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix:通话记录,通话设置,ecm编辑bug和一些其他bug
parent
80baa611
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
162 additions
and
43 deletions
+162
-43
upload.js
src/directives/upload.js
+1
-1
calllogApi.js
src/service/api/calllogApi.js
+3
-1
rechargeApi.js
src/service/api/rechargeApi.js
+3
-0
calllog.vue
src/views/calllog/calllog.vue
+3
-2
record.vue
src/views/calllog/record.vue
+29
-14
batch-dialog.vue
src/views/ecm/batch-dialog.vue
+2
-2
current-list.vue
src/views/ecm/current-list.vue
+2
-2
form.js
src/views/ecm/form.js
+8
-4
form.vue
src/views/ecm/form.vue
+5
-5
board.vue
src/views/recharge/board.vue
+5
-5
consume.vue
src/views/recharge/consume.vue
+91
-4
recharge.vue
src/views/recharge/recharge.vue
+10
-3
No files found.
src/directives/upload.js
View file @
661fe815
...
@@ -54,6 +54,7 @@ export default {
...
@@ -54,6 +54,7 @@ export default {
})
})
.
catch
(
err
=>
{
.
catch
(
err
=>
{
binding
.
value
.
$tips
({
type
:
'warning'
,
message
:
err
.
message
});
binding
.
value
.
$tips
({
type
:
'warning'
,
message
:
err
.
message
});
binding
.
value
.
loading
=
false
;
});
});
}
else
{
}
else
{
upload
();
upload
();
...
@@ -68,7 +69,6 @@ export default {
...
@@ -68,7 +69,6 @@ export default {
axios
axios
.
post
(
config
.
api
+
binding
.
value
.
url
,
formData
)
.
post
(
config
.
api
+
binding
.
value
.
url
,
formData
)
.
then
(
res
=>
{
.
then
(
res
=>
{
console
.
log
(
res
);
binding
.
value
.
loading
=
false
;
binding
.
value
.
loading
=
false
;
el
.
value
=
''
;
el
.
value
=
''
;
if
(
res
.
data
.
errorCode
===
0
)
{
if
(
res
.
data
.
errorCode
===
0
)
{
...
...
src/service/api/calllogApi.js
View file @
661fe815
import
{
requests
}
from
'./index'
;
import
{
requests
}
from
'./index'
;
const
PREFIX
=
'api-marketing/'
;
const
PREFIX
=
'api-marketing/'
;
//智能营销--
ECM营销引擎分页列表
//智能营销--
通话记录
export
const
callLogList
=
params
=>
requests
(
PREFIX
+
'call-log'
,
params
);
export
const
callLogList
=
params
=>
requests
(
PREFIX
+
'call-log'
,
params
);
export
const
saveCallSetting
=
params
=>
requests
(
PREFIX
+
'save-call-setting'
,
params
);
// 录音设置保存
export
const
getCallSetting
=
params
=>
requests
(
PREFIX
+
'get-call-setting'
,
params
);
// 录音配置
src/service/api/rechargeApi.js
View file @
661fe815
...
@@ -27,6 +27,9 @@ export const voiceData = params => requests(PREFIX + 'voice-data', params);
...
@@ -27,6 +27,9 @@ export const voiceData = params => requests(PREFIX + 'voice-data', params);
//计费中心--双向呼叫消费详情
//计费中心--双向呼叫消费详情
export
const
callData
=
params
=>
requests
(
PREFIX
+
'call-data'
,
params
);
export
const
callData
=
params
=>
requests
(
PREFIX
+
'call-data'
,
params
);
//计费中心--通话录音消费详情
export
const
recordData
=
params
=>
requests
(
PREFIX
+
'call-record-data'
,
params
);
//计费中心--点击充值后--第一步:获取余额, 各项服务单价
//计费中心--点击充值后--第一步:获取余额, 各项服务单价
export
const
rechargeStep0
=
params
=>
requests
(
PREFIX
+
'recharge-step-1'
,
params
);
export
const
rechargeStep0
=
params
=>
requests
(
PREFIX
+
'recharge-step-1'
,
params
);
...
...
src/views/calllog/calllog.vue
View file @
661fe815
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
<el-option
v-for=
"(v, i) in telTaskTypeOption"
:key=
"i"
:label=
"v.label"
:value=
"v.value"
></el-option>
<el-option
v-for=
"(v, i) in telTaskTypeOption"
:key=
"i"
:label=
"v.label"
:value=
"v.value"
></el-option>
</el-select>
</el-select>
<el-input
v-model=
"listParams.phoneNumber"
class=
"w200"
placeholder=
"输入号码查询"
clearable
@
change=
"refresh"
><i
slot=
"prefix"
class=
"el-input__icon el-icon-search"
></i></el-input>
<el-input
v-model=
"listParams.phoneNumber"
class=
"w200"
placeholder=
"输入号码查询"
clearable
@
change=
"refresh"
><i
slot=
"prefix"
class=
"el-input__icon el-icon-search"
></i></el-input>
<
!--
<el-button
type=
"primary"
class=
"fr"
@
click=
"$router.push('/calllog/record')"
>
录音设置
</el-button>
--
>
<
el-button
type=
"primary"
class=
"fr"
@
click=
"$router.push('/calllog/record')"
>
录音设置
</el-button
>
</div>
</div>
<el-table
tooltipEffect=
"light"
:data=
"tableList"
style=
"width:100%"
v-loading=
"loading"
>
<el-table
tooltipEffect=
"light"
:data=
"tableList"
style=
"width:100%"
v-loading=
"loading"
>
<el-table-column
align=
"left"
width=
"160"
prop=
"callBeginTime"
label=
"呼叫时间"
>
<el-table-column
align=
"left"
width=
"160"
prop=
"callBeginTime"
label=
"呼叫时间"
>
...
@@ -52,7 +52,8 @@
...
@@ -52,7 +52,8 @@
</el-table-column>
</el-table-column>
<el-table-column
align=
"left"
width=
"150"
prop=
"callFee"
label=
"录音"
>
<el-table-column
align=
"left"
width=
"150"
prop=
"callFee"
label=
"录音"
>
<
template
slot-scope=
"scope"
>
<
template
slot-scope=
"scope"
>
<a
v-if=
"scope.row.recordUrl && scope.row.callStatus == 2"
:href=
"scope.row.recordUrl"
target=
"_blank"
title=
"通话录音"
>
通话录音
</a>
<span
v-if=
"scope.row.showStatus !== 1"
>
{{
scope
.
row
.
description
}}
</span>
<a
v-else
:href=
"scope.row.showRecordUrl"
target=
"_blank"
:title=
"scope.row.description"
><i
class=
"iconfont icon-xinxixianshi2 pr5"
></i>
{{
scope
.
row
.
description
}}
</a>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
</el-table>
</el-table>
...
...
src/views/calllog/record.vue
View file @
661fe815
<
template
>
<
template
>
<section
class=
"dm-wrap"
v-loading=
"loading"
element-loading-text=
"数据保存中"
>
<section
class=
"dm-wrap"
v-loading=
"loading"
element-loading-text=
"数据保存中"
>
<el-alert
type=
"info"
:closable=
"false"
show-icon
>
<el-alert
type=
"info"
:closable=
"false"
show-icon
>
<p
slot=
"title"
class=
"fz1
6 info-color line-height1_5"
>
使用录音功能需开启录音服务,未开启则录音不作保存。开启后,仅支持保存从开启当天起的录音数据,未开启录音服务之前的历史录音数据不做同步。选择不同保存时长收费标准不同,当前收费标准如下:1、三个月 0.04元/分钟 2、六个月 0.06元/分钟 3、十二个月 0.1
元/分钟
</p>
<p
slot=
"title"
class=
"fz1
4 info-color line-height1_5"
>
使用录音功能需开启录音服务,未开启则录音不作保存。开启后,仅支持保存从开启当天起的录音数据,未开启录音服务之前的历史录音数据不做同步。选择不同保存时长收费标准不同,当前收费标准如下:1、三个月
{{
allUnitFee
.
storageThreeFee
}}
元/分钟 2、六个月
{{
allUnitFee
.
storageSixFee
}}
元/分钟 3、十二个月
{{
allUnitFee
.
storageTwelveFee
}}
元/分钟
</p>
</el-alert>
</el-alert>
<section
class=
"mt20"
>
<section
class=
"mt20"
>
<div
class=
"mb20"
>
<div
class=
"mb20"
>
<span
class=
"dm-input_label mr10"
>
开启录音服务
</span>
<span
class=
"dm-input_label mr10"
>
开启录音服务
</span>
<el-switch
v-model=
"
swithKey
"
></el-switch>
<el-switch
v-model=
"
openFlag
"
></el-switch>
</div>
</div>
<div>
<div>
<span
class=
"dm-input_label mr10"
>
录音保存时长
</span>
<span
class=
"dm-input_label mr10"
>
录音保存时长
</span>
<el-radio-group
v-model=
"s
aveTim
e"
>
<el-radio-group
v-model=
"s
torageTyp
e"
>
<el-radio
:label=
"
3
"
>
三个月
</el-radio>
<el-radio
:label=
"
0
"
>
三个月
</el-radio>
<el-radio
:label=
"
6
"
>
六个月
</el-radio>
<el-radio
:label=
"
1
"
>
六个月
</el-radio>
<el-radio
:label=
"
9
"
>
十二个月
</el-radio>
<el-radio
:label=
"
2
"
>
十二个月
</el-radio>
</el-radio-group>
</el-radio-group>
</div>
</div>
<div
class=
"mt30"
><el-button
type=
"primary"
class=
"save"
@
click=
"submit"
>
保存
</el-button></div>
<div
class=
"mt30"
><el-button
type=
"primary"
class=
"save"
@
click=
"submit"
>
保存
</el-button></div>
...
@@ -22,29 +22,44 @@
...
@@ -22,29 +22,44 @@
</
template
>
</
template
>
<
script
>
<
script
>
import
{
saveCallSetting
,
getCallSetting
}
from
'@/service/api/calllogApi.js'
;
export
default
{
export
default
{
name
:
'record'
,
name
:
'record'
,
data
()
{
data
()
{
return
{
return
{
swithKey
:
false
,
openFlag
:
false
,
saveTime
:
3
,
storageType
:
0
,
loading
:
false
loading
:
false
,
// 录音收费
allUnitFee
:
{
storageThreeFee
:
0
,
storageSixFee
:
0
,
storageTwelveFee
:
0
}
};
};
},
},
methods
:
{
methods
:
{
// getRecordDetail() {}
submit
()
{
submit
()
{
this
.
loading
=
true
;
this
.
loading
=
true
;
setTimeout
(()
=>
{
const
{
openFlag
,
storageType
}
=
this
;
saveCallSetting
({
openFlag
:
Number
(
openFlag
),
storageType
}).
then
(
res
=>
{
this
.
loading
=
false
;
this
.
loading
=
false
;
this
.
$tips
({
type
:
'success'
,
message
:
'保存成功!'
});
this
.
$tips
({
type
:
'success'
,
message
:
res
.
result
});
// this.$tips({ type: 'error', message: '删除失败!' });
});
},
2000
);
}
}
},
},
created
()
{
created
()
{
this
.
$store
.
commit
(
'aside_handler'
,
false
);
this
.
$store
.
commit
(
'aside_handler'
,
false
);
this
.
$store
.
commit
(
'mutations_breadcrumb'
,
[{
name
:
'会员管理'
,
path
:
''
},
{
name
:
'通话记录'
,
path
:
'/calllog/index'
},
{
name
:
'录音存储设置'
,
path
:
''
}]);
this
.
$store
.
commit
(
'mutations_breadcrumb'
,
[{
name
:
'会员管理'
,
path
:
''
},
{
name
:
'通话记录'
,
path
:
'/calllog/index'
},
{
name
:
'录音存储设置'
,
path
:
''
}]);
getCallSetting
().
then
(
res
=>
{
const
{
callSetting
,
unitFee
}
=
res
.
result
;
if
(
callSetting
)
{
this
.
openFlag
=
!!
callSetting
.
openFlag
;
this
.
storageType
=
callSetting
.
storageType
;
}
this
.
allUnitFee
=
unitFee
;
});
}
}
};
};
</
script
>
</
script
>
...
...
src/views/ecm/batch-dialog.vue
View file @
661fe815
...
@@ -74,8 +74,8 @@ export default {
...
@@ -74,8 +74,8 @@ export default {
return
row
.
errCode
===
'0'
?
'满足'
:
'不满足'
;
return
row
.
errCode
===
'0'
?
'满足'
:
'不满足'
;
}
}
},
},
{
label
:
'主门店'
,
prop
:
'main
ClerkCod
e'
,
minWidth
:
'120'
,
align
:
'left'
},
{
label
:
'主门店'
,
prop
:
'main
StoreNam
e'
,
minWidth
:
'120'
,
align
:
'left'
},
{
label
:
'专属导购'
,
prop
:
'main
StoreNam
e'
,
minWidth
:
'120'
,
align
:
'left'
},
{
label
:
'专属导购'
,
prop
:
'main
ClerkCod
e'
,
minWidth
:
'120'
,
align
:
'left'
},
{
label
:
'备注'
,
prop
:
'errMsg'
,
minWidth
:
'120'
,
align
:
'left'
}
{
label
:
'备注'
,
prop
:
'errMsg'
,
minWidth
:
'120'
,
align
:
'left'
}
],
],
tableList
:
[],
tableList
:
[],
...
...
src/views/ecm/current-list.vue
View file @
661fe815
...
@@ -106,8 +106,8 @@ export default {
...
@@ -106,8 +106,8 @@ export default {
},
},
{
label
:
'会员信息'
,
prop
:
'marketingType'
,
minWidth
:
'120'
,
align
:
'left'
,
component
:
'member-info'
},
{
label
:
'会员信息'
,
prop
:
'marketingType'
,
minWidth
:
'120'
,
align
:
'left'
,
component
:
'member-info'
},
{
label
:
'手机号码'
,
prop
:
'phoneNumber'
,
minWidth
:
'120'
,
align
:
'left'
},
{
label
:
'手机号码'
,
prop
:
'phoneNumber'
,
minWidth
:
'120'
,
align
:
'left'
},
{
label
:
'主门店'
,
prop
:
'main
ClerkCod
e'
,
minWidth
:
'120'
,
align
:
'left'
},
{
label
:
'主门店'
,
prop
:
'main
StoreNam
e'
,
minWidth
:
'120'
,
align
:
'left'
},
{
label
:
'专属导购'
,
prop
:
'main
StoreNam
e'
,
minWidth
:
'120'
,
align
:
'left'
},
{
label
:
'专属导购'
,
prop
:
'main
ClerkCod
e'
,
minWidth
:
'120'
,
align
:
'left'
},
{
{
label
:
'状态'
,
label
:
'状态'
,
prop
:
'errCode'
,
prop
:
'errCode'
,
...
...
src/views/ecm/form.js
View file @
661fe815
...
@@ -696,19 +696,23 @@ export default {
...
@@ -696,19 +696,23 @@ export default {
getData
()
{
getData
()
{
this
.
$refs
.
peopleFilter
.
confirmSet
();
this
.
$refs
.
peopleFilter
.
confirmSet
();
},
},
// 子组件触发父组件事件,返回过滤条件数据
// 子组件触发父组件事件,返回过滤条件数据
-- 仅新增时保存
findFilter
(
value
)
{
findFilter
(
value
)
{
if
(
this
.
isAdd
)
{
this
.
form
.
memberSearchDTO
=
value
;
this
.
form
.
memberSearchDTO
=
value
;
}
},
},
// 取消
// 取消
cancelFilter
()
{
cancelFilter
()
{
this
.
$refs
.
peopleFilter
.
cancelSet
();
this
.
$refs
.
peopleFilter
.
cancelSet
();
},
},
// 获取需要回显的数据, 供保存时候使用
// 获取需要回显的数据, 供保存时候使用
-- 仅新增时保存
getBackData
(
val
)
{
getBackData
(
val
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
if
(
this
.
isAdd
)
{
this
.
getSaveData
=
val
;
this
.
getSaveData
=
val
;
console
.
log
(
this
.
getSaveData
,
val
);
}
// console.log(this.getSaveData, val);
resolve
();
resolve
();
});
});
},
},
...
@@ -737,7 +741,7 @@ export default {
...
@@ -737,7 +741,7 @@ export default {
}
}
},
},
handleDataLeft
(
selectedData
,
selectionToRemove
)
{
handleDataLeft
(
selectedData
,
selectionToRemove
)
{
console
.
log
(
selectedData
,
selectionToRemove
);
//
console.log(selectedData, selectionToRemove);
}
}
},
},
filters
:
{
filters
:
{
...
...
src/views/ecm/form.vue
View file @
661fe815
...
@@ -35,15 +35,15 @@
...
@@ -35,15 +35,15 @@
<el-checkbox-group
v-model=
"checked"
:max=
"1"
>
<el-checkbox-group
v-model=
"checked"
:max=
"1"
>
<div
class=
"pb10"
>
<div
class=
"pb10"
>
<el-checkbox
:disabled=
"isEdit"
class=
"w150"
label=
"brithday_day"
>
会员生日前
</el-checkbox>
<el-checkbox
:disabled=
"isEdit"
class=
"w150"
label=
"brithday_day"
>
会员生日前
</el-checkbox>
<el-input-number
controls-position=
"right"
:min=
"checked[0] === 'brithday_day' ? 1 : 0"
style=
"width:244px;"
:disabled=
"checked[0] !== 'brithday_day'"
v-model=
"form.brithday_day"
></el-input-number>
天
<el-input-number
controls-position=
"right"
:min=
"checked[0] === 'brithday_day' ? 1 : 0"
style=
"width:244px;"
:disabled=
"checked[0] !== 'brithday_day'
|| isEdit
"
v-model=
"form.brithday_day"
></el-input-number>
天
</div>
</div>
<div
class=
"pb10"
>
<div
class=
"pb10"
>
<el-checkbox
:disabled=
"isEdit"
class=
"w150"
label=
"attention_day"
>
关注时长超过
</el-checkbox>
<el-checkbox
:disabled=
"isEdit"
class=
"w150"
label=
"attention_day"
>
关注时长超过
</el-checkbox>
<el-input-number
controls-position=
"right"
:min=
"checked[0] === 'attention_day' ? 1 : 0"
:max=
"100000"
style=
"width:244px;"
:disabled=
"checked[0] !== 'attention_day'"
v-model=
"form.attention_day"
></el-input-number>
天
<el-input-number
controls-position=
"right"
:min=
"checked[0] === 'attention_day' ? 1 : 0"
:max=
"100000"
style=
"width:244px;"
:disabled=
"checked[0] !== 'attention_day'
|| isEdit
"
v-model=
"form.attention_day"
></el-input-number>
天
</div>
</div>
<div
class=
"pb10"
>
<div
class=
"pb10"
>
<el-checkbox
:disabled=
"isEdit"
class=
"w150"
label=
"lastCost_day"
>
最近消费间隔
</el-checkbox>
<el-checkbox
:disabled=
"isEdit"
class=
"w150"
label=
"lastCost_day"
>
最近消费间隔
</el-checkbox>
<el-input-number
controls-position=
"right"
:min=
"checked[0] === 'lastCost_day' ? 1 : 0"
style=
"width:244px;"
:disabled=
"checked[0] !== 'lastCost_day'"
v-model=
"form.lastCost_day"
></el-input-number>
天
<el-input-number
controls-position=
"right"
:min=
"checked[0] === 'lastCost_day' ? 1 : 0"
style=
"width:244px;"
:disabled=
"checked[0] !== 'lastCost_day'
|| isEdit
"
v-model=
"form.lastCost_day"
></el-input-number>
天
</div>
</div>
</el-checkbox-group>
</el-checkbox-group>
</el-form-item>
</el-form-item>
...
@@ -67,7 +67,7 @@
...
@@ -67,7 +67,7 @@
<el-input-number
:disabled=
"isEdit"
controls-position=
"right"
min=
""
style=
"width:150px;"
v-model=
"form.max_cost"
@
change=
"handleLowestCost()"
></el-input-number>
<el-input-number
:disabled=
"isEdit"
controls-position=
"right"
min=
""
style=
"width:150px;"
v-model=
"form.max_cost"
@
change=
"handleLowestCost()"
></el-input-number>
<span
class=
"pl5"
>
元
</span>
<span
class=
"pl5"
>
元
</span>
<el-popover
placement=
"right"
title=
""
width=
"200"
trigger=
"hover"
content=
"最大值最小值可选填其一或两个都填写,包含边界值"
><i
class=
"el-icon-info ml5 gray"
slot=
"reference"
></i></el-popover>
<el-popover
placement=
"right"
title=
""
width=
"200"
trigger=
"hover"
content=
"最大值最小值可选填其一或两个都填写,包含边界值"
><i
class=
"el-icon-info ml5 gray"
slot=
"reference"
></i></el-popover>
<span
class=
"pl20 fz13 red"
v-show=
"error_cost_info
!==''"
>
*
{{
error_cost_info
}}
</span>
<span
class=
"pl20 fz13 red"
v-show=
"error_cost_info
!== ''"
>
*
{{
error_cost_info
}}
</span>
</el-form-item>
</el-form-item>
<el-form-item
label=
"消费件数"
>
<el-form-item
label=
"消费件数"
>
<el-input-number
:disabled=
"isEdit"
controls-position=
"right"
min=
""
style=
"width:150px;"
v-model=
"form.lowest_cost_count"
@
change=
"handleLowestCostCount()"
></el-input-number>
<el-input-number
:disabled=
"isEdit"
controls-position=
"right"
min=
""
style=
"width:150px;"
v-model=
"form.lowest_cost_count"
@
change=
"handleLowestCostCount()"
></el-input-number>
...
@@ -75,7 +75,7 @@
...
@@ -75,7 +75,7 @@
<el-input-number
:disabled=
"isEdit"
controls-position=
"right"
min=
""
style=
"width:150px;"
v-model=
"form.max_cost_count"
@
change=
"handleLowestCostCount()"
></el-input-number>
<el-input-number
:disabled=
"isEdit"
controls-position=
"right"
min=
""
style=
"width:150px;"
v-model=
"form.max_cost_count"
@
change=
"handleLowestCostCount()"
></el-input-number>
<span
class=
"pl5"
>
件
</span>
<span
class=
"pl5"
>
件
</span>
<el-popover
placement=
"right"
title=
""
width=
"200"
trigger=
"hover"
content=
"最大值最小值可选填其一或两个都填写,包含边界值,不包含赠品"
><i
class=
"el-icon-info ml5 gray"
slot=
"reference"
></i></el-popover>
<el-popover
placement=
"right"
title=
""
width=
"200"
trigger=
"hover"
content=
"最大值最小值可选填其一或两个都填写,包含边界值,不包含赠品"
><i
class=
"el-icon-info ml5 gray"
slot=
"reference"
></i></el-popover>
<span
class=
"pl20 fz13 red"
v-show=
"error_cost_count_info
!==
''"
>
*
{{
error_cost_count_info
}}
</span>
<span
class=
"pl20 fz13 red"
v-show=
"error_cost_count_info
!==
''"
>
*
{{
error_cost_count_info
}}
</span>
</el-form-item>
</el-form-item>
<el-form-item
label=
"指定消费门店"
>
<el-form-item
label=
"指定消费门店"
>
<el-radio-group
v-model=
"form.store_mode"
@
change=
"initStoreCardLeft"
:disabled=
"isEdit"
>
<el-radio-group
v-model=
"form.store_mode"
@
change=
"initStoreCardLeft"
:disabled=
"isEdit"
>
...
...
src/views/recharge/board.vue
View file @
661fe815
...
@@ -83,9 +83,9 @@
...
@@ -83,9 +83,9 @@
</div>
</div>
<div
class=
"text-center fr"
>
<div
class=
"text-center fr"
>
<p
class=
"text-right"
>
<p
class=
"text-right"
>
<span
class=
"fz30"
>
{{
recharge
.
c
allTime
||
0
}}
</span>
分钟
<span
class=
"fz30"
>
{{
recharge
.
recordC
allTime
||
0
}}
</span>
分钟
</p>
</p>
<p
class=
"regular-font-color"
>
合计费用:¥
{{
(
recharge
.
callFee
/
10
00
).
toFixed
(
2
)
||
0
}}
</p>
<p
class=
"regular-font-color"
>
合计费用:¥
{{
(
recharge
.
recordCallfee
/
1
00
).
toFixed
(
2
)
||
0
}}
</p>
</div>
</div>
</div>
</div>
</el-col>
</el-col>
...
@@ -102,12 +102,12 @@
...
@@ -102,12 +102,12 @@
<el-table-column
align=
"left"
prop=
"count"
label=
"时长/条数"
>
<el-table-column
align=
"left"
prop=
"count"
label=
"时长/条数"
>
<template
slot-scope=
"scope"
>
<template
slot-scope=
"scope"
>
<span>
{{
scope
.
row
.
count
}}
</span>
<span>
{{
scope
.
row
.
count
}}
</span>
{{
scope
.
row
.
name
===
'双向呼叫
'
?
'分钟'
:
'条'
}}
{{
scope
.
row
.
type
===
'call'
||
scope
.
row
.
type
===
'record
'
?
'分钟'
:
'条'
}}
</
template
>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
align=
"left"
prop=
"fee"
label=
"费用"
>
<el-table-column
align=
"left"
prop=
"fee"
label=
"费用"
>
<
template
slot-scope=
"scope"
>
<
template
slot-scope=
"scope"
>
<span>
{{
(
scope
.
row
.
fee
/
1000
).
toFixed
(
2
)
}}
</span
<span>
{{
(
scope
.
row
.
fee
/
(
scope
.
row
.
type
===
'record'
?
100
:
1000
)
).
toFixed
(
2
)
}}
</span
>
元
>
元
</
template
>
</
template
>
</el-table-column>
</el-table-column>
...
@@ -166,7 +166,7 @@ export default {
...
@@ -166,7 +166,7 @@ export default {
try
{
try
{
let
res
=
await
consumeRecord
(
this
.
listParams
);
let
res
=
await
consumeRecord
(
this
.
listParams
);
const
result
=
res
.
result
;
const
result
=
res
.
result
;
this
.
tableList
=
[{
name
:
'短信营销'
,
type
:
'marketing'
,
fee
:
result
.
messageFee
,
count
:
result
.
messageCount
},
{
name
:
'短信验证码'
,
type
:
'sms'
,
fee
:
result
.
smsFee
,
count
:
result
.
smsCount
},
{
name
:
'语音验证码'
,
type
:
'voice'
,
fee
:
result
.
voiceFee
,
count
:
result
.
voiceCount
},
{
name
:
'双向呼叫'
,
type
:
'call'
,
fee
:
result
.
callFee
,
count
:
result
.
callTime
}];
this
.
tableList
=
[{
name
:
'短信营销'
,
type
:
'marketing'
,
fee
:
result
.
messageFee
,
count
:
result
.
messageCount
},
{
name
:
'短信验证码'
,
type
:
'sms'
,
fee
:
result
.
smsFee
,
count
:
result
.
smsCount
},
{
name
:
'语音验证码'
,
type
:
'voice'
,
fee
:
result
.
voiceFee
,
count
:
result
.
voiceCount
},
{
name
:
'双向呼叫'
,
type
:
'call'
,
fee
:
result
.
callFee
,
count
:
result
.
callTime
}
,
{
name
:
'通话录音'
,
type
:
'record'
,
fee
:
result
.
recordCallfee
,
count
:
result
.
recordCallTime
}
];
}
catch
(
err
)
{
}
catch
(
err
)
{
console
.
log
(
err
);
console
.
log
(
err
);
}
}
...
...
src/views/recharge/consume.vue
View file @
661fe815
...
@@ -3,7 +3,8 @@
...
@@ -3,7 +3,8 @@
<div
class=
"dm-wrap"
>
日期:
<el-date-picker
v-model=
"dateTime"
type=
"daterange"
range-separator=
"至"
start-placeholder=
"开始日期"
end-placeholder=
"结束日期"
@
change=
"loadAll(false)"
></el-date-picker></div>
<div
class=
"dm-wrap"
>
日期:
<el-date-picker
v-model=
"dateTime"
type=
"daterange"
range-separator=
"至"
start-placeholder=
"开始日期"
end-placeholder=
"结束日期"
@
change=
"loadAll(false)"
></el-date-picker></div>
<div
class=
"dm-form__wrap"
>
<div
class=
"dm-form__wrap"
>
<h3
class=
"dm-title__label"
>
趋势分析图
</h3>
<h3
class=
"dm-title__label"
>
趋势分析图
</h3>
<div
class=
"text-center fz16"
>
{{
formatDateTimeByType
(
dateTime
[
0
],
'yyyy-MM-dd'
)
}}
至
{{
formatDateTimeByType
(
dateTime
[
1
],
'yyyy-MM-dd'
)
}}
成功发送:
{{
sumCount
||
0
}}
条 总计消费:
{{
(
sumFee
/
1000
).
toFixed
(
2
)
}}
元
</div>
<div
class=
"text-center fz16"
v-if=
"$route.params.type === 'record'"
>
{{
formatDateTimeByType
(
dateTime
[
0
],
'yyyy-MM-dd'
)
}}
至
{{
formatDateTimeByType
(
dateTime
[
1
],
'yyyy-MM-dd'
)
}}
成功存储:
{{
sumCount
||
0
}}
分钟 总计消费:
{{
(
sumFee
/
100
).
toFixed
(
2
)
}}
元
</div>
<div
class=
"text-center fz16"
v-else
>
{{
formatDateTimeByType
(
dateTime
[
0
],
'yyyy-MM-dd'
)
}}
至
{{
formatDateTimeByType
(
dateTime
[
1
],
'yyyy-MM-dd'
)
}}
成功发送:
{{
sumCount
||
0
}}
条 总计消费:
{{
(
sumFee
/
1000
).
toFixed
(
2
)
}}
元
</div>
<div>
<div>
<div
id=
"mountNode"
ref=
"mountNode"
v-show=
"list.length"
></div>
<div
id=
"mountNode"
ref=
"mountNode"
v-show=
"list.length"
></div>
<div
class=
"chart--nodata"
v-show=
"!list.length"
></div>
<div
class=
"chart--nodata"
v-show=
"!list.length"
></div>
...
@@ -136,12 +137,60 @@
...
@@ -136,12 +137,60 @@
</
template
>
</
template
>
</el-table-column>
</el-table-column>
</el-table>
</el-table>
<el-table
tooltipEffect=
"light"
:data=
"tableList"
style=
"width:100%"
v-loading=
"loading"
v-if=
"$route.params.type === 'record'"
>
<el-table-column
align=
"left"
width=
"160"
prop=
"createTime"
label=
"呼叫时间"
>
<
template
slot-scope=
"scope"
>
{{
formatDateTimeByType
(
scope
.
row
.
callBeginTime
,
'yyyy-MM-dd-HH-mm-ss'
)
}}
</
template
>
</el-table-column>
<el-table-column
:show-overflow-tooltip=
"true"
align=
"left"
min-width=
"180"
prop=
"storeName"
label=
"主门店"
>
<
template
slot-scope=
"scope"
>
<p>
{{
scope
.
row
.
storeName
}}
</p>
<p
class=
"fz13 gray"
>
{{
scope
.
row
.
storeGroupName
}}
</p>
</
template
>
</el-table-column>
<el-table-column
align=
"left"
width=
"150"
prop=
"clerkName"
label=
"主叫"
>
<
template
slot-scope=
"scope"
>
<p>
{{
scope
.
row
.
clerkName
||
'--'
}}
</p>
<p
class=
"gray"
>
{{
scope
.
row
.
sendPhone
}}
</p>
</
template
>
</el-table-column>
<el-table-column
align=
"left"
width=
"150"
prop=
"memberId"
label=
"被叫(会员)"
>
<
template
slot-scope=
"scope"
>
<img
:src=
"scope.row.memberPic || defaultAvatar"
width=
"32"
height=
"32"
alt=
""
/>
<div
class=
"inline-block"
>
<p>
{{
scope
.
row
.
memberName
||
'--'
}}
</p>
<p
class=
"fz13 gray"
>
{{
scope
.
row
.
receivePhone
||
'--'
}}
</p>
</div>
</
template
>
</el-table-column>
<el-table-column
align=
"left"
width=
"150"
prop=
"status"
label=
"类型"
>
<
template
slot-scope=
"scope"
>
{{
scope
.
row
.
telTaskTitle
}}
</
template
>
</el-table-column>
<el-table-column
align=
"left"
width=
"150"
prop=
"status"
label=
"录音保存时长"
>
<
template
slot-scope=
"scope"
>
{{
scope
.
row
.
storageTypeRemark
}}
</
template
>
</el-table-column>
<el-table-column
align=
"left"
width=
"150"
prop=
"callTime"
label=
"时间(分钟)"
>
<
template
slot-scope=
"scope"
>
{{
scope
.
row
.
callTime
}}
分钟
</
template
>
</el-table-column>
<el-table-column
align=
"left"
width=
"150"
prop=
"callFee"
label=
"消费金额(元)"
>
<
template
slot-scope=
"scope"
>
{{
Number
(
scope
.
row
.
storageFee
/
100
).
toFixed
(
2
)
}}
元
</
template
>
</el-table-column>
</el-table>
<el-pagination
v-show=
"tableList.length"
background
class=
"dm-pagination"
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"listParams.currentPage"
:page-sizes=
"[10, 20, 30, 40]"
:page-size=
"listParams.pageSize"
layout=
"total, sizes, prev, pager, next"
:total=
"total"
></el-pagination>
<el-pagination
v-show=
"tableList.length"
background
class=
"dm-pagination"
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"listParams.currentPage"
:page-sizes=
"[10, 20, 30, 40]"
:page-size=
"listParams.pageSize"
layout=
"total, sizes, prev, pager, next"
:total=
"total"
></el-pagination>
</div>
</div>
</section>
</section>
</template>
</template>
<
script
>
<
script
>
import
{
messageMarketingChart
,
messageMarketingPage
,
smsData
,
voiceData
,
callData
}
from
'@/service/api/rechargeApi.js'
;
import
{
messageMarketingChart
,
messageMarketingPage
,
smsData
,
voiceData
,
callData
,
recordData
}
from
'@/service/api/rechargeApi.js'
;
import
{
formatDateTimeByType
}
from
'@/utils/index.js'
;
import
{
formatDateTimeByType
}
from
'@/utils/index.js'
;
import
G2
from
'@antv/g2'
;
import
G2
from
'@antv/g2'
;
export
default
{
export
default
{
...
@@ -219,6 +268,13 @@ export default {
...
@@ -219,6 +268,13 @@ export default {
}
}
this
.
callData
(
'list'
);
this
.
callData
(
'list'
);
}
}
if
(
this
.
$route
.
params
.
type
===
'record'
)
{
this
.
placeholder
=
'输入手机号码'
;
if
(
!
onlyList
)
{
this
.
recordData
(
'charts'
);
}
this
.
recordData
(
'list'
);
}
},
},
async
marketingList
()
{
async
marketingList
()
{
this
.
loading
=
true
;
this
.
loading
=
true
;
...
@@ -343,7 +399,38 @@ export default {
...
@@ -343,7 +399,38 @@ export default {
}
catch
(
err
)
{}
}
catch
(
err
)
{}
this
.
loading
=
false
;
this
.
loading
=
false
;
},
},
// TODO:
async
recordData
(
type
=
'list'
)
{
this
.
loading
=
true
;
try
{
let
res
=
await
recordData
(
Object
.
assign
({
ajaxType
:
type
,
taskType
:
type
===
'list'
?
this
.
taskType
:
''
},
this
.
listParams
));
if
(
type
===
'list'
)
{
if
(
res
.
errorCode
===
0
&&
res
.
result
.
page
.
result
)
{
this
.
tableList
=
res
.
result
.
page
.
result
||
[];
this
.
total
=
res
.
result
.
page
.
totalCount
;
this
.
taskTypeOptions
=
[{
taskType
:
''
,
ecmName
:
'全部'
},
{
taskType
:
1
,
ecmName
:
'不良评价回访'
}];
}
else
{
this
.
tableList
=
[];
}
}
else
if
(
type
===
'charts'
)
{
this
.
sumCount
=
res
.
result
.
sumCallTime
;
this
.
sumFee
=
res
.
result
.
sumFee
;
let
chartList
=
res
.
result
.
chartList
||
[];
let
list
=
[];
chartList
.
map
(
v
=>
{
list
.
push
({
day
:
v
.
chartsDate
,
name
:
'录音存储消费'
,
temperature
:
v
.
fee
?
(
parseInt
(
v
.
fee
)
/
100
).
toFixed
(
2
)
:
0
});
});
list
.
sort
((
a
,
b
)
=>
{
return
a
.
temperature
-
b
.
temperature
;
});
this
.
list
=
list
;
this
.
$nextTick
(
_
=>
{
this
.
initCharts
(
list
,
'mountNode'
);
});
}
}
catch
(
err
)
{}
this
.
loading
=
false
;
},
//生成折线图
//生成折线图
initCharts
(
data
,
nodeName
)
{
initCharts
(
data
,
nodeName
)
{
//先清空原先图表
//先清空原先图表
...
@@ -374,7 +461,7 @@ export default {
...
@@ -374,7 +461,7 @@ export default {
chart
.
axis
(
'temperature'
,
{
chart
.
axis
(
'temperature'
,
{
label
:
{
label
:
{
formatter
:
function
formatter
(
val
)
{
formatter
:
function
formatter
(
val
)
{
console
.
log
(
val
);
//
console.log(val);
return
(
isNaN
(
val
)
?
'0.00'
:
val
)
+
'元'
;
return
(
isNaN
(
val
)
?
'0.00'
:
val
)
+
'元'
;
}
}
}
}
...
...
src/views/recharge/recharge.vue
View file @
661fe815
...
@@ -32,7 +32,7 @@
...
@@ -32,7 +32,7 @@
<p
class=
"fz12 gray line-height2"
>
2、请尽量保障账户余额大于您日常使用的额度,避免因余额不足导致业务中断
</p>
<p
class=
"fz12 gray line-height2"
>
2、请尽量保障账户余额大于您日常使用的额度,避免因余额不足导致业务中断
</p>
<p
class=
"fz12 gray line-height2"
>
3、若未能及时充值或其他问题,请联系客户经理或客服人员
</p>
<p
class=
"fz12 gray line-height2"
>
3、若未能及时充值或其他问题,请联系客户经理或客服人员
</p>
<p
class=
"fz12 gray line-height2"
>
4、各项服务单价:短信验证码
{{
allUnitFee
.
smsfee
}}
元/条,语音验证码
{{
allUnitFee
.
voiceIfee
}}
元/条,双向呼叫
{{
allUnitFee
.
callfee
}}
元/分钟
</p>
<p
class=
"fz12 gray line-height2"
>
4、各项服务单价:短信验证码
{{
allUnitFee
.
smsfee
}}
元/条,语音验证码
{{
allUnitFee
.
voiceIfee
}}
元/条,双向呼叫
{{
allUnitFee
.
callfee
}}
元/分钟
</p>
<p
class=
"fz12 gray line-height2"
>
5、通话录音存储收费标准:「三个月
0.04元/分钟」「六个月0.06元/分钟」「十二个月0.1
元/分钟」,不满一分钟按一分钟收费
</p>
<p
class=
"fz12 gray line-height2"
>
5、通话录音存储收费标准:「三个月
{{
allUnitFee
.
storageThreeFee
}}
元/分钟」「六个月
{{
allUnitFee
.
storageSixFee
}}
元/分钟」「十二个月
{{
allUnitFee
.
storageTwelveFee
}}
元/分钟」,不满一分钟按一分钟收费
</p>
</div>
</div>
</article>
</article>
<article
v-if=
"step === 1"
>
<article
v-if=
"step === 1"
>
...
@@ -83,7 +83,14 @@ export default {
...
@@ -83,7 +83,14 @@ export default {
step
:
0
,
step
:
0
,
balance
:
0
,
balance
:
0
,
transactionCode
:
''
,
transactionCode
:
''
,
allUnitFee
:
{},
allUnitFee
:
{
callfee
:
0
,
smsfee
:
0
,
voiceIfee
:
0
,
storageThreeFee
:
0
,
storageSixFee
:
0
,
storageTwelveFee
:
0
},
count
:
100
,
count
:
100
,
countDown
:
5
,
countDown
:
5
,
// eslint-disable-next-line
// eslint-disable-next-line
...
@@ -125,7 +132,7 @@ export default {
...
@@ -125,7 +132,7 @@ export default {
this
.
count
=
Math
.
ceil
(
Math
.
abs
(
this
.
balance
));
this
.
count
=
Math
.
ceil
(
Math
.
abs
(
this
.
balance
));
}
}
this
.
transactionCode
=
res
.
result
.
transactionCode
;
this
.
transactionCode
=
res
.
result
.
transactionCode
;
this
.
allUnitFee
=
res
.
result
.
allUnitFee
;
Object
.
assign
(
this
.
allUnitFee
,
res
.
result
.
allUnitFee
)
;
}
else
{
}
else
{
this
.
$tips
({
type
:
'error'
,
message
:
'初始化失败'
});
this
.
$tips
({
type
:
'error'
,
message
:
'初始化失败'
});
}
}
...
...
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