465 lines
10 KiB
Vue
465 lines
10 KiB
Vue
<template>
|
||
<!-- 只查部门 -->
|
||
<div>
|
||
<el-dialog title="组织机构选择" width="50%" :close-on-click-modal="false" v-model="props.showDdld" @close="closeDialog"
|
||
:show-close="false">
|
||
<div class="search" v-if="!props.Single">
|
||
<el-input></el-input>
|
||
<el-button type="primary">
|
||
<el-icon>
|
||
<Search />
|
||
</el-icon>
|
||
<span>搜索</span>
|
||
</el-button>
|
||
</div>
|
||
<!-- <el-form :model="listQuery" :rules="rules" label-width="100px" class="demo-ruleForm" :size="formSize" status-icon>
|
||
</el-form> -->
|
||
<!-- 组织机构信息 -->
|
||
<div :class="props.Single ? 'box' : 'box border'">
|
||
<div :class="props.Single ? 'treeBox' : 'treeBox with'">
|
||
<el-tree ref="singleTableRef" class="filter-tree" :props="endProps" node-key="id" accordion
|
||
:default-expanded-keys="treemrData" check-strictly @node-click="nodeClick" :filter-node-method="filterNode"
|
||
@check-change="checkChange" :data="treeData" show-checkbox @check="handleCheck"
|
||
:default-checked-keys="ids" />
|
||
</div>
|
||
<div class="cskbox" v-if="!props.Single">
|
||
<!-- 穿梭按钮 -->
|
||
<el-icon @click="pushRight">
|
||
<DArrowRight />
|
||
</el-icon>
|
||
<el-icon @click="pushLeft">
|
||
<DArrowLeft />
|
||
</el-icon>
|
||
</div>
|
||
|
||
<div class="listbox" v-if="!props.Single">
|
||
<!-- 选中的组员 -->
|
||
<ul>
|
||
<li :class="item.active ? 'activ' : ''" v-for="(item, index) in rightList" :key="item"
|
||
@click="clicklist(item, index)">
|
||
{{ item.orgName }}
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<template #footer>
|
||
<span class="dialog-footer">
|
||
<el-button type="primary" @click="handleSave">
|
||
<el-icon>
|
||
<DocumentChecked />
|
||
</el-icon>
|
||
<span>确定</span>
|
||
</el-button>
|
||
<el-button type="primary" @click="clearlist" v-if="!props.Single">
|
||
<el-icon>
|
||
<DocumentRemove />
|
||
</el-icon>
|
||
<span>清空</span>
|
||
</el-button>
|
||
<el-button @click="handleClose" type="primary">
|
||
<el-icon>
|
||
<DocumentDelete />
|
||
</el-icon>
|
||
<span>关闭</span>
|
||
</el-button>
|
||
</span>
|
||
</template>
|
||
</el-dialog>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup>
|
||
// 引入
|
||
import {
|
||
defineProps,
|
||
watch,
|
||
onMounted,
|
||
ref,
|
||
defineEmits,
|
||
watchEffect
|
||
} from "vue";
|
||
|
||
import {
|
||
getDept
|
||
} from "@/api/user-manage";
|
||
import { getApi, postApi } from "@/api/tobAcco_api.js";
|
||
import { getItem } from "@/utils/storage";
|
||
const treeData = ref([]); // 树的数据
|
||
const node_had = ref([]);
|
||
const treemrData = ref([]);
|
||
const singleTableRef = ref();
|
||
const rightList = ref([]); //右边列表数据
|
||
const diIndex = ref(); //点击右边列表数据
|
||
const leftList = ref([]); //存放右边被点击的数据
|
||
const currentRow = ref(-1); //选中的数据
|
||
const emits = defineEmits(["closezzjg", "listdata"]);
|
||
const resolve_had = ref([]);
|
||
const props = defineProps({
|
||
showDdld: {
|
||
type: Boolean,
|
||
default: true
|
||
},
|
||
zzlx: String,
|
||
// 单位回显
|
||
formInfo: {
|
||
type: Array,
|
||
default: []
|
||
},
|
||
//单选/多选
|
||
Single: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
parentId: {
|
||
type: String,
|
||
default: ""
|
||
},
|
||
// orgLevels省部门:11,市部门:21,县部门:31,s市部门-县部门:21,30
|
||
orgLevels: {
|
||
type: String,
|
||
default: ""
|
||
}
|
||
});
|
||
const listQuery = ref({
|
||
orgLevels: '',
|
||
parentId: getItem('deptId').ssdwid
|
||
});
|
||
const ids = ref([])
|
||
watch(
|
||
() => props.showDdld,
|
||
(newVal) => {
|
||
if (newVal) {
|
||
ids.value = []
|
||
currentRow.value = []
|
||
rightList.value = []
|
||
// listQuery.value.parentId = props.parentId;
|
||
listQuery.value.orgLevels = props.orgLevels;
|
||
getTreeData();
|
||
}
|
||
},
|
||
{ deep: true, immediate: true }
|
||
);
|
||
|
||
|
||
|
||
onMounted(() => {
|
||
// getTreeData();
|
||
|
||
});
|
||
watchEffect(() => {
|
||
if (props.orgLevels) {
|
||
listQuery.value.orgLevels = props.orgLevels;
|
||
}
|
||
|
||
})
|
||
const endProps = {
|
||
children: "children",
|
||
value: "id",
|
||
label: "orgName",
|
||
isLeaf: "leaf"
|
||
};
|
||
// 获取部门树的数据
|
||
function getTreeData() {
|
||
// orgLevels省部门:11,市部门:21,县部门:31
|
||
// orgLevels市部门-县部门:21,30
|
||
postApi(listQuery.value, "/mosty-base/deptFeign/getOrgList").then((res) => {
|
||
if (res.length == 1) {
|
||
res.forEach((element) => {
|
||
element.orgname = element.orgName
|
||
treemrData.value.push(element.id);
|
||
emits("getdeptData", element);
|
||
});
|
||
}
|
||
for (let i = 0; i < res.length; i++) {
|
||
res[i].leaf = !res[i].hasChildren;
|
||
}
|
||
if (res.length > 0) {
|
||
treeData.value = res;
|
||
}
|
||
if (props.formInfo && props.formInfo.length > 0) {
|
||
multipleUser(props.formInfo);
|
||
}
|
||
});
|
||
}
|
||
|
||
//懒加载方法
|
||
async function loadNode(node, resolve) {
|
||
listQuery.value.parentid = node.data.id;
|
||
if (node.level === 0) {
|
||
node_had.value = node;
|
||
resolve_had.value = resolve;
|
||
getTreeData();
|
||
}
|
||
if (node.level >= 1) {
|
||
getDept(listQuery.value).then((res) => {
|
||
for (let i = 0; i < res.length; i++) {
|
||
res[i].leaf = !res[i].hasChildren;
|
||
}
|
||
resolve(res);
|
||
});
|
||
}
|
||
}
|
||
const filterNode = (value, data) => {
|
||
if (!value) return true;
|
||
return data.orgName.includes(value);
|
||
};
|
||
//获取复选框中被选中的值
|
||
function handleCheck(data, checkedData) {
|
||
let arr = checkedData.checkedNodes;
|
||
for (let i = 0; i < arr.length; i++) {
|
||
const e = arr[i];
|
||
// if (e.hasChildren == true) {
|
||
// arr.splice(i, 1);
|
||
// }
|
||
}
|
||
currentRow.value = arr;
|
||
// currentRow.value.zzlx = props.zzlx?props.zzlx:null;
|
||
}
|
||
function checkChange(val, checkedData) {
|
||
if (checkedData == true) {
|
||
if (props.Single) {
|
||
currentRow.value = [val]
|
||
treeData.value.forEach((treeVal) => {
|
||
singleTableRef.value.setChecked(treeVal.id, treeVal.id == val.id);
|
||
});
|
||
} else {
|
||
currentRow.value.push(val)
|
||
}
|
||
} else {
|
||
if (currentRow.value && currentRow.value.length > 0) {
|
||
currentRow.value.forEach(el => {
|
||
if (el.id == val.id) {
|
||
currentRow.value.splice(val, 1);
|
||
}
|
||
});
|
||
}
|
||
|
||
}
|
||
}
|
||
function nodeClick(data, checkedData) {
|
||
if (props.Single) {
|
||
singleTableRef.value.setChecked(data, true);
|
||
} else {
|
||
if (currentRow.value && currentRow.value.length > 0) {
|
||
let rowid = []
|
||
rowid = currentRow.value.filter(it => { return it.id == data.id })
|
||
if (rowid.length > 0) {
|
||
singleTableRef.value.setChecked(data.id, false);
|
||
|
||
} else {
|
||
singleTableRef.value.setChecked(data, true);
|
||
}
|
||
|
||
} else {
|
||
singleTableRef.value.setChecked(data, true);
|
||
}
|
||
}
|
||
|
||
}
|
||
//点击右箭头
|
||
function pushRight() {
|
||
rightList.value = currentRow.value;
|
||
}
|
||
//点击左箭头
|
||
function pushLeft() {
|
||
//遍历右边选中的数据
|
||
for (let i = 0; i < leftList.value.length; i++) {
|
||
const e = leftList.value[i];
|
||
if (e.id) {
|
||
singleTableRef.value.setChecked(e.id, false);
|
||
}
|
||
|
||
rightList.value.forEach((item, index) => {
|
||
if (e.id == item.id) {
|
||
rightList.value.splice(index, 1);
|
||
}
|
||
});
|
||
currentRow.value.forEach((item, index) => {
|
||
if (e.id == item.id) {
|
||
currentRow.value.splice(index, 1);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
//点击右边列表的每一项
|
||
function clicklist(item, index) {
|
||
item.active = !item.active;
|
||
diIndex.value = index;
|
||
if (item.active) {
|
||
leftList.value.push(item);
|
||
} else {
|
||
for (let i = 0; i < leftList.value.length; i++) {
|
||
const element = leftList.value[i];
|
||
if (element.id == item.id) {
|
||
leftList.value.splice(i, 1);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// //处理回显问题
|
||
function multipleUser(row) {
|
||
|
||
// 左右清除历史缓存
|
||
rightList.value = []
|
||
ids.value = []
|
||
treeData.value.forEach((val) => {
|
||
singleTableRef.value.setChecked(val.id, false);
|
||
});
|
||
if (row) {
|
||
ids.value = row
|
||
row.forEach((item) => {
|
||
treeData.value.forEach((val) => {
|
||
if (item == val.id) {
|
||
singleTableRef.value.setChecked(val.id, true);
|
||
}
|
||
});
|
||
//获取部门详情
|
||
getApi({}, `/mosty-base/deptFeign/getDeptById/${item}`).then(res => {
|
||
rightList.value.push(res)
|
||
})
|
||
})
|
||
}
|
||
}
|
||
//点击清空列表
|
||
function clearlist() {
|
||
leftList.value = [];
|
||
rightList.value = [];
|
||
ids.value = []
|
||
currentRow.value = [];
|
||
singleTableRef.value.setCheckedKeys([], false);
|
||
}
|
||
const closeDialog = () => {
|
||
emits("closezzjg", false);
|
||
};
|
||
const handleSave = () => {
|
||
// rightList.value.forEach(item=>{
|
||
// item.orgName=item.orgName
|
||
// })
|
||
emits("closezzjg", false);
|
||
if (props.Single) {
|
||
emits("listdata", ...currentRow.value);
|
||
} else {
|
||
emits("listdata", rightList.value);
|
||
}
|
||
|
||
|
||
};
|
||
const handleClose = () => {
|
||
emits("closezzjg", false);
|
||
};
|
||
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
:v-deep .el-tree-node {
|
||
.is-leaf+el-checkbox .el-checkbox__inner {
|
||
display: inline-block;
|
||
}
|
||
}
|
||
|
||
::v-deep .el-overlay-dialog {
|
||
overflow: hidden !important;
|
||
}
|
||
|
||
:v-deep .el-checkbox .el-checkbox__inner {
|
||
display: none;
|
||
}
|
||
|
||
:v-deep .wrap .el-checkbox__input.is-disabled {
|
||
display: none;
|
||
}
|
||
|
||
.el-form {
|
||
margin-top: 10px;
|
||
display: flex;
|
||
// flex-wrap: wrap;
|
||
justify-content: space-between;
|
||
}
|
||
|
||
.search {
|
||
width: 300px;
|
||
display: flex;
|
||
margin-bottom: 10px;
|
||
justify-content: flex-end;
|
||
margin-left: 65%;
|
||
}
|
||
|
||
.el-form-item {
|
||
text-align: center;
|
||
width: 400px;
|
||
}
|
||
|
||
.flx {
|
||
display: flex;
|
||
width: 100%;
|
||
|
||
.el-button {
|
||
margin-left: 10px;
|
||
}
|
||
}
|
||
|
||
.box {
|
||
width: 100%;
|
||
height: 400px;
|
||
overflow-y: hidden;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
}
|
||
|
||
.border {
|
||
border: 1px solid var(--el-color-primary);
|
||
}
|
||
|
||
.treeBox {
|
||
width: 100%;
|
||
overflow: auto;
|
||
}
|
||
|
||
.with {
|
||
width: 50%;
|
||
}
|
||
|
||
.cskbox {
|
||
width: 40px;
|
||
padding: 107px 0;
|
||
|
||
.el-icon {
|
||
width: 4em !important;
|
||
height: 6em !important;
|
||
}
|
||
|
||
.el-icon svg {
|
||
width: 3em !important;
|
||
height: 3em !important;
|
||
}
|
||
}
|
||
|
||
.listbox {
|
||
border: 1px solid var(--el-color-primary);
|
||
width: 300px;
|
||
height: 400px;
|
||
overflow-y: scroll;
|
||
|
||
ul>li {
|
||
padding: 4px 10px;
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
.activ {
|
||
background-color: var(--el-color-primary);
|
||
}
|
||
}
|
||
|
||
.bot_font {
|
||
width: 100%;
|
||
text-align: center;
|
||
font-size: 16px;
|
||
color: #ffff;
|
||
margin-top: 10px;
|
||
}
|
||
|
||
.fenye {
|
||
margin-top: 10px;
|
||
}
|
||
</style>
|