Files
test/src/components/MyComponents/ChooseDept/Departbm.vue
2025-03-30 22:09:19 +08:00

465 lines
10 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>
<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市部门-县部门2130
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市部门-县部门2130
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>