这是基于vue-vben-admin 模板适用于abp Vnext的前端管理项目
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.
 
 
 
 
 
 

235 lines
7.5 KiB

<template>
<div>
<el-card class="box-card">
<div
slot="header"
class="clearfix"
>
<span>组织机构</span>
</div>
<div>
<el-tree
ref="organizationUnitTree"
node-key="id"
:props="organizationProps"
:load="loadOrganizationUnit"
lazy
draggable
highlight-current
:allow-drag="handleAllowDrag"
:allow-drop="handleAllowDrop"
@node-drop="handleNodeDroped"
@node-click="handleNodeClick"
>
<span
slot-scope="{node, data}"
class="custom-tree-node"
>
<span>{{ node.label }}</span>
<el-dropdown @command="handleChangeOrganizationUint">
<span class="el-dropdown-link">
操作方法
<i class="el-icon-arrow-down el-icon--right" />
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{key: 'append', node: node, data: data}">新增机构</el-dropdown-item>
<el-dropdown-item :command="{key: 'remove', node: node, data: data}">删除机构</el-dropdown-item>
<el-dropdown-item :command="{key: 'add-user', node: node, data: data}">添加用户</el-dropdown-item>
<el-dropdown-item :command="{key: 'add-role', node: node, data: data}">添加角色</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</span>
</el-tree>
</div>
</el-card>
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import OrganizationUnitService, { OrganizationUnitCreate } from '@/api/organizationunit'
class OrganizationUnitTree {
id?: string
parentId?: string
code!: string
displayName!: string
isLeaf!: boolean
children?: OrganizationUnitTree[]
constructor() {
this.isLeaf = false
this.children = new Array<OrganizationUnitTree>()
}
}
@Component({
name: 'EditOrganizationUint',
data() {
return {
organizationProps: {
label: 'displayName',
isLeaf: 'isLeaf',
children: 'children'
}
}
}
})
export default class extends Vue {
private async loadOrganizationUnit(node: any, resolve: any) {
if (node.level === 0) {
const rootOrganizationUnit = new OrganizationUnitTree()
rootOrganizationUnit.id = undefined
rootOrganizationUnit.parentId = undefined
rootOrganizationUnit.code = 'root'
rootOrganizationUnit.displayName = '组织机构'
return resolve([rootOrganizationUnit])
}
if (node.data.id === undefined) {
const result = await OrganizationUnitService.findOrganizationUnitLastChildren(node.data.id)
if (result) {
const organizationUnit = new OrganizationUnitTree()
organizationUnit.id = result.id
organizationUnit.parentId = result.parentId
organizationUnit.code = result.code
organizationUnit.displayName = result.displayName
const children = node.data.children as OrganizationUnitTree[]
if (!children.every(x => x.id === result.id)) {
children.push(organizationUnit)
}
return resolve([organizationUnit])
}
} else {
const result = await OrganizationUnitService.findOrganizationUnitChildren(node.data.id, undefined)
if (result.items.length !== 0) {
const organizationUnits = new Array<OrganizationUnitTree>()
result.items.map((item) => {
const organizationUnit = new OrganizationUnitTree()
organizationUnit.id = item.id
organizationUnit.parentId = item.parentId
organizationUnit.code = item.code
organizationUnit.displayName = item.displayName
organizationUnits.push(organizationUnit)
const children = node.data.children as OrganizationUnitTree[]
if (!children.every(x => x.id === item.id)) {
children.push(organizationUnit)
}
})
return resolve(organizationUnits)
}
}
return resolve([])
}
private handleChangeOrganizationUint(command: { key: string, node: any, data: any}) {
switch (command.key) {
case 'append' :
this.handleAppendOrganizationUnit(command.node, command.data)
break
case 'remove' :
this.handleRemoveOrganizationUnit(command.node, command.data)
break
case 'add-user' :
this.handleOrganizationUnitUserAdd(command.data)
break
case 'add-role' :
this.handleOrganizationUnitRoleAdd(command.data)
break
default: break
}
}
private handleAppendOrganizationUnit(node: any, data: any) {
this.$prompt('请输入组织机构名称',
'新增组织机构', {
showInput: true,
inputValidator: (val) => {
return !(!val || val.length === 0)
},
inputErrorMessage: '组织机构名称不能为空',
inputPlaceholder: '请输入机构名称'
}).then((val: any) => {
const organizationUnit = new OrganizationUnitCreate()
organizationUnit.parentId = data.id
organizationUnit.displayName = val.value
OrganizationUnitService.createOrganizationUnit(organizationUnit).then(res => {
const organizationUnit = new OrganizationUnitTree()
organizationUnit.id = res.id
organizationUnit.parentId = res.parentId
organizationUnit.code = res.code
organizationUnit.displayName = res.displayName
data.children.push(organizationUnit)
})
})
}
private handleRemoveOrganizationUnit(node: any, data: any) {
this.$confirm('删除组织机构',
'是否要删除组织机构 ' + data.displayName, {
callback: (action) => {
if (action === 'confirm') {
OrganizationUnitService.deleteOrganizationUnit(data.id).then(() => {
this.$message.success('组织机构 ' + data.displayName + ' 已删除')
const parent = node.parent
const children = parent.data.children as OrganizationUnitTree[]
const index = children.findIndex(d => d.id === data.id)
children.splice(index, 1)
parent.childNodes.splice(index, 1)
})
}
}
})
}
private handleOrganizationUnitUserAdd(data: any) {
console.log(data)
}
private handleOrganizationUnitRoleAdd(data: any) {
console.log(data)
}
private handleAllowDrag(draggingNode: any) {
return draggingNode.data.parentId !== undefined && draggingNode.data.parentId !== null
}
private handleAllowDrop(draggingNode: any, dropNode: any) {
return dropNode.code !== 'root'
}
private handleNodeDroped(draggingNode: any, dropNode: any) {
OrganizationUnitService.moveOrganizationUnit(draggingNode.data.id, dropNode.data.id).then(res => {
const organizationUnit = new OrganizationUnitTree()
organizationUnit.id = res.id
organizationUnit.parentId = res.parentId
organizationUnit.code = res.code
organizationUnit.displayName = res.displayName
})
}
private handleNodeClick(data: any) {
if (data.id !== undefined) {
this.$emit('onOrganizationUnitChecked', data.id)
}
}
}
</script>
<style lang="scss" scoped>
.custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
padding-right: 8px;
}
.el-dropdown-link {
cursor: pointer;
color: #409EFF;
}
.el-icon-arrow-down {
font-size: 12px;
}
</style>