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.
 
 
 
 

292 lines
10 KiB

<template>
<div class="app-container">
<div class="filter-container">
<el-form>
<el-form-item>
<el-input v-model="listQuery.name" placeholder="请输入部门名称" clearable style="width: 280px" @keyup.enter.native="handleFilter" />
<el-button type="primary" icon="el-icon-search" @click="handleFilter">
查询
</el-button>
<el-button type="primary" icon="el-icon-edit" @click="showCreate">
添加
</el-button>
<el-button type="danger" icon="el-icon-delete" @click="deleteDepartment">
删除
</el-button>
</el-form-item>
</el-form>
</div>
<el-table
ref="list"
:data="list"
border
row-key="id"
default-expand-all
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
highlight-current-row
@row-click="onRowClick"
@selection-change="handleSelectionChange"
@select="rowSelect"
@select-all="selectAll"
>
<el-table-column type="selection" width="40" />
<el-table-column type="index" align="center" label="序号" width="80" />
<el-table-column label="部门名称" prop="name" style="width: 60px;" />
<el-table-column :formatter="formatter.getChineseName" align="center" label="负责人" prop="leader" style="width: 60px;" />
<el-table-column align="center" label="创建时间" prop="createTime" style="width: 60px;" />
<el-table-column align="center" label="最近修改时间" prop="updateTime" style="width: 60px;" />
<el-table-column align="center" label="管理" width="150">
<template slot-scope="scope">
<el-button type="primary" icon="edit" @click="showUpdate(scope.$index)">
修改
</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="totalCount>0" :total="totalCount" :page-num.sync="listQuery.pageNum" :page-row.sync="listQuery.pageSize" @pagination="getList" />
<el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" @close="closeDialog">
<el-form ref="tempDepartment" :model="tempDepartment" class="small-space" label-width="80px">
<el-form-item label="部门名称" required>
<el-input v-model="tempDepartment.name" type="text" size="small" />
</el-form-item>
<el-form-item label="负责人" size="small" required>
<el-select v-model="tempDepartment.leader" filterable placeholder="请选择" clearable>
<el-option v-for="item in leaders" :key="item.id" :label="item.nickname" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="部门代码(选填)">
<el-input v-model="tempDepartment.code" type="text" size="small" style="width: 200px" />
</el-form-item>
<el-form-item label="成员">
<template>
<el-transfer v-model="departmentUserList" :props="{key: 'id', label: 'nickname'}" :button-texts="['移除', '添加']" :titles="['未分配员工', '部门成员']" :data="unAllotUserList" />
</template>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">
取 消
</el-button>
<el-button v-if="dialogStatus==='create'" type="success" @click="createDepartment">
创 建
</el-button>
<el-button v-if="dialogStatus==='update'" type="primary" @click="updateDepartment">
</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import Pagination from '@/components/Pagination'
import { updateDepartmentFn, deleteDepartmentFn, addDepartmentFn } from '@/api/common'
export default {
name: 'DepartmentList',
components: { Pagination },
data() {
return {
list: [],
totalCount: 0,
dialogStatus: 'create',
dialogFormVisible: false,
listQuery: {
pageNum: 1,
pageSize: 20
},
textMap: {
update: '编辑',
create: '新建部门'
},
tempDepartment: {
},
// 所有用户
unAllotUserList: [],
departmentUserList: [],
leaders: [],
multipleSelection: [],
isIndeterminate: true
}
},
created() {
this.getList()
},
methods: {
getList() {
// 查询列表
this.api({
url: '/department/tree',
method: 'get',
params: this.listQuery
}).then(data => {
data.forEach(row => {
row.isChecked = false
})
this.list = data
})
},
showCreate() {
this.leaders = this.$store.getters.allUser
this.tempDepartment = {}
this.getUserListByDepartmentIdOrNull(0)
this.dialogStatus = 'create'
this.dialogFormVisible = true
},
showUpdate($index) {
this.leaders = this.$store.getters.allUser
const department = this.list[$index]
this.tempDepartment = department
this.getUserListByDepartmentIdOrNull(department.id)
this.getUserListByDepartmentId(department.id)
this.dialogStatus = 'update'
this.dialogFormVisible = true
},
getUserListByDepartmentId(departmentId) {
this.api({
url: '/user/getUserListByDepartmentId',
method: 'get',
params: {
departmentId: departmentId
}
}).then((data) => {
if (data != null) {
data.forEach(user => {
this.departmentUserList.push(user.id)
})
}
})
},
getUserListByDepartmentIdOrNull(departmentId) {
this.api({
url: '/user/getUserListByDepartmentIdOrNull',
method: 'get',
params: {
departmentId: departmentId
}
}).then((data) => {
this.unAllotUserList = data
})
},
createDepartment() {
// 添加
this.$refs['tempDepartment'].validate(valid => {
if (valid) {
this.tempDepartment.userList = this.departmentUserList
addDepartmentFn(this.tempDepartment).then(() => {
this.$message.success('添加成功。')
this.getList()
this.dialogFormVisible = false
})
} else {
return false
}
})
},
updateDepartment() {
// 修改用户信息
this.$refs['tempDepartment'].validate(valid => {
if (valid) {
this.tempDepartment.userList = this.departmentUserList
updateDepartmentFn(this.tempDepartment).then(() => {
this.$message.success('修改成功。')
this.getList()
this.dialogFormVisible = false
})
} else {
return false
}
})
},
deleteDepartment() {
if (this.multipleSelection.length <= 0) {
this.$message.warning('请选择要删除的数据。')
return
}
const pks = []
this.multipleSelection.forEach(department => {
pks.push(department.id)
})
this.$confirm('确定删除此科室吗?可能会导致下属人员没有科室', '提示', {
confirmButtonText: '确定',
showCancelButton: '取消',
type: 'warning'
}).then(() => {
deleteDepartmentFn({ pks: pks }).then(() => {
this.$message({ message: '删除成功。', type: 'success' })
this.getList()
})
})
},
handleFilter() {
// 查询事件
this.listQuery.pageNum = 1
this.getList()
},
onRowClick(row) {
this.$refs.list.toggleRowSelection(row)
},
handleSelectionChange: function(val) {
this.multipleSelection = val
},
closeDialog() {
this.unAllotUserList = []
this.departmentUserList = []
},
/**
* 注意在获取初始数据时,所有节点(包括子节点)都增加一个isChecked 标志参数
*
* @param selection
* @param row
*/
rowSelect(selection, row) {
if (row.children) { // 只对有子节点的行响应
if (!row.isChecked) { // 由行数据中的元素isChecked判断当前是否被选中
row.children.map((item) => { // 遍历所有子节点
this.$refs.list.toggleRowSelection(item, true) // 切换该子节点选中状态
/*
方法名 说明 参数
用于多选表格,切换某一行的选中状态, row, selected
toggleRowSelection 如果使用了第二个参数,则是设置这一行
选中与否(selected 为 true 则选中)
*/
item.isChecked = true
})
row.isChecked = true // 当前行isChecked标志元素切换为false
} else {
row.children.map((item) => {
this.$refs.list.toggleRowSelection(item, false)
item.isChecked = false
})
row.isChecked = false
}
// console.log(this.multipleSelection, row);
}
},
selectAll(selection) {
// selection 是选中的数据集合
this.$refs.list.data.map((items) => { // 使用$ref获取注册的子组件信息,用data获取所有行,并用map函数遍历行
if (items.children) {
if (!items.isChecked) { // 若遍历出来的行未选中
this.$refs.list.toggleRowSelection(items, true) // 行变为选中状态
items.isChecked = true // 更新标志参数
items.children.map((item) => { // 遍历子节点并改变状态与标志参数
this.$refs.list.toggleRowSelection(item, true)
item.isChecked = true
})
} else { // 选中状态同理
this.$refs.list.toggleRowSelection(items, false)
items.isChecked = false
items.children.map((item) => {
this.$refs.list.toggleRowSelection(item, false)
item.isChecked = false
})
}
} else {
items.isChecked = !items.isChecked
}
})
// console.log(this.orgs)
}
}
}
</script>