Merge branch 'v_porcess' of http://gitlab.ldxinyong.com/enterpriseManagement/digitization-ui into v_porcess
* 'v_porcess' of http://gitlab.ldxinyong.com/enterpriseManagement/digitization-ui: (54 commits) 优化 优化 优化 优化 优化 优化:指标名称使用 textarea 优化 优化 优化 优化 优化 优化 优化 优化 优化 优化 优化 优化 优化 优化 ...
This commit is contained in:
commit
41c1e31718
17
src/App.vue
17
src/App.vue
@ -4,6 +4,7 @@
|
||||
请移步PC端操作
|
||||
</div>
|
||||
<router-view v-else class="main"/>
|
||||
<div @dblclick="handleShowVcnsole" class="baaa" style="width:20px;height:20px;"></div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -35,7 +36,7 @@ export default {
|
||||
computed: {
|
||||
},
|
||||
async created () {
|
||||
if (!dd.other) {
|
||||
if (dd.other) {
|
||||
var vConsole = new VConsole({
|
||||
vConsole_switch_x: 0,
|
||||
vConsole_switch_y: 0
|
||||
@ -48,6 +49,14 @@ export default {
|
||||
this.dd = dd
|
||||
},
|
||||
methods: {
|
||||
handleShowVcnsole () {
|
||||
var vConsole = new VConsole({
|
||||
vConsole_switch_x: 0,
|
||||
vConsole_switch_y: 0
|
||||
})
|
||||
localStorage.setItem('vConsole_switch_y', 0)
|
||||
localStorage.setItem('vConsole_switch_x', 1000)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@ -61,4 +70,10 @@ export default {
|
||||
height: 200px;
|
||||
.center();
|
||||
}
|
||||
.baaa{
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
z-index: 0999999999999;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -158,3 +158,12 @@ export function apiTaskCommentList (query) {
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 一键催办
|
||||
export function apiManagerUrging (query) {
|
||||
return request({
|
||||
url: '/lz_management/performance/assess/manager/Urging',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<!-- -->
|
||||
<template>
|
||||
<div class="smallNav">
|
||||
<span @click="handleBack" class="smallNav-back a">返回</span>
|
||||
<span @click="handleBack" v-if="handMore" class="smallNav-back a">返回</span>
|
||||
<span v-if="showTitle" class="commonFont smallNav-title commonFont">{{title}}</span>
|
||||
<slot name='content'></slot>
|
||||
</div>
|
||||
@ -21,6 +21,9 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
handMore () {
|
||||
return window.history.length !== 1
|
||||
},
|
||||
title () {
|
||||
return this.$route.meta.title || ''
|
||||
}
|
||||
|
||||
@ -8,12 +8,8 @@ let mixin = {
|
||||
...mapGetters(['auth'])
|
||||
},
|
||||
methods: {
|
||||
loadPage (routerName, param) {
|
||||
if (param) {
|
||||
this.$router.push({name: routerName, query: param})
|
||||
} else {
|
||||
this.$router.push({name: routerName})
|
||||
}
|
||||
loadPage (routerName, param = {}) {
|
||||
this.$router.push({name: routerName, query: param})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
.pre{
|
||||
line-height: 20px;
|
||||
pre{
|
||||
overflow:hidden;
|
||||
overflow:hidden;
|
||||
line-height: 20px;
|
||||
// white-space:pre-line;
|
||||
// word-wrap: break-word;
|
||||
|
||||
@ -39,13 +39,15 @@ import {
|
||||
Avatar,
|
||||
Progress,
|
||||
Drawer,
|
||||
Slider
|
||||
Slider,
|
||||
ButtonGroup
|
||||
} from 'element-ui'
|
||||
|
||||
Vue.prototype.$loading = Loading
|
||||
Vue.prototype.$message = Message
|
||||
Vue.prototype.$confirm = MessageBox.confirm
|
||||
Vue.prototype.$alert = MessageBox.alert
|
||||
Vue.use(ButtonGroup)
|
||||
Vue.use(Slider)
|
||||
Vue.use(Drawer)
|
||||
Vue.use(Progress)
|
||||
|
||||
@ -36,9 +36,11 @@
|
||||
:key="indexJ">
|
||||
<div class="goals-content-tabbar-table-content-top">
|
||||
<div style="width:200px;"
|
||||
class="my-handle"><img style="width:20px;height:20px;"
|
||||
class="my-handle pre"><img style="width:20px;height:20px;"
|
||||
src="@/assets/img/yidong.png"
|
||||
alt="">{{j.target}}</div>
|
||||
alt="">
|
||||
<pre>{{j.target}}</pre>
|
||||
</div>
|
||||
<div style="flex:1 0 auto;"
|
||||
class="kaohe">
|
||||
<pre>{{j.keyResult}}</pre>
|
||||
@ -93,7 +95,7 @@
|
||||
业务指标权重:{{handleGetWeight(i)}}% <span v-if="i.weight !== null">/{{Math.round((i.weight * 100)*1000)/1000}}%</span>
|
||||
</div>
|
||||
<div>
|
||||
所有指标总权重: <span style="color:#EE6723;">{{ handleGetWeight1()}}%</span>
|
||||
所有指标总权重: <span style="color:#EE6723;">{{ handleGetWeight1()}}%</span><span>/100%</span>
|
||||
</div>
|
||||
</div>
|
||||
<div style=" padding: 10px;">
|
||||
@ -170,7 +172,8 @@
|
||||
<el-form-item prop="target"
|
||||
label='指标名称'>
|
||||
<el-input clearable
|
||||
|
||||
:rows="4"
|
||||
type="textarea"
|
||||
size="small"
|
||||
v-model="formIndicators.target"></el-input>
|
||||
</el-form-item>
|
||||
@ -178,7 +181,7 @@
|
||||
prop="keyResult">
|
||||
<el-input size="small"
|
||||
clearable
|
||||
:rows="24"
|
||||
:rows="22"
|
||||
type="textarea"
|
||||
v-model="formIndicators.keyResult"></el-input>
|
||||
</el-form-item>
|
||||
@ -197,10 +200,16 @@
|
||||
<div class="goals-bottom">
|
||||
<div class="goals-bottom-content">
|
||||
<el-button size='small'
|
||||
@click="handleSaveDetail()"
|
||||
v-if="this.$route.query.saveIn===1"
|
||||
@click="handleSaveDetail(obj,1)"
|
||||
plain>保存</el-button>
|
||||
<el-button size='small'
|
||||
v-if="this.$route.query.saveAndAdd===1"
|
||||
@click="handleSaveDetail(obj,2)"
|
||||
plain>暂存</el-button>
|
||||
<el-button size='small'
|
||||
type="primary"
|
||||
v-if="this.$route.query.saveAndAdd===1"
|
||||
@click="handleGetNext">提交</el-button>
|
||||
</div>
|
||||
</div>
|
||||
@ -283,6 +292,7 @@ export default {
|
||||
computed: {},
|
||||
beforeMount () { },
|
||||
mounted () {
|
||||
console.log('auth', this.auth)
|
||||
this.handleGetDimensions()
|
||||
this.handleGetTbale()
|
||||
},
|
||||
@ -383,7 +393,7 @@ export default {
|
||||
let weight = 0
|
||||
let maxWeight = 0
|
||||
const nullArray = arr.map(i => {
|
||||
i.detailDtos.map(j => {
|
||||
this.handleFilter(i.detailDtos).map(j => {
|
||||
if (i.weight === null) maxWeight += j.checkWeight
|
||||
weight += j.checkWeight
|
||||
})
|
||||
@ -397,7 +407,7 @@ export default {
|
||||
} else {
|
||||
for (let i in arr) {
|
||||
let num = 0
|
||||
arr[i].detailDtos.map(l => {
|
||||
this.handleFilter(arr[i].detailDtos).map(l => {
|
||||
num += l.checkWeight
|
||||
})
|
||||
if (num.toFixed(2) !== arr[i].weight.toFixed(2)) {
|
||||
@ -405,14 +415,7 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
const obj = { status: 1, menuName: '制定了' }
|
||||
const params = Object.assign({}, { resultRecordId: this.$route.query.id || '' }, obj)
|
||||
let res = await apiSaveapproval(params)
|
||||
if (res.code !== 200) {
|
||||
this.$message.error(res.msg || '出错了 ')
|
||||
return
|
||||
}
|
||||
this.obj.commentId = res.commentId
|
||||
|
||||
this.obj.recortModelDtos.map(i => {
|
||||
i.detailDtos.map(j => {
|
||||
const result = this.handleFilter(j.taskDtos).reduce((result, item) => {
|
||||
@ -428,6 +431,15 @@ export default {
|
||||
this.$message.error(res1.msg)
|
||||
return
|
||||
}
|
||||
const obj = { status: 1, menuName: '制定了' }
|
||||
const params = Object.assign({}, { resultRecordId: this.$route.query.id || '' }, obj)
|
||||
params.commentId = res1.commentId || ''
|
||||
|
||||
let res = await apiSaveapproval(params)
|
||||
if (res.code !== 200) {
|
||||
this.$message.error(res.msg || '出错了 ')
|
||||
return
|
||||
}
|
||||
this.$message({
|
||||
message: res.msg,
|
||||
type: 'success'
|
||||
@ -451,7 +463,36 @@ export default {
|
||||
arr.isTrue = (Math.round((weight * 100) * 1000) / 1000) === (Math.round((arr.weight * 100) * 1000) / 1000)
|
||||
return Math.round((weight * 100) * 1000) / 1000
|
||||
},
|
||||
async handleSaveDetail (params = this.obj) {
|
||||
async handleSaveDetail (params = this.obj, type) {
|
||||
if (type === 1) {
|
||||
const arr = this.handleFilter(this.obj.recortModelDtos)
|
||||
if (arr.some(i => i.weight === null)) {
|
||||
let weight = 0
|
||||
let maxWeight = 0
|
||||
const nullArray = arr.map(i => {
|
||||
this.handleFilter(i.detailDtos).map(j => {
|
||||
if (i.weight === null) maxWeight += j.checkWeight
|
||||
weight += j.checkWeight
|
||||
})
|
||||
})
|
||||
if (weight !== 1) {
|
||||
const noWeightArr = arr.filter(i => i.weight === null)
|
||||
let str = noWeightArr.map(i => i.name).join(',')
|
||||
this.$message.error(str + '维度内的权重和必须为100%!')
|
||||
return
|
||||
}
|
||||
} else {
|
||||
for (let i in arr) {
|
||||
let num = 0
|
||||
this.handleFilter(arr[i].detailDtos).map(l => {
|
||||
num += l.checkWeight
|
||||
})
|
||||
if (num.toFixed(2) !== arr[i].weight.toFixed(2)) {
|
||||
return this.$message.error(arr[i].name + '维度内的权重和必须为' + Math.round((arr[i].weight * 100) * 1000) / 1000)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
params.recortModelDtos.map(i => {
|
||||
i.detailDtos.map(j => {
|
||||
const result = this.handleFilter(j.taskDtos).reduce((result, item) => {
|
||||
@ -470,7 +511,11 @@ export default {
|
||||
message: res.msg,
|
||||
type: 'success'
|
||||
})
|
||||
this.handleGetTbale()
|
||||
if (type === 1) {
|
||||
history.go(-1)
|
||||
} else {
|
||||
this.handleGetTbale()
|
||||
}
|
||||
},
|
||||
// 获取维度类型
|
||||
async handleGetDimensions () {
|
||||
|
||||
@ -1,24 +1,34 @@
|
||||
<!-- -->
|
||||
<template>
|
||||
<div>
|
||||
<div style="display:inline-block;margin:0 4px;"
|
||||
v-for="(i,index) in authList.filter(i=>i.info)"
|
||||
:key="index">
|
||||
<el-button size="mini"
|
||||
v-if="info?info[i.permis]:formList.auth[i.permis]"
|
||||
:disabled='formList[i.permis]===1'
|
||||
@click="i.click"
|
||||
:plain='i.plain'
|
||||
type="primary">{{i.name}}</el-button>
|
||||
<div style="display:inline-block;" v-for="(i,index) in authList.filter(i=>i.info && !i.isManage)" :key="index">
|
||||
<el-button-group v-if="i.ground">
|
||||
<el-button
|
||||
:disabled='formList[i.permis]===1'
|
||||
@click="k.click"
|
||||
v-for="(k,indexK) in i.list.filter(n=>info?info[n.permis]:formList.auth[n.permis])"
|
||||
:key="indexK"
|
||||
size="mini"
|
||||
:type="k.type" >{{k.name}}</el-button>
|
||||
</el-button-group>
|
||||
<div style="margin:0 4px;" v-if="info?info[i.permis]:formList.auth[i.permis]">
|
||||
<el-button size="mini"
|
||||
:disabled='formList[i.permis]===1'
|
||||
@click="i.click"
|
||||
:type="i.type">{{i.name}}</el-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <el-button size="mini" v-if="!info" @click="handlePingfen" type="primary">开始评分</el-button>
|
||||
<el-button size="mini" v-if="!info" @click="handleZhiding" type="primary">制定目标</el-button>
|
||||
<el-button size="mini" v-if="!info" @click="handleTongyi" type="primary">同 意</el-button>
|
||||
<el-button size="mini" v-if="!info" @click="handleBohui" type="primary">驳 回</el-button>
|
||||
<el-button size="mini" v-if="info && formList.auth.tiaozhuang" :disabled='formList.auth.tiaozhuang===1' @click="handleJump" type="primary" plain>跳过</el-button>
|
||||
<el-button size="mini" @click="handleZhuanjiao" type="primary" plain>转 交</el-button> -->
|
||||
<!-- <el-button size="mini" v-if="info" @click="handleCuiban" type="warning" plain>催办</el-button> -->
|
||||
<el-dropdown v-if="authList.filter(i=>i.info && i.isManage && (info?info[i.permis]:formList.auth[i.permis])).length!== 0">
|
||||
<el-button plain size="mini" >
|
||||
管理<i class="el-icon-arrow-down el-icon--right"></i>
|
||||
</el-button>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item
|
||||
@click.native="i.click"
|
||||
v-for="(i,index) in authList.filter(i=>i.info && i.isManage && (info?info[i.permis]:formList.auth[i.permis]))"
|
||||
:key="index">{{i.name}}</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
<getPersonnel @cb='cb'
|
||||
v-if="isShowPersonnel"
|
||||
:isShow.sync='isShowPersonnel'
|
||||
@ -130,51 +140,6 @@
|
||||
</div>
|
||||
|
||||
</el-drawer>
|
||||
<!-- <el-dialog title="重置流程"
|
||||
:visible.sync="dialogFormVisibleChongZhi">
|
||||
<el-form :model="form"
|
||||
:rules="rules"
|
||||
ref="formChongZhi">
|
||||
<el-form-item label="">
|
||||
<el-radio-group v-model="form.resetFlag">
|
||||
<el-radio :label="0">重置到指定节点</el-radio>
|
||||
<el-radio :label="1">重新读取考核流程</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="form.resetFlag===1"
|
||||
label="数据">
|
||||
<br />
|
||||
<el-radio-group v-model="form.clearFlag">
|
||||
<el-radio :label="1">保留指标</el-radio>
|
||||
<el-radio :label="0">不保留指标</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="form.resetFlag===0"
|
||||
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>
|
||||
<div slot="footer"
|
||||
class="dialog-footer">
|
||||
<el-button size="small"
|
||||
@click="dialogFormVisibleChongZhi = false">取 消</el-button>
|
||||
<el-button size="small"
|
||||
type="primary"
|
||||
@click="handleAgreeChongZhi">确 定</el-button>
|
||||
</div>
|
||||
</el-dialog> -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -187,15 +152,34 @@ export default {
|
||||
data () {
|
||||
return {
|
||||
authList: [
|
||||
{
|
||||
info: !this.info,
|
||||
ground: true,
|
||||
list: [{
|
||||
name: '同 意',
|
||||
type: 'primary',
|
||||
info: !this.info,
|
||||
permis: 'keyCheck',
|
||||
click: this.handleTongyi
|
||||
}, {
|
||||
name: '驳 回',
|
||||
type: '',
|
||||
info: !this.info,
|
||||
permis: 'reject',
|
||||
click: this.handleBohui
|
||||
}]
|
||||
},
|
||||
{
|
||||
name: '催办',
|
||||
plain: true,
|
||||
type: 'primary',
|
||||
isManage: true,
|
||||
type: '',
|
||||
info: !this.info,
|
||||
permis: 'toFast',
|
||||
click: this.handleCuiban
|
||||
}, {
|
||||
name: '重置流程',
|
||||
isManage: true,
|
||||
plain: true,
|
||||
type: 'primary',
|
||||
info: !this.info,
|
||||
@ -209,12 +193,6 @@ export default {
|
||||
info: !this.info,
|
||||
permis: 'resultInput',
|
||||
click: this.handleJieguo
|
||||
}, {
|
||||
name: '修改目标',
|
||||
type: 'primary',
|
||||
info: !this.info,
|
||||
permis: 'changeResult',
|
||||
click: this.handleZhiding
|
||||
},
|
||||
{
|
||||
name: '开始评分',
|
||||
@ -231,17 +209,11 @@ export default {
|
||||
click: this.handleZhiding
|
||||
},
|
||||
{
|
||||
name: '同 意',
|
||||
type: 'primary',
|
||||
name: '调整目标',
|
||||
type: '',
|
||||
info: !this.info,
|
||||
permis: 'keyCheck',
|
||||
click: this.handleTongyi
|
||||
}, {
|
||||
name: '驳 回',
|
||||
type: 'primary',
|
||||
info: !this.info,
|
||||
permis: 'reject',
|
||||
click: this.handleBohui
|
||||
permis: 'changeResult',
|
||||
click: this.handleZhiding
|
||||
}, {
|
||||
name: '跳过',
|
||||
info: !!this.info,
|
||||
@ -252,6 +224,7 @@ export default {
|
||||
}, {
|
||||
name: '跳过',
|
||||
info: !this.info,
|
||||
isManage: true,
|
||||
plain: true,
|
||||
type: 'primary',
|
||||
permis: 'tiaozhuang',
|
||||
@ -267,7 +240,7 @@ export default {
|
||||
name: '转 交',
|
||||
plain: true,
|
||||
info: !this.info,
|
||||
type: 'primary',
|
||||
type: '',
|
||||
permis: 'transfer',
|
||||
click: this.handleZhuanjiao
|
||||
}
|
||||
@ -395,19 +368,19 @@ export default {
|
||||
}
|
||||
}
|
||||
|
||||
const obj = { status: 1, menuName: '同意了', comment: this.form.comment }
|
||||
const params = Object.assign({}, { resultRecordId: this.obj.id || '' }, obj)
|
||||
let res = await apiSaveapproval(params)
|
||||
if (res.code !== 200) {
|
||||
this.$message.error(res.msg || '出错了 ')
|
||||
return
|
||||
}
|
||||
this.obj.commentId = res.commentId
|
||||
let res1 = await apiSaveDetail(this.obj)
|
||||
if (res1.code !== 200) {
|
||||
this.$message.error(res1.msg)
|
||||
return
|
||||
}
|
||||
const obj = { status: 1, menuName: '同意了', comment: this.form.comment }
|
||||
const params = Object.assign({}, { resultRecordId: this.obj.id || '' }, obj)
|
||||
params.commentId = res1.commentId || ''
|
||||
let res = await apiSaveapproval(params)
|
||||
if (res.code !== 200) {
|
||||
this.$message.error(res.msg || '出错了 ')
|
||||
return
|
||||
}
|
||||
this.$message({
|
||||
message: res.msg,
|
||||
type: 'success'
|
||||
@ -489,7 +462,7 @@ export default {
|
||||
handleZhiding () {
|
||||
this.$router.push({
|
||||
name: 'assessment-goals',
|
||||
query: {
|
||||
query: {...this.formList.auth,
|
||||
id: this.resultRecordId || ''
|
||||
}
|
||||
})
|
||||
|
||||
BIN
src/views/kpi/assessment/performance/components/imgs/kr.png
Normal file
BIN
src/views/kpi/assessment/performance/components/imgs/kr.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 939 B |
BIN
src/views/kpi/assessment/performance/components/imgs/mubiao.png
Normal file
BIN
src/views/kpi/assessment/performance/components/imgs/mubiao.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
BIN
src/views/kpi/assessment/performance/components/imgs/pinglun.png
Normal file
BIN
src/views/kpi/assessment/performance/components/imgs/pinglun.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 49 KiB |
BIN
src/views/kpi/assessment/performance/components/imgs/zanwukr.png
Normal file
BIN
src/views/kpi/assessment/performance/components/imgs/zanwukr.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
@ -22,9 +22,9 @@
|
||||
#</span></div>
|
||||
<div v-if="!isJilu" style="font-size:12px;">{{i.gmtCreate}}</div>
|
||||
</div>
|
||||
<div class="pinglunTem-right-content pre">
|
||||
<div class="pinglunTem-right-content pre" :style="{background:(i.isSelf===1)?'#cfe5fc':'#fff'}">
|
||||
<div v-if="i.useType !== 0 && i.taskName" class="content-top">
|
||||
评论 「{{i.taskName}}」
|
||||
评论KR 「{{i.taskName}}」
|
||||
</div>
|
||||
<span v-for="i in i.atStaffNames?_.compact(i.atStaffNames.split(',')):[]" :key="i" style="color:#09f;">@{{i}} </span>
|
||||
<span v-html="remark(i.label)"></span>
|
||||
@ -32,6 +32,9 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="pinglunList.length === 0" class="zanwurenwu">
|
||||
<img src="./imgs/pinglun.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -46,6 +49,10 @@ export default {
|
||||
isJilu: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
background: {
|
||||
type: String,
|
||||
default: '#cfe5fc'
|
||||
}
|
||||
},
|
||||
// 1,修改名称,2修改进度 ,3名称和进度都修改
|
||||
@ -71,6 +78,20 @@ export default {
|
||||
|
||||
<style lang='less' scoped>
|
||||
.pinglunTem {
|
||||
.zanwurenwu{
|
||||
width: 100%;
|
||||
height: 400px;
|
||||
.center();
|
||||
img{
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
}
|
||||
}
|
||||
// max-height: 300px;
|
||||
// overflow: auto;
|
||||
.pingcontent:first-child{
|
||||
margin-top: 10px;
|
||||
}
|
||||
&-content{
|
||||
display: flex;
|
||||
|
||||
@ -118,13 +139,12 @@ export default {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
&-content {
|
||||
border: 1px solid #bdd7f4;
|
||||
background: #cfe5fc;
|
||||
border: 1px solid #eff4fa;
|
||||
border-radius: 0 6px 6px 6px;
|
||||
color: #313841;
|
||||
font-size: 12px;
|
||||
max-width: 400px;
|
||||
padding: 4px 6px;
|
||||
padding: 8px 6px;
|
||||
}
|
||||
.beizhu {
|
||||
margin-left: 10px;
|
||||
@ -134,6 +154,7 @@ export default {
|
||||
}
|
||||
.content-top{
|
||||
padding: 4px 0;
|
||||
margin-bottom: 6px;
|
||||
border-bottom: 1px solid rgba(200, 200, 200,0.6);
|
||||
}
|
||||
.position{
|
||||
|
||||
@ -9,7 +9,8 @@
|
||||
<div class="drawer-content-left">
|
||||
<div class="drawer-content-left-jiaoyi">
|
||||
<div class="title">
|
||||
<span>名称:{{(taskInfo.target && taskInfo.target.length>10)?(taskInfo.target.substring(0,8)+'...'):taskInfo.target}}</span>
|
||||
<img style="width:30px;height:30px;" src="./imgs/mubiao.png" alt="">
|
||||
<span>名称: {{(taskInfo.target && taskInfo.target.length>20)?(taskInfo.target.substring(0,18)+'...'):taskInfo.target}}</span>
|
||||
</div>
|
||||
<div class="process">
|
||||
<span>
|
||||
@ -19,7 +20,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="drawer-content-left-title">
|
||||
<div> 关键结果({{handleFilter(taskInfo.resultTasks).length}})</div>
|
||||
<div style="margin-top:10px;" class="title"> <img style="width:30px;height:30px;" src="./imgs/kr.png" alt="">
|
||||
<span>关键结果({{handleFilter(taskInfo.resultTasks).length}})</span></div>
|
||||
<div>
|
||||
<el-button icon="el-icon-plus"
|
||||
@click="handleAddTask"
|
||||
@ -30,17 +32,21 @@
|
||||
<div style="padding:20px;">
|
||||
<el-form :model="form"
|
||||
ref="form"
|
||||
label-width="80px"
|
||||
:rules="formRules">
|
||||
<el-form-item prop="name"
|
||||
label='任务名称'>
|
||||
<el-input clearable
|
||||
type="textarea"
|
||||
:row='2'
|
||||
size="small"
|
||||
placeholder="请输入任务名称"
|
||||
v-model="form.name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="任务进度:"
|
||||
<el-form-item label="任务进度"
|
||||
prop="weight">
|
||||
<el-input size="small"
|
||||
style="width:200px;"
|
||||
@blur="$handleBlur('form.processRate')"
|
||||
@input.native="$handleInputInt('form.processRate')"
|
||||
v-model="form.processRate">
|
||||
@ -66,14 +72,16 @@
|
||||
<div v-for="(i,index) in handleFilter(taskInfo.resultTasks)"
|
||||
:key="i.id"
|
||||
class="boderAndRadius drawer-content-left-content">
|
||||
<div :style="{border:!(!i.updateProcess && i.label)?'none':''}"
|
||||
<div :style="{border:!(!i.showTask)?'none':''}"
|
||||
class="drawer-content-left-content-top">
|
||||
<div class="drawer-content-left-content-top-process">
|
||||
<el-progress type="circle"
|
||||
<div>
|
||||
<el-progress type="circle"
|
||||
:width='50'
|
||||
:stroke-width='4'
|
||||
:percentage="Math.round((i.processRate * 100)*1000)/1000 "></el-progress>
|
||||
<div style="margin-left:10px;">
|
||||
</div>
|
||||
<div style="margin:0 30px 0 10px;">
|
||||
<span v-if="!i.editProcess">KR{{index+1}} : {{i.name}}</span>
|
||||
<el-input v-if="i.editProcess"
|
||||
size="small"
|
||||
@ -133,7 +141,7 @@
|
||||
<div v-if="!i.updateProcess && i.typeDesc"
|
||||
class="drawer-content-left-content-center"
|
||||
:class="{bg:i.showTask}">
|
||||
<div class="content commonFont">
|
||||
<div class="content commonFont" style="padding:0 20px;">
|
||||
<div class="drawer-content-left-content-center-left">
|
||||
<img v-if="!i.showTask"
|
||||
:onerror="defaultImg"
|
||||
@ -151,8 +159,10 @@
|
||||
class="el-icon-arrow-down"></i>
|
||||
</div>
|
||||
</div>
|
||||
<pinglun v-if="i.showTask"
|
||||
<div style="overflow:auto;max-height:300px;padding:0 20px;">
|
||||
<pinglun v-if="i.showTask"
|
||||
:pinglunList='i.taskList' />
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="i.updateProcess"
|
||||
class="drawer-content-left-content-bottom">
|
||||
@ -166,6 +176,7 @@
|
||||
:step="10">
|
||||
</el-slider> -->
|
||||
<el-input size="small"
|
||||
style="width:200px;"
|
||||
@blur="$handleBlur('form.processRate')"
|
||||
@input.native="$handleInputInt('form.processRate')"
|
||||
v-model="form.processRate">
|
||||
@ -192,6 +203,9 @@
|
||||
</el-form>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="handleFilter(taskInfo.resultTasks).length===0" class="zanwurenwu">
|
||||
<img src="./imgs/zanwukr.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="drawer-content-right">
|
||||
<div style="padding: 0 20px;">
|
||||
@ -354,12 +368,10 @@ export default {
|
||||
this.pinglunForm = {}
|
||||
},
|
||||
handleCheckStaffIds (list) {
|
||||
console.log('🚀 ~ file: process.vue ~ line 321 ~ handleCheckStaffIds ~ list', list)
|
||||
this.staffList = list
|
||||
this.isShow = false
|
||||
this.$nextTick(() => {
|
||||
const pingList = this.$refs.pingList
|
||||
pingList.scrollTop = pingList.scrollHeight
|
||||
this.handleScroll()
|
||||
})
|
||||
},
|
||||
handleCloseItem (item) {
|
||||
@ -376,17 +388,15 @@ export default {
|
||||
this.$message.error(res.msg)
|
||||
return
|
||||
}
|
||||
this.nowPingLunList = res.data.list.reverse()
|
||||
this.nowPingLunList = res.data.list
|
||||
this.$nextTick(() => {
|
||||
const pingList = this.$refs.pingList
|
||||
pingList.scrollTop = pingList.scrollHeight
|
||||
this.handleScroll()
|
||||
})
|
||||
},
|
||||
// 发送评论
|
||||
async handleSendPingLun (event) {
|
||||
const str = this.staffList.list.map(i => i.staffId).join(',')
|
||||
let params = {}
|
||||
// debugger
|
||||
if (!this.form.content.replace(/(^\s*)|(\s*$)/g, '')) return
|
||||
this.form.content = this.form.content.replace(/(^\s*)|(\s*$)/g, '')
|
||||
params.content = this.form.content
|
||||
@ -409,10 +419,13 @@ export default {
|
||||
})
|
||||
this.dialogFormVisible = false
|
||||
this.pinglunForm = Object.assign({}, item)
|
||||
const pingList = this.$refs.pingList
|
||||
pingList.scrollTop = pingList.scrollHeight
|
||||
this.handleScroll()
|
||||
this.$refs.input.focus()
|
||||
},
|
||||
handleScroll () {
|
||||
const pingList = this.$refs.pingList
|
||||
pingList.scrollTop = 0
|
||||
},
|
||||
// 获取当前任务的评论
|
||||
async handleShowAll (i) {
|
||||
if (i.showTask) {
|
||||
@ -420,6 +433,7 @@ export default {
|
||||
this.$forceUpdate()
|
||||
return
|
||||
}
|
||||
|
||||
const params = {
|
||||
currPage: 1,
|
||||
taskId: i.id,
|
||||
@ -431,6 +445,11 @@ export default {
|
||||
this.$message.error(res.msg)
|
||||
return
|
||||
}
|
||||
this.taskInfo.resultTasks.map(j => {
|
||||
j.updateProcess = false
|
||||
j.editProcess = false
|
||||
j.showTask = false
|
||||
})
|
||||
i.showTask = true
|
||||
i.taskList = res.data.list
|
||||
this.$forceUpdate()
|
||||
@ -542,6 +561,10 @@ export default {
|
||||
console.log(tab, event)
|
||||
},
|
||||
handleAddTask () {
|
||||
this.form = {
|
||||
name: '',
|
||||
processRate: 0
|
||||
}
|
||||
this.taskInfo.resultTasks.map(i => {
|
||||
i.updateProcess = false
|
||||
i.editProcess = false
|
||||
@ -580,6 +603,24 @@ export default {
|
||||
</style>
|
||||
<style lang='less'>
|
||||
.drawer {
|
||||
.zanwurenwu{
|
||||
width: 100%;
|
||||
height: 400px;
|
||||
.center();
|
||||
img{
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
}
|
||||
}
|
||||
.title {
|
||||
font-size: 16px;
|
||||
display: flex;
|
||||
align-items:center;
|
||||
margin-bottom: 10px;
|
||||
img{
|
||||
margin-right: 6px;
|
||||
}
|
||||
}
|
||||
&-content {
|
||||
display: flex;
|
||||
height: 100%;
|
||||
@ -600,7 +641,12 @@ export default {
|
||||
&-jiaoyi {
|
||||
.title {
|
||||
font-size: 16px;
|
||||
display: flex;
|
||||
align-items:center;
|
||||
margin-bottom: 10px;
|
||||
img{
|
||||
margin-right: 6px;
|
||||
}
|
||||
}
|
||||
.process {
|
||||
padding: 0 0 0 20px;
|
||||
@ -623,23 +669,24 @@ export default {
|
||||
margin-bottom: 20px;
|
||||
max-height:2000px;
|
||||
transition:all 0.4s;
|
||||
box-shadow: 0 1px 6px 0 rgba(0,0,0,.12), 0 1px 6px 0 rgba(0,0,0,.12);
|
||||
&-top {
|
||||
display: flex;
|
||||
align-content: center;
|
||||
// align-content: center;
|
||||
justify-content: space-between;
|
||||
border-bottom: 1px solid @borderColor;
|
||||
margin: 20px 20px 0;
|
||||
padding-bottom: 12px;
|
||||
&-process {
|
||||
display: flex;
|
||||
align-content: center;
|
||||
// align-content: center;
|
||||
> div {
|
||||
.center();
|
||||
|
||||
// .center();
|
||||
}
|
||||
}
|
||||
.right {
|
||||
.center();
|
||||
// .center();
|
||||
font-size: 16px;
|
||||
&-item {
|
||||
cursor: pointer;
|
||||
border: 1px solid @borderColor;
|
||||
@ -661,7 +708,7 @@ export default {
|
||||
transform: rotate(-180deg);
|
||||
}
|
||||
&-center {
|
||||
padding: 6px 20px 6px;
|
||||
padding: 6px 0 6px;
|
||||
.label {
|
||||
width: 300px;
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
<div class="table-header">
|
||||
<div class="title table-left weidu">维度</div>
|
||||
<div class="title table-header-flex name">名称</div>
|
||||
<div class="title table-header-flex jindu">进度</div>
|
||||
<div class="title table-header-flex jindu">任务</div>
|
||||
<div class="title table-header-flex kaohe">考核标准</div>
|
||||
<div class="title table-header-flex jieguo"
|
||||
v-if="tableInfo.result || tableAuth.showResult">结果值</div>
|
||||
@ -23,8 +23,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<div class="title table-header-flex kaohejieguo" v-if="auth.showAllScore">考核结果</div>
|
||||
<div class="title table-header-flex jixiaodengji" v-if="auth.showAllScore">绩效等级</div>
|
||||
</div>
|
||||
<div class="table-weidu"
|
||||
<div class="tableRight">
|
||||
<div style="flex:1 0 auto;">
|
||||
<div class="table-weidu"
|
||||
v-for="(item,index) in ((tableInfo.score || tableAuth.showScore)?obj.recortModelDtos:obj.recortModelDtos.slice(0,obj.recortModelDtos.length-1))"
|
||||
:key="index">
|
||||
<!-- ((tableInfo.score || tableAuth.showScore) && tableAuth.editScore?obj.recortModelDtos:obj.recortModelDtos.slice(0,obj.recortModelDtos.length-1)) -->
|
||||
@ -39,22 +43,29 @@
|
||||
<div class="table-content"
|
||||
v-for="(i,index2) in item.detailDtos"
|
||||
:key="index2">
|
||||
<div class="name"
|
||||
v-html="i.target">
|
||||
<div class="name pre"
|
||||
>
|
||||
<pre>{{i.target}}</pre>
|
||||
</div>
|
||||
<div class="jindu">
|
||||
<el-progress type="circle"
|
||||
<el-progress v-if='i.taskDtos.length !== 0' type="circle"
|
||||
:width='50'
|
||||
:stroke-width='4'
|
||||
:percentage="Math.round((i.processRate * 100) * 1000) / 1000 "></el-progress>
|
||||
<el-button type="text"
|
||||
<el-button v-if='i.taskDtos.length !== 0' type="text"
|
||||
@click="handleLookProcess(i.id)"
|
||||
size="mini">
|
||||
查看任务
|
||||
查看任务({{i.taskDtos.length || 0}})
|
||||
</el-button>
|
||||
<el-button v-if='i.taskDtos.length === 0' type="text"
|
||||
@click="handleLookProcess(i.id)"
|
||||
size="mini">
|
||||
暂无任务<br/>去添加
|
||||
</el-button>
|
||||
|
||||
</div>
|
||||
<div class="kaohe pre" style="justify-content: flex-start;">
|
||||
<pre>
|
||||
<pre>
|
||||
{{i.keyResult}}
|
||||
</pre>
|
||||
</div>
|
||||
@ -119,7 +130,7 @@
|
||||
--
|
||||
</div>
|
||||
<div class="jindu">
|
||||
暂无进度
|
||||
暂无任务
|
||||
</div>
|
||||
<div class="kaohe">
|
||||
--
|
||||
@ -136,10 +147,10 @@
|
||||
:key="index4"
|
||||
class="pingfen table-content-pingfen">
|
||||
<div class="pingfen-content-ping">
|
||||
{{k.Level}}
|
||||
{{handleGetDengJi(k.ScoreSimple)}}
|
||||
</div>
|
||||
<div class="pingfen-content-defen">
|
||||
{{k.Score}}
|
||||
{{k.ScoreSimple}}
|
||||
</div>
|
||||
<div class="pingfen-content-shuoming">
|
||||
--
|
||||
@ -149,6 +160,16 @@
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="auth.showAllScore" style='display:flex;'>
|
||||
<div class="item kaohejieguo">
|
||||
{{handleGetAllScore(scoreListForParams).score}}
|
||||
</div>
|
||||
<div class="item jixiaodengji">
|
||||
{{handleGetAllScore(scoreListForParams).a}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else
|
||||
@ -175,9 +196,9 @@
|
||||
type="primary">{{tableInfo.result?'提交结果值':'提交评分'}}</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="scoreListForParams.length>0"
|
||||
<!-- <div v-if="scoreListForParams.length>0"
|
||||
class="commonFont"
|
||||
style="font-size:12px;margin:10px 0;">{{handleGetAllScore(scoreListForParams)}}</div>
|
||||
style="font-size:12px;margin:10px 0;">{{handleGetAllScore(scoreListForParams)}}</div> -->
|
||||
<process v-if="!_.isEmpty(taskInfo)"
|
||||
:taskObj='taskInfo'
|
||||
:drawer.sync='drawer' />
|
||||
@ -238,6 +259,7 @@ export default {
|
||||
if (this.obj.recortModelDtos.length > 0 && this.obj.recortModelDtos[0].detailDtos && this.obj.recortModelDtos[0].detailDtos.length > 0) {
|
||||
return this.handleGetScorlList(this.obj.recortModelDtos[0].detailDtos[0].scoreDtos).map((item, index) => {
|
||||
let result = 0
|
||||
let res = 0
|
||||
this.obj.recortModelDtos.map(j => {
|
||||
j.detailDtos.map((k, index2) => {
|
||||
let str = k.scoreDtos[index].calculate.replace(/{\w+}/g, (l) => {
|
||||
@ -245,12 +267,15 @@ export default {
|
||||
return k.scoreDtos[index][l] || 0
|
||||
})
|
||||
// eslint-disable-next-line no-eval
|
||||
result += (k.scoreDtos[index].score || eval(str))
|
||||
result += (eval(str))
|
||||
// eslint-disable-next-line no-eval
|
||||
res += (eval(str) / k.scoreDtos[index].weight)
|
||||
!k.scoreDtos[index].score && (k.scoreDtos[index].score = result)
|
||||
})
|
||||
})
|
||||
const arr = this.scoreList.filter(i => i.minScore <= result && i.maxScore > result)
|
||||
return {
|
||||
ScoreSimple: res.toFixed(3),
|
||||
Score: result.toFixed(3),
|
||||
Level: arr.length > 0 ? arr[0].name : ''
|
||||
}
|
||||
@ -263,10 +288,11 @@ export default {
|
||||
const result = this.obj.recortModelDtos.reduce((result, i) => {
|
||||
i.detailDtos.map(j => {
|
||||
j.scoreDtos.map(k => {
|
||||
const str = j.calculate.replace(/{\w+}/g, (i) => {
|
||||
const str = k.calculate.replace(/{\w+}/g, (i) => {
|
||||
i = i.replace(/{|}/g, '')
|
||||
return k[i]
|
||||
})
|
||||
|
||||
// eslint-disable-next-line no-eval
|
||||
let a = eval(str)
|
||||
result += a
|
||||
@ -281,10 +307,19 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
this.handleGrt375()
|
||||
async created () {
|
||||
await this.handleGrt375()
|
||||
},
|
||||
async mounted () {
|
||||
if (this.$route.params.detailId) {
|
||||
this.handleLookProcess(this.$route.query.detailId)
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleGetDengJi (result) {
|
||||
const obj = this.scoreList.find(i => i.minScore <= Number(result) && i.maxScore > Number(result))
|
||||
return obj ? obj.name : ''
|
||||
},
|
||||
// 获取指标任务详情
|
||||
async handleGetTaskDetail (id = '') {
|
||||
let res = await apiTaskDetail({ detailId: id })
|
||||
@ -295,7 +330,6 @@ export default {
|
||||
return Object.assign({}, res.data, { detailId: id })
|
||||
},
|
||||
async handleLookProcess (item) {
|
||||
console.log(item)
|
||||
this.taskInfo = {}
|
||||
let result = await this.handleGetTaskDetail(item)
|
||||
if (!result) return {}
|
||||
@ -310,32 +344,54 @@ export default {
|
||||
result += Number(item.Score)
|
||||
return result
|
||||
}, 0)
|
||||
return '总分:' + (this.scoreList.filter(i => i.minScore <= result && i.maxScore > result).length > 0 ? this.scoreList.filter(i => i.minScore <= result && i.maxScore > result)[0].name : '--')
|
||||
console.log('this.scoreList: ', this.scoreList)
|
||||
return {
|
||||
score: result.toFixed(3),
|
||||
a: this.handleGetDengJi(result)
|
||||
}
|
||||
},
|
||||
handleGetScorlList (list) {
|
||||
if (!list) list = []
|
||||
console.log('list: ', list)
|
||||
console.log('userInfo: ', this.userInfo.userId)
|
||||
return list.filter(i => i.acquireScore !== null || (i.approvalId === this.userInfo.userId && this.tableInfo.score))
|
||||
return list.filter(i => i.isEdit || (i.approvalId === this.userInfo.userId && this.tableInfo.score))
|
||||
},
|
||||
handleScore (item) {
|
||||
return this.scoreList.filter(i => i.score === item).length > 0 ? this.scoreList.filter(i => i.score === item)[0].name : 0
|
||||
},
|
||||
async handleGetNext () {
|
||||
this.loadingTi = true
|
||||
const obj = { status: 1, menuName: this.tableInfo.result ? '提交了结果值' : '提交了评分' }
|
||||
const params = Object.assign({}, { resultRecordId: this.$route.query.id || '' }, obj)
|
||||
if (!this.tableInfo.result) {
|
||||
let isScore = true
|
||||
this.obj.recortModelDtos.map(i => {
|
||||
i.detailDtos.map(j => {
|
||||
const obj = j.scoreDtos.find(k => k.approvalId === this.userInfo.userId)
|
||||
if (obj.acquireScore) {
|
||||
obj.isEdit = 1
|
||||
} else {
|
||||
isScore = false
|
||||
}
|
||||
})
|
||||
})
|
||||
if (!isScore) {
|
||||
this.loadingTi = false
|
||||
return this.$message({
|
||||
message: '有未评分指标',
|
||||
type: 'info'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
let res1 = await apiSaveDetail(Object.assign({}, this.obj, this.score))
|
||||
if (res1.code !== 200) {
|
||||
this.$message.error(res1.msg)
|
||||
this.loadingTi = false
|
||||
return
|
||||
}
|
||||
const obj = { status: 1, menuName: this.tableInfo.result ? '提交了结果值' : '提交了评分' }
|
||||
const params = Object.assign({}, { resultRecordId: this.$route.query.id || '' }, obj)
|
||||
params.commentId = res1.commentId || ''
|
||||
let res = await apiSaveapproval(params)
|
||||
this.loadingTi = false
|
||||
if (res.code !== 200) {
|
||||
this.$message.error(res.msg)
|
||||
return
|
||||
return this.$message.error(res.msg)
|
||||
}
|
||||
this.$message({
|
||||
message: res.msg,
|
||||
@ -354,7 +410,7 @@ export default {
|
||||
if (res.code !== 200) return
|
||||
this.scoreList = res.data
|
||||
},
|
||||
async handleSaveDetail (params = Object.assign({}, this.obj, this.score)) {
|
||||
async handleSaveDetail (params = Object.assign({}, this.obj, this.score, {save: 1})) {
|
||||
this.loadingZan = true
|
||||
let res = await apiSaveDetail(params)
|
||||
this.loadingZan = false
|
||||
@ -371,6 +427,23 @@ export default {
|
||||
}
|
||||
</script>
|
||||
<style lang='less' scoped>
|
||||
.item{
|
||||
border-right: 1px solid @borderColor;
|
||||
border-bottom: 1px solid @borderColor;
|
||||
}
|
||||
.tableRight{
|
||||
display: flex;
|
||||
}
|
||||
.kaohejieguo{
|
||||
width: 100px;
|
||||
.center();
|
||||
font-size:10px;
|
||||
}
|
||||
.jixiaodengji{
|
||||
width: 100px;
|
||||
font-size:10px;
|
||||
.center();
|
||||
}
|
||||
.title {
|
||||
background: #f5f5f5;
|
||||
border-bottom: 1px solid @borderColor;
|
||||
@ -386,7 +459,7 @@ export default {
|
||||
.center();
|
||||
}
|
||||
.jindu {
|
||||
width: 60px;
|
||||
width: 90px;
|
||||
.center();
|
||||
flex-direction: column;
|
||||
}
|
||||
@ -654,7 +727,7 @@ export default {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
&-content {
|
||||
width: 1360px;
|
||||
width: 100;
|
||||
margin: 0 auto;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
|
||||
@ -276,6 +276,7 @@ export default {
|
||||
if (this.isNoRouter) {
|
||||
await this.handleStartsReq()
|
||||
}
|
||||
|
||||
await this.handleList()
|
||||
},
|
||||
methods: {
|
||||
|
||||
@ -50,6 +50,13 @@
|
||||
@click="showChooseList= true"
|
||||
type="primary"
|
||||
>开始评分</el-button>
|
||||
<el-button
|
||||
size="small"
|
||||
type="primary"
|
||||
v-if="auth.toFast"
|
||||
@click="handleAddCuiBan"
|
||||
plain
|
||||
>一键催办</el-button>
|
||||
<!-- handleGetList handleChoose -->
|
||||
<el-button
|
||||
size="small"
|
||||
@ -221,7 +228,7 @@ import EvaluationTeamFilter from '@/components/EvaluationTeamFilter'
|
||||
import ChooseInitiate from '@/components/ChooseInitiate'
|
||||
import popupRemovePerson from '@/components/popupPerson'
|
||||
import InfoHeader from '@/components/InfoHeader'
|
||||
import { apiManagerDetail, apiChartList, apiAssessManagerToScore } from '@/api/assessment'
|
||||
import { apiManagerDetail, apiChartList, apiAssessManagerToScore, apiManagerUrging } from '@/api/assessment'
|
||||
import { getStartsData } from '@/api/report'
|
||||
let id = 0
|
||||
export default {
|
||||
@ -293,6 +300,34 @@ export default {
|
||||
await this.handleStartsReq()
|
||||
},
|
||||
methods: {
|
||||
async handleAddCuiBan () {
|
||||
const obj = this.titleList.find(i => i.active)
|
||||
if (obj.num === 0) return this.$message.info('暂无可催办人员!')
|
||||
this.$confirm('将给当前节点处理人发送催办消息通知,确认进行催办?', '催办确认', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(async () => {
|
||||
const params = {
|
||||
startId: this.startId[1],
|
||||
flowProcess: obj.flowProcess
|
||||
}
|
||||
const res = await apiManagerUrging(params)
|
||||
if (res.code !== 200) {
|
||||
this.$message.error(res.msg)
|
||||
}
|
||||
this.$message({
|
||||
message: res.msg,
|
||||
type: 'success'
|
||||
})
|
||||
console.log('params: ', params)
|
||||
}).catch(() => {
|
||||
this.$message({
|
||||
type: 'info',
|
||||
message: '已取消'
|
||||
})
|
||||
})
|
||||
},
|
||||
async handleCallBackChoose (item) {
|
||||
if (!item.value) return this.$message.info('请选择考评组!')
|
||||
this.$confirm('所选考评组员工的绩效考核将自动进入评分流程,确认开始评分?', '提示', {
|
||||
|
||||
@ -10,8 +10,8 @@
|
||||
考核月份
|
||||
</div>
|
||||
<div class="tablePint-aboult-item"
|
||||
style="width:110px">
|
||||
2020年9月
|
||||
style="width:130px">
|
||||
{{obj.assessCycle}}
|
||||
</div>
|
||||
<div class="tablePint-aboult-item"
|
||||
style="width:50px">
|
||||
@ -27,7 +27,7 @@
|
||||
</div>
|
||||
<div class="tablePint-aboult-item"
|
||||
style="width:50px">
|
||||
熊成强
|
||||
{{obj.currentApprovalStaffName}}
|
||||
</div>
|
||||
<div class="tablePint-aboult-item"
|
||||
style="width:80px">
|
||||
@ -35,7 +35,7 @@
|
||||
</div>
|
||||
<div class="tablePint-aboult-item"
|
||||
style="width:120px">
|
||||
设计部
|
||||
{{obj.departmentOne}}
|
||||
</div>
|
||||
<div class="tablePint-aboult-item"
|
||||
style="width:80px">
|
||||
@ -43,7 +43,7 @@
|
||||
</div>
|
||||
<div class="tablePint-aboult-item"
|
||||
style="width:100px">
|
||||
/
|
||||
{{obj.departmentTwo}}
|
||||
</div>
|
||||
<div class="tablePint-aboult-item"
|
||||
style="width:100px">
|
||||
@ -51,7 +51,7 @@
|
||||
</div>
|
||||
<div class="tablePint-aboult-item"
|
||||
style="width:100px">
|
||||
/
|
||||
{{obj.departmentThree}}
|
||||
</div>
|
||||
<div class="tablePint-aboult-item"
|
||||
style="width:100px">
|
||||
@ -74,16 +74,16 @@
|
||||
<div class="tablePint-top-weidu" style="width:100px">
|
||||
考核维度
|
||||
</div>
|
||||
<div class="tablePint-top-mubiao" style="width:110px">
|
||||
<div class="tablePint-top-mubiao" style="width:130px">
|
||||
目标/指标
|
||||
</div>
|
||||
<div class="tablePint-top-guanjian" style="width:310px">
|
||||
<div class="tablePint-top-guanjian" style="width:430px">
|
||||
关键结果
|
||||
</div>
|
||||
<div class="tablePint-top-quanzhong" style="width:100px">
|
||||
考核权重
|
||||
</div>
|
||||
<div class="tablePint-top-kaohe" style="width:500px">
|
||||
<div class="tablePint-top-kaohe" style="width:380px">
|
||||
考核结果(员工填写)
|
||||
</div>
|
||||
<div class="tablePint-top-zhishu" style=" width:100px;flex-direction: column;">
|
||||
@ -96,41 +96,46 @@
|
||||
评分说明
|
||||
</div>
|
||||
</div>
|
||||
<div v-for="i in 2">
|
||||
<div v-for="i in obj.recortModelDtos" :key="i.id">
|
||||
<div class="tablePint-content">
|
||||
<div class="tablePint-content-left item" style="width:100px;">
|
||||
业绩
|
||||
{{i.name}}
|
||||
</div>
|
||||
<div class="tablePint-content-right">
|
||||
<div v-for="i in 10" class="tablePint-content-right-item">
|
||||
<div class="item" style="width:110px;">几月交易额</div>
|
||||
<div class="item" style="width:310px">几月交易额</div>
|
||||
<div class="item" style="width:100px">几月交易额</div>
|
||||
<div class="item" style="width:500px">几月交易额</div>
|
||||
<div class="item" style="width:100px">几月交易额</div>
|
||||
<div v-for="j in i.detailDtos" class="tablePint-content-right-item" :key="j.id">
|
||||
<div class="item" style="width:130px;">{{j.target}}</div>
|
||||
<div class="item pre" style="width:430px;"><pre>{{j.keyResult}}</pre></div>
|
||||
<div class="item" style="width:100px">几月交易额</div>
|
||||
<div class="item" style="width:380px">{{j.checkResult}}</div>
|
||||
<div class="item" style="width:100px">{{j.superScore || '/'}}</div>
|
||||
<div class="item" style="width:100px">{{j.acquireScore || '/'}}</div>
|
||||
<div class="item" style="width:140px">几月交易额</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex ">
|
||||
<div class="item bg" style="width:520px;">业务考核结果</div>
|
||||
<div class="item bg" style="width:100px;">70%</div>
|
||||
<div class="item bg" style="width:500px;">/</div>
|
||||
<div class="item bg" style="width:660px;">业务考核结果</div>
|
||||
<div class="item bg" style="width:100px;">{{Math.round((i.weight * 100) * 1000) / 1000 }}%</div>
|
||||
<div class="item bg" style="width:380px;">/</div>
|
||||
<div class="item bg" style="width:100px;">/</div>
|
||||
<div class="item bg" style="width:100px;">2.512</div>
|
||||
<div class="item bg" style="width:140px;">/</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex">
|
||||
<div class="items" style="width:1220px;">zui</div>
|
||||
<div class="item" style="width:100px;">zui</div>
|
||||
<div class="item" style="width:140px;">zui</div>
|
||||
<div class="items" style="width:1240px;">最终绩效考核评分</div>
|
||||
<div class="item" style="width:100px;">3.234</div>
|
||||
<div class="item" style="width:140px;">/</div>
|
||||
</div>
|
||||
<div class="flex">
|
||||
<div class="items" style="width:730px;padding:20px 10px;">直属上级确认绩效考核内容与结果
|
||||
<div class="items" style="width:1240px;">最终绩效考核结果等级</div>
|
||||
<div class="item" style="width:100px;">3.5+</div>
|
||||
<div class="item" style="width:140px;">/</div>
|
||||
</div>
|
||||
<div class="flex">
|
||||
<div class="items" style="width:740px;padding:20px 10px;">直属上级确认绩效考核内容与结果
|
||||
签字:</div>
|
||||
<div class="items" style="width:730px;padding:20px 10px;">直属上级确认绩效考核内容与结果
|
||||
<div class="items" style="width:740px;padding:20px 10px;">直属上级确认绩效考核内容与结果
|
||||
签字:</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -166,6 +171,7 @@ export default {
|
||||
|
||||
<style lang="less" scoped>
|
||||
.tablePint {
|
||||
font-size: 10px;
|
||||
div{
|
||||
box-sizing: border-box;
|
||||
}
|
||||
@ -180,7 +186,7 @@ export default {
|
||||
border-left: 1px solid #666666;
|
||||
&-title {
|
||||
.center();
|
||||
width: 1460px;
|
||||
width: 1480px;
|
||||
height: 50px;
|
||||
border-top: 1px solid #666666;
|
||||
border-right: 1px solid #666666;
|
||||
@ -239,7 +245,7 @@ export default {
|
||||
border-bottom: 1px solid #666666;
|
||||
}
|
||||
.bg{
|
||||
background: rgb(245, 187, 120);
|
||||
background-color: rgb(245, 187, 120);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
<i @click.stop="handleDelete(i)"
|
||||
class="el-icon-close close"></i>
|
||||
</div>
|
||||
<div v-if="index+1!==list.length && list.length!==0"
|
||||
<div v-if="index+1!==handleGetList().length && handleGetList().length!==0"
|
||||
class="process-title-item-img">
|
||||
<img src="./imgs/right.png"
|
||||
alt="">
|
||||
@ -250,13 +250,14 @@ export default {
|
||||
} else {
|
||||
this.list = this.list.filter(i => i !== item)
|
||||
}
|
||||
if (this.handleGetList().length === 1) {
|
||||
const list = this.handleGetList()
|
||||
if (list.length === 1) {
|
||||
this.itemInfo = {}
|
||||
}
|
||||
if (!this.list.some(i => i.isCick && !i.isDelete)) {
|
||||
if (this.list[0]) {
|
||||
this.list[0].isCick = true
|
||||
this.itemInfo = this.list[0]
|
||||
if (list.every(i => !i.isCick)) {
|
||||
if (list[0]) {
|
||||
list[0].isCick = true
|
||||
this.itemInfo = list[0]
|
||||
}
|
||||
}
|
||||
}).catch(() => {
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
<span>{{i.label}}</span>
|
||||
<i @click.stop="handleDelete(i)" class="el-icon-close close"></i>
|
||||
</div>
|
||||
<div v-if="index+1!==list.length && list.length!==0" class="process-title-item-img">
|
||||
<div v-if="index+1!==handleGetList().length && handleGetList().length!==0" class="process-title-item-img">
|
||||
<img src="./imgs/right.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
@ -230,13 +230,15 @@ export default {
|
||||
} else {
|
||||
this.list = this.list.filter(i => i !== item)
|
||||
}
|
||||
if (this.handleGetList().length === 1) {
|
||||
const list = this.handleGetList()
|
||||
|
||||
if (list.length === 1) {
|
||||
this.itemInfo = {}
|
||||
}
|
||||
if (!this.list.some(i => i.isCick && !i.isDelete)) {
|
||||
if (this.list[0]) {
|
||||
this.list[0].isCick = true
|
||||
this.itemInfo = this.list[0]
|
||||
if (list.every(i => !i.isCick)) {
|
||||
if (list[0]) {
|
||||
list[0].isCick = true
|
||||
this.itemInfo = list[0].id === 9999 ? {} : list[0]
|
||||
}
|
||||
}
|
||||
}).catch(() => {
|
||||
|
||||
@ -75,6 +75,13 @@ export default {
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
listinfo: {
|
||||
deep: true,
|
||||
handler (n, o) {
|
||||
this.handleIsEmit(JSON.parse(JSON.stringify(this.form)))
|
||||
this.$forceUpdate()
|
||||
}
|
||||
},
|
||||
form: {
|
||||
deep: true,
|
||||
handler (n, o) {
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
<span style="font-size:12px;">{{i.label || "---"}}</span>
|
||||
<i @click.stop="handleDelete(i)" class="el-icon-close close"></i>
|
||||
</div>
|
||||
<div v-if="index+1!==list.length && list.length!==0" class="process-title-item-img">
|
||||
<div v-if="index+1!==handleGetList(list).length && handleGetList(list).length!==0" class="process-title-item-img">
|
||||
<img src="./imgs/right.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
@ -238,13 +238,14 @@ export default {
|
||||
} else {
|
||||
this.list = this.list.filter(i => i !== item)
|
||||
}
|
||||
if (this.handleGetList().length === 1) {
|
||||
const list = this.handleGetList()
|
||||
if (list.length === 1) {
|
||||
this.itemInfo = {}
|
||||
}
|
||||
if (!this.list.some(i => i.isCick && !i.isDelete)) {
|
||||
if (this.list[0]) {
|
||||
this.list[0].isCick = true
|
||||
this.itemInfo = this.list[0]
|
||||
if (list.every(i => !i.isCick)) {
|
||||
if (list[0]) {
|
||||
list[0].isCick = true
|
||||
this.itemInfo = list[0].id === 9999 ? {} : list[0]
|
||||
}
|
||||
}
|
||||
}).catch(() => {
|
||||
|
||||
@ -258,6 +258,9 @@ export default {
|
||||
async handleGetByIdForBasis (id) {
|
||||
try {
|
||||
let res = await getByIdForBasis({id})
|
||||
if (res.code !== 200) {
|
||||
return this.$message.error(res.msg)
|
||||
}
|
||||
res = res.data
|
||||
this.GroundList1 = res.managers ? res.managers.map(i => {
|
||||
i.staffId = i.id
|
||||
@ -299,6 +302,9 @@ export default {
|
||||
async handleGetGround () {
|
||||
try {
|
||||
let res = await getGround({groupId: 1})
|
||||
if (res.code !== 200) {
|
||||
return this.$message.error(res.msg)
|
||||
}
|
||||
res = res.data
|
||||
res = res.map(i => {
|
||||
i.isDisable = i.isSelect
|
||||
@ -308,6 +314,7 @@ export default {
|
||||
this.GroundList1 = JSON.parse(JSON.stringify(res))
|
||||
} catch (error) {
|
||||
this.$message.error(error.msg)
|
||||
this.$loadingEnd()
|
||||
}
|
||||
},
|
||||
handleCancel () {
|
||||
|
||||
@ -96,7 +96,7 @@
|
||||
v-for="(j,indexJ) in handleFilter(i.tagetLibItems)"
|
||||
:key="indexJ"
|
||||
>
|
||||
<div style="width:30%">{{j.name}}</div>
|
||||
<div style="width:30%" class="pre"><pre>{{j.name}}</pre></div>
|
||||
<div style="width:30%" class="pre">
|
||||
<pre >{{j.keyResult}}</pre>
|
||||
</div>
|
||||
@ -186,7 +186,7 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item prop="name" label='指标名称'>
|
||||
<el-input clearable size="small" v-model="formIndicators.name"></el-input>
|
||||
<el-input clearable size="small" :rows="4" type="textarea" v-model="formIndicators.name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="考核标准" prop="keyResult">
|
||||
<el-input size="small" resize='vertical' :rows="24" clearable type="textarea" v-model="formIndicators.keyResult"></el-input>
|
||||
@ -209,11 +209,7 @@ import draggable from 'vuedraggable'
|
||||
import {getDimensions} from '@/api/data'
|
||||
import { getByGroupId } from '@/api/workbench'
|
||||
// console.log('Sortable: ', Sortable)
|
||||
const info = {
|
||||
gradeGroupId: 1,
|
||||
modelItems: [
|
||||
]
|
||||
}
|
||||
// const info =
|
||||
export default {
|
||||
props: ['templateForm'],
|
||||
data () {
|
||||
@ -228,7 +224,11 @@ export default {
|
||||
maxCount: '',
|
||||
weight: 0,
|
||||
// 整个info
|
||||
info: info,
|
||||
info: {
|
||||
gradeGroupId: 1,
|
||||
modelItems: [
|
||||
]
|
||||
},
|
||||
form: {
|
||||
weight: '',
|
||||
maxCount: ''
|
||||
@ -289,7 +289,11 @@ export default {
|
||||
computed: {},
|
||||
beforeMount () {},
|
||||
mounted () {
|
||||
this.info = info
|
||||
this.info = {
|
||||
gradeGroupId: 1,
|
||||
modelItems: [
|
||||
]
|
||||
}
|
||||
const id = this.$route.query.id || ''
|
||||
this.id = id
|
||||
if (id) {
|
||||
|
||||
@ -69,7 +69,8 @@ export default {
|
||||
this.$nextTick(() => {
|
||||
this.$router.replace({
|
||||
name: item[0].name,
|
||||
query: this.$route.query
|
||||
query: this.$route.query,
|
||||
params: this.$route.query
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user