增加撤回,驳回到指定节点共
This commit is contained in:
parent
4d78828e18
commit
0a731eae63
17701
package-lock.json
generated
Normal file
17701
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
11
src/router/config_route.js
Normal file
11
src/router/config_route.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
export default [
|
||||||
|
{
|
||||||
|
path: '/dingTalkLogin',
|
||||||
|
name: 'dingTalkLogin',
|
||||||
|
component: (resolve) => require(['@/views/login/dingTalkLogin.vue'], resolve),
|
||||||
|
meta: {
|
||||||
|
title: '登录',
|
||||||
|
isNav: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@ -33,12 +33,13 @@
|
|||||||
v-if="isShowPersonnel"
|
v-if="isShowPersonnel"
|
||||||
:isShow.sync='isShowPersonnel'
|
:isShow.sync='isShowPersonnel'
|
||||||
:len='1' />
|
:len='1' />
|
||||||
<!-- 驳回 -->
|
|
||||||
<popup-right v-if="bohui"
|
<!-- 撤回 -->
|
||||||
@cancel='handleCancel'
|
<popup-right v-if="chehui"
|
||||||
@submit="handleSubmit"
|
@cancel='handleChehuiCancel'
|
||||||
|
@submit="handleChehuiSubmit"
|
||||||
:footer='true'
|
:footer='true'
|
||||||
title="驳回">
|
title="撤回">
|
||||||
<div slot="content"
|
<div slot="content"
|
||||||
class="chooseManage">
|
class="chooseManage">
|
||||||
<el-form style="width:400px;"
|
<el-form style="width:400px;"
|
||||||
@ -47,7 +48,45 @@
|
|||||||
ref="form"
|
ref="form"
|
||||||
label-width="80px"
|
label-width="80px"
|
||||||
class="demo-ruleForm">
|
class="demo-ruleForm">
|
||||||
<el-form-item label="驳回理由">
|
<el-form-item label="撤回理由">
|
||||||
|
<el-input :rows="5"
|
||||||
|
type="textarea"
|
||||||
|
v-model="form.comment"
|
||||||
|
placeholder="请输入撤回理由"
|
||||||
|
maxlength="9999"
|
||||||
|
show-word-limit></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</popup-right>
|
||||||
|
<!-- 驳回 -->
|
||||||
|
<popup-right v-if="bohui"
|
||||||
|
@cancel='handleCancel'
|
||||||
|
@submit="handleSubmit"
|
||||||
|
:footer='true'
|
||||||
|
title="驳回">
|
||||||
|
<div slot="content"
|
||||||
|
class="chooseManage">
|
||||||
|
<el-form :model="form"
|
||||||
|
:rules="rules"
|
||||||
|
ref="formBoHui">
|
||||||
|
<el-form-item
|
||||||
|
prop="flowRecordId"
|
||||||
|
label="驳回到">
|
||||||
|
<div>
|
||||||
|
<br />
|
||||||
|
<el-select v-model="form.flowRecordId"
|
||||||
|
size="mini"
|
||||||
|
placeholder="请选择流程节点">
|
||||||
|
<el-option v-for="item in selectList"
|
||||||
|
:key="item.id"
|
||||||
|
:label="item.flowName + ':'+item.staffNames"
|
||||||
|
:value="item.id">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="驳回理由" prop="comment">
|
||||||
<el-input :rows="5"
|
<el-input :rows="5"
|
||||||
type="textarea"
|
type="textarea"
|
||||||
v-model="form.comment"
|
v-model="form.comment"
|
||||||
@ -188,6 +227,14 @@ export default {
|
|||||||
click: this.handleChongZhi
|
click: this.handleChongZhi
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name: '撤回',
|
||||||
|
type: 'primary',
|
||||||
|
info: !this.info,
|
||||||
|
permis: 'recall',
|
||||||
|
click: this.handleCheHui
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
name: '结果值录入',
|
name: '结果值录入',
|
||||||
type: 'primary',
|
type: 'primary',
|
||||||
@ -251,7 +298,7 @@ export default {
|
|||||||
dialogFormVisible: false,
|
dialogFormVisible: false,
|
||||||
form: {},
|
form: {},
|
||||||
rules: {
|
rules: {
|
||||||
name: [
|
comment: [
|
||||||
{ required: true, message: '请输入驳回理由', trigger: 'blur' }
|
{ required: true, message: '请输入驳回理由', trigger: 'blur' }
|
||||||
],
|
],
|
||||||
flowRecordId: [
|
flowRecordId: [
|
||||||
@ -259,6 +306,7 @@ export default {
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
bohui: false,
|
bohui: false,
|
||||||
|
chehui: false,
|
||||||
isShowPersonnel: false,
|
isShowPersonnel: false,
|
||||||
staffIds: '',
|
staffIds: '',
|
||||||
personnelList: {
|
personnelList: {
|
||||||
@ -310,6 +358,11 @@ export default {
|
|||||||
this.dialogFormVisibleChongZhi = true
|
this.dialogFormVisibleChongZhi = true
|
||||||
},
|
},
|
||||||
// 结果值录入
|
// 结果值录入
|
||||||
|
handleCheHui () {
|
||||||
|
this.form = {}
|
||||||
|
this.chehui = true
|
||||||
|
},
|
||||||
|
// 结果值录入
|
||||||
handleJieguo () {
|
handleJieguo () {
|
||||||
this.$emit('update:tableInfo', Object.assign({}, this.tableInfo, { result: true }))
|
this.$emit('update:tableInfo', Object.assign({}, this.tableInfo, { result: true }))
|
||||||
},
|
},
|
||||||
@ -435,8 +488,9 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 驳回
|
// 驳回
|
||||||
handleBohui () {
|
async handleBohui () {
|
||||||
this.ruleForm = {}
|
this.form = {}
|
||||||
|
await this.handleResetData(this.obj.id || '')
|
||||||
this.bohui = true
|
this.bohui = true
|
||||||
},
|
},
|
||||||
// 催办
|
// 催办
|
||||||
@ -513,11 +567,31 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
async handleSubmit () {
|
async handleChehuiSubmit () {
|
||||||
this.$loadingStart()
|
this.$loadingStart()
|
||||||
let res = await this.handlApiSaveapproval({ status: 5, menuName: '驳回了' })
|
let res = await this.handlApiSaveapproval({ status: 2, menuName: '撤回了' })
|
||||||
this.$loadingEnd()
|
this.$loadingEnd()
|
||||||
this.bohui = !!res
|
this.chehui = !!res
|
||||||
|
},
|
||||||
|
handleChehuiCancel () {
|
||||||
|
this.chehui = false
|
||||||
|
},
|
||||||
|
async handleSubmit () {
|
||||||
|
this.$refs.formBoHui.validate(async v => {
|
||||||
|
if (v) {
|
||||||
|
const params = Object.assign({}, this.form, { resultRecordId: this.resultRecordId || '' }, { status: 10, menuName: '驳回了流程' })
|
||||||
|
let res = await apiSaveapproval(params)
|
||||||
|
if (res.code !== 200) {
|
||||||
|
this.$message.error(res.msg)
|
||||||
|
history.go(0)
|
||||||
|
}
|
||||||
|
this.$message({
|
||||||
|
message: res.msg,
|
||||||
|
type: 'success'
|
||||||
|
})
|
||||||
|
history.go(0)
|
||||||
|
}
|
||||||
|
})
|
||||||
},
|
},
|
||||||
handleCancel () {
|
handleCancel () {
|
||||||
this.bohui = false
|
this.bohui = false
|
||||||
@ -557,7 +631,11 @@ export default {
|
|||||||
type: 'success',
|
type: 'success',
|
||||||
duration: 1000,
|
duration: 1000,
|
||||||
onClose: () => {
|
onClose: () => {
|
||||||
|
if (obj.status !== 2) {
|
||||||
this.nextProcess(res)
|
this.nextProcess(res)
|
||||||
|
} else {
|
||||||
|
location.reload(false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
if (res.resultRecordId) {
|
if (res.resultRecordId) {
|
||||||
|
|||||||
@ -153,17 +153,29 @@
|
|||||||
{{dto.acquireScore}}
|
{{dto.acquireScore}}
|
||||||
</div>
|
</div>
|
||||||
<div class="pingfen-content-shuoming">
|
<div class="pingfen-content-shuoming">
|
||||||
<el-input
|
<el-form
|
||||||
|
label-width="auto"
|
||||||
|
size="mini"
|
||||||
|
:model="dto">
|
||||||
|
<el-form-item
|
||||||
|
:rules="[
|
||||||
|
{ required: handleCheckMustInput(dto), message: '请输入评分说明', trigger: 'blur' }
|
||||||
|
]"
|
||||||
|
prop="scoreComment"
|
||||||
v-if="tableInfo.score && dto.approvalId ===userInfo.userId"
|
v-if="tableInfo.score && dto.approvalId ===userInfo.userId"
|
||||||
style="width:200px;"
|
>
|
||||||
|
<el-input
|
||||||
|
style="width:100px;"
|
||||||
:rows="4"
|
:rows="4"
|
||||||
size="mini"
|
size="mini"
|
||||||
type="textarea"
|
type="textarea"
|
||||||
:placeholder="handleGetCommentsPlaceholder(dto)"
|
|
||||||
v-model="dto.scoreComment"
|
v-model="dto.scoreComment"
|
||||||
|
:placeholder="handleGetCommentsPlaceholder(dto)"
|
||||||
clearable
|
clearable
|
||||||
></el-input>
|
></el-input>
|
||||||
|
</el-form-item>
|
||||||
<span v-else>{{dto.scoreComment || '--'}}</span>
|
<span v-else>{{dto.scoreComment || '--'}}</span>
|
||||||
|
</el-form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -311,7 +323,12 @@ export default {
|
|||||||
loadingZan: false,
|
loadingZan: false,
|
||||||
input: '',
|
input: '',
|
||||||
scoreList: [],
|
scoreList: [],
|
||||||
taskInfo: {}
|
taskInfo: {},
|
||||||
|
rules: {
|
||||||
|
scoreComment: [
|
||||||
|
{ required: true, message: '请输入评分说明', trigger: 'blur' }
|
||||||
|
]
|
||||||
|
}
|
||||||
// score: {
|
// score: {
|
||||||
// lastScore: '',
|
// lastScore: '',
|
||||||
// scoreLevel: ''
|
// scoreLevel: ''
|
||||||
@ -441,9 +458,8 @@ export default {
|
|||||||
} else {
|
} else {
|
||||||
isScore = false
|
isScore = false
|
||||||
}
|
}
|
||||||
|
|
||||||
// 有分数等于3.5或3.75 但为评论
|
// 有分数等于3.5或3.75 但为评论
|
||||||
if ((obj.acquireScore !== 3.75 && obj.acquireScore !== 3.5) && this.$isStringEmpty(obj.scoreComment)) {
|
if (this.handleCheckMustInput(obj)) {
|
||||||
isScoreComment = false
|
isScoreComment = false
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -457,7 +473,7 @@ export default {
|
|||||||
} else if (!isScoreComment) {
|
} else if (!isScoreComment) {
|
||||||
this.loadingTi = false
|
this.loadingTi = false
|
||||||
return this.$message({
|
return this.$message({
|
||||||
message: '评分不等于3.50或3.75的未填写评分说明',
|
message: '有些评分需要说明的未填写',
|
||||||
type: 'error'
|
type: 'error'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -504,6 +520,37 @@ export default {
|
|||||||
message: res.msg,
|
message: res.msg,
|
||||||
type: 'success'
|
type: 'success'
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
handleGetCommentsPlaceholder (dto) {
|
||||||
|
if (this.checkPingFenAuto(dto.acquireScore)) {
|
||||||
|
return dto.acquireScore + '分必须输入评分说明'
|
||||||
|
}
|
||||||
|
return '请输入评分说明'
|
||||||
|
},
|
||||||
|
handleCheckMustInput (dto) {
|
||||||
|
return this.checkPingFenAuto(dto.acquireScore)
|
||||||
|
},
|
||||||
|
checkPingFenAuto (fen) {
|
||||||
|
if (fen === 4 && this.tableAuth.ScoreComment4 === 1) {
|
||||||
|
return true
|
||||||
|
} else if (fen === 4 && this.tableAuth.scoreComment4 === 1) {
|
||||||
|
return true
|
||||||
|
} else if (fen === 3.875 && this.tableAuth.scoreComment375P === 1) {
|
||||||
|
return true
|
||||||
|
} else if (fen === 3.75 && this.tableAuth.scoreComment375 === 1) {
|
||||||
|
return true
|
||||||
|
} else if (fen === 3.667 && this.tableAuth.scoreComment375M === 1) {
|
||||||
|
return true
|
||||||
|
} else if (fen === 3.583 && this.tableAuth.scoreComment35P === 1) {
|
||||||
|
return true
|
||||||
|
} else if (fen === 3.5 && this.tableAuth.scoreComment35 === 1) {
|
||||||
|
return true
|
||||||
|
} else if (fen === 3.375 && this.tableAuth.scoreComment35M === 1) {
|
||||||
|
return true
|
||||||
|
} else if (fen === 3.25 && this.tableAuth.scoreComment325 === 1) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
29
src/views/kpi/home/index.vue
Normal file
29
src/views/kpi/home/index.vue
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<!-- -->
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
home
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {},
|
||||||
|
beforeMount () {},
|
||||||
|
mounted () {
|
||||||
|
console.log('this.$route', this.$route)
|
||||||
|
},
|
||||||
|
methods: {},
|
||||||
|
watch: {}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang='' scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
46
src/views/kpi/home1/index.vue
Normal file
46
src/views/kpi/home1/index.vue
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<!-- -->
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
home
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// beforeRouteLeave (to, from, next) {
|
||||||
|
// console.log('123')
|
||||||
|
// next(false)
|
||||||
|
// // ...
|
||||||
|
// },
|
||||||
|
computed: {},
|
||||||
|
beforeMount () {},
|
||||||
|
mounted () {
|
||||||
|
console.log('this.$route', this.$route)
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
open () {
|
||||||
|
this.$alert('这是一段内容', '标题名称', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
callback: action => {
|
||||||
|
this.$message({
|
||||||
|
type: 'info',
|
||||||
|
message: `action: ${action}`
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang='' scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
<!-- 撤回 -->
|
||||||
|
<template>
|
||||||
|
<div class="ReCall">
|
||||||
|
<div class="ReCall-title commonFont">由谁撤回:</div>
|
||||||
|
<div class="commonFont">执行人:<el-radio v-model="form.optType" :label="-1">被考核人</el-radio></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: ['info'],
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
form: {
|
||||||
|
optType: -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {},
|
||||||
|
beforeMount () {},
|
||||||
|
mounted () {
|
||||||
|
const params = JSON.parse(JSON.stringify(this.info))
|
||||||
|
params.chartDetails.status = 1
|
||||||
|
params.chartDetails.recordSimpleDtos = params.chartDetails.recordSimpleDtos.length ? params.chartDetails.recordSimpleDtos : [this.form]
|
||||||
|
this.$emit('update:info', params)
|
||||||
|
},
|
||||||
|
methods: {},
|
||||||
|
watch: {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang='less' scoped>
|
||||||
|
.ReCall{
|
||||||
|
&-title{
|
||||||
|
margin: 20px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -17,6 +17,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="noInfo" class="process-content">
|
<div v-if="noInfo" class="process-content">
|
||||||
<!-- {{isActive}} -->
|
<!-- {{isActive}} -->
|
||||||
|
<ReCall v-show="isActive==='撤回'" :info.sync='info.ReCallInfo'/>
|
||||||
<ToDevelop v-show="isActive==='目标制定'" :info.sync='info.ToDevelopInfo'/>
|
<ToDevelop v-show="isActive==='目标制定'" :info.sync='info.ToDevelopInfo'/>
|
||||||
<Confirm v-show="isActive==='目标确认'" :info.sync='info.ConfirmInfo'/>
|
<Confirm v-show="isActive==='目标确认'" :info.sync='info.ConfirmInfo'/>
|
||||||
<Perform v-show="isActive==='执行中'" :info.sync='info.PerformInfo'/>
|
<Perform v-show="isActive==='执行中'" :info.sync='info.PerformInfo'/>
|
||||||
@ -30,6 +31,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import PopupRight from '@/components/PopupRight'
|
import PopupRight from '@/components/PopupRight'
|
||||||
|
import ReCall from './ReCall'
|
||||||
import ToDevelop from './ToDevelop'
|
import ToDevelop from './ToDevelop'
|
||||||
import Confirm from './Confirm'
|
import Confirm from './Confirm'
|
||||||
import Perform from './Perform'
|
import Perform from './Perform'
|
||||||
@ -46,6 +48,7 @@ export default {
|
|||||||
// componentId: 'Approval',
|
// componentId: 'Approval',
|
||||||
radio: '1',
|
radio: '1',
|
||||||
info: {
|
info: {
|
||||||
|
ReCallInfo: {},
|
||||||
ToDevelopInfo: {},
|
ToDevelopInfo: {},
|
||||||
ConfirmInfo: {
|
ConfirmInfo: {
|
||||||
status: 0,
|
status: 0,
|
||||||
@ -61,6 +64,9 @@ export default {
|
|||||||
},
|
},
|
||||||
processLsit: [],
|
processLsit: [],
|
||||||
processLsitCopy: [{
|
processLsitCopy: [{
|
||||||
|
name: '撤回',
|
||||||
|
componment: 'ReCall'
|
||||||
|
}, {
|
||||||
name: '目标制定',
|
name: '目标制定',
|
||||||
componment: 'ToDevelop'
|
componment: 'ToDevelop'
|
||||||
}, {
|
}, {
|
||||||
@ -83,7 +89,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
PopupRight, ToDevelop, Confirm, Perform, Entry, Score, Approval
|
PopupRight, ReCall, ToDevelop, Confirm, Perform, Entry, Score, Approval
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
// componentId () {
|
// componentId () {
|
||||||
|
|||||||
57
src/views/login/dingTalkLogin.vue
Normal file
57
src/views/login/dingTalkLogin.vue
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h2 class="brand-info__text">{{dataForm.verify}}</h2>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import * as dd from 'dingtalk-jsapi'
|
||||||
|
import { apiDingtalkLogin } from '@/api/login'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
dataForm: {
|
||||||
|
verify: '身份验证中...'
|
||||||
|
},
|
||||||
|
dingCode: '' // 获取钉钉授权码
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
this.handleGetDingtalkCode()
|
||||||
|
},
|
||||||
|
mounted () {},
|
||||||
|
methods: {
|
||||||
|
// 获取钉钉鉴权码
|
||||||
|
handleGetDingtalkCode () {
|
||||||
|
let _this = this
|
||||||
|
dd.runtime.permission.requestAuthCode({
|
||||||
|
corpId: 'ding267474e759bbca1c35c2f4657eb6378f',
|
||||||
|
onSuccess (res) {
|
||||||
|
console.log('result===', res)
|
||||||
|
_this.handleDingtalkLogin(res)
|
||||||
|
_this.dingCode = res
|
||||||
|
},
|
||||||
|
onFail (err) {
|
||||||
|
console.log('err===', err)
|
||||||
|
_this.dingCode = err
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 钉钉免登录
|
||||||
|
handleDingtalkLogin (val) {
|
||||||
|
apiDingtalkLogin(val).then(res => {
|
||||||
|
if (res && res.code === 0) {
|
||||||
|
this.$cookie.set('token', res.token)
|
||||||
|
this.dataForm.verify = '登录成功,跳转中...'
|
||||||
|
window.open(window.location.protocol + '//' + window.location.host + '/digitization/kpi/workbench/home?code=' + this.dingCode.code)
|
||||||
|
} else {
|
||||||
|
this.dataForm.verify = '身份验证失败' + res.msg
|
||||||
|
this.$message.error(this.dataForm.verify)
|
||||||
|
this.$router.replace({ name: 'dingTalkLogin' })
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
BIN
static/default.jpg
Normal file
BIN
static/default.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
Loading…
x
Reference in New Issue
Block a user