<template>
|
|
<div class="study-subject">
|
|
<div class="subject-top">{{study.name}}</div>
|
|
<div class="subject-study">
|
|
<div class="study-info">{{$t('page.business.study.study.sn')}}:<span>{{study.sn}}</span></div>
|
|
<div class="study-info">{{$t('page.business.study.study.name')}}:<span>{{study.name}}</span></div>
|
|
<div class="study-info">{{$t('page.business.study.study.createDate')}}:<span>{{study.createTime}}</span></div>
|
|
</div>
|
|
<div class="subject-operate">
|
|
<div class="operate-img"></div>
|
|
<div class="operate-left">{{$t('page.business.study.studyEnter.syxkxx')}}</div>
|
|
<div class="operate-right">
|
|
<i class="el-icon-edit operate-icon" @click="editSubject" v-if="operate && (study.leader==userId || checkRole(['TFM']))"></i>
|
|
</div>
|
|
</div>
|
|
<div class="subject-content">
|
|
<div class="subject-item" :class="selectedSubjectId===item.id?'active':''" v-for="(item,index) in subjectList" :key="index" @click="changeSelectedSubject(item)">
|
|
<div class="subject-item-name">{{item.deptName}}({{item.leaderName}})</div>
|
|
<div class="subject-item-add" v-if="operate && item.leader==userId">
|
|
<el-button type="primary" plain @click.stop="yq(item)">{{$t('page.business.study.studyEnter.yq')}}</el-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :title="infoDialog.title" :visible.sync="infoDialog.visible" width="800px" append-to-body>
|
|
<el-table v-loading="infoDialog.loading" :data="infoDialog.list">
|
|
<el-table-column label="" type="index" width="50">
|
|
<template slot-scope="scope">
|
|
<el-checkbox v-model="scope.row.select"></el-checkbox>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column :label="$t('page.business.study.studyEnter.xk')" prop="deptName" align="center" />
|
|
<el-table-column :label="$t('page.business.study.studyEnter.czfzr')" align="center">
|
|
<template slot-scope="scope">
|
|
<div class="subject-table-box">
|
|
<div class="subject-table-left">
|
|
<el-input v-model="scope.row.leaderName" maxlength="100" readonly />
|
|
</div>
|
|
<div class="subject-table-right">
|
|
<el-button type="primary" plain @click="chooseLeader(scope.row)">{{$t('page.business.study.studyEnter.xzfzr')}}</el-button>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
<div slot="footer" class="dialog-footer">
|
|
<el-button type="primary" @click="save">{{$t('form.saveConfirm')}}</el-button>
|
|
<el-button @click="infoDialog.visible = false">{{$t('form.cancel')}}</el-button>
|
|
</div>
|
|
</el-dialog>
|
|
|
|
<SelectDeptUserDialog ref="selectSubjectDeptUserDialog" @change="changeSubject" />
|
|
<SelectDeptUserMultipleDialog ref="selectSubjectDeptUserMultipleDialog" @change="changeMember" />
|
|
|
|
<Sign ref="subjectSignRef" @callback="doSign" />
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { checkPermi, checkRole } from "@/utils/permission";
|
|
import {
|
|
studySubject_listByStudyId,
|
|
studySubject_getAllListByStudyId,
|
|
studySubject_save
|
|
} from '@/api/business/study/studySubject'
|
|
import {
|
|
studySubjectUser_getListByStudySubjectId,
|
|
studySubjectUser_save
|
|
} from '@/api/business/study/studySubjectUser'
|
|
import SelectDeptUserDialog from '@/views/business/comps/select/SelectDeptUserDialog.vue';
|
|
import SelectDeptUserMultipleDialog from '@/views/business/comps/select/SelectDeptUserMultipleDialog.vue';
|
|
import Sign from './sign.vue'
|
|
export default {
|
|
name: 'StudySubject',
|
|
props: {
|
|
study:{
|
|
type:Object,
|
|
default:()=>{
|
|
return {}
|
|
},
|
|
deep: true,
|
|
},
|
|
operate:{
|
|
type:Boolean,
|
|
default:false
|
|
}
|
|
},
|
|
watch: {
|
|
study: {
|
|
immediate: true,
|
|
handler(v) {
|
|
this.getList()
|
|
}
|
|
},
|
|
},
|
|
components: {SelectDeptUserDialog,SelectDeptUserMultipleDialog,Sign},
|
|
filters: {},
|
|
data() {
|
|
return {
|
|
userId:this.$store.getters.id,
|
|
subjectList:[],
|
|
selectedSubjectId:'',
|
|
infoDialog:{
|
|
title:this.$t('page.business.study.studyEnter.xzxk'),
|
|
visible:false,
|
|
|
|
loading:false,
|
|
list:[],
|
|
subject:{
|
|
leader:'',
|
|
leaderName:'',
|
|
},
|
|
|
|
saveList:[]
|
|
},
|
|
|
|
memberSubject:{},
|
|
|
|
signType:'',
|
|
memberList:[]
|
|
}
|
|
},
|
|
created() {},
|
|
methods: {
|
|
checkPermi,
|
|
checkRole,
|
|
getList(){
|
|
if(this.study.id){
|
|
this.selectedSubjectId = ''
|
|
studySubject_listByStudyId({studyId:this.study.id}).then(response => {
|
|
this.subjectList = response.data;
|
|
for(let i=0;i<this.subjectList.length;i++){
|
|
let item = this.subjectList[i]
|
|
if(item.leader==this.userId || (item.userIdList && item.userIdList.length>0 && item.userIdList.indexof(this.userId)>-1)){
|
|
this.selectedSubjectId = item.id
|
|
break
|
|
}
|
|
}
|
|
if(this.selectedSubjectId === ''){
|
|
this.selectedSubjectId = this.subjectList.length>0?this.subjectList[0].id:''
|
|
}
|
|
|
|
this.$emit('change',this.selectedSubjectId)
|
|
})
|
|
}
|
|
},
|
|
changeSelectedSubject(item){
|
|
this.selectedSubjectId = item.id
|
|
this.$emit('change',this.selectedSubjectId)
|
|
},
|
|
editSubject(){
|
|
this.infoDialog.list = []
|
|
this.infoDialog.loading = true
|
|
studySubject_getAllListByStudyId({studyId:this.study.id}).then(response => {
|
|
this.infoDialog.list = response.data;
|
|
this.infoDialog.visible = true;
|
|
}).finally(()=>{
|
|
this.infoDialog.loading = false;
|
|
});
|
|
},
|
|
save(){
|
|
let postList = _.filter(this.infoDialog.list, (o)=> { return o.select })
|
|
if(postList.length>0){
|
|
for(let i=0;i<postList.length;i++){
|
|
let item = postList[i]
|
|
if(!item.leader || !item.leaderName){
|
|
this.$message.error(`${item.deptName}还没设置负责人`)
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
this.infoDialog.saveList = postList
|
|
this.signType = 'save'
|
|
this.$refs.subjectSignRef.show(this.$t('page.business.study.study.rybg'),this.$t('page.business.study.study.rybg'))
|
|
},
|
|
doSign(val){
|
|
if(this.signType==='save'){
|
|
this.doSave(val)
|
|
}
|
|
if(this.signType==='member'){
|
|
this.doChangeMember(val)
|
|
}
|
|
},
|
|
doSave(sign){
|
|
this.$modal.loading()
|
|
studySubject_save({
|
|
studyId:this.study.id,
|
|
subjectList:this.infoDialog.saveList,
|
|
sign:sign
|
|
}).then(() => {
|
|
this.infoDialog.visible = false
|
|
this.$refs.subjectSignRef.cancel()
|
|
this.getList()
|
|
}).finally(() => {
|
|
this.$modal.closeLoading()
|
|
})
|
|
},
|
|
chooseLeader(row){
|
|
this.infoDialog.subject = row
|
|
this.$refs.selectSubjectDeptUserDialog.show(this.infoDialog.subject.leader,this.infoDialog.subject.leaderName)
|
|
},
|
|
changeSubject(val){
|
|
this.infoDialog.subject.leader = val.id
|
|
this.infoDialog.subject.leaderName = val.name
|
|
this.infoDialog.subject.select = true
|
|
let index = _.findIndex(this.infoDialog.list,(item)=>{
|
|
return item.deptId===this.infoDialog.subject.deptId
|
|
})
|
|
if(index>-1){
|
|
this.infoDialog.list.splice(index,1,this.infoDialog.subject)
|
|
}
|
|
},
|
|
|
|
yq(item){
|
|
this.memberSubject = item
|
|
studySubjectUser_getListByStudySubjectId({studySubjectId:item.id}).then(response => {
|
|
let memberList = []
|
|
for(let i=0;i<response.data.length;i++){
|
|
memberList.push({
|
|
id:response.data[i].userId,
|
|
name:response.data[i].userName,
|
|
})
|
|
}
|
|
this.$refs.selectSubjectDeptUserMultipleDialog.show(memberList)
|
|
}).finally(()=>{
|
|
});
|
|
},
|
|
changeMember(val){
|
|
let postList = []
|
|
if(val.length>0){
|
|
for(let i=0;i<val.length;i++){
|
|
let item = val[i]
|
|
postList.push({
|
|
userId:item.id,
|
|
userName:item.name,
|
|
})
|
|
}
|
|
}
|
|
this.memberList = postList
|
|
this.signType = 'member'
|
|
this.$refs.subjectSignRef.show(this.$t('page.business.study.study.rybg'),this.$t('page.business.study.study.rybg'))
|
|
},
|
|
|
|
doChangeMember(sign){
|
|
this.$modal.loading()
|
|
studySubjectUser_save({
|
|
studySubjectId:this.memberSubject.id,
|
|
subjectUserList:this.memberList,
|
|
sign:sign
|
|
}).then(() => {
|
|
this.$refs.subjectSignRef.cancel()
|
|
}).finally(() => {
|
|
this.$modal.closeLoading()
|
|
})
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
.study-subject {
|
|
.subject-top {
|
|
background: #f0f7ff;
|
|
border-top-left-radius: 3px;
|
|
border-top-right-radius: 3px;
|
|
border-top: 3px solid #409eff;
|
|
padding: 20px 0;
|
|
text-align: center;
|
|
color: #409eff;
|
|
font-weight: bold;
|
|
}
|
|
.subject-study{
|
|
background: #fafcff;
|
|
padding: 20px;
|
|
color: #666666;
|
|
position: relative;
|
|
.study-info{
|
|
margin-bottom: 20px;
|
|
span{
|
|
color: #777;
|
|
}
|
|
&:last-child{
|
|
margin-bottom: 0;
|
|
}
|
|
}
|
|
}
|
|
.subject-operate{
|
|
margin: 20px 0;
|
|
display: flex;
|
|
flex-direction: row;
|
|
align-items: center;
|
|
.operate-img{
|
|
flex-shrink: 0;
|
|
height: 15px;
|
|
background: #3178ff;
|
|
width: 3px;
|
|
}
|
|
.operate-left{
|
|
flex-shrink: 0;
|
|
font-weight: bold;
|
|
padding-left: 10px;
|
|
}
|
|
.operate-right{
|
|
flex-grow: 1;
|
|
text-align: right;
|
|
.operate-icon{
|
|
cursor: pointer;
|
|
}
|
|
}
|
|
}
|
|
.subject-content{
|
|
.subject-item{
|
|
margin-bottom: 10px;
|
|
padding: 10px;
|
|
display: flex;
|
|
flex-direction: row;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
background: #f9fafc;
|
|
border-radius: 5px;
|
|
cursor: pointer;
|
|
&.active{
|
|
border: 1px solid #47a1ff;
|
|
}
|
|
.subject-item-name{
|
|
color: #777;
|
|
}
|
|
.subject-item-add{
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.subject-table-box{
|
|
display: flex;
|
|
flex-direction: row;
|
|
align-items: center;
|
|
.subject-table-left{
|
|
flex-shrink: 0;
|
|
width: 60%;
|
|
}
|
|
.subject-table-right{
|
|
flex-grow: 1;
|
|
margin-left: 5px;
|
|
}
|
|
}
|
|
</style>
|