* 'v_porcess' of http://gitlab.ldxinyong.com/enterpriseManagement/digitization-ui: (54 commits)
  优化
  优化
  优化
  优化
  优化
  优化:指标名称使用 textarea
  优化
  优化
  优化
  优化
  优化
  优化
  优化
  优化
  优化
  优化
  优化
  优化
  优化
  优化
  ...
This commit is contained in:
zhujida 2020-12-18 15:26:42 +08:00
commit 41c1e31718
25 changed files with 480 additions and 231 deletions

View File

@ -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>

View File

@ -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
})
}

View File

@ -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 || ''
}

View File

@ -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})
}
}
}

View File

@ -18,7 +18,7 @@
.pre{
line-height: 20px;
pre{
overflow:hidden;
overflow:hidden;
line-height: 20px;
// white-space:pre-line;
// word-wrap: break-word;

View File

@ -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)

View File

@ -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 () {

View File

@ -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 || ''
}
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 939 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@ -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'
}
},
// 12 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{

View File

@ -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;
}

View File

@ -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;

View File

@ -276,6 +276,7 @@ export default {
if (this.isNoRouter) {
await this.handleStartsReq()
}
await this.handleList()
},
methods: {

View File

@ -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('所选考评组员工的绩效考核将自动进入评分流程,确认开始评分?', '提示', {

View File

@ -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>

View File

@ -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(() => {

View File

@ -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(() => {

View File

@ -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) {

View File

@ -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(() => {

View File

@ -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 () {

View File

@ -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) {

View File

@ -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
})
})
}