优化
This commit is contained in:
parent
6cbae7c47e
commit
94eff82a21
@ -105,3 +105,30 @@ export function apiAssessresetdata(query) {
|
|||||||
params: query
|
params: query
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取绩效任务详情
|
||||||
|
export function apiTaskDetail(query) {
|
||||||
|
return request({
|
||||||
|
url: '/lz_management/performance/result/taskDetail',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除绩效任务
|
||||||
|
export function apiDeleteTask(query) {
|
||||||
|
return request({
|
||||||
|
url: '/lz_management/performance/result/deleteTask',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改任务
|
||||||
|
export function apiEditTask(query) {
|
||||||
|
return request({
|
||||||
|
url: '/lz_management/performance/result/changeTask',
|
||||||
|
method: 'post',
|
||||||
|
data: query
|
||||||
|
})
|
||||||
|
}
|
||||||
@ -15,11 +15,11 @@
|
|||||||
<span>
|
<span>
|
||||||
<span>整体进度:</span>
|
<span>整体进度:</span>
|
||||||
</span>
|
</span>
|
||||||
<el-progress :percentage="50"></el-progress>
|
<el-progress :percentage="handleGetProgress(taskInfo.resultTasks)"></el-progress>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="drawer-content-left-title">
|
<div class="drawer-content-left-title">
|
||||||
<div> 关键结果(3)</div>
|
<div> 关键结果({{handleFilter(taskInfo.resultTasks).length}})</div>
|
||||||
<div>
|
<div>
|
||||||
<i style="color:#409EFF;"
|
<i style="color:#409EFF;"
|
||||||
class="el-icon-plus"></i>
|
class="el-icon-plus"></i>
|
||||||
@ -27,9 +27,123 @@
|
|||||||
type="text">添加</el-button>
|
type="text">添加</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-for="i in 10"
|
<div v-for="i in handleFilter(taskInfo.resultTasks)"
|
||||||
class="boderAndRadius drawer-content-left-content">
|
class="boderAndRadius drawer-content-left-content">
|
||||||
ss
|
<div :style="{border:!(!i.updateProcess && i.label)?'none':''}"
|
||||||
|
class="drawer-content-left-content-top">
|
||||||
|
<div class="drawer-content-left-content-top-process">
|
||||||
|
<el-progress type="circle"
|
||||||
|
:width='40'
|
||||||
|
:stroke-width='4'
|
||||||
|
:percentage="Math.round((i.processRate * 100)*1000)/1000 "></el-progress>
|
||||||
|
<div style="margin-left:10px;">
|
||||||
|
<span v-if="!i.editProcess">{{i.name}}</span>
|
||||||
|
<el-input v-if="i.editProcess"
|
||||||
|
size="small"
|
||||||
|
placeholder="请输入内容"
|
||||||
|
v-model="form.input"
|
||||||
|
clearable>
|
||||||
|
</el-input>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="right">
|
||||||
|
<div v-if="i.editProcess">
|
||||||
|
<el-button size="mini"
|
||||||
|
type="primary">确认</el-button>
|
||||||
|
<el-button size="mini"
|
||||||
|
@click="handleEditProcess(i,false)"
|
||||||
|
type="danger">取消</el-button>
|
||||||
|
</div>
|
||||||
|
<div v-if="!i.editProcess"
|
||||||
|
class="right-item">
|
||||||
|
<div>
|
||||||
|
<el-tooltip class="item"
|
||||||
|
effect="dark"
|
||||||
|
content="更新进度"
|
||||||
|
placement="top-start">
|
||||||
|
<i @click="handleUpdateProcess(i,true)"
|
||||||
|
class="el-icon-refresh-left"></i>
|
||||||
|
</el-tooltip>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="right-item-center">
|
||||||
|
<el-tooltip class="item"
|
||||||
|
effect="dark"
|
||||||
|
content="评论"
|
||||||
|
placement="top-start">
|
||||||
|
<i class="el-icon-chat-square"></i>
|
||||||
|
</el-tooltip>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<el-dropdown size="mini">
|
||||||
|
<el-tooltip class="item"
|
||||||
|
effect="dark"
|
||||||
|
content="更多"
|
||||||
|
placement="top-start">
|
||||||
|
<i class="el-icon-more"></i>
|
||||||
|
</el-tooltip>
|
||||||
|
<el-dropdown-menu slot="dropdown">
|
||||||
|
<el-dropdown-item @click.native="handleEditProcess(i,true)">编辑</el-dropdown-item>
|
||||||
|
<el-dropdown-item @click.native="handleDetele(i.id)">删除</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</el-dropdown>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="!i.updateProcess && i.label"
|
||||||
|
class="drawer-content-left-content-center"
|
||||||
|
:class="{bg:false}">
|
||||||
|
<div class="content commonFont">
|
||||||
|
<div class="drawer-content-left-content-center-left">
|
||||||
|
<img v-if="true"
|
||||||
|
:onerror="defaultImg"
|
||||||
|
:src='i.avatar'
|
||||||
|
alt="">
|
||||||
|
<span v-if="true">{{i.staffName}}</span>
|
||||||
|
<span v-if="true">:{{i.label}}</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<i :class="{rate:false}"
|
||||||
|
style=" cursor: pointer;color:#3ba1ff;"
|
||||||
|
class="el-icon-arrow-down"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<pinglun v-if="false" />
|
||||||
|
</div>
|
||||||
|
<div v-if="i.updateProcess"
|
||||||
|
class="drawer-content-left-content-bottom">
|
||||||
|
<el-form :model="form"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="80px">
|
||||||
|
<el-form-item label="当前进度:"
|
||||||
|
prop="weight">
|
||||||
|
<el-input size="small"
|
||||||
|
@blur="$handleBlur('form.processRate')"
|
||||||
|
@input.native="$handleInputInt('form.processRate')"
|
||||||
|
v-model="form.processRate">
|
||||||
|
<template slot="append">%</template>
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="进度说明:"
|
||||||
|
prop="remake">
|
||||||
|
<el-input type="textarea"
|
||||||
|
size="small"
|
||||||
|
v-model="form.remake">
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<div style="text-align: right;">
|
||||||
|
<el-button type="primary"
|
||||||
|
size="mini"
|
||||||
|
@click="handleEditTask">确定</el-button>
|
||||||
|
<el-button @click="handleUpdateProcess(i,false)"
|
||||||
|
size="mini">取消</el-button>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="drawer-content-right">
|
<div class="drawer-content-right">
|
||||||
@ -97,16 +211,27 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import InfoHeader from '@/components/InfoHeader'
|
||||||
import pinglun from './pinglun.vue'
|
import pinglun from './pinglun.vue'
|
||||||
|
|
||||||
|
import { apiDeleteTask, apiEditTask } from '@/api/assessment'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
props: {
|
props: {
|
||||||
drawer: {
|
drawer: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
|
},
|
||||||
|
taskObj: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
|
taskInfo: {},
|
||||||
activeName: '1',
|
activeName: '1',
|
||||||
formRules: {
|
formRules: {
|
||||||
name: [{
|
name: [{
|
||||||
@ -121,14 +246,77 @@ export default {
|
|||||||
process: '0'
|
process: '0'
|
||||||
},
|
},
|
||||||
dialogFormVisible: false,
|
dialogFormVisible: false,
|
||||||
title: '添加任务'
|
title: '添加任务',
|
||||||
|
defaultImg: 'this.src="' + require('@/assets/img/default.jpg') + '"'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: { pinglun },
|
components: { pinglun, InfoHeader },
|
||||||
computed: {},
|
computed: {},
|
||||||
beforeMount () { },
|
beforeMount () { },
|
||||||
mounted () { },
|
mounted () {
|
||||||
|
this.taskInfo = Object.assign({}, this.taskObj)
|
||||||
|
console.log(this.taskInfo)
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
async handleEditTask () {
|
||||||
|
const res = await apiEditTask(Object.assign({}, this.form, { processRate: this.form.processRate / 100 }))
|
||||||
|
if (res.code !== 200) {
|
||||||
|
this.$message.error(res.msg)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.form = {}
|
||||||
|
this.taskInfo = await this.$parent.handleGetTaskDetail(this.taskInfo.detailId)
|
||||||
|
this.$message({
|
||||||
|
message: res.msg,
|
||||||
|
type: 'success'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleGetProgress (arr = []) {
|
||||||
|
const result = this.handleFilter(arr).reduce((result, item) => {
|
||||||
|
result += Number(item.processRate)
|
||||||
|
return result
|
||||||
|
}, 0)
|
||||||
|
const _process = Number(result.toFixed(2)) / this.handleFilter(arr).length || 0
|
||||||
|
return Number((_process * 100).toFixed(2))
|
||||||
|
},
|
||||||
|
async handleDetele (id) {
|
||||||
|
let res = await apiDeleteTask({ taskId: id })
|
||||||
|
if (res.code !== 200) {
|
||||||
|
this.$message.error(res.msg)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.taskInfo = await this.$parent.handleGetTaskDetail(this.taskInfo.detailId)
|
||||||
|
this.$message({
|
||||||
|
message: res.msg,
|
||||||
|
type: 'success'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 更新进度
|
||||||
|
handleUpdateProcess (i, type = false) {
|
||||||
|
this.taskInfo.resultTasks.map(i => {
|
||||||
|
i.updateProcess = false
|
||||||
|
})
|
||||||
|
if (type) {
|
||||||
|
this.form = Object.assign({}, i)
|
||||||
|
this.form.taskId = this.form.id
|
||||||
|
this.form.processRate = Math.round(Number(this.form.processRate) * 100)
|
||||||
|
} else {
|
||||||
|
this.form = {}
|
||||||
|
}
|
||||||
|
i.updateProcess = type
|
||||||
|
console.log(this.form)
|
||||||
|
this.$forceUpdate()
|
||||||
|
},
|
||||||
|
// 编辑/取消编辑进度
|
||||||
|
handleEditProcess (i, type = false) {
|
||||||
|
i.editProcess = type
|
||||||
|
this.form = Object.assign({}, i)
|
||||||
|
this.form.taskId = this.form.id
|
||||||
|
this.$forceUpdate()
|
||||||
|
},
|
||||||
|
handleFilter (item) {
|
||||||
|
return item ? item.filter(i => !i.isDelete) : []
|
||||||
|
},
|
||||||
handleClick (tab, event) {
|
handleClick (tab, event) {
|
||||||
console.log(tab, event);
|
console.log(tab, event);
|
||||||
},
|
},
|
||||||
@ -136,7 +324,7 @@ export default {
|
|||||||
this.dialogFormVisible = true
|
this.dialogFormVisible = true
|
||||||
},
|
},
|
||||||
handleClose () {
|
handleClose () {
|
||||||
this.$emit("update:drawer", false)
|
this.$emit('update:drawer', false)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {}
|
watch: {}
|
||||||
@ -156,6 +344,9 @@ export default {
|
|||||||
.el-drawer__body {
|
.el-drawer__body {
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
|
.el-progress-bar {
|
||||||
|
width: 94% !important;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
<style lang='less'>
|
<style lang='less'>
|
||||||
.drawer {
|
.drawer {
|
||||||
@ -199,8 +390,72 @@ export default {
|
|||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
&-content {
|
&-content {
|
||||||
padding: 20px;
|
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
|
&-top {
|
||||||
|
display: flex;
|
||||||
|
align-content: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
border-bottom: 1px solid @borderColor;
|
||||||
|
margin: 20px 20px 0;
|
||||||
|
padding-bottom: 6px;
|
||||||
|
&-process {
|
||||||
|
display: flex;
|
||||||
|
align-content: center;
|
||||||
|
> div {
|
||||||
|
.center();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.right {
|
||||||
|
.center();
|
||||||
|
&-item {
|
||||||
|
cursor: pointer;
|
||||||
|
border: 1px solid @borderColor;
|
||||||
|
> div {
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
display: flex;
|
||||||
|
&-center {
|
||||||
|
border-left: 1px solid @borderColor;
|
||||||
|
border-right: 1px solid @borderColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.bg {
|
||||||
|
background: #fafafa;
|
||||||
|
}
|
||||||
|
.rate {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
&-center {
|
||||||
|
padding: 6px 20px 6px;
|
||||||
|
|
||||||
|
.content {
|
||||||
|
display: flex;
|
||||||
|
align-content: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
&-left {
|
||||||
|
flex: 1 0 auto;
|
||||||
|
display: flex;
|
||||||
|
align-content: center;
|
||||||
|
img {
|
||||||
|
width: 28px;
|
||||||
|
height: 28px;
|
||||||
|
border-radius: 50%;
|
||||||
|
overflow: hidden;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
.center();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-bottom {
|
||||||
|
padding: 10px 20px 6px;
|
||||||
|
border-top: 1px solid @borderColor;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
&-right {
|
&-right {
|
||||||
|
|||||||
@ -46,16 +46,16 @@
|
|||||||
<el-progress type="circle"
|
<el-progress type="circle"
|
||||||
:width='40'
|
:width='40'
|
||||||
:stroke-width='4'
|
:stroke-width='4'
|
||||||
:percentage="25"></el-progress>
|
:percentage="Math.round((i.processRate * 100) * 1000) / 1000 "></el-progress>
|
||||||
<el-button type="text"
|
<el-button type="text"
|
||||||
@click="handleLookProcess"
|
@click="handleLookProcess(i)"
|
||||||
size="mini">
|
size="mini">
|
||||||
查看任务
|
查看任务
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="kaohe pre">
|
<div class="kaohe pre">
|
||||||
<pre>
|
<pre>
|
||||||
{{i.keyResult}}o7
|
{{i.keyResult}}
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="jieguo pre"
|
<div class="jieguo pre"
|
||||||
@ -178,11 +178,13 @@
|
|||||||
<div v-if="scoreListForParams.length>0"
|
<div v-if="scoreListForParams.length>0"
|
||||||
class="commonFont"
|
class="commonFont"
|
||||||
style="font-size:12px;margin:10px 0;">{{handleGetAllScore(scoreListForParams)}}</div>
|
style="font-size:12px;margin:10px 0;">{{handleGetAllScore(scoreListForParams)}}</div>
|
||||||
<process :drawer.sync='drawer' />
|
<process v-if="!_.isEmpty(taskInfo)"
|
||||||
|
:taskObj='taskInfo'
|
||||||
|
:drawer.sync='drawer' />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { apiSaveDetail, apiGet375, apiSaveapproval } from '@/api/assessment'
|
import { apiSaveDetail, apiGet375, apiSaveapproval, apiTaskDetail } from '@/api/assessment'
|
||||||
import process from './process.vue';
|
import process from './process.vue';
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
|
|
||||||
@ -215,11 +217,12 @@ export default {
|
|||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
drawer: true,
|
drawer: false,
|
||||||
loadingTi: false,
|
loadingTi: false,
|
||||||
loadingZan: false,
|
loadingZan: false,
|
||||||
input: '',
|
input: '',
|
||||||
scoreList: []
|
scoreList: [],
|
||||||
|
taskInfo: {},
|
||||||
// score: {
|
// score: {
|
||||||
// lastScore: '',
|
// lastScore: '',
|
||||||
// scoreLevel: ''
|
// scoreLevel: ''
|
||||||
@ -282,8 +285,24 @@ export default {
|
|||||||
this.handleGrt375()
|
this.handleGrt375()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
handleLookProcess () {
|
// 获取指标任务详情
|
||||||
|
async handleGetTaskDetail (id = '') {
|
||||||
|
let res = await apiTaskDetail({ detailId: id })
|
||||||
|
if (res.code !== 200) {
|
||||||
|
this.$message.error(res.msg)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return Object.assign({}, res.data, { detailId: id })
|
||||||
|
},
|
||||||
|
async handleLookProcess (item) {
|
||||||
|
console.log(item)
|
||||||
|
this.taskInfo = {}
|
||||||
|
let result = await this.handleGetTaskDetail(item.id)
|
||||||
|
if (!result) return
|
||||||
|
this.taskInfo = result
|
||||||
|
this.$nextTick(() => {
|
||||||
this.drawer = true
|
this.drawer = true
|
||||||
|
})
|
||||||
},
|
},
|
||||||
handleGetAllScore (arr) {
|
handleGetAllScore (arr) {
|
||||||
const result = arr.reduce((result, item) => {
|
const result = arr.reduce((result, item) => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user