<template>
|
<el-dialog v-model="params.visible" :title="`下发任务(${params.data?.taskName || ''})`" width="65%" @open="openDialog"
|
@close="dialogClose" destroy-on-close>
|
<div class="content" v-loading="isLoading">
|
<el-form :model="form" ref="formRef" :rules="rules" label-position="top">
|
<el-form-item label="评优奖项" prop="categoryEntities">
|
<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="第二轮任务结束时间" 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" :loading="isLoading">取消</el-button>
|
<el-button type="primary" @click="taskPublic" :loading="isLoading">确认发布</el-button>
|
</template>
|
<!-- 添加评优种类候选人 -->
|
<reissueSrCandiadate :params="addEcCandidateParams" @addCandidateList="addCandidateList" />
|
<!-- 人员选择 -->
|
<selectionDialog :params="selectionParams" @addEvaluateParams="addEvaluateParams" />
|
</el-dialog>
|
</template>
|
|
<script>
|
import _ from 'lodash';
|
import { getDict } from '@/api/dict'
|
import { add, update, getEcList, getEmployeeLevelList, addEtaskCc } from '@/api/evaluate/evaluateTask'
|
import selectionDialog from './selectionDialog.vue';
|
import reissueSrCandiadate from './reissueSrCandiadate.vue';
|
|
export default {
|
components: {
|
selectionDialog,
|
reissueSrCandiadate
|
},
|
props: {
|
params: {
|
type: Object,
|
default: () => {
|
return {
|
visible: false,
|
data: {}
|
};
|
},
|
},
|
},
|
data() {
|
return {
|
isLoading: false,
|
employeeDict: [],
|
form: {
|
categoryEntities: [],
|
pollingPersons: [],
|
votePersonObjInfo: [],
|
evaluateCutoffTimeStart: '',
|
evaluateCutoffTimeEnd: ''
|
},
|
rules: {
|
categoryEntities: [
|
{ required: true, message: '任务类别不可为空', trigger: 'click' },
|
{
|
validator: (rule, value, callback) => {
|
if (this.candidateList.length <= 0) {
|
callback(new Error("候选人不可为空!!"))
|
} else {
|
callback()
|
}
|
},
|
trigger: 'click'
|
}
|
],
|
pollingPersons: [
|
{ 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: {},
|
selectionParams: {},
|
candidateList: [],
|
}
|
},
|
watch: {
|
// 'params.visible': {
|
// handler(value) {
|
// if (!value) return
|
// this.form.pollingPersons = this.params.data.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.candidateList = []
|
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
|
this.isLoading = true
|
// 创建新任务
|
this.createNewTask(this.params.data).then(taskRes => {
|
this.addCategoryCandiadate(taskRes).then(respones => {
|
const data = _.cloneDeep(this.form)
|
const { id } = taskRes
|
data.id = id
|
data.candidateState = 2
|
data.pollingPersons = data.pollingPersons.join(',')
|
delete data.categoryEntities
|
update(data).then(res => {
|
if (res.data.code !== 200) return
|
this.isLoading = false
|
this.params.visible = false
|
this.$emit('initAsideData')
|
})
|
})
|
})
|
})
|
},
|
addCandidateList(list) {
|
list.forEach(item => {
|
const isExist = this.candidateList.find(user => user.userId === item.userId && user.categoryName === item.categoryName)
|
if (!isExist) {
|
this.candidateList.push(item)
|
}
|
})
|
},
|
getNowDate() {
|
const date = new Date()
|
const year = date.getFullYear()
|
const month = date.getMonth() + 1
|
const day = date.getDate()
|
return year + '-' + month + '-' + day + ' ' + '00:00:00'
|
},
|
// 创建新任务
|
createNewTask(params) {
|
const { id, taskName, candidateState } = params
|
// 获取当前任务评优奖项
|
return getEcList(1, 100, id).then(res => {
|
if (res.data.code !== 200) return this.$message.error(res.data.msg)
|
const categoryEntities = []
|
res.data.data.records.forEach(item => {
|
const { categoryName, standard, peopleNum } = item
|
categoryEntities.push({ categoryName, standard, peopleNum })
|
})
|
return categoryEntities
|
}).then(categoryEntities => {
|
// 发起创建任务请求
|
const newTaskData = {
|
taskName: taskName + '(同票数)',
|
categoryEntities: categoryEntities,
|
candidateState: candidateState,
|
candidateCutoffTimeEnd: this.getNowDate(),
|
candidateCutoffTimeStart: this.getNowDate()
|
}
|
return add(newTaskData).then(taskRes => {
|
if (taskRes.data.code !== 200) return this.$message.error(res.data.msg)
|
return taskRes.data.data
|
})
|
})
|
},
|
// 将候选人添加进类别中
|
addCategoryCandiadate(taskRes) {
|
const { categoryEntities } = taskRes
|
const newCandidateList = this.candidateList.map(user => {
|
const sUser = categoryEntities.find(category => category.categoryName === user.categoryName)
|
if (sUser !== void 0) {
|
const { id } = sUser
|
user['evaluateTaskCategoryId'] = id
|
delete user['categoryName']
|
return user
|
}
|
})
|
const promiseArrs = []
|
newCandidateList.forEach(sParams => {
|
promiseArrs.push(addEtaskCc(sParams))
|
})
|
return Promise.allSettled(promiseArrs).then((responses) => {
|
return responses
|
}, error => {
|
this.$message.error(error)
|
})
|
},
|
addEcCandidateHandler(row) {
|
const { id, categoryName, evaluateTaskId } = row
|
this.addEcCandidateParams = {
|
visible: true,
|
data: {
|
categoryName,
|
evaluateTaskId,
|
evaluateTaskCategoryId: id,
|
list: this.candidateList
|
}
|
}
|
},
|
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>
|