Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
company_app
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
毛细亚
company_app
Commits
114871d3
提交
114871d3
authored
7月 03, 2025
作者:
毛细亚
浏览文件
操作
浏览文件
下载
差异文件
合并分支 '6.2' 到 'release'
6.2 查看合并请求
!9
上级
1584accd
b17d4fa4
隐藏空白字符变更
内嵌
并排
正在显示
12 个修改的文件
包含
1498 行增加
和
581 行删除
+1498
-581
App.vue
src/App.vue
+55
-24
game.js
src/api/game.js
+81
-62
works.js
src/api/works.js
+8
-0
dialog.vue
src/components/dialog.vue
+92
-0
scroll.js
src/directive/scroll/scroll.js
+1
-0
index.js
src/router/index.js
+6
-6
game.js
src/store/modules/game.js
+55
-0
user.js
src/store/modules/user.js
+1
-1
taskDetails.vue
src/views/components/taskList/taskDetails.vue
+967
-0
uesrTask.vue
src/views/components/taskList/uesrTask.vue
+60
-47
taskList.vue
src/views/taskList.vue
+84
-252
taskRecord.vue
src/views/taskRecord.vue
+88
-189
没有找到文件。
src/App.vue
浏览文件 @
114871d3
...
...
@@ -15,7 +15,16 @@
ref="menuRef"
>
<el-menu-item
v-for=
"item in menuList"
:key=
"item.path"
:index=
"item.path"
class=
"mobile-menu-item"
>
{{
item
.
label
}}
<!-- 任务列表菜单项显示红点 -->
<div
v-if=
"item.path === '/taskList' && hasTaskRedDot"
class=
"menu-item-with-badge"
>
<div
class=
"task-badge"
>
<el-badge
is-dot
>
<span>
{{
item
.
label
}}
</span>
</el-badge>
</div>
</div>
<!-- 普通菜单项 -->
<span
v-else
>
{{
item
.
label
}}
</span>
</el-menu-item>
</el-menu>
...
...
@@ -43,10 +52,11 @@
<
script
>
import
bindUserList
from
'@/views/components/bindGameAccount/bindUserList.vue'
import
{
getToken
}
from
'@/utils/auth'
import
{
mapState
,
mapMutations
}
from
'vuex'
import
{
mapState
,
mapMutations
,
mapActions
}
from
'vuex'
import
Cookies
from
'js-cookie'
import
{
getParams
}
from
'@/utils/index'
import
Debug
from
'@/components/debug.vue'
export
default
{
name
:
'App'
,
components
:
{
...
...
@@ -97,10 +107,11 @@ export default {
label
:
'快捷发送'
,
path
:
'/quickSendGame'
},
// {
// label: '任务列表',
// path: '/taskList'
// },
{
label
:
'任务列表'
,
path
:
'/taskList'
,
hasRedDot
:
false
// 红点状态
},
// {
// label: '通讯录',
// path: '/addressBook'
...
...
@@ -113,7 +124,12 @@ export default {
}
},
computed
:
{
...
mapState
(
'user'
,
[
'external_userid'
,
'token'
]),
...
mapState
(
'user'
,
[
'external_userid'
,
'token'
,
'userInfo'
]),
...
mapState
(
'game'
,
[
'taskData'
]),
// 计算任务列表是否需要显示红点
hasTaskRedDot
()
{
return
this
.
taskData
.
user_task
>
0
||
this
.
taskData
.
account_task
>
0
}
},
watch
:
{
'$route.path'
(
val
)
{
...
...
@@ -125,6 +141,18 @@ export default {
}
console
.
log
(
'路由变化:'
,
val
,
'选中路径:'
,
this
.
selectedPath
)
},
// 监听用户信息变化,只在初始化时获取一次任务数据
userInfo
:
{
handler
(
newVal
,
oldVal
)
{
if
(
newVal
&&
newVal
.
id
&&
(
!
oldVal
||
!
oldVal
.
id
))
{
console
.
log
(
'用户信息初始化完成,获取任务数据:'
,
newVal
)
// 只在用户信息第一次设置时获取任务数据
this
.
getTaskUnReadData
()
}
},
deep
:
true
,
immediate
:
true
},
// 监听 external_userid 的变化,确保界面及时更新
external_userid
:
{
handler
(
newVal
)
{
...
...
@@ -181,6 +209,7 @@ export default {
methods
:
{
...
mapMutations
(
'user'
,
[
'set_userid'
,
'set_corp_id'
,
'set_token'
,
'set_cser_info'
,
'set_cser_id'
,
'set_cser_name'
,
'set_userInfo'
]),
...
mapMutations
(
'game'
,
[
'set_accountSelect'
]),
...
mapActions
(
'game'
,
[
'getTaskUnReadData'
]),
// 设置缓存
cacheCorp_id
(
corp_id
)
{
Cookies
.
set
(
'corp_id'
,
corp_id
,
{
expires
:
7
})
...
...
@@ -205,23 +234,6 @@ export default {
handleSelect
(
key
,
keyPath
)
{
console
.
log
(
'菜单选择:'
,
key
,
keyPath
,
window
.
location
.
href
)
},
initVuexValue
(){
this
.
set_userid
(
Cookies
.
get
(
'userid'
))
this
.
set_corp_id
(
Cookies
.
get
(
'corp_id'
))
this
.
set_token
(
Cookies
.
get
(
'token'
))
this
.
set_cser_id
(
Cookies
.
get
(
'cser_id'
))
this
.
set_cser_name
(
Cookies
.
get
(
'cser_name'
))
const
userinfo
=
{
cser_id
:
Cookies
.
get
(
'cser_id'
),
cser_name
:
Cookies
.
get
(
'cser_name'
),
username
:
Cookies
.
get
(
'cser_name'
),
id
:
Cookies
.
get
(
'cser_id'
),
}
this
.
set_userInfo
(
userinfo
)
const
cser_info
=
Cookies
.
get
(
'cser_info'
)
console
.
log
(
Cookies
.
get
(
'cser_id'
),
'cser_info'
,
Cookies
.
get
(
'cser_name'
))
cser_info
?
this
.
set_cser_info
(
JSON
.
parse
(
cser_info
)):
this
.
set_cser_info
({})
},
// 切换菜单展开收起状态
toggleMenu
()
{
this
.
isMenuExpanded
=
!
this
.
isMenuExpanded
...
...
@@ -366,4 +378,23 @@ export default {
body
{
background
:
#f0f2f5
;
}
/* 任务列表菜单项红点样式 */
.menu-item-with-badge
{
display
:
inline-block
;
}
.task-badge
{
::v-deep
.el-badge__content.is-dot
{
top
:
8px
!important
;
right
:
-5px
!important
;
}
}
/* 确保菜单项内容居中 */
.mobile-menu-item
.menu-item-with-badge
{
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
}
</
style
>
src/api/game.js
浏览文件 @
114871d3
import
request
from
'@/utils/request'
import
store
from
'@/store/index'
import
Cookies
from
'js-cookie'
const
zw_user_id
=
Cookies
.
get
(
'cser_id'
)
||
store
.
state
.
user
.
userInfo
.
id
||
store
.
state
.
user
.
cser_id
// 获取用户ID的函数,避免在模块加载时访问可能未初始化的 store
function
getZwUserId
()
{
return
Cookies
.
get
(
'cser_id'
)
||
(
store
.
state
?.
user
?.
userInfo
?.
id
)
||
(
store
.
state
?.
user
?.
cser_id
)
}
// 游戏业务所属的接口信息
// 所属分组下拉
function
returnApi
(
api
){
...
...
@@ -385,7 +391,7 @@ export function channelList(data) {
// 任务列表
export
function
taskIndex
(
data
)
{
return
new
Promise
((
resovle
,
reject
)
=>
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
cross_systemRequest
({
system
:
'zhangyou'
,
api
:
'/operator_task/index'
,
...
...
@@ -399,7 +405,7 @@ export function taskIndex(data) {
// 任务详情
export
function
taskDetails
(
data
)
{
return
new
Promise
((
resovle
,
reject
)
=>
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
cross_systemRequest
({
system
:
'zhangyou'
,
api
:
'/operator_task/info'
,
...
...
@@ -412,7 +418,7 @@ export function taskDetails(data) {
// 分配
export
function
taskAssign
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -426,7 +432,7 @@ export function taskAssign(data) {
// 完成任务
export
function
taskTrack
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -440,7 +446,7 @@ export function taskTrack(data) {
// 结果列表
export
function
taskRecord
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -454,7 +460,7 @@ export function taskRecord(data) {
// 备注
export
function
logsSave
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -468,7 +474,7 @@ export function logsSave(data) {
// 角色累充
export
function
RoleTodayOrder
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -481,7 +487,7 @@ export function RoleTodayOrder(data) {
}
// 用户充值
export
function
memberOrder
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -494,7 +500,7 @@ export function memberOrder(data) {
}
// 下拉加载
export
function
searchcondition
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -507,7 +513,7 @@ export function searchcondition(data) {
}
// 误操作列表
export
function
misoperationIndex
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -520,7 +526,7 @@ export function misoperationIndex(data) {
}
// 添加误操作
export
function
addErrorHandle
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -532,7 +538,7 @@ export function addErrorHandle(data) {
})
}
export
function
updateErrorHandle
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -545,7 +551,7 @@ export function updateErrorHandle(data) {
}
// 操作数量
export
function
numErrorHandle
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -558,7 +564,7 @@ export function numErrorHandle(data) {
}
// 操作数量新
export
function
operationCount
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -571,7 +577,7 @@ export function operationCount(data) {
}
// 任务消息读取
export
function
taskRead
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -584,7 +590,7 @@ export function taskRead(data) {
}
// 任务消息状态
export
function
taskReadStatus
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -598,7 +604,7 @@ export function taskReadStatus(data) {
// 撤回消息
export
function
cancelRefundRequest
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -612,7 +618,7 @@ export function cancelRefundRequest(data) {
// 举报列表
export
function
reportIndex
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -627,7 +633,7 @@ export function reportIndex(data) {
// 玩家举报
export
function
playerReport
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -642,7 +648,7 @@ export function playerReport(data) {
// 审批记录
export
function
reportProcess
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -656,7 +662,7 @@ export function reportProcess(data) {
// 撤销举报
export
function
reportCancel
(
data
)
{
data
.
zw_user_id
=
store
.
state
.
user
.
cser_id
||
store
.
state
.
user
.
userInfo
.
id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -670,7 +676,7 @@ export function reportCancel(data) {
// 新增举报
export
function
reportAdd
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -684,7 +690,7 @@ export function reportAdd(data) {
// 申诉列表
export
function
appealList
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -698,7 +704,7 @@ export function appealList(data) {
// 新增申诉
export
function
appealAdd
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -712,7 +718,7 @@ export function appealAdd(data) {
// 撤销申诉
export
function
appealCancel
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -726,7 +732,7 @@ export function appealCancel(data) {
// 申诉记录
export
function
appealProcess
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -739,7 +745,7 @@ export function appealProcess(data) {
}
// 玩家举报审批记录
export
function
gamerReportProcess
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -753,7 +759,7 @@ export function gamerReportProcess(data) {
// 角色列表Holo 实时性较高
export
function
getRoleHoLo
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -766,7 +772,7 @@ export function getRoleHoLo(data) {
}
// 角色列表 待请求
export
function
memberTaskStatus
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -780,7 +786,7 @@ export function memberTaskStatus(data) {
// 举报申请列表
export
function
report_request_list
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -793,7 +799,7 @@ export function report_request_list(data) {
}
// 举报申请驳回或者通过
export
function
report_request_approval
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -807,7 +813,7 @@ export function report_request_approval(data) {
// 游戏类型下的游戏列表 游戏类型:安卓 h5 ios
export
function
getTransferRecallGameList
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -820,7 +826,7 @@ export function getTransferRecallGameList(data) {
}
// 转端和召回 游戏类型列表
export
function
getGameConfig
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -834,7 +840,7 @@ export function getGameConfig(data) {
// 召回的时候染色
export
function
recallChannelSeq
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -848,7 +854,7 @@ export function recallChannelSeq(data) {
// 获取游戏信息
export
function
getGameInfo
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -861,7 +867,7 @@ export function getGameInfo(data) {
}
// 新增渠道
export
function
addChannel
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -874,7 +880,7 @@ export function addChannel(data) {
}
// 一键发送召回渠道链接
export
function
quickRecallChannelLink
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -887,7 +893,7 @@ export function quickRecallChannelLink(data) {
}
// 转端发送落地页
export
function
getLandingPageTransfer
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -901,7 +907,7 @@ export function getLandingPageTransfer(data) {
// 工作台关联客服
export
function
bindUserSelfAdd
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -914,7 +920,7 @@ export function bindUserSelfAdd(data) {
}
// 关联客服列表
export
function
bindUserList
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -927,7 +933,7 @@ export function bindUserList(data) {
}
// 新增关联客服
export
function
bindUserAdd
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -941,7 +947,7 @@ export function bindUserAdd(data) {
// 删除关联客服
export
function
bindUserDelete
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -955,7 +961,7 @@ export function bindUserDelete(data) {
// 调用掌游的日志中心
export
function
getSystemModelLog
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -969,7 +975,7 @@ export function getSystemModelLog(data) {
export
function
getMemberTransStatus
(
data
)
{
// 转端文档 获取W账号的转端状态 如果状态是 false 表示不允许转端 在工作台 发送游戏 里面转端里 点开发送的时候 提示 当前w账号不满足转端要求,请联系组长处理
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -982,7 +988,7 @@ export function getMemberTransStatus(data) {
}
export
function
getTaskTracer
(
data
)
{
// 获取运营任务的跟进人 参数 member_id
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -995,7 +1001,7 @@ export function getTaskTracer(data) {
}
// 用户触达 发送客服号添加消息的日志
export
function
getTaskTracerTouch
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1008,7 +1014,7 @@ export function getTaskTracerTouch(data) {
}
// 添加一条任务跟进记录
export
function
getTaskTracerTouchAdd
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1021,7 +1027,7 @@ export function getTaskTracerTouchAdd(data) {
}
// 审批组流程下拉
export
function
approval_group_flow_list
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1034,7 +1040,7 @@ export function approval_group_flow_list(data) {
}
// 审批人员表格
export
function
approval_group_flow_user
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1048,7 +1054,7 @@ export function approval_group_flow_user(data) {
// 保存转端提交
export
function
approval_group_flow_add
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1062,7 +1068,7 @@ export function approval_group_flow_add(data) {
// 转端申请列表
export
function
member_trans_request_list
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1076,7 +1082,7 @@ export function member_trans_request_list(data) {
// 转端申请审批记录
export
function
member_trans_request_process
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1090,7 +1096,7 @@ export function member_trans_request_process(data) {
// 转区列表
export
function
transfer_server_request_list
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1104,7 +1110,7 @@ export function transfer_server_request_list(data) {
// 转区申请
export
function
transfer_server_request_add
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1118,7 +1124,7 @@ export function transfer_server_request_add(data) {
// 转区申请节点
export
function
transfer_server_request_process
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1130,7 +1136,7 @@ export function transfer_server_request_process(data) {
})
}
export
function
getMainGameInfo
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1144,7 +1150,7 @@ export function getMainGameInfo(data) {
// 掌游标签搜索
export
function
roleLabelSearch
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1158,7 +1164,7 @@ export function roleLabelSearch(data) {
// 掌游标签列表
export
function
roleGetRoleLabel
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1171,7 +1177,7 @@ export function roleGetRoleLabel(data) {
}
// 编辑角色标签
export
function
editRoleLabel
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1185,7 +1191,7 @@ export function editRoleLabel(data) {
// 编辑角色标签
export
function
getRoleLabelCreate
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1197,7 +1203,7 @@ export function getRoleLabelCreate(data) {
})
}
export
function
ruleList
(
data
)
{
data
.
zw_user_id
=
zw_user_id
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
...
...
@@ -1208,3 +1214,16 @@ export function ruleList(data) {
})
})
}
// 查询客服未完成任务
export
function
getTaskTotal
(
data
)
{
data
.
zw_user_id
=
getZwUserId
()
return
new
Promise
((
resovle
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
api
:
'/api/operator_task/getTaskTotal'
,
params
:
data
}).
then
((
res
)
=>
{
resovle
(
res
)
})
})
}
src/api/works.js
浏览文件 @
114871d3
...
...
@@ -243,6 +243,14 @@ export function clearTaskUnReadData(data) {
data
})
}
// w账号绑定客户列表
export
function
memberBindExternalUser
(
data
)
{
return
request
({
url
:
returnApi
(
'/cser_receipt/memberBindExternalUser'
),
method
:
'post'
,
data
})
}
// 删除共享信息
export
function
shareInfoDel
(
data
)
{
return
request
({
...
...
src/components/dialog.vue
0 → 100644
浏览文件 @
114871d3
<
template
>
<el-drawer
:lock-scroll=
"true"
:title=
"title"
:visible=
"show"
:size=
"width"
:append-to-body=
"true"
@
close=
"close"
>
<div
class=
"layerConent"
>
<slot></slot>
<span
class=
"dialog-footer rowFlex"
>
<el-button
class=
"btn"
type=
"primary"
size=
"small"
@
click=
"submit"
>
确 定
</el-button>
<el-button
class=
"btn"
size=
"small"
@
click=
"close"
>
取 消
</el-button>
</span>
</div>
</el-drawer>
</
template
>
<
script
type=
"text/javascript"
>
export
default
{
name
:
'Layer'
,
props
:
[
'show'
,
'width'
,
'title'
],
data
()
{
return
{
}
},
watch
:
{
show
(
newVal
,
oldVal
)
{
if
(
newVal
)
{
console
.
log
(
'显示弹窗'
)
}
}
},
mounted
()
{
},
methods
:
{
close
()
{
this
.
$emit
(
'update:show'
,
false
)
},
submit
()
{
this
.
$emit
(
'confirm'
)
}
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
//
::v-deep
.el-drawer
{
//
height
:
100%
;
//
overflow
:
100%
;
//
overflow-x
:
hidden
;
//
over
//
}
.layerConent
{
width
:
100%
;
height
:
100%
;
overflow
:
auto
;
padding-bottom
:
100px
;
padding-right
:
20px
;
}
.dialog-footer
{
width
:
100%
;
height
:
auto
;
position
:
absolute
;
right
:
0px
;
bottom
:
0px
;
padding-right
:
10px
;
padding-top
:
20px
;
padding-bottom
:
20px
;
border-top
:
1px
solid
rgba
(
0
,
0
,
0
,
0.06
);
justify-content
:
flex-end
;
background
:
#fff
;
.btn
{
width
:
84px
;
height
:
32px
;
}
}
</
style
>
\ No newline at end of file
src/directive/scroll/scroll.js
浏览文件 @
114871d3
...
...
@@ -83,6 +83,7 @@ function createScrollHandler(el, binding, vnode) {
// 调用加载函数
options
.
loadMore
();
}
};
}
...
...
src/router/index.js
浏览文件 @
114871d3
...
...
@@ -11,7 +11,7 @@ import violationRecord from '../views/ViolationRecord.vue'
import
taskRecord
from
'../views/taskRecord.vue'
import
mailList
from
'@/views/mailList.vue'
import
quickSendGame
from
'@/views/quickSendGame.vue'
//
import taskList from '@/views/taskList.vue'
import
taskList
from
'@/views/taskList.vue'
import
Cookies
from
'js-cookie'
import
store
from
'@/store'
Vue
.
use
(
VueRouter
)
...
...
@@ -78,11 +78,11 @@ const routes = [
name
:
'quickSendGame'
,
component
:
quickSendGame
},
//
{
//
path: '/taskList',
//
name: 'taskList',
//
component: taskList
//
},
{
path
:
'/taskList'
,
name
:
'taskList'
,
component
:
taskList
},
{
path
:
'/login'
,
name
:
'login'
,
...
...
src/store/modules/game.js
浏览文件 @
114871d3
...
...
@@ -2,6 +2,7 @@
// 管理公共的store
import
{
zyouBindMember
}
from
'@/api/works'
import
{
getTaskTotal
}
from
'@/api/game'
import
Cookies
from
'js-cookie'
// 从本地缓存获取accountSelect
...
...
@@ -15,6 +16,13 @@ const state = {
chatUserInfo
:
{},
// 当前选中的用户的详情
viewLoading
:
false
,
// 查看用户详情的时候 加载状态
taskDetails
:
{},
// 任务详情
// 任务数据
taskData
:
{
user_task
:
0
,
account_task
:
0
,
operator_task
:
0
,
lastUpdateTime
:
null
},
}
const
mutations
=
{
...
...
@@ -38,6 +46,13 @@ const mutations = {
},
set_taskDetails
(
state
,
data
)
{
state
.
taskDetails
=
data
},
// 设置任务数据
set_taskData
(
state
,
data
)
{
state
.
taskData
=
{
...
data
,
lastUpdateTime
:
Date
.
now
()
}
}
}
...
...
@@ -62,6 +77,46 @@ const actions = {
})
})
},
// 获取任务数据
async
getTaskUnReadData
({
commit
,
rootState
})
{
return
new
Promise
(
async
(
resolve
,
reject
)
=>
{
try
{
// 确保用户信息存在
if
(
!
rootState
.
user
.
userInfo
||
!
rootState
.
user
.
userInfo
.
id
)
{
console
.
log
(
'用户信息不存在,跳过任务数据获取'
)
return
}
const
data
=
{
zw_user_id
:
rootState
.
user
.
userInfo
.
id
}
console
.
log
(
'开始获取任务数据:'
,
data
)
const
res
=
await
getTaskTotal
(
data
)
if
(
res
.
status_code
===
1
)
{
// 使用真实的 API 响应数据
const
responseData
=
res
.
data
.
data
||
{}
const
taskData
=
{
user_task
:
responseData
.
user_num
||
0
,
account_task
:
responseData
.
member_num
||
0
,
operator_task
:
Number
(
responseData
.
user_num
||
0
)
+
Number
(
responseData
.
member_num
||
0
)
}
commit
(
'set_taskData'
,
taskData
)
resolve
(
taskData
)
return
taskData
}
else
{
reject
(
res
.
msg
)
console
.
error
(
'获取任务数据失败:'
,
res
.
msg
)
}
}
catch
(
error
)
{
reject
(
error
)
console
.
error
(
'获取任务数据异常:'
,
error
)
throw
error
}
})
}
}
export
default
{
...
...
src/store/modules/user.js
浏览文件 @
114871d3
...
...
@@ -76,7 +76,7 @@ const mutations = {
},
set_client_online_status
(
state
,
status
)
{
state
.
client_online_status
=
status
}
,
}
}
const
actions
=
{
...
...
src/views/components/taskList/taskDetails.vue
0 → 100644
浏览文件 @
114871d3
<
template
>
<div>
<el-drawer
:lock-scroll=
"true"
title=
"玩家申诉"
:visible=
"show"
size=
"100%"
:append-to-body=
"true"
@
close=
"close"
>
<!-- 我的任务 -->
<div
class=
"contet"
v-loading=
"loading"
>
<div
class=
"title"
>
当前任务
</div>
<div
class=
"taskInfo rowFlex flexWarp columnCenter"
>
<div
v-for=
"(item, index) in detailsList"
:key=
"index"
class=
"taskInfoItem rowFlex"
>
<div
v-if=
"
item.value != 'plan_type' &&
item.value != 'target' &&
item.value != 'finished_event' &&
item.value != 'username'
"
class=
"rowFlex"
>
<div
class=
"label"
>
{{
item
.
label
}}
</div>
<div
v-if=
"item.type == 'money'"
class=
"value"
>
<p>
<span>
¥
</span><span>
{{
assionInfo
[
item
.
value
]
||
0
}}
</span>
</p>
</div>
<div
v-else
class=
"value"
>
<span
v-if=
"assionInfo[item.value]"
>
{{
assionInfo
[
item
.
value
]
||
""
}}
</span>
</div>
</div>
<div
v-else-if=
"item.value == 'plan_type'"
class=
"rowFlex"
>
<div
class=
"label"
>
{{
item
.
label
}}
</div>
<div
class=
"value"
>
<span
style=
"color: #0787f2"
>
{{
taskTypeList
.
find
((
k
)
=>
k
.
value
==
assionInfo
[
item
.
value
])
?
taskTypeList
.
find
((
k
)
=>
k
.
value
==
assionInfo
[
item
.
value
])
.
label
:
""
}}
</span>
</div>
</div>
<div
v-else-if=
"item.value == 'target'"
class=
"rowFlex"
>
<div
class=
"label"
>
{{
item
.
label
}}
</div>
<div
class=
"value"
>
<span
v-if=
"assionInfo.target"
style=
"color: #0787f2"
>
{{
assionInfo
.
target
.
first
&&
assionInfo
.
target
.
first
.
is_finished
?
"已完成"
:
"未完成"
}}
</span>
</div>
</div>
<div
v-else-if=
"item.value == 'finished_event'"
class=
"rowFlex"
>
<div
class=
"label"
>
{{
item
.
label
}}
</div>
<div
v-if=
"assionInfo.finished_event"
class=
"value"
>
<span
v-for=
"(item, index) in assionInfo.finished_event"
:key=
"index"
>
{{
item
}}
</span>
</div>
</div>
<!-- w 账号 -->
<div
v-else-if=
"item.value == 'username'"
class=
"rowFlex"
>
<div
class=
"label"
>
{{
item
.
label
}}
</div>
<div
v-if=
"assionInfo.username && assionInfo.username.length > 0"
class=
"value"
>
<div
v-if=
"assionInfo.username.length
<
=
1
"
class=
"rowFlex"
>
<div
v-for=
"(items, indexs) in assionInfo.username"
:key=
"indexs"
class=
"rowFlex userInfoStyle"
>
<p
class=
"textHidden rowFlex userAlias"
style=
"max-width:150px;"
>
{{
items
}}
</p>
</div>
</div>
<el-popover
v-else
placement=
"top"
trigger=
"click"
>
<div
style=
"max-width: 400px"
>
<p
v-for=
"(items, indexs) in assionInfo.username"
:key=
"indexs"
class=
"rowFlex columnCenter userInfoStyle"
style=
"margin-bottom: 10px"
>
<span
class=
"textHidden"
style=
"max-width:150px;"
>
{{
items
}}
</span>
</p>
</div>
<el-button
slot=
"reference"
type=
"text"
size=
"medium"
style=
"margin-top: -10px"
>
{{
assionInfo
.
username
.
length
}}
个
</el-button>
</el-popover>
</div>
</div>
</div>
</div>
<div
class=
"contentInfo"
>
<div
class=
"contentInfoItem rowFlex"
>
<div
class=
"label"
>
跟进状态
</div>
<div
v-if=
"assionInfo.status == 1"
class=
"noSend"
>
待跟进
</div>
<div
v-else-if=
"assionInfo.status == 2"
class=
"noSend"
>
跟进中
</div>
<div
v-else-if=
"assionInfo.status == 3"
class=
"sended"
>
已跟进
</div>
</div>
<div
v-if=
"remarks.remarks"
class=
"remarks rowFlex flexWarp"
>
<div
v-for=
"(item, index) in remarks.remarks"
:key=
"index"
>
<div
class=
"contentInfoItem rowFlex"
>
<div
class=
"label"
>
跟进时间
</div>
<div
class=
"value"
>
{{
item
.
update_time
}}
</div>
</div>
<div
class=
"contentInfoItem rowFlex"
>
<div
class=
"label"
>
备注
</div>
<div
class=
"value"
>
<div
class=
"remarkContent"
v-html=
"item.remark"
></div>
</div>
</div>
</div>
</div>
<!-- 发起会话 -->
<!-- 新增判断逻辑 根据 taskDetails 中的is_bind 判断 1:显示发起会话按钮 0:不显示发起会话按钮 -->
<div
v-if=
"kfhList && kfhList.length > 0 && assionInfo.status_name !== '已完成'"
class=
"kfhList rowFlex columnCenter flexWarp"
>
<div
v-for=
"(item, index) in kfhList"
:key=
"index"
class=
"sessionUserList "
>
<div
style=
"margin-bottom: 10px"
class=
"sessionUser"
>
<div
class=
"kfhItem rowFlex spaceBetween"
>
<div
class=
"left rowFlex columnCenter"
>
<el-image
:src=
"item.user.avatar"
class=
"image"
></el-image>
<div
class=
"name"
>
{{
item
.
user
.
alias
}}
</div>
</div>
<el-button
class=
"right"
type=
"primary"
size=
"small"
@
click=
"requestSession(item)"
>
发起会话
</el-button>
</div>
<div
class=
"wxUserInfo columnFlex"
>
<p>
<span>
用户备注:
</span>
<label
style=
"word-break: break-all;"
>
{{
item
.
external_user
.
remark
||
item
.
external_user
.
name
}}
</label>
</p>
<p
v-if=
"false"
>
最近接待时间:
{{
item
.
username
}}
</p>
</div>
</div>
</div>
</div>
<el-button
v-if=
"kfhList.length == 0 && taskDetails.status != 3 && !is_finished"
type=
"primary"
size=
"small"
style=
"margin-top: 20px"
@
click=
"showLayer = true"
>
完成任务
</el-button>
</div>
</div>
</el-drawer>
<layer
:show
.
sync=
"showLayer"
title=
"填写跟进结果"
width=
"320px"
@
confirm=
"onConfirm"
>
<div
class=
"editLayer"
>
<el-form
ref=
"ruleForm"
:model=
"webForm"
label-position=
"top"
:rules=
"webFormRule"
label-width=
"100px"
>
<!-- 新增异常原因筛选 当 plan_type==5 5:为大R异跟进异常时 新增异常原因筛选 -->
<el-form-item
v-if=
"taskDetails.plan_type==5"
label=
"异常原因"
prop=
"abnormal_types"
>
<el-select
v-model=
"webForm.abnormal_types"
style=
"width: 100%"
placeholder=
"请选择"
multiple
collapse-tags
>
<el-option
v-for=
"item in errorTypeList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item
label=
"跟进结果:"
prop=
"trace_result"
>
<el-select
v-model=
"webForm.trace_result"
style=
"width: 100%"
placeholder=
"请选择"
>
<el-option
v-for=
"item in traceList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item
label=
"备注:"
prop=
"remark"
>
<el-input
v-model=
"webForm.remark"
type=
"textarea"
style=
"width: 100%; height: 150px"
placeholder=
"备注请填写异常原因和异常类型,并列举后续维护策略/难以维护的原因"
></el-input>
</el-form-item>
</el-form>
</div>
</layer>
</div>
</
template
>
<
script
>
import
{
mapState
,
mapMutations
}
from
'vuex'
import
{
taskRecord
,
searchcondition
,
memberOrder
,
RoleTodayOrder
,
taskDetails
,
taskTrack
,
}
from
'@/api/game'
import
{
memberBindExternalUser
}
from
'@/api/works'
import
layer
from
'@/components/dialog.vue'
export
default
{
computed
:
{
...
mapState
(
'game'
,
[
'taskDetails'
]),
...
mapState
(
'user'
,
[
'userInfo'
])
},
components
:
{
layer
},
props
:
[
'show'
],
data
()
{
return
{
is_finished
:
false
,
loading
:
false
,
remarks
:
[],
kfhList
:
{},
traceList
:
[],
taskTypeList
:
[],
errorTypeList
:
[],
approvalProcessList
:
[],
assionInfo
:
{},
current
:
0
,
showLayer
:
false
,
dialogRemake
:
''
,
webForm
:
{
trace_result
:
''
,
remark
:
''
,
abnormal_types
:
[]
},
webFormRule
:
{
remark
:
[{
required
:
true
,
message
:
'请输入备注'
,
trigger
:
'blur'
}],
trace_result
:
[
{
required
:
true
,
message
:
'请选择跟进结果'
,
trigger
:
'change'
}
],
abnormal_types
:
[
{
required
:
true
,
message
:
'请选择异常原因'
,
trigger
:
'change'
}
]
},
detailsList
:
[
{
label
:
'游戏名称'
,
value
:
'main_game_name'
},
{
label
:
'计划名称'
,
value
:
'plan_name'
},
{
label
:
'CP角色ID'
,
value
:
'cp_role_id'
},
{
label
:
'角色名称'
,
value
:
'role_name'
},
{
label
:
'区服'
,
value
:
'server_name'
},
{
label
:
'任务类型'
,
value
:
'plan_type'
},
{
label
:
'W账号'
,
value
:
'username'
},
{
label
:
'角色充值金额'
,
value
:
'recharge_total'
,
type
:
'money'
},
{
label
:
'用户累充金额'
,
value
:
'member_recharge'
,
type
:
'money'
},
{
label
:
'今日充值金额'
,
value
:
'today_amount'
,
type
:
'money'
},
{
label
:
'跟进人'
,
value
:
'tracer_name'
},
{
label
:
'举报人角色'
,
value
:
'report_role_name'
},
{
label
:
'米大师支付'
,
value
:
'm_pay_amount'
,
type
:
'money'
},
{
label
:
'H5支付'
,
value
:
'h5_pay_amount'
,
type
:
'money'
},
{
label
:
'IOS支付'
,
value
:
'ios_pay_amount'
,
type
:
'money'
},
{
label
:
'待维护时间'
,
value
:
'assignment_time'
},
{
label
:
'最近充值时间'
,
value
:
'last_pay_time'
},
{
label
:
'最近登录时间'
,
value
:
'last_login_time'
},
{
label
:
'任务截止时间'
,
value
:
'deadline_time'
},
{
label
:
'任务状态'
,
value
:
'status_name'
},
{
label
:
'目标完成状态'
,
value
:
'target'
},
{
label
:
'马甲包'
,
value
:
'game_name'
},
{
label
:
'完成事件'
,
value
:
'finished_event'
},
{
label
:
'目标客服号'
,
value
:
'target_service_name'
}
],
}
},
watch
:
{
taskDetails
(
newVal
,
oldVal
)
{
if
(
newVal
.
member_id
)
{
this
.
requestInit
()
}
}
},
created
()
{
this
.
assionInfo
=
this
.
taskDetails
},
mounted
()
{
if
(
this
.
taskDetails
.
id
)
{
this
.
requestInit
()
}
},
methods
:
{
...
mapMutations
(
'game'
,
[
'set_taskDetails'
,
'set_task_session_member_id'
]),
requestInit
()
{
this
.
current
=
0
this
.
is_finished
=
false
this
.
assionInfo
=
this
.
taskDetails
this
.
taskRecord
()
this
.
memberOrder
()
this
.
requestTaskDetails
()
this
.
searchTrackList
()
// 只有状态是 5 的时候 才请求
if
(
this
.
taskDetails
.
plan_type
==
5
)
{
this
.
searchconditionError
()
}
},
close
()
{
this
.
$emit
(
'update:show'
,
false
)
},
searchconditionError
()
{
const
data
=
{
type
:
'dictionaries'
,
table_name
:
'zs_operator_task'
,
field_name
:
'abnormal_type'
}
searchcondition
(
data
).
then
((
res
)
=>
{
this
.
errorTypeList
=
res
.
data
.
data
})
},
searchcondition
()
{
const
data
=
{
type
:
'dictionaries'
,
table_name
:
'zs_operator_plan'
,
field_name
:
'plan_type'
}
searchcondition
(
data
).
then
((
res
)
=>
{
this
.
taskTypeList
=
res
.
data
.
data
})
},
searchTrackList
()
{
const
data
=
{
type
:
'dictionaries'
,
table_name
:
'zs_operator_task'
,
field_name
:
'trace_result'
}
searchcondition
(
data
).
then
((
res
)
=>
{
this
.
traceList
=
res
.
data
.
data
})
},
// 完成任务
submitForm
()
{
const
data
=
{
id
:
this
.
taskDetails
.
id
,
trace_result
:
this
.
webForm
.
trace_result
,
create_user
:
this
.
userInfo
.
username
,
remark
:
this
.
webForm
.
remark
,
abnormal_types
:
this
.
webForm
.
abnormal_types
,
create_department
:
this
.
userInfo
.
department_name
}
taskTrack
(
data
).
then
((
res
)
=>
{
if
(
res
.
status_code
==
1
)
{
this
.
$message
.
success
(
res
.
msg
)
this
.
webForm
=
{
trace_result
:
''
,
remark
:
''
,
abnormal_types
:
[]
}
this
.
is_finished
=
true
this
.
showLayer
=
false
}
})
},
onConfirm
()
{
this
.
$refs
.
ruleForm
.
validate
((
valid
)
=>
{
if
(
valid
)
{
this
.
submitForm
()
}
else
{
console
.
log
(
'error submit!!'
)
}
})
},
requestTaskDetails
()
{
const
data
=
{
id
:
this
.
taskDetails
.
id
}
taskDetails
(
data
).
then
((
res
)
=>
{
this
.
assionInfo
=
{
...
res
.
data
,
...
this
.
assionInfo
}
this
.
memberBindExternalUser
()
if
(
this
.
assionInfo
&&
this
.
assionInfo
.
username
&&
this
.
assionInfo
.
username
.
indexOf
(
'
\
n'
)
!==
-
1
)
{
this
.
assionInfo
.
username
=
this
.
assionInfo
.
username
.
split
(
'
\
n'
)
}
else
{
this
.
assionInfo
.
username
=
[
this
.
assionInfo
.
username
]
}
})
},
requestSession
(
item
)
{
this
.
$ww
.
openEnterpriseChat
({
externalUserIds
:
item
.
external_userid
,
success
:
(
res
)
=>
{
console
.
log
(
res
,
'打开会话窗口成功'
)
},
fail
:
(
err
)
=>
{
console
.
log
(
err
,
'打开会话窗口失败'
)
}
})
},
async
memberOrder
()
{
let
res
=
{}
if
(
!
this
.
taskDetails
.
cp_role_id
||
this
.
taskDetails
.
cp_role_id
==
''
)
{
res
=
await
memberOrder
({
member_id
:
this
.
taskDetails
.
member_id
})
}
else
{
res
=
await
RoleTodayOrder
({
role_id
:
this
.
taskDetails
.
role_id
})
}
this
.
todayOrder
=
res
.
data
[
0
]
this
.
assionInfo
=
{
...
this
.
assionInfo
,
...
this
.
todayOrder
}
},
async
taskRecord
()
{
const
res
=
await
taskRecord
({
task_id
:
this
.
taskDetails
.
id
,
user_type
:
''
})
console
.
log
(
res
.
data
.
data
,
'res.data.data'
)
if
(
res
.
data
.
data
.
length
>
0
){
this
.
remarks
=
res
.
data
.
data
[
0
].
remarks
}
else
{
this
.
remarks
=
[{
remark
:
''
}]
}
},
async
memberBindExternalUser
()
{
let
member_list
=
[]
if
(
this
.
assionInfo
.
members
?.
length
>
0
)
{
member_list
=
this
.
assionInfo
.
members
.
map
((
item
)
=>
item
.
member_id
)
}
else
{
member_list
=
[
this
.
assionInfo
.
member_id
]
}
this
.
loading
=
true
if
(
member_list
.
length
===
0
)
{
return
false
}
try
{
const
res
=
await
memberBindExternalUser
({
member_id
:
member_list
.
toString
(),
is_bind
:
this
.
assionInfo
.
is_bind
})
this
.
kfhList
=
res
.
data
this
.
loading
=
false
}
catch
(
error
)
{
this
.
loading
=
false
}
}
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
.contet
{
height
:
100%
;
background
:
#fff
;
padding
:
10px
;
overflow
:
auto
;
.title
{
font-size
:
14px
;
font-family
:
PingFangSC-Medium
,
PingFang
SC
;
font-weight
:
500
;
color
:
#333333
;
margin-bottom
:
10px
;
}
.taskInfo
{
height
:
auto
;
background
:
#f7f8fa
;
border-radius
:
4px
;
padding-bottom
:
3px
;
padding-top
:
10px
;
position
:
relative
;
.icon
{
font-size
:
52px
;
}
.approval_status
{
position
:
absolute
;
top
:
50%
;
right
:
20px
;
transform
:
translateY
(
-50%
);
}
.taskInfoItem
{
width
:
250px
;
margin-bottom
:
5px
;
.label
{
width
:
100px
;
font-size
:
14px
;
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
font-weight
:
400
;
color
:
#99a3b4
;
text-align
:
right
;
margin-right
:
10px
;
}
.value
{
font-size
:
14px
;
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
font-weight
:
400
;
color
:
#333333
;
text-align
:
left
;
}
}
}
.remarks
{
margin-top
:
20px
;
}
.contentInfo
{
margin-top
:
20px
;
.contentInfoItem
{
margin-right
:
40px
;
margin-top
:
10px
;
.label
{
width
:
60px
;
font-size
:
14px
;
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
font-weight
:
400
;
color
:
#99a3b4
;
text-align
:
right
;
margin-right
:
10px
;
}
.remarkContent
{
width
:
200px
;
height
:
auto
;
::v-deep
img
{
max-width
:
200px
;
}
}
.value
{
font-size
:
14px
;
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
font-weight
:
400
;
color
:
#333333
;
text-align
:
left
;
}
}
}
.kfhList
{
width
:
100%
;
height
:
auto
;
margin-top
:
22px
;
margin-bottom
:
60px
;
.sessionUser{
width
:
100%
;
height
:
auto
;
background
:
#F8F8F8
;
border-radius
:
4px
;
padding
:
10px
;
}
.wxUserInfo
{
span{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
14px
;
color
:
#949FB0
;
}
}
.kfhItem
{
width
:
330px
;
background
:
#f8f8f8
;
border-radius
:
4px
;
margin-right
:
20px
;
margin-bottom
:
5px
;
.left
{
.image
{
width
:
30px
;
height
:
30px
;
border-radius
:
50%
;
margin-right
:
10px
;
}
.name
{
font-size
:
14px
;
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
font-weight
:
400
;
color
:
#333333
;
}
}
}
}
.approvalProcessList
{
margin-bottom
:
20px
;
margin-top
:
20px
;
}
//
掌游的样式
::v-deep
.el-step
.el-step__line
{
width
:
1px
;
}
::v-deep
.el-step
>
.is-success
{
color
:
#00bf8a
;
border-color
:
#00bf8a
;
.el-step__line
{
background-color
:
#e5e6eb
;
}
}
::v-deep
.el-step__main
>
.is-success
{
color
:
#00bf8a
;
}
::v-deep
.el-step
>
.is-process
{
color
:
#00bf8a
;
border-color
:
#00bf8a
;
.el-step__line
{
background-color
:
#e5e6eb
;
}
}
::v-deep
.el-step__main
>
.is-process
{
color
:
#00bf8a
;
}
.form-item-btn
{
margin
:
0
0
0
20px
;
}
.audit-label
{
font-size
:
14px
;
font-weight
:
800
;
margin
:
0
0
10px
0
;
}
.remark-label
{
color
:
#949fb0
;
font-size
:
14px
;
}
.preview-btn
{
cursor
:
pointer
;
font-size
:
14px
;
color
:
#00bf8a
;
margin
:
0
0
0
10px
;
i
{
margin
:
0
5px
0
0
;
}
}
.remark-value
{
width
:
480px
;
min-height
:
100px
;
margin
:
10px
0
0
40px
;
padding
:
6px
12px
;
border
:
1px
solid
#d9d9d9
;
border-radius
:
4px
;
cursor
:
not-allowed
;
color
:
#333
;
}
.flex-box
{
display
:
flex
;
.remark-lebel
{
width
:
50px
;
text-align
:
right
;
}
}
.refund-flow-drawer
{
position
:
fixed
;
top
:
0
;
right
:
700px
;
}
.btm-btn-box
{
position
:
fixed
;
bottom
:
20px
;
width
:
560px
;
height
:
32px
;
}
.audit-state
{
width
:
50px
;
height
:
50px
;
position
:
absolute
;
top
:
50%
;
right
:
0
;
transform
:
translateY
(
-50%
);
z-index
:
100
;
.audit-state-stamp
{
font-size
:
50px
;
}
}
.info-item
{
width
:
45%
;
display
:
flex
;
height
:
18px
;
margin
:
0
0
12px
0
;
}
.info-item-pic
{
width
:
100%
;
min-height
:
96px
;
max-height
:
192px
;
display
:
flex
;
.img-list
{
width
:
464px
;
display
:
flex
;
flex-wrap
:
wrap
;
&-item
{
width
:
80px
;
height
:
80px
;
border-radius
:
4px
;
overflow
:
hidden
;
margin
:
0
10px
10px
0
;
position
:
relative
;
.preview-pic
{
width
:
80px
;
height
:
80px
;
background
:
rgba
(
0
,
0
,
0
,
0.5
);
position
:
absolute
;
top
:
0
;
left
:
0
;
z-index
:
-1
;
text-align
:
center
;
line-height
:
80px
;
.preview-icon
{
font-size
:
16px
;
color
:
#fff
;
cursor
:
pointer
;
}
}
.screenshot
{
object-fit
:
center
;
width
:
80px
;
height
:
80px
;
}
&
:hover
>
.preview-pic
{
z-index
:
100
;
}
}
}
}
.flex-btn
{
display
:
flex
;
justify-content
:
space-between
;
}
.info-label
{
//
width
:
90px
;
//
text-align
:
right
;
display
:
block
;
margin
:
0
10px
0
0
;
font-size
:
14px
;
color
:
#949fb0
;
}
.info-value
{
display
:
block
;
font-size
:
14px
;
color
:
#333
;
}
.card-style
{
background
:
#f2f2f7
;
border-radius
:
4px
;
}
.trans-follow-1
{
width
:
548px
;
min-height
:
fit-content
;
margin
:
6px
0
12px
0
;
padding
:
12px
12px
0
;
display
:
flex
;
flex-wrap
:
wrap
;
position
:
relative
;
.collapse-btn
{
position
:
absolute
;
top
:
20px
;
right
:
15px
;
}
.follow-item-remark
{
width
:
100%
;
line-height
:
20px
;
margin
:
0
0
12px
0
;
}
.info-value-color
{
color
:
#00bf8a
;
margin-left
:
5px
;
}
}
.follow-item
{
width
:
50%
;
height
:
20px
;
line-height
:
20px
;
margin
:
0
0
12px
0
;
display
:
flex
;
.label-left
{
width
:
90px
;
text-align
:
right
;
}
}
.left-label
{
width
:
60px
;
}
.follow-info-label
{
width
:
fit-content
;
text-align
:
left
;
display
:
inline-block
;
margin
:
0
10px
0
0
;
}
.info-value
{
font-size
:
14px
;
color
:
#333
;
}
.label-font
{
font-size
:
14px
;
color
:
#949fb0
;
}
.info-item-remark
{
width
:
100%
;
padding
:
0
0
12px
0
;
line-height
:
20px
;
.info-label
{
display
:
block
;
}
.info-value
{
display
:
block
;
width
:
440px
;
}
}
}
.editLayer
{
padding
:
20px
;
padding-right
:
0
;
::v-deep
.el-textarea__inner
{
height
:
150px
;
}
}
</
style
>
\ No newline at end of file
src/views/components/taskList/uesrTask.vue
浏览文件 @
114871d3
...
...
@@ -3,10 +3,11 @@
<!--
<div
class=
"detailsTitle rowFlex spaceBetween columnCenter"
>
<p>
任务记录
</p>
</div>
-->
<div
class=
"account-task-container-content"
v-scroll=
"requestOrderList"
v-loading=
"loading"
>
<div
class=
"account-task-container-content"
v-scroll=
"requestOrderList"
>
<!-- 运营任务 和 用户任务 -->
<div
class=
"orderDetailsScroll"
v-loading=
"loading"
>
<div
v-if=
"orderList.length > 0"
>
<div
...
...
@@ -35,34 +36,32 @@
</div>
</div>
</
template
>
<div
class=
"item rowFlex columnCenter spaceBetween"
>
<div
class=
"rowFlex columnCenter"
>
<span
class=
"label"
>
跟进客服
</span>
<p
class=
"text"
>
{{ item.tracer_name }}
</p>
</div>
</div>
<div
class=
"item rowFlex columnCenter spaceBetween"
>
<div
class=
"rowFlex"
>
<span
class=
"label"
>
待维护日期
</span>
<p
class=
"text"
>
{{ item.assignment_time }}
</p>
</div>
</div>
<div
class=
"editLayer"
>
<el-form
:model=
"webForm"
label-width=
"100px"
>
<el-form-item
label=
"跟进客服:"
>
<p
class=
"text"
style=
"margin-left: 10px;"
>
{{ item.tracer_name || '--' }}
</p>
</el-form-item>
<el-form-item
label=
"待维护日期:"
>
<p
class=
"text"
style=
"margin-left: 10px;"
>
{{ item.assignment_time }}
</p>
</el-form-item>
<!-- 新增异常原因筛选 当 plan_type==5 5:为大R异跟进异常时 新增异常原因筛选 -->
<el-form-item
v-if=
"taskInfo.plan_type && taskInfo.plan_type==5"
label=
"异常原因"
prop=
"abnormal_types"
label-width=
"100px"
>
<el-select
v-model=
"webForm.abnormal_types"
style=
"width: 90%"
placeholder=
"请选择"
multiple
style=
"margin-left: 10px;"
collapse-tags
>
<el-option
...
...
@@ -77,12 +76,11 @@
<el-form-item
label=
"跟进结果:"
prop=
"trace_result"
label-width=
"100px"
>
<el-select
v-model=
"webForm.trace_result"
style=
"width: 90%"
placeholder=
"请选择"
style=
"margin-left: 10px;"
>
<el-option
v-for=
"item in traceList"
...
...
@@ -95,15 +93,17 @@
<el-form-item
v-if=
"activeType == 'user_task'"
label=
"免打扰:"
label-width=
"80px"
prop=
"no_trouble"
style=
"margin-left: 10px;"
>
<div
class=
"noDisturb"
>
<el-checkbox
v-model=
"webForm.no_trouble"
class=
"noDisturb rowFlex
allCenter
"
class=
"noDisturb rowFlex "
:true-label=
"1"
:false-label=
"0"
>
免打扰(勾选后该用户不会再被分配任务)
</el-checkbox>
</div>
</el-form-item>
</el-form>
</div>
...
...
@@ -114,17 +114,17 @@
class=
"item rowFlex columnCenter spaceBetween"
>
<div
class=
"rowFlex spaceBetween"
class=
"rowFlex spaceBetween
remarkItem
"
style=
"width: 100%;"
>
<span
class=
"label"
style=
"width: 50px"
style=
"margin-left: 40px;color: #999999;"
>
备注:
</span>
<div
class=
"
t
ext rowFlex remark flex1"
>
<div
class=
"
remarkTx
ext rowFlex remark flex1"
>
<textEditor
:remark
.
sync=
"remark.remark"
:domid=
"'taskRemark' + indexs"
style=
"width: 100%;"
:contenteditable=
"!Boolean(remark.id)"
@
resultReamrk=
"resultReamrk"
/>
...
...
@@ -167,6 +167,7 @@
</div>
<div
v-else-if=
"!loading && orderList.length == 0"
style=
"margin-top: 100px;"
class=
"noContent rowFlex allCenter"
>
<noContent
/>
...
...
@@ -183,7 +184,7 @@
export
default
{
components
:
{
textEditor
,
noContent
noContent
,
},
data
()
{
return
{
...
...
@@ -259,13 +260,13 @@
total
:
0
}
this
.
orderList
=
[]
this
.
requestOrderList
()
this
.
requestOrderList
(
'msg'
)
}
}
},
mounted
()
{
// this.gameMemberView()
this
.
requestOrderList
()
this
.
requestOrderList
(
'msg'
)
this
.
searchcondition
()
this
.
searchTrackList
()
this
.
searchconditionError
()
...
...
@@ -405,7 +406,7 @@
no_trouble
:
0
}
},
requestOrderList
()
{
requestOrderList
(
msg
=
''
)
{
if
(
this
.
accountSelect
==
''
)
{
this
.
$message
.
warning
(
'暂无关联的账号,请先去关联账号!'
)
return
false
...
...
@@ -431,7 +432,7 @@
this
.
orderList
.
map
((
item
)
=>
{
!
item
.
remarks
||
item
.
remarks
.
length
===
0
?
(
item
.
remarks
=
[{
remark
:
''
}])
:
''
})
if
(
res
.
status_code
==
1
)
{
if
(
res
.
status_code
==
1
&&
!
msg
)
{
this
.
$message
.
success
(
res
.
msg
)
}
},
...
...
@@ -450,6 +451,9 @@
background
:
#fff
;
position
:
relative
;
overflow
:
hidden
;
::v-deep
.el-form-item__content{
line-height
:
32px
;
}
.detailsTitle
{
width
:
100%
;
padding
:
0
10px
;
...
...
@@ -481,7 +485,7 @@
color
:
#999999
;
}
}
.
i
tem
{
.
taskI
tem
{
width
:
100%
;
height
:
auto
;
font-size
:
14px
;
...
...
@@ -489,7 +493,6 @@
color
:
#333333
;
transition
:
all
0.5s
;
position
:
relative
;
cursor
:
pointer
;
div
{
width
:
100%
;
margin-bottom
:
5px
;
...
...
@@ -620,15 +623,13 @@
.money
{
width
:
100%
;
height
:
auto
;
padding-left
:
10px
;
.btns
{
padding-right
:
4
0px
;
margin-right
:
2
0px
;
}
.btn
{
background
:
#fff
;
border-radius
:
4px
;
padding
:
2px
5px
;
margin-left
:
10px
;
font-size
:
12px
;
border
:
1px
solid
rgba
(
0
,
0
,
0
,
0.15
);
color
:
#333333
;
...
...
@@ -711,7 +712,14 @@
font-size
:
16px
;
font-weight
:
500
;
}
.remarkTxext
{
width
:
calc
(
100%
-
120px
);
margin-left
:
10px
;
}
.remarkItem
{
margin-left
:
40px
;
position
:
relative
;
}
::v-deep
.el-collapse
{
border
:
none
;
}
...
...
@@ -720,6 +728,7 @@
color
:
#333333
;
font-size
:
14px
;
font-weight
:
400
;
padding
:
0
5px
;
/* 单行显示省略号 */
overflow
:
hidden
;
text-overflow
:
ellipsis
;
...
...
@@ -733,20 +742,25 @@
padding
:
10px
;
}
.editLayer
{
margin-left
:
-20px
;
.noDisturb{
//
换行
white-space
:
wrap
;
}
::v-deep
.el-form-item__label
{
font-weight
:
normal
;
color
:
#999999
;
}
::v-deep
.el-form-item--small.el-form-item
{
margin-bottom
:
10px
;
padding
:
10px
0
;
.noDisturb
{
display
:
flex
;
align-items
:
center
;
margin-top
:
4px
;
}
::v-deep
.el-form-item__label
{
font-weight
:
normal
;
color
:
#999999
;
padding-right
:
8px
;
}
::v-deep
.el-form-item
{
margin-bottom
:
14px
;
}
::v-deep
.el-select
,
::v-deep
.el-checkbox
{
width
:
100%
;
}
}
}
}
</
style
>
\ No newline at end of file
src/views/taskList.vue
浏览文件 @
114871d3
...
...
@@ -4,24 +4,17 @@
<el-tabs
v-model=
"taskForm.type"
@
tab-click=
"taskTypeChange"
>
<el-tab-pane
v-for=
"(item, index) in typeList"
:key=
"index"
:label=
"item.label"
:name=
"item.value + ''"
>
<template
slot=
"label"
>
<!-- 有
数字
-->
<div
v-if=
"item.redNum && item.redNum > 0"
>
<el-badge
is-dot
class=
"badgeItem"
>
<!-- 有
红点数字显示 badge
-->
<div
v-if=
"item.redNum && item.redNum > 0"
class=
"tab-label-with-badge"
>
<el-badge
:value=
"item.redNum"
class=
"badgeItem"
>
<span>
{{
item
.
label
}}
</span>
</el-badge>
<!--
<el-badge
v-else
:value=
"item.redNum"
class=
"badgeItem"
>
<span>
{{
item
.
label
}}
</span>
</el-badge>
-->
</div>
<div
v-else
>
<span
class=
"badgeLabel"
>
{{
item
.
label
}}
</span>
<!-- 没有红点时正常显示标签 -->
<div
v-else
class=
"tab-label-normal"
>
<span>
{{
item
.
label
}}
</span>
</div>
</
template
>
</el-tab-pane>
</el-tabs>
<!-- 运营任务 -->
...
...
@@ -110,21 +103,7 @@
</el-form-item>
</div>
</el-form>
<!-- <div class="filterChat rowFlex">
<div
ref="btnList"
class="btnList rowFlex columnCenter flexWarp"
>
<el-button
v-for="(item,index) in taskTypeList"
:key="index"
class="btnListScroll"
:class="item.value===plan_type?'itemActive':'btnItem'"
round
@click="handleClick(item)"
>{{ item.label || '' }}</el-button>
</div>
</div> -->
<div
v-if=
"taskForm.type == 1"
class=
"taskSort rowFlex columnCenter spaceBetween"
>
<p>
任务数:{{ taskListNum || 0 }}
</p>
<p
class=
"rowFlex columnCenter sortIcon"
>
...
...
@@ -185,48 +164,6 @@
<div
class=
"bottom"
>
分配时间:{{ item.assignment_time }}
</div>
</div>
</div>
<!-- 举报申请 玩家投诉 -->
<div
v-if=
"taskForm.type == 2 || taskForm.type == 3 || taskForm.type == 4"
class=
"scrollMain"
>
<div
v-for=
"(item, index) in taskList"
:key=
"index"
class=
"reportItem rowFlex spaceBetween columnCenter"
:class=
"item.id === taskDetails.id ? 'chatListItemActive' : ''"
@
click=
"selectTaskItem(item)"
>
<div
class=
"reportItemLeft"
>
<p>
{{ item.username }}
</p>
<p>
<span
class=
"label"
>
角色名称:
</span><span
class=
"value"
>
{{ item.role_name }}
</span>
</p>
<p>
<span
class=
"label"
>
累计充值:
</span><span
class=
"value"
>
{{ item.recharge_total_amount
}}
</span>
</p>
<p>
<span
class=
"label"
>
近一周充值:
</span><span
class=
"value"
>
{{ item.recharge_week_amount
}}
</span>
</p>
<p
v-if=
"taskForm.type == 2"
>
<span
class=
"label"
>
违规操作:
</span><span
class=
"value"
>
{{ item.violation_type_text
}}
</span>
</p>
<p
v-else-if=
"taskForm.type == 3"
>
<span
class=
"label"
>
违规操作:
</span><span
class=
"value"
>
{{ item.appeal_type_text }}
</span>
</p>
<p>
<span
class=
"label"
>
登记时间:
</span><span
class=
"value"
>
{{ item.create_time }}
</span>
</p>
</div>
<div
class=
"reportItemRight columnFlex columnCenter"
>
<el-button
v-if=
"item.approval_status == 1 && item.create_user_id == userInfo.id && taskForm.type != 4"
type=
"primary"
size=
"mini"
class=
"handleReport"
@
click=
"handleReport(item)"
>
撤销
</el-button>
<img
v-if=
"item.approval_status == 1"
:src=
"shenpi1"
class=
"icon"
/>
<img
v-else-if=
"item.approval_status == 2"
:src=
"shenpi2"
class=
"icon"
/>
<img
v-else-if=
"item.approval_status == 3"
:src=
"shenpi3"
class=
"icon"
/>
<img
v-else-if=
"item.approval_status == 4"
:src=
"shenpi4"
class=
"icon"
/>
<img
v-else-if=
"item.approval_status == 5"
:src=
"shenpi5"
class=
"icon"
/>
</div>
</div>
</div>
</div>
<noContent
v-if=
"taskList.length == 0"
/>
</div>
...
...
@@ -234,23 +171,21 @@
<div
class=
"taskListContent"
v-else-if=
"taskForm.type == 'user_task' || taskForm.type == 'account_task'"
>
<userTask
:taskForm=
"taskForm"
:activeType=
"taskForm.type"
/>
</div>
<taskDetails
v-if=
"showTaskDetails"
:show
.
sync=
"showTaskDetails"
/>
</div>
</template>
<
script
>
import
{
taskIndex
,
searchcondition
,
reportIndex
,
appealList
,
reportCancel
,
appealCancel
appealCancel
,
getTaskTotal
}
from
'@/api/game'
import
{
getTaskUnReadData
,
clearTaskUnReadData
}
from
'@/api/works'
import
{
mapState
,
mapMutations
}
from
'vuex'
import
{
clearTaskUnReadData
}
from
'@/api/works'
import
{
mapState
,
mapMutations
,
mapActions
}
from
'vuex'
import
mainGameSelect
from
'@/components/mainGame.vue'
import
{
removeDp
}
from
'@/utils/index'
import
{
report_request_list
,
playerReport
}
from
'@/api/game'
import
selectDate
from
'@/components/selectDate.vue'
import
{
formatNumber
}
from
'@/utils/index'
import
shenpi1
from
'@/assets/icon/shenpi1.svg'
...
...
@@ -260,6 +195,7 @@ import shenpi4 from '@/assets/icon/shenpi4.svg'
import
shenpi5
from
'@/assets/icon/shenpi5.svg'
import
noContent
from
'@/components/noContent.vue'
import
userTask
from
'./components/taskList/uesrTask.vue'
import
taskDetails
from
'./components/taskList/taskDetails.vue'
export
default
{
props
:
{
...
...
@@ -273,18 +209,20 @@ export default {
},
},
computed
:
{
...
mapState
(
'game'
,
[
'taskDetails'
,
'accountSelect'
]),
...
mapState
(
'game'
,
[
'taskDetails'
,
'accountSelect'
,
'taskData'
]),
...
mapState
(
'user'
,
[
'userInfo'
,
'corp_id'
])
},
components
:
{
mainGameSelect
,
selectDate
,
noContent
,
userTask
userTask
,
taskDetails
},
data
()
{
return
{
formatNumber
,
showTaskDetails
:
false
,
taskForm
:
{
type
:
'1'
,
status
:
''
,
...
...
@@ -347,21 +285,6 @@ export default {
type
:
'account_task'
,
value
:
'account_task'
},
// {
// label: '举报申请',
// type: 'report_request',
// value: '2'
// },
// {
// label: '玩家申诉',
// type: 'appeal_request',
// value: '3'
// },
// {
// label: '玩家举报',
// type: 'member_report_request',
// value: '4'
// }
],
taskList
:
[],
isMoreRecord
:
false
,
...
...
@@ -421,7 +344,6 @@ export default {
}
},
created
()
{
this
.
getTaskUnReadData
()
this
.
reportForm
.
create_time_start
=
this
.
$moment
().
subtract
(
30
,
'days'
).
format
(
'YYYY-MM-DD 00:00:00'
)
this
.
reportForm
.
create_time_end
=
this
.
$moment
().
format
(
'YYYY-MM-DD 23:59:59'
)
this
.
reportForm
.
createTimeDate
=
[
this
.
reportForm
.
create_time_start
,
this
.
reportForm
.
create_time_end
]
...
...
@@ -431,22 +353,25 @@ export default {
this
.
requstPlanList
(
''
)
},
mounted
()
{
// 进入任务列表页面时重新请求任务数据,刷新红点状态
const
taskForm
=
window
.
sessionStorage
.
getItem
(
'newTaskForm'
)
if
(
taskForm
)
{
const
form
=
JSON
.
parse
(
taskForm
)
!
form
.
type
||
form
.
type
==
''
?
(
form
.
type
=
'1'
)
:
form
.
type
=
form
.
type
+
''
// if (form.assignment_time_start == '') {
// form.timeDate = [this.$moment().subtract(7, 'days').format('YYYY-MM-DD 00:00:00'), this.$moment().format('YYYY-MM-DD 23:59:59')]
// form.assignment_time_start = this.$moment().subtract(7, 'days').format('YYYY-MM-DD 00:00:00')
// form.assignment_time_end = this.$moment().format('YYYY-MM-DD 00:00:00')
// }
this
.
taskForm
=
form
}
this
.
requestList
()
this
.
searchcondition
()
this
.
requstApprovalList
()
this
.
initializeWecom
()
this
.
$nextTick
(()
=>
{
this
.
refreshTaskData
()
})
},
methods
:
{
...
mapActions
(
'user'
,
[
'initWecom'
]),
...
mapActions
(
'game'
,
[
'getTaskUnReadData'
]),
...
mapMutations
(
'game'
,
[
'set_taskDetails'
]),
filterChange
()
{
this
.
pageInfo
.
page
=
1
...
...
@@ -454,23 +379,50 @@ export default {
this
.
isMoreRecord
=
true
this
.
requestList
()
},
// 获取更新
getTaskUnReadData
()
{
let
taskNum
=
{}
getTaskUnReadData
().
then
(
res
=>
{
if
(
res
.
status_code
===
1
)
{
taskNum
=
res
.
data
this
.
typeList
.
map
(
item
=>
{
for
(
const
key
in
taskNum
)
{
if
(
item
.
type
==
key
)
{
item
.
redNum
=
taskNum
[
key
]
}
}
})
this
.
typeList
[
0
].
redNum
=
0
this
.
$forceUpdate
()
async
initializeWecom
()
{
try
{
console
.
log
(
'🚀 开始初始化企业微信 SDK'
)
const
result
=
await
this
.
initWecom
()
console
.
log
(
'✅ 企业微信 SDK 初始化成功'
,
result
)
}
catch
(
error
)
{
console
.
error
(
'❌ 企业微信 SDK 初始化失败:'
,
error
)
}
},
// 刷新任务数据
async
refreshTaskData
()
{
try
{
console
.
log
(
'taskList.vue 刷新任务数据'
)
// 重新请求任务数据接口,更新 Vuex 状态
await
this
.
getTaskUnReadData
()
console
.
log
(
'任务数据刷新成功'
)
// 更新本地显示(这里调用本地的方法来更新 typeList 显示)
this
.
updateLocalTaskDisplay
()
}
catch
(
error
)
{
console
.
error
(
'刷新任务数据失败:'
,
error
)
}
},
// 更新本地任务显示
updateLocalTaskDisplay
()
{
// 直接使用 Vuex 中存储的任务数据
const
taskData
=
this
.
taskData
console
.
log
(
taskData
,
'taskData'
)
const
taskNum
=
{
operator_task
:
taskData
.
operator_task
||
0
,
user_task
:
taskData
.
user_task
||
0
,
account_task
:
taskData
.
account_task
||
0
}
// 更新 typeList 中的红点数量
this
.
typeList
.
forEach
(
item
=>
{
// 重置红点数量
item
.
redNum
=
0
// 根据任务类型设置红点数量
if
(
taskNum
[
item
.
type
]
&&
taskNum
[
item
.
type
]
>
0
)
{
item
.
redNum
=
taskNum
[
item
.
type
]
}
})
this
.
$forceUpdate
()
},
iconSort
(
type
)
{
if
(
type
==
'top'
)
{
...
...
@@ -499,18 +451,9 @@ export default {
taskTypeChange
()
{
this
.
reportForm
.
create_time_start
=
this
.
$moment
().
subtract
(
30
,
'days'
).
format
(
'YYYY-MM-DD 00:00:00'
)
this
.
reportForm
.
create_time_end
=
this
.
$moment
().
format
(
'YYYY-MM-DD 23:59:59'
)
const
tabItem
=
this
.
typeList
.
find
((
item
)
=>
item
.
value
==
this
.
taskForm
.
type
)
this
.
loading
=
true
this
.
set_taskDetails
({})
this
.
filterChange
()
if
(
tabItem
.
redNum
>
0
)
{
this
.
clearTaskUnReadData
(
tabItem
.
type
)
}
},
// 清除红点
async
clearTaskUnReadData
(
type
)
{
const
res
=
await
clearTaskUnReadData
({
type
:
type
})
this
.
getTaskUnReadData
()
},
mainGameResult
(
data
)
{
this
.
taskForm
.
main_game_id
=
[
data
]
...
...
@@ -575,6 +518,7 @@ export default {
this
.
reportForm
.
role_name
=
value
},
selectTaskItem
(
item
)
{
this
.
showTaskDetails
=
true
this
.
set_taskDetails
(
item
)
},
handleClick
(
item
)
{
...
...
@@ -596,12 +540,6 @@ export default {
requestList
()
{
if
(
this
.
taskForm
.
type
==
1
)
{
this
.
taskIndex
()
}
else
if
(
this
.
taskForm
.
type
==
2
)
{
this
.
reportIndex
()
}
else
if
(
this
.
taskForm
.
type
==
3
)
{
this
.
appealList
()
}
else
if
(
this
.
taskForm
.
type
==
4
)
{
this
.
report_request_list
()
}
},
handleCurrentChange
(
val
)
{
...
...
@@ -701,9 +639,9 @@ export default {
}
else
{
this
.
taskList
=
removeDp
(
this
.
taskList
,
res
.
data
.
data
,
'id'
)
}
if
(
!
this
.
taskDetails
.
id
&&
this
.
taskList
.
length
>
0
)
{
this
.
set_taskDetails
(
this
.
taskList
[
0
])
}
//
if (!this.taskDetails.id && this.taskList.length > 0) {
//
this.set_taskDetails(this.taskList[0])
//
}
if
(
res
.
data
.
data
.
length
<
20
)
{
this
.
isMoreRecord
=
false
}
else
{
...
...
@@ -714,121 +652,6 @@ export default {
this
.
loading
=
false
}
},
// 举报列表
async
reportIndex
()
{
if
(
this
.
pageInfo
.
page
==
1
)
{
this
.
taskList
=
[]
}
const
{
username
,
role_name
,
approval_status
,
create_time_start
,
create_time_end
}
=
this
.
reportForm
const
{
id
}
=
this
.
userInfo
const
data
=
{
username
,
role_name
,
approval_status
,
customer_id
:
id
,
create_time_start
,
create_time_end
,
...
this
.
pageInfo
}
try
{
const
res
=
await
reportIndex
(
data
)
this
.
loading
=
false
if
(
this
.
pageInfo
.
page
==
1
)
{
this
.
taskList
=
res
.
data
.
data
}
else
{
this
.
taskList
=
removeDp
(
this
.
taskList
,
res
.
data
.
data
,
'id'
)
}
if
(
!
this
.
taskDetails
.
id
&&
this
.
taskList
.
length
>
0
)
{
this
.
set_taskDetails
(
this
.
taskList
[
0
])
}
if
(
res
.
data
.
data
.
length
<
20
)
{
this
.
isMoreRecord
=
false
}
else
{
this
.
isMoreRecord
=
true
}
}
catch
(
error
)
{
this
.
loading
=
false
}
},
// 审核列表
async
appealList
()
{
if
(
this
.
pageInfo
.
page
==
1
)
{
this
.
taskList
=
[]
}
const
{
username
,
role_name
,
approval_status
,
create_time_start
,
create_time_end
}
=
this
.
reportForm
const
{
id
}
=
this
.
userInfo
const
data
=
{
username
,
role_name
,
approval_status
,
customer_id
:
id
,
create_time_start
,
create_time_end
,
...
this
.
pageInfo
}
try
{
const
res
=
await
appealList
(
data
)
this
.
loading
=
false
if
(
this
.
pageInfo
.
page
==
1
)
{
this
.
taskList
=
res
.
data
.
data
}
else
{
this
.
taskList
=
removeDp
(
this
.
taskList
,
res
.
data
.
data
,
'id'
)
}
if
(
!
this
.
taskDetails
.
id
&&
this
.
taskList
.
length
>
0
)
{
this
.
set_taskDetails
(
this
.
taskList
[
0
])
}
if
(
res
.
data
.
data
.
length
<
20
)
{
this
.
isMoreRecord
=
false
}
else
{
this
.
isMoreRecord
=
true
}
}
catch
(
error
)
{
this
.
loading
=
false
}
},
async
report_request_list
()
{
if
(
this
.
pageInfo
.
page
==
1
)
{
this
.
taskList
=
[]
}
const
{
username
,
role_name
,
create_time_start
,
create_time_end
}
=
this
.
reportForm
const
{
id
}
=
this
.
userInfo
const
user_name
=
this
.
userInfo
.
username
// approval_status 1 待审批 2 审批中 3 通过 4 驳回 5 已撤销 默认是待审批
const
data
=
{
username
,
role_name
,
// 这歌地方写死是 1 待审批状态
// approval_status: 1,
// customer_id: id,
user_id
:
id
,
user_name
:
user_name
,
create_time_start
,
create_time_end
,
register_type
:
2
,
// register_type 1 客服登记 2 玩家登记 默认是 2
...
this
.
pageInfo
}
try
{
const
res
=
await
playerReport
(
data
)
console
.
log
(
res
.
data
.
data
,
'res'
)
this
.
loading
=
false
if
(
this
.
pageInfo
.
page
==
1
)
{
this
.
taskList
=
res
.
data
.
data
}
else
{
this
.
taskList
=
removeDp
(
this
.
taskList
,
res
.
data
.
data
,
'id'
)
}
if
(
!
this
.
taskDetails
.
id
&&
this
.
taskList
.
length
>
0
)
{
this
.
set_taskDetails
(
this
.
taskList
[
0
])
}
if
(
res
.
data
.
data
.
length
<
20
)
{
this
.
isMoreRecord
=
false
}
else
{
this
.
isMoreRecord
=
true
}
}
catch
(
error
)
{
this
.
loading
=
false
}
}
}
}
</
script
>
...
...
@@ -1036,12 +859,21 @@ export default {
}
.badgeItem
{
::v-deep
.is-dot
{
top
:
8px
;
}
::v-deep
.el-badge__content
{
top
:
8px
;
top
:
12px
!important
;
right
:
-2px
!important
;
}
::v-deep
.el-badge__content.is-dot
{
top
:
10px
!important
;
right
:
-2px
!important
;
width
:
8px
!important
;
height
:
8px
!important
;
}
}
.tab-label-normal
{
display
:
inline-block
;
}
.badgeLabel
{
...
...
src/views/taskRecord.vue
浏览文件 @
114871d3
...
...
@@ -459,30 +459,18 @@ export default {
margin-left
:
2px
;
position
:
relative
;
overflow
:
hidden
;
.detailsTitle
{
width
:
100%
;
padding
:
0
10px
;
height
:
60px
;
font-size
:
18px
;
font-family
:
PingFangSC-Medium
,
PingFang
SC
;
font-weight
:
500
;
color
:
#333333
;
border-bottom
:
1px
solid
#ebeef5
;
border-left
:
1px
solid
#ebeef5
;
p
{
color
:
#333333
;
}
}
.account-task-container-content
{
width
:
100%
;
height
:
calc
(
100%
-
60px
)
;
padding
:
20px
10px
;
padding-top
:
0px
;
height
:
100%
;
padding
:
20px
10px
0
;
.tabSelect
{
width
:
100%
;
height
:
60px
;
border-bottom
:
1px
solid
#ebeef5
;
cursor
:
pointer
;
.tabSelectItem
{
font-size
:
18px
;
font-family
:
PingFangSC-Medium
,
PingFang
SC
;
...
...
@@ -492,167 +480,37 @@ export default {
line-height
:
47px
;
cursor
:
pointer
;
}
.tabSelectItemActive
{
color
:
#409EFF
;
border-bottom
:
2px
solid
#409EFF
;
}
}
.contentItem
{
position
:
relative
;
.title
{
position
:
absolute
;
left
:
10px
;
top
:
14px
;
font-size
:
14px
;
color
:
#999999
;
}
}
.item
{
width
:
100%
;
height
:
auto
;
font-size
:
14px
;
font-weight
:
400
;
color
:
#333333
;
transition
:
all
0.5s
;
position
:
relative
;
cursor
:
pointer
;
div
{
width
:
100%
;
margin-bottom
:
5px
;
}
.remark
{
::v-deep
.el-textarea__inner
{
height
:
80px
;
}
}
.tableImage
{
width
:
40px
;
height
:
40px
;
border-radius
:
6px
;
margin-right
:
10px
;
}
.label
{
color
:
#999999
;
}
.text
{
color
:
#333333
;
margin-left
:
10px
;
word-break
:
break-all
;
max-width
:
75%
;
}
.icon
{
display
:
none
;
position
:
absolute
;
right
:
0
;
top
:
12px
;
}
.dianFail
{
display
:
inline-block
;
width
:
8px
;
height
:
8px
;
background
:
#f45454
;
border-radius
:
5px
;
}
.dian
{
display
:
inline-block
;
width
:
8px
;
height
:
8px
;
background
:
#409EFF
;
border-radius
:
5px
;
}
.dian2
{
display
:
inline-block
;
width
:
8px
;
height
:
8px
;
background
:
#ff9d02
;
border-radius
:
5px
;
}
}
.orderMoney
{
width
:
calc
(
100%
+
40px
);
height
:
80px
;
//
margin-left
:
-20px
;
padding
:
10px
0
;
.orderMoneyItem
{
width
:
50%
;
text-align
:
center
;
margin-top
:
5px
;
span
{
font-size
:
14px
;
font-family
:
PingFangSC-Medium
,
PingFang
SC
;
font-weight
:
500
;
color
:
#333333
;
}
p
{
font-size
:
22px
;
color
:
#409EFF
;
}
}
}
.filterList
{
margin-bottom
:
10px
;
.filterListInput
{
width
:
60%
;
margin-left
:
15px
;
margin-bottom
:
10px
;
}
.filterListDate
{
width
:
150px
;
margin-bottom
:
10px
;
}
::v-deep
.search-item
.item-label
{
margin-right
:
20px
;
}
}
.orderDetailsScroll
{
width
:
100%
;
height
:
calc
(
100%
-
2
0px
);
height
:
calc
(
100%
-
8
0px
);
overflow
:
auto
;
overflow-x
:
hidden
;
}
.orderDetails
{
width
:
100%
;
height
:
auto
;
margin-top
:
20px
;
position
:
relative
;
.bridgeMain
{
position
:
absolute
;
top
:
0px
;
right
:
0px
;
width
:
50px
;
height
:
50px
;
.text
{
font-size
:
8px
;
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
font-weight
:
400
;
color
:
#ff9d02
;
transform
:
rotate
(
48deg
);
z-index
:
100
;
position
:
absolute
;
right
:
-6px
;
top
:
10px
;
width
:
50px
;
text-align
:
center
;
}
.bridge
{
font-size
:
50px
;
position
:
absolute
;
top
:
0
;
right
:
0
;
}
}
.orderDetailsTitle
{
width
:
100%
;
background
:
#f9faff
;
.money
{
width
:
100%
;
height
:
auto
;
padding-left
:
10px
;
.btns
{
padding-right
:
40px
;
}
.btn
{
background
:
#fff
;
border-radius
:
4px
;
...
...
@@ -663,20 +521,7 @@ export default {
color
:
#333333
;
cursor
:
pointer
;
}
.btnnot
{
background
:
#ffdddd
;
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
font-weight
:
400
;
color
:
#f56c6c
;
border
:
none
;
}
.btnsuccess
{
background
:
#e1fff0
;
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
font-weight
:
400
;
color
:
#409EFF
;
border
:
none
;
}
.sended
{
padding
:
0
8px
;
height
:
20px
;
...
...
@@ -688,6 +533,7 @@ export default {
font-weight
:
400
;
color
:
#409EFF
;
}
.noSend
{
padding
:
0
8px
;
height
:
20px
;
...
...
@@ -700,6 +546,7 @@ export default {
color
:
#ffa81d
;
}
}
.text
{
font-size
:
14px
;
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
...
...
@@ -707,53 +554,105 @@ export default {
color
:
#333333
;
max-width
:
200px
;
overflow
:
hidden
;
white-space
:
nowrap
;
/* 防止文字换行 */
text-overflow
:
ellipsis
;
/* 超出部分显示省略号 */
white-space
:
nowrap
;
text-overflow
:
ellipsis
;
}
}
.orderDetailsList
{
width
:
100%
;
height
:
auto
;
background
:
#ffffff
;
border
:
1px
solid
#ebeef5
;
position
:
relative
;
.titleFix
{
position
:
absolute
;
left
:
10px
;
top
:
20px
;
}
}
.item
{
width
:
100%
;
font-size
:
14px
;
font-weight
:
400
;
color
:
#333333
;
position
:
relative
;
.remark
{
::v-deep
.el-textarea__inner
{
height
:
80px
;
}
}
.label
{
color
:
#999999
;
}
.text
{
color
:
#333333
;
margin-left
:
10px
;
word-break
:
break-all
;
max-width
:
75%
;
}
}
}
.remarkHandle
{
font-size
:
20px
;
color
:
#0ac358
;
cursor
:
pointer
;
margin-right
:
5px
;
position
:
absolute
;
position
:
absolute
;
right
:
0
;
top
:
0
;
}
::v-deep
.el-tabs__item
{
line-height
:
26px
;
font-size
:
16px
;
font-weight
:
500
;
}
.editLayer
{
margin-left
:
-20px
;
.noDisturb{
//
换行
white-space
:
wrap
;
padding
:
10px
0
;
.noDisturb
{
display
:
flex
;
align-items
:
center
;
flex-wrap
:
wrap
;
}
::v-deep
.el-form-item__label
{
::v-deep
.el-form-item__label
{
font-weight
:
normal
;
color
:
#999999
;
padding-right
:
8px
;
}
::v-deep
.el-form-item
{
margin-bottom
:
14px
;
}
::v-deep
.el-select
{
width
:
100%
;
max-width
:
90%
;
}
::v-deep
.el-checkbox
{
width
:
100%
;
}
}
::v-deep
.el-form-item--small.el-form-item
{
margin-bottom
:
10px
;
::v-deep
.el-collapse
{
border
:
none
;
}
}
}
::v-deep
.el-collapse-item__header
{
width
:
100%
;
color
:
#333333
;
font-size
:
14px
;
font-weight
:
400
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
}
::v-deep
.el-collapse-item__arrow
{
position
:
absolute
;
right
:
5px
;
}
::v-deep
.el-collapse-item__content
{
padding
:
10px
;
}
}
</
style
>
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论