You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kaohe/ruoyi-ui/src/views/votepage.vue

411 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container">
<div class="title">{{ vote.pingceName }}</div>
<div class="title" style="font-size: 22px">{{ vote.voteTitle }}</div>
<div class="time">时间{{ vote.sTime }} - {{ vote.eTime }}</div>
<div class="time" v-if="vote.khitemTypeid===1 && vote.umax">评优最大值为 {{ vote.umax }}</div>
<div class="time" v-if="vote.khitemTypeid!==1 && vote.maxNum">评分最大值为 {{ vote.maxNum }}</div>
<div class="des">{{ vote.vDescription }}</div>
<el-row :gutter="10" class="tou_piao" v-if="vote.khitemTypeid===2||vote.khitemTypeid===3">
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-for="item in voteList">
<div class="tou_piao_item">
<div>
{{ item.bkhdxName }}
<el-link type="primary" @click="goPage(item)" icon="el-icon-view" v-hasPermi="['system:dept:query','kaohe:employee:query']"></el-link>
</div>
<!-- <div class="_desc">参与评分 {{ item.voteNum!==null?item.voteNum: ''}} 人 </div>
<div class="_desc">均值:{{ item.avgScore!==null?item.avgScore: '' }} </div>-->
<div class="mt10">
<el-input-number v-model="item.score"></el-input-number>
</div>
</div>
</el-col>
</el-row>
<el-row :gutter="10" class="tou_piao" v-if="vote.khitemTypeid===1">
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-for="item in voteList">
<div class="tou_piao_item">
<div>
{{ item.bkhdxName }}
<el-link type="primary" @click="goPage(item)" icon="el-icon-view" v-hasPermi="['system:dept:query','kaohe:employee:query']"></el-link>
</div>
<!-- <div class="_desc">参与评分 {{ item.voteNum!==null?item.voteNum: ''}} 人 </div>
<div class="_desc">均值:{{ item.avgScore!==null?item.avgScore: '' }} </div>-->
<div class="mt10">
<el-radio-group v-model="item.option" size="mini">
<el-radio label="optionA">优秀</el-radio>
<el-radio label="optionB">合格</el-radio>
<el-radio label="optionC">基本合格</el-radio>
<el-radio label="optionD">不合格</el-radio>
</el-radio-group>
</div>
</div>
</el-col>
</el-row>
<div style="text-align: center; margin-top: 40px;">
<el-button type="primary" icon="el-icon-s-promotion" @click="VoteSubmit" v-hasPermi="['kaohe:vote_emp:edit']">提交评分</el-button>
</div>
<!-- 详情对话框 -->
<el-dialog :title="uploadFJ.title" :visible.sync="uploadFJ.open" width="800px" append-to-body class="my_dialog">
<el-row :gutter="20" v-if="vote.bkhdxType==='0'">
<el-col :span="24">
<span>部门名称:</span><span>{{ detail.deptName }}</span>
</el-col>
</el-row>
<el-row :gutter="20" v-if="vote.bkhdxType==='1'">
<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
<span>工号:</span><span>{{ detail.wordId }}</span>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
<span>职工姓名:</span><span>{{ detail.empName }}</span>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
<span>部门名称:</span><span>{{ detail.deptName }}</span>
</el-col>
</el-row>
<el-row class="mt20" :gutter="20" v-for="item in uploadFJ.docDiscripList">
<el-col :span="24">
<span>附件主题:</span><span>{{ item.title }}</span>
</el-col>
<el-col class="mt5" :span="24">
<span>附件简介</span><span>{{ item.docDiscrip }}</span>
</el-col>
</el-row>
<el-card style="margin-bottom: 10px;">
<div slot="header">
<span>附件</span>
</div>
<div v-for="(item,index) in uploadFJ.fileList" :key="item.url" class="yy_fj_list">
<!-- <a :href="item.url" :download="item.name" target="_blank">{{ item.name }}</a>-->
<el-link type="primary" @click="downloadFJ(item)">{{ item.name }}</el-link>
</div>
</el-card>
<div slot="footer" class="dialog-footer">
<el-button @click="uploadFJ.open = false">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { getVote } from "@/api/kaohe/vote"
import { listVote_emp, VoteEmpSubmit } from "@/api/kaohe/vote_emp"
import { getEmployee } from "@/api/kaohe/employee";
import { getDept } from "@/api/system/dept"
import { getVoteEmps } from "@/api/kaohe/votepage"
import axios from "axios";
export default {
name: "votepage",
data() {
return {
vote: {},
loading: null,
voteList: [],
// 附件详情参数
uploadFJ: {
// 是否显示弹出层
open: false,
// 标题
title: '',
// 附件上传
fileList: [],
// 附件上传
docDiscripList: []
},
// 修改内容行
detail: {},
}
},
created() {
this.getVote();
},
methods: {
getVote(){
this.loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
getVote(this.$route.query.id).then(response => {
this.vote = response.data;
this.getList();
})
},
/** 查询投票评测列表 */
getList() {
getVoteEmps({
voteId: this.$route.query.id,
pageNum: 1,
pageSize: 10000000,
}).then(response => {
this.voteList = response.rows;
this.loading.close()
})
},
VoteSubmit(){
let voteEmpList = [];
let flag = true;
let bkhdxName = '';
let pyA = 0
if(this.vote.khitemTypeid===2 || this.vote.khitemTypeid===3){
let VoteList = this.voteList;
for (let i = 0; i < VoteList.length; i++) {
if(VoteList[i].score===null||VoteList[i].score===undefined){
flag = false;
this.$alert(`【${ VoteList[i].bkhdxName }】未评分,请去评分!`, `提示`, {
type: 'Danger'
})
break;
}else if(VoteList[i].score > this.vote.maxNum){
flag = false;
this.$alert(`【${ VoteList[i].bkhdxName }】评分值不能超过评分最大值${this.vote.maxNum},请重新去评分!`, `提示`, {
type: 'Danger'
})
break;
}else {
voteEmpList.push({
id: VoteList[i].id,
bkhdxId: VoteList[i].bkhdxId,
bkhdxName: VoteList[i].bkhdxName,
score: VoteList[i].score,
})
}
}
}
if(this.vote.khitemTypeid===1){
this.voteList.forEach(item => {
let obj = {
id: item.id,
bkhdxId: item.bkhdxId,
bkhdxName: item.bkhdxName,
optionA: 0,
optionB: 0,
optionC: 0,
optionD: 0,
}
if(item.option){
obj[item.option] = 1;
}else {
flag = false;
bkhdxName += item.bkhdxName+''
}
if(item.option&&item.option==='optionA'){
pyA += 1;
}
voteEmpList.push(obj);
});
bkhdxName=bkhdxName.slice(0, -1);
}
if(this.vote.umax && pyA>this.vote.umax){
flag = false;
this.$alert(`评优数量不能超过评优最大值!`, `提示`, {
type: 'Danger'
})
}
if(flag){
if(new Date(this.vote.eTime) > (new Date())){
this.$confirm('是否确认提交评分?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
VoteEmpSubmit({
khitemTypeid : this.vote.khitemTypeid,
pingceId : this.vote.pingceId,
voteId : this.vote.id,
userId : this.$store.state.user.id,
userName : this.$store.state.user.name,
uid : 1,
voteEmpList: voteEmpList
}).then(response => {
this.$modal.msgSuccess("提交成功");
this.$router.go(-1)
});
}).catch(() => {
this.$message({
type: 'info',
message: '已取消提交操作'
});
});
}else {
this.$alert(`已超时,无法提交评分!`, `提示`, {
type: 'Danger'
})
}
}else if(bkhdxName){
this.$alert(`【${ bkhdxName }】未评分,请去评分!`, `提示`, {
type: 'Danger'
})
}
},
// 表单重置
reset() {
this.detail = {};
this.uploadFJ = {
// 是否显示弹出层
open: false,
// 附件上传
fileList: [],
// 附件上传
docDiscripList: []
};
},
goPage(row){
this.reset()
// 0 组织架构
if(this.vote.bkhdxType==='0'){
this.zzjgDetail(row)
}
// 1 职工
if(this.vote.bkhdxType==='1'){
this.zgDetail(row)
}
},
// 组织架构详情
zzjgDetail(row){
getDept(row.bkhdxId).then(response => {
this.detail = response.data;
if(this.detail.docs){
let arr = this.detail.docs.split(';');
arr.forEach( item => {
let arr1 = item.split(',');
this.uploadFJ.fileList.push({
name: arr1[0],
url: arr1[1]
});
})
}
if(this.detail.docDiscrip){
this.uploadFJ.docDiscripList = JSON.parse(this.detail.docDiscrip);
}else {
this.uploadFJ.docDiscripList=[{
title:'',
docDiscrip:'',
}]
}
this.uploadFJ.open = true;
this.uploadFJ.title = '组织架构详情';
})
},
// 职工详情
zgDetail(row){
getEmployee(row.bkhdxId).then(response => {
this.detail = response.data;
if(this.detail.docs){
let arr = this.detail.docs.split(';');
arr.forEach( item => {
let arr1 = item.split(',');
this.uploadFJ.fileList.push({
name: arr1[0],
url: arr1[1]
});
})
}
if(this.detail.docDiscrip){
this.uploadFJ.docDiscripList = JSON.parse(this.detail.docDiscrip);
}else {
this.uploadFJ.docDiscripList=[{
title:'',
docDiscrip:'',
}]
}
this.uploadFJ.open = true;
this.uploadFJ.title = '职工详情';
})
},
// 下载
downloadFJ(row){
axios({
url: row.url,
method: 'get',
responseType: 'blob'
}).then(res => {
const blob = new Blob([res.data], { type: res.headers['content-type'] });
const fileName = row.name; // 根据实际需求动态生成
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = fileName;
document.body.appendChild(link);
link.click();
URL.revokeObjectURL(link.href);
document.body.removeChild(link);
}).catch(err => {
console.error('下载失败', err);
});
}
}
}
</script>
<style scoped lang="scss">
.app-container{
margin: 0 auto;
padding: 30px;
.title{
font-size: 24px;
text-align: center;
margin-bottom: 20px;
}
.des{
padding: 10px;
color: #666666;
}
.time{
padding: 5px;
color: #af5e5e;
}
.tou_piao{
font-size: 14px;
.tou_piao_item{
border: 1px solid #eee;
padding: 10px;
box-sizing: border-box;
margin-bottom: 10px;
._desc{
font-size: 12px;
color: #666666;
margin: 10px 0;
}
.el-radio{
margin-top: 10px;
}
}
}
}
.el-dialog__body{
padding: 20px;
.el-card{
margin-top: 10px;
}
.yy_fj_list {
//height: 36px;
line-height: 36px;
border-bottom: 1px solid #39CCCC;
}
}
@media (max-width: 757px){
::v-deep.my_dialog .el-dialog{
width: 95% !important;
}
}
</style>