<template>
|
<el-dialog v-model="params.visible" :title="`发布评优任务(${params.data?.taskName || ''})`" width="65%" @open="openDialog"
|
@close="dialogClose">
|
<div class="content">
|
<el-form :model="form" ref="formRef" :rules="rules" label-position="top">
|
<el-form-item prop="categoryEntities">
|
<template #label>
|
评优奖项
|
<el-button type="primary" icon="el-icon-view" text
|
@click="viewCandidateResult">查看第一轮候选结果</el-button>
|
</template>
|
<ul class="type-list">
|
<li class="type-item">
|
<div class="title">奖项</div>
|
<div class="introduction">认定标准</div>
|
<div class="number">名额</div>
|
<div class="tool">操作</div>
|
</li>
|
<li class="type-item" v-for="(item, index) in form.categoryEntities" :key="index">
|
<div class="title">{{ item.categoryName }}</div>
|
<el-tooltip effect="dark" placement="top">
|
<template #content>
|
<p style="max-width: 500px;">{{ item.standard }}</p>
|
</template>
|
<div class="introduction">
|
{{ item.standard }}
|
</div>
|
</el-tooltip>
|
|
<div class="number">{{ item.peopleNum }}</div>
|
<div class="tool">
|
<el-button type="primary" icon="el-icon-plus" text
|
@click="addEcCandidateHandler(item)">添加候选人</el-button>
|
</div>
|
</li>
|
</ul>
|
</el-form-item>
|
<el-form-item label="投票人员" prop="pollingPersons">
|
<el-checkbox-group v-model="form.pollingPersons">
|
<el-checkbox v-for="item in employeeDict" :key="item.id" :label="item.dictKey"
|
@change="checkBoxChange($event, item)">
|
{{ item.dictValue }}
|
<el-button type="primary" icon="el-icon-edit" text
|
@click="selectionHandler(item)">设置人员</el-button>
|
</el-checkbox>
|
</el-checkbox-group>
|
</el-form-item>
|
<el-form-item label="是否可以投选本部门成员" prop="isSelfDept">
|
<el-radio-group v-model="form.isSelfDept">
|
<el-radio :label="0" border>否</el-radio>
|
<el-radio :label="1" border>是</el-radio>
|
</el-radio-group>
|
</el-form-item>
|
<el-form-item label="第二轮任务结束时间" required>
|
<el-form-item class="time-box" prop="evaluateCutoffTimeStart">
|
<el-date-picker v-model="form.evaluateCutoffTimeStart" type="datetime" placeholder="请选择任务开始时间"
|
value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%;" />
|
</el-form-item>
|
<span class="time-span">至</span>
|
<el-form-item class="time-box" prop="evaluateCutoffTimeEnd">
|
<el-date-picker v-model="form.evaluateCutoffTimeEnd" type="datetime" placeholder="请选择任务结束时间"
|
value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%;" />
|
</el-form-item>
|
</el-form-item>
|
</el-form>
|
</div>
|
<template #footer>
|
<el-button @click="() => params.visible = false">取消</el-button>
|
<el-button type="primary" @click="taskPublic">确认发布</el-button>
|
</template>
|
<!-- 查看第一轮候选结果 -->
|
<candidateResult :params="candidateResultParams" />
|
<!-- 添加评优种类候选人 -->
|
<addEcCandidate :params="addEcCandidateParams" />
|
<!-- 人员选择 -->
|
<selectionDialog :params="selectionParams" @addEvaluateParams="addEvaluateParams" />
|
</el-dialog>
|
</template>
|
|
<script>
|
import _ from 'lodash';
|
import { getDict } from '@/api/dict'
|
import { update, getEcList, getEmployeeLevelList } from '@/api/evaluate/evaluateTask'
|
import addEcCandidate from './addEcCandidate.vue';
|
import candidateResult from './candidateResult.vue';
|
import selectionDialog from './selectionDialog.vue';
|
|
export default {
|
components: {
|
addEcCandidate,
|
candidateResult,
|
selectionDialog
|
},
|
props: {
|
params: {
|
type: Object,
|
default: () => {
|
return {
|
visible: false,
|
data: {}
|
};
|
},
|
},
|
},
|
data() {
|
return {
|
employeeDict: [],
|
form: {
|
categoryEntities: [],
|
pollingPersons: [],
|
isSelfDept: '',
|
votePersonObjInfo: [],
|
evaluateCutoffTimeStart: '',
|
evaluateCutoffTimeEnd: ''
|
},
|
rules: {
|
categoryEntities: [
|
{ required: true, message: '任务类别不可为空', trigger: 'click' },
|
],
|
pollingPersons: [
|
{ required: true, message: '请选择评定人员', trigger: 'click' },
|
],
|
isSelfDept: [
|
{ required: true, message: '请选择是否可以自选', trigger: 'click' },
|
],
|
evaluateCutoffTimeStart: [
|
{ required: true, message: '请选择任务开始时间', trigger: 'click' },
|
],
|
evaluateCutoffTimeEnd: [
|
{ required: true, message: '请选择任务开始时间', trigger: 'click' },
|
]
|
},
|
page: {
|
current: 1,
|
size: 100,
|
total: 0
|
},
|
addEcCandidateParams: {},
|
candidateResultParams: {},
|
selectionParams: {}
|
}
|
},
|
watch: {
|
'params.visible': {
|
handler(value) {
|
if (!value) return
|
console.log(this.params.data.pollingPersons);
|
const pollingPersons = this.params.data.pollingPersons
|
this.form.pollingPersons = pollingPersons !== "0" ? pollingPersons.split(',') : []
|
this.form.votePersonObjInfo = JSON.parse(this.params.data.votePersonObjInfo) || []
|
this.form.evaluateCutoffTimeStart = this.params.data.evaluateCutoffTimeStart || ''
|
this.form.evaluateCutoffTimeEnd = this.params.data.evaluateCutoffTimeEnd || ''
|
},
|
deep: true
|
}
|
},
|
methods: {
|
dialogClose() {
|
this.$refs.formRef.resetFields()
|
},
|
openDialog() {
|
this.initDict()
|
const { id } = this.params.data
|
const { current, size } = this.page
|
getEcList(current, size, id).then(ecResult => {
|
const { code, data: { records } } = ecResult.data
|
if (code !== 200) return this.$message.error('评优类别加载失败')
|
this.form.categoryEntities = records
|
})
|
},
|
initDict() {
|
getDict('employee_type').then(res => {
|
const { code, data } = res.data
|
if (code !== 200) {
|
return this.$message.error('人员类型字典加载失败')
|
}
|
this.employeeDict = data
|
})
|
},
|
taskPublic() {
|
this.$refs.formRef.validate(valid => {
|
if (!valid) return
|
const data = _.cloneDeep(this.form)
|
const { id } = this.params.data
|
data.id = id
|
// data.candidateState = 2
|
// data.evaluateState = 1
|
data.pollingPersons = data.pollingPersons.join(',')
|
delete data.categoryEntities
|
update(data).then(res => {
|
if (res.data.code !== 200) return
|
this.params.visible = false
|
this.$emit('refreshTable', { currentPage: 1, pageSize: 10 })
|
})
|
})
|
},
|
addEcCandidateHandler(row) {
|
this.addEcCandidateParams = {
|
visible: true,
|
data: row
|
}
|
},
|
viewCandidateResult() {
|
this.candidateResultParams = {
|
visible: true,
|
data: this.params.data
|
}
|
},
|
selectionHandler(row) {
|
const obj = this.form.votePersonObjInfo.find(item => item.employeeType === row.dictKey) || {}
|
this.selectionParams = {
|
visible: true,
|
data: row,
|
values: obj
|
}
|
},
|
checkBoxChange(e, { dictKey }) {
|
const index = this.form.votePersonObjInfo.findIndex(item => item.employeeType === dictKey)
|
if (!e) {
|
this.form.votePersonObjInfo.splice(index, 1)
|
return
|
}
|
getEmployeeLevelList(dictKey).then((res) => {
|
const { code, data } = res.data
|
if (code !== 200) return this.$message.error('当前级别人员加载失败,请重试!!')
|
const participateInList = data.map(item => {
|
const { id, name, deptId, deptName, postId, postName } = item
|
return { id, name, deptId, deptName, postId, postName }
|
})
|
const params = {
|
employeeType: dictKey,
|
participateIn: participateInList,
|
notParticipateIn: []
|
}
|
if (index === -1) {
|
this.form.votePersonObjInfo.push(params)
|
} else {
|
this.form.votePersonObjInfo[index] = params
|
}
|
})
|
},
|
addEvaluateParams(params) {
|
const { participateIn, employeeType } = params
|
const index = this.form.votePersonObjInfo.findIndex(item => item.employeeType === employeeType)
|
const typeIndex = this.form.pollingPersons.findIndex(item => item === employeeType)
|
|
if (index === -1) {
|
if (participateIn.length > 0) {
|
this.form.votePersonObjInfo.push(params)
|
this.form.pollingPersons.push(params.employeeType)
|
}
|
} else {
|
if (participateIn.length > 0) {
|
this.form.votePersonObjInfo[index] = params
|
} else {
|
this.form.votePersonObjInfo.splice(index, 1)
|
this.form.pollingPersons.splice(typeIndex, 1)
|
}
|
}
|
}
|
}
|
};
|
</script>
|
|
<style lang="scss" scoped>
|
$borderColor: var(--el-border-color);
|
|
.content {
|
max-height: 600px;
|
overflow-y: auto;
|
|
.time-span {
|
margin: 0 10px;
|
}
|
|
.time-box {
|
width: calc(100% / 2 - 20px);
|
}
|
|
.type-list {
|
margin: 0;
|
padding: 0;
|
list-style-type: none;
|
width: 100%;
|
border: 1px solid $borderColor;
|
border-radius: var(--el-border-radius-base);
|
box-sizing: border-box;
|
|
.type-item {
|
display: flex;
|
height: 40px;
|
line-height: 40px;
|
text-align: center;
|
|
div {
|
border-bottom: 1px solid $borderColor;
|
flex-shrink: 0;
|
white-space: nowrap;
|
overflow: hidden;
|
text-overflow: ellipsis;
|
}
|
|
.title {
|
flex: 2;
|
}
|
|
.introduction {
|
flex: 5;
|
flex-shrink: 0;
|
|
border: {
|
right: 1px solid $borderColor;
|
left: 1px solid $borderColor;
|
}
|
}
|
|
.number {
|
flex: 1;
|
}
|
|
.tool {
|
flex: 2;
|
border-left: 1px solid $borderColor;
|
}
|
|
&:last-child {
|
div {
|
border-bottom: 0;
|
}
|
}
|
}
|
}
|
}
|
</style>
|