Files
UNION_NJUST/target/classes/static/components/userpartupdate/UserPartUpdateSet.vue
T
2026-09-23 09:38:39 +08:00

699 lines
25 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div>
<template>
<el-card shadow="never">
<el-row class="query-row">
<el-col class="query-title" span="2">姓名/工号:</el-col>
<el-select v-model="pageForm.userId"
:remote-method="queryUser" clearable collapse-tags filterable
multiple placeholder="输入工号或者姓名查找" remote
style="width: 100%"
@change="doSearch">
<el-option v-for="o in userList"
:key="o.id" :label="o.username+'('+o.loginname+')-'+o.unitname"
:value="o.id"></el-option>
</el-select>
</el-row>
<el-row v-if="is_H10===true||is_A06===true||is_sysadmin===true||is_H02===true"
class="query-row">
<el-col class="query-title hidden-xs-only" span="2">会员类型:</el-col>
<el-col class="query-content">
<el-tag
v-for="item in memberTypeOptions"
:key="item.code"
:effect="pageForm.memberTypes.includes(item.name)?'dark':'plain'"
:type="item.name"
style="margin-right: 10px;cursor: pointer"
@click="tagClick('memberTypes',item.name)">
{{ item.name }}
</el-tag>
</el-col>
</el-row>
<el-row class="query-row">
<el-col class="query-title hidden-xs-only" span="2">性别:</el-col>
<el-col class="query-content">
<el-tag
v-for="item in sexTypeOptions"
:key="item.code"
:effect="pageForm.sexTypes.includes(item.name)?'dark':'plain'"
:type="item.name"
style="margin-right: 10px;cursor: pointer"
@click="tagClick('sexTypes',item.name)">
{{ item.name }}
</el-tag>
</el-col>
</el-row>
<el-row v-if="is_H10===true||is_A06===true||is_sysadmin===true||is_H04===true"
class="query-row">
<el-col class="query-title" span="2">人员类型:</el-col>
<el-col class="query-content">
<el-tag
v-for="item in personTypeOptions"
:key="item.code"
:effect="pageForm.personTypes.includes(item.name)?'dark':'plain'"
:type="item.name"
style="margin-right: 10px;cursor: pointer"
@click="tagClick('personTypes',item.name)">
{{ item.name }}
</el-tag>
<el-link v-if="personTypeOptions.length&&pageForm.personTypes.length" :underline="false"
type="danger"
@click="pageForm.personTypes=[];doSearch()">清空
</el-link>
<el-link :underline="false"
type="success"
@click="pageForm.personTypes=personTypeOptions.map(p=>p.code);doSearch()">全部
</el-link>
</el-col>
</el-row>
<el-row v-if="is_H10===true||is_A06===true||is_sysadmin===true||is_H04===true"
class="query-row">
<el-col class="query-title" span="2">在职状态:</el-col>
<el-col class="query-content">
<el-tag
v-for="item in userStateOptions"
:key="item.code"
:effect="pageForm.userStates.includes(item.name)?'dark':'plain'"
:type="item.name"
style="margin-right: 10px;cursor: pointer"
@click="tagClick('userStates',item.name)">
{{ item.name }}
</el-tag>
<el-link v-if="userStateOptions.length&&pageForm.userStates.length" :underline="false"
type="danger"
@click="pageForm.userStates=[];doSearch()">清空
</el-link>
<el-link :underline="false"
type="success"
@click="pageForm.userStates=userStateOptions.map(p=>p.code);doSearch()">全部
</el-link>
</el-col>
</el-row>
<el-row v-if="is_H10===true||is_A06===true||is_sysadmin===true||is_H04===true"
class="query-row">
<el-col class="query-title" span="2">部门查询:</el-col>
<el-col class="query-content">
<el-row :gutter="20">
<el-col :lg="12" :md="12" :sm="24" :xl="12" :xs="24">
<el-select v-model="pageForm.unionId"
:clearable="is_H10===true||is_A06===true||is_sysadmin===true"
filterable="true"
placeholder="所属工会"
style="width: 100%" @change="flushUnits();doSearch()"
@clear="flushUnits();doSearch()">
<el-option v-for="item in unions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</el-col>
<el-col :lg="12" :md="12" :sm="24" :xl="12" :xs="24">
<el-select v-model="pageForm.unitId" clearable="true" filterable="true"
placeholder="所属单位"
style="width: 100%"
@change="doSearch"
@clear="doSearch">
<el-option v-for="item in units" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
<!-- <template v-if="is_H10===true||is_A06===true||is_sysadmin===true">
<el-row class="query-row">
<el-col class="query-title">系统角色:</el-col>
<el-col class="query-content">
<el-row :gutter="20">
<el-col :span="6">
<el-select @change="getRoleListByMenuId" v-model="pageForm.module"
clearable
filterable
style="width: 100%" placeholder="请选择角色所属的系统">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in menuOptions">
</el-option>
</el-select>
</el-col>
<el-col :span="6" v-if="relatedSessionMenus.includes(pageForm.module)">
<el-select filterable
placeholder="届次"
style="width: 100%"
:disabled="!relatedSessionMenus.includes(pageForm.module)"
v-model="pageForm.teacherMeetingId">
<el-option :key="item.id" :label="item.name"
:value="item.id"
v-for="item in meetingOptions">
</el-option>
</el-select>
</el-col>
<el-col :span="12">
<el-select
@change="doSearch" clearable filterable
placeholder="请选择角色"
multiple
style="width: 100%"
v-model="pageForm.roleIds">
<el-option :label="item.name" :value="item.id"
v-for="item in roleList"></el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
</template>
<el-row class="query-row"
v-if="is_H10===true||is_A06===true||is_sysadmin===true||is_H02===true">
<el-col class="query-title">协会:</el-col>
<el-col class="query-content">
<el-select v-model="pageForm.clubId" placeholder="请选择协会" @change="doSearch"
filterable
:clearable="is_H10===true||is_A06===true||is_sysadmin===true||(is_H04===true&&is_H02===true)"
style="width: 100%">
<el-option
v-for="item in clubOptions"
:key="item.stid"
:label="item.name"
:value="item.stid">
</el-option>
</el-select>
</el-col>
</el-row>-->
<el-row class="query-row">
<el-col class="query-title" span="2">更新组别:</el-col>
<el-col class="query-content">
<el-select v-model="pageForm.activityGroupId" clearable placeholder="请选择更新组别范围之外的人员"
style="width: 100%" @change="doSearch()">
<el-option v-for="item in activityGroupList2"
:label="item.groupName"
:value="item.groupId"></el-option>
</el-select>
</el-col>
</el-row>
<el-row v-if="is_H10===true||is_A06===true||is_sysadmin===true||is_H04===true"
class="query-row">
<el-col class="query-title" span="2">年龄范围:</el-col>
<el-col class="query-content">
<el-row style="align-items: center" type="flex">
<el-col :span="15">
<el-slider
v-model="pageForm.age"
:max="100"
range
show-stops>
</el-slider>
</el-col>
<el-col :span="9" class="pl20">
当前范围:{{ pageForm.age }}
</el-col>
</el-row>
</el-col>
</el-row>
<el-row class="query-row" style="justify-content: end">
<el-checkbox v-model="pageForm.reverseSelection" border class="reverseCheckBox"
label="是否反选"
@change="doSearch"></el-checkbox>
<el-button icon="el-icon-circle-close" type="danger" @click="doReset">重置
</el-button>
<el-button icon="el-icon-search" type="primary" @click="doSearch">搜索</el-button>
</el-row>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="筛选人员">
<template #func>
<el-button icon="el-icon-download"
size="medium"
type="primary" @click="doExportUser">
导出查询人员
</el-button>
<el-button size="medium"
type="primary"
@click="setDialogVisible=true">
设置为更新组别
</el-button>
</template>
</table-tool>
<el-table ref="userTable" :data="tableData" :size="tableSize" border
stripe @sort-change="pageOrder">
<el-table-column label="序号" type="index" width="80px"></el-table-column>
<el-table-column
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
></el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
:current-page="pageForm.pageNumber"
:page-size="pageForm.pageSize"
:total="pageForm.totalCount"
layout="total, prev, pager, next"
@size-change="pageSizeChange"
@current-change="pageNumberChange">
</el-pagination>
</el-row>
</el-card>
</template>
<el-dialog :append-to-body="true" :close-on-click-modal="false" :visible.sync="setDialogVisible" title="设置活动人员"
width="45%">
<el-form ref="setForm" :model="formData" :rules="rules" label-width="100px">
<el-form-item label="添加方式" prop="setGroupType">
<el-radio-group v-model="formData.setGroupType" size="small">
<el-radio :label="1">添加至原有分组</el-radio>
<el-radio :label="2">添加到新分组</el-radio>
</el-radio-group>
</el-form-item>
<el-row v-if="formData.setGroupType===1">
<el-form-item label="原有分组" prop="setGroupId">
<el-radio-group v-model="formData.setGroupId" size="small">
<el-radio v-for="item in activityGroupList" :disabled="item.groupId!=pageForm.activityGroupId"
:label="item.groupId" border>
{{ item.groupName }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-row>
<el-row v-if="formData.setGroupType===2">
<el-form-item label="新分组" prop="setGroupName">
<el-input v-model="formData.setGroupName" placeholder="请输入新分组名称"></el-input>
</el-form-item>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="setDialogVisible = false">取 消</el-button>
<el-button v-loading="settingLoading" type="primary"
@click="doSetActivityUser">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
module.exports = {
props: {},
model: {},
mixins: [initTableMixins],
data() {
return {
userList: [],
clubOptions: [],
settingLoading: false,
setDialogVisible: false,
setGroupType: null,
setGroupId: null,
setGroupName: null,
personTypeOptions: [],
userStateOptions: [],
activityGroupList: [],
activityGroupList2: [],
memberTypeOptions: [{
code: 'unionMember',
name: '工会会员'
}, {
code: 'welfareMember',
name: '福利会员'
}, {
code: 'sickFundMember',
name: '基金会员'
}],
sexTypeOptions: [
{code: '男', name: '男'},
{code: '女', name: '女'}
],
pageForm: {
age: [0, 0],
unionId: '',
unitId: '',
clubId: '',
searchName: "u.username",
personTypes: [],
userStates: [],
memberStatus: [],
memberTypes: [],
sexTypes: [],
minAge: 0,
maxAge: 0,
year: moment().format('YYYY'),
module: '',
teacherMeetingId: '',
activityGroupId: '',
roleIds: [],
userId: [],
activityUserCnd: '',
reverseSelection: false
},
activityUnions: [],
unions: [],
units: [],
activityUnits: [],
menuOptions: [],
meetingOptions: [],
roleList: [],
tableHeight: '0px',
tableColumns: [
{prop: 'loginName', label: '工号'},
{prop: 'userName', label: '姓名'},
{prop: 'sex', label: '性别'},
{prop: 'birthday', label: '出生年月', sortable: true},
{prop: 'age', label: '年龄', sortable: true},
{prop: 'mobile', label: '联系电话'},
{prop: 'personType', label: '人员类型', sortable: true},
{prop: 'userState', label: '在职状态', sortable: true},
{prop: 'unitName', label: '所属单位', sortable: true},
{prop: 'unionName', label: '所属工会', sortable: true},
// {prop: 'activityUnionName', label: '活动工会', sortable: true},
],
rules: {
setGroupType: [{required: true, message: '请选择添加方式', trigger: ['blur', 'change']}],
setGroupId: [{required: true, message: '请选择分组', trigger: ['blur', 'change']}],
setGroupName: [{required: true, message: '请输入分组名称', trigger: ['blur', 'change']}]
},
relatedSessionMenus: ['aca4d14498c145ceb5b24ed70776aae2', '733d7266652740a3aeac9da97ab5eeca', 'fe2d0768e26d4a80beeb159306bb8d01'],
roleData: {},
columnInfos: [],
}
},
computed: {
is_H10() {
return this.roleData.is_H10
},
is_A06() {
return this.roleData.is_A06
},
is_H04() {
return this.roleData.is_H04
},
is_H02() {
return this.roleData.is_H02
},
is_sysadmin() {
return this.roleData.is_sysadmin
},
unionid() {
return this.roleData.unionid
},
},
components: {
'user-cnd': httpVueLoader('/components/plugins/UserCnd.vue'),
},
methods: {
doExportUser() {
const {
userId,
memberTypes,
sexTypes,
personTypes,
userStates,
unionId,
unitId,
teacherMeetingId,
roleIds,
clubId,
activityGroupId,
age,
reverseSelection,
activityUserCnd
} = this.pageForm
let props = {}
this.tableColumns.forEach(v => {
props[v.prop] = v.label
})
window.open("/platform/user/part/update/doExportUser?userId=" + JSON.stringify(userId) +
"&props=" + JSON.stringify(props) +
"&memberTypes=" + JSON.stringify(memberTypes) +
"&sexTypes=" + JSON.stringify(sexTypes) +
"&personTypes=" + JSON.stringify(personTypes) +
"&userStates=" + JSON.stringify(userStates) +
"&roleIds=" + JSON.stringify(roleIds) +
"&age=" + JSON.stringify(age) +
"&activityUserCnd=" + (activityUserCnd ? JSON.stringify(activityUserCnd) : activityUserCnd) +
"&reverseSelection=" + reverseSelection +
"&clubId=" + clubId +
"&activityGroupId=" + activityGroupId +
"&teacherMeetingId=" + teacherMeetingId +
"&unionId=" + unionId +
"&unitId=" + unitId
)
},
doReset() {
this.pageForm.userId = []
this.pageForm.memberTypes = []
this.pageForm.sexTypes = []
this.pageForm.personTypes = []
this.pageForm.userStates = []
this.pageForm.unionId = ''
this.pageForm.unitId = ''
this.pageForm.module = ''
this.pageForm.teacherMeetingId = ''
this.pageForm.roleIds = []
this.pageForm.clubId = ''
this.pageForm.activityGroupId = ''
this.pageForm.activityUserCnd = ''
this.pageForm.age = [0, 0]
this.pageForm.reverseSelection = false
this.doSearch()
},
async queryUser(val) {
this.userList = await searchUser(val)
},
tagClick(key, val) {
let idx = this.pageForm[key].indexOf(val)
if (idx !== -1) {
this.pageForm[key].splice(idx, 1)
} else {
this.pageForm[key].push(val)
}
this.doSearch()
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if (this.is_sysadmin || this.is_A06) {
this.units = await getUnits(this.pageForm.unionId)
this.activityUnits = await getActivityUnits(this.pageForm.activityUnionId)
} else {
this.units = await getUnits(this.unionid)
}
},
async pageData() {
sublime.showLoadingbar()
const pageForm = clone(this.pageForm)
pageForm.personTypes = JSON.stringify(pageForm.personTypes)
pageForm.userStates = JSON.stringify(pageForm.userStates)
pageForm.memberStatus = JSON.stringify(pageForm.memberStatus)
pageForm.memberTypes = JSON.stringify(pageForm.memberTypes)
pageForm.sexTypes = JSON.stringify(pageForm.sexTypes)
pageForm.roleIds = JSON.stringify(pageForm.roleIds)
pageForm.userId = JSON.stringify(pageForm.userId)
pageForm.age = JSON.stringify(pageForm.age)
pageForm.activityUserCnd = pageForm.activityUserCnd ? JSON.stringify(pageForm.activityUserCnd) : pageForm.activityUserCnd
const resp = await $.post('/platform/user/part/update/userPartData', pageForm)
sublime.closeLoadingbar()
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
} else {
this.notifyWarning(resp.msg)
}
},
async doSetActivityUser() {
const valid = await this.$refs.setForm.validate()
if (!valid) {
return
}
if (this.tableData.length === 0) {
this.$message.warning('请先指定筛选条件!')
return
}
const confirm = await this.$confirm('是否将符合搜索条件的用户设为更新人员?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
this.settingLoading = true
const pageForm = clone(this.pageForm)
pageForm.personTypes = JSON.stringify(pageForm.personTypes)
pageForm.userStates = JSON.stringify(pageForm.userStates)
pageForm.memberStatus = JSON.stringify(pageForm.memberStatus)
pageForm.memberTypes = JSON.stringify(pageForm.memberTypes)
pageForm.sexTypes = JSON.stringify(pageForm.sexTypes)
pageForm.roleIds = JSON.stringify(pageForm.roleIds)
pageForm.userId = JSON.stringify(pageForm.userId)
pageForm.age = JSON.stringify(pageForm.age)
pageForm.activityUserCnd = pageForm.activityUserCnd ? JSON.stringify(pageForm.activityUserCnd) : pageForm.activityUserCnd
Object.assign(pageForm, this.formData)
const resp = await $.post('/platform/user/part/update/doSetUpUser', pageForm)
if (resp.code === 0) {
this.setDialogVisible = false
// this.userScopeDialog = false
await this.getActivityGroup()
this.doSearch()
this.notifySuccess(resp.msg)
this.formData = {
setGroupType: null,
setGroupId: null,
setGroupName: null
}
} else {
this.notifyError(resp.msg)
}
this.settingLoading = false
this.$emit("update:group_id", resp.data)
this.$emit('group_change')
}
},
async getActivityGroup() {
const resp = await $.get('/platform/user/part/update/getUserPart')
this.activityGroupList = resp.data
this.activityGroupList2 = []
resp.data.forEach(v => {
this.activityGroupList2.push({groupId: v.groupId, groupName: v.groupName + "范围之外人员"})
})
},
async getMenuOptions() {
const {data} = await $.get("/platform/sys/role/getMenuOptions")
this.menuOptions = data
},
async getRoleListByMenuId() {
if (['aca4d14498c145ceb5b24ed70776aae2', '733d7266652740a3aeac9da97ab5eeca'].includes(this.pageForm.module)) {
//教代会
let meets = await proposal.getOpenMeeting()
this.meetingOptions = meets.map(v => ({...v, name: v.jdhallname}))
} else if (['fe2d0768e26d4a80beeb159306bb8d01'].includes(this.pageForm.module)) {
//工代会
let meets = await getGdh(true)
this.meetingOptions = meets.map(v => ({...v, name: v.gdhAllName}))
}
this.pageForm.teacherMeetingId = ''
const {data} = await $.post("/platform/activity/basic/scope/getRoleListByMenuId", {menuId: this.pageForm.module})
this.roleList = data
},
async getRolesAndUnion() {
const {data} = await $.post("/platform/activity/basic/scope/getRolesAndUnion")
this.roleData = data
},
},
async created() {
await this.getRolesAndUnion()
this.clubOptions = await getClubsByRole()
if (((this.is_sysadmin || this.is_A06 || this.is_H02) === false) && this.is_H04 === true) {
this.unions = await getUnionList(this.unionid)
this.$set(this.pageForm, "unionId", this.unions[0].id)
} else {
this.unions = await getUnions(null)
this.activityUnions = await getActivityUnions()
}
if (this.is_H04 === false && this.is_H02 === true) {
if (this.clubOptions.length > 0) {
this.$set(this.pageForm, "clubId", this.clubOptions[0].stid)
}
}
await this.flushUnits()
await this.getActivityGroup()
this.personTypeOptions = await getDictOptions("UserType")
this.userStateOptions = await getDictOptions("UserState")
await this.getMenuOptions()
await this.pageData()
},
}
</script>
<style>
.query-row {
display: flex;
align-items: center;
padding: 6px 0;
}
.query-row:not(:last-child) {
border-bottom: 1px dashed rgb(230, 230, 230);
}
.query-row > .query-content {
min-width: 200px;
overflow: hidden;
}
.query-row > .query-content > .el-tag {
margin-bottom: 5px;
margin-top: 5px;
}
@media screen and (max-width: 992px) {
.query-row:nth-child(4) .query-content .el-col:not(:last-child) {
margin-bottom: 5px;
}
.query-title {
display: none;
}
}
.header_card .el-card__body {
padding: 2px 20px;
}
.user_card .el-card__body {
padding: 2px 20px;
}
.user_card {
border: none !important;
}
.user_table {
max-height: 260px;
}
.user_table .el-table__cell {
padding: 0;
}
.el-pagination {
height: 40px;
}
.el-popover {
height: 250px;
}
.reverseCheckBox {
margin: 0 10px 0 0 !important;
}
</style>