fix : 修复新增需求征集所属公司选择弹框

This commit is contained in:
2024-06-14 23:17:32 +08:00
parent 58cbceb747
commit 532ef440ce
3 changed files with 131 additions and 149 deletions

View File

@@ -4,10 +4,10 @@
:destroy-on-close="true"> :destroy-on-close="true">
<div class="picker"> <div class="picker">
<div class="candidate" v-loading="loading"> <div class="candidate" v-loading="loading">
<el-input v-model="filterText" @change="getList(1)" <el-input v-model="filterText" @change="getList()"
clearable placeholder="输入部门/昵称进行搜索"> clearable placeholder="输入部门进行搜索">
<template #append> <template #append>
<el-button @click="getList(1)">搜索</el-button> <el-button @click="getList()">搜索</el-button>
</template> </template>
</el-input> </el-input>
<!-- 人员选择 --> <!-- 人员选择 -->
@@ -15,26 +15,12 @@
<el-scrollbar style="height:90%;"> <el-scrollbar style="height:90%;">
<div class="tree"> <div class="tree">
<el-tree :data="dataList" ref="tree" :props="defaultProps" empty-text="" node-key="value" <el-tree :data="dataList" ref="tree" :props="defaultProps" empty-text="" node-key="value"
:default-expanded-keys="expandedKeys" lazy accordion default-expand-all :show-checkbox="showCheckbox" highlight-current :default-checked-keys="defaultChecked"
@node-click="handleChange" @node-expand="handleChange"> :check-strictly="multiple===false" @node-click="(node,check)=>handle(node,check)"
@check-change="handleChange" :filter-node-method="filterNode">
<template #default="{ node, data }"> <template #default="{ node, data }">
<div class="tree-node"> <div class="tree-node">
<div v-if="data.type === 0" style="display: flex;align-items: center;padding: 3px 0"> <div style="display: flex;align-items: center;padding: 3px 0">
<el-icon>
<UserFilled/>
</el-icon>
{{ node.label }}-{{ data.companyName }}
</div>
<div v-else-if="data.type ===1">
<el-icon>
<UserFilled/>
</el-icon>
{{ node.label }}
</div>
<div v-else>
<el-icon>
<FolderOpened/>
</el-icon>
{{ node.label }} {{ node.label }}
</div> </div>
</div> </div>
@@ -51,8 +37,9 @@
<div class="org-items"> <div class="org-items">
<el-empty :image-size="100" description="请点击左侧列表选择数据" v-show="selectList.length === 0"/> <el-empty :image-size="100" description="请点击左侧列表选择数据" v-show="selectList.length === 0"/>
<div v-for="(selectItem, selectIndex) in selectList" :key="selectIndex" class="org-item"> <div v-for="(selectItem, selectIndex) in selectList" :key="selectIndex" class="org-item">
{{ selectItem.name }}-{{ selectItem.companyName }} {{ selectItem.label }}
<el-icon @click="noSelected(selectItem)" size="20" style="margin-left: 10px;cursor: pointer;"> <el-icon @click="noSelected(selectItem)" size="20" style="margin-left: 10px;cursor: pointer;"
v-if="showCheckbox===false">
<CircleClose/> <CircleClose/>
</el-icon> </el-icon>
</div> </div>
@@ -67,9 +54,8 @@
</template> </template>
<script setup> <script setup>
import {computed, defineProps, defineExpose} from "vue";
import {ElMessageBox} from "element-plus"; import {ElMessageBox} from "element-plus";
import {getMosrDept} from "@/api/workflow/process-user"; import {getSubCompOpt} from "@/api/user/user";
const props = defineProps({ const props = defineProps({
value: { value: {
@@ -93,28 +79,22 @@ let selectItem = reactive({
type: -1, type: -1,
value: "0" value: "0"
}); });
const activeNames = ref(["1"]);
const visible = ref(false); const visible = ref(false);
const loading = ref(false); const loading = ref(false);
const title = ref("请选择"); const title = ref("请选择");
const selectList = ref([]); const selectList = ref([]);
const filterText = ref(""); const filterText = ref("");
const dataList = ref([]); const dataList = ref([]);
const defaultChecked = ref([]);
const tree = ref([]); const tree = ref([]);
const isSearch = ref(false); const isSearch = ref(false);
const expandedKeys = ref([]); const expandedKeys = ref([]);
const defaultProps = { const defaultProps = {
value: "value", value: "value",
label: "name", label: "label",
children: "children", children: "children"
isLeaf: (data) => {
if (data.type === 0) {
return true
}
}
}; };
const emit = defineEmits(); const emit = defineEmits();
const _value = computed({ const _value = computed({
get() { get() {
return props.value; return props.value;
@@ -125,135 +105,102 @@ const _value = computed({
}); });
watch(() => filterText.value, (newVal) => { watch(() => filterText.value, (newVal) => {
console.log('filterText.value', newVal) tree.value.filter(newVal);
filterText.value = newVal
}); });
const getList = (flag) => { const getList = () => {
let params = {} getSubCompOpt().then(res => {
if (flag === 1) { dataList.value = res.data;
isSearch.value = true;
params = {
chooseId: 0,
chooseName: filterText.value
}
selectItem = {
type: -1,
value: "0"
};
} else {
params = {
chooseId: radio.value,
chooseName: filterText.value
}
}
getMosrDept(params).then(res => {
console.log('selectItem.type', selectItem.type)
// if (res.data) {
if (selectItem.type === -1) {
dataList.value = res.data;
} else if (selectItem.type === 1) {
selectItem.children = res.data;
if (res.data.length === 0) {
selectItem.children = [{
type: 1,
name: '暂无数据'
}]
}
} else if (selectItem.type === 2) {
selectItem.children = res.data;
}
// }
}); });
}; };
const setData = (source) => {
// for (let item of source) {
// this.$set(item, "value", selectItem.value + "-" + item.id)
// }
return source;
};
//通过关键字过滤树节点 //通过关键字过滤树节点
// filterNode(value, data) { const filterNode = (value, data) => {
// if (!value) return true; //通过关键字过滤树节点
// return data.name.indexOf(value) !== -1; if (!value) return true;
// }, return data.label.indexOf(value) !== -1;
//用于用户选择
const showUserPicker = () => {
selectItem = {
type: -1,
value: "0"
};
dataList.value = [];
selectList.value = []
chooseId.value = 0;
radio.value = 0;
visible.value = true;
expandedKeys.value = [];
getList();
}; };
const handleChange = (item, data) => { //用于用户选择
selectItem = item; const show = () => {
if (isSearch.value && item.type !== 0) { //用于弹开部门选择
filterText.value = "" visible.value = true;
radio.value = item.id; selectList.value=_value.value
getList(); defaultChecked.value=_value.value.map(item=>item.value)
return; getList()
} else if (!isSearch.value) { };
//渲染子节点用户或部门及用户数据 const handleChange = (data, checked) => {
if (data.expanded) { // 左侧有选择框
if (expandedKeys.value.indexOf(item.value) === -1) { if (props.showCheckbox) {
expandedKeys.value.push(item.value); // 左侧有选择框 + 多选
if (item.type !== 0) {
radio.value = item.id;
getList();
return;
}
}
}
}
// if(expandedKeys.value.indexOf(item.value)==-1){
// expandedKeys.value.push(item.value);
// }else {
// if (data.expanded === true) {
// if (item.type !== 0) {
// chooseId.value = item.id;
// getList();
// return;
// }
// }
// }
//仅选择用户
if (item.type === 0) {
if (props.multiple) { if (props.multiple) {
//不添加重复的数据到右边 //不添加重复的数据到右边
for (let i = 0; i < selectList.value.length; i++) { for (let i = 0; i < selectList.value.length; i++) {
if (selectList.value[i].id === item.id) { if (selectList.value[i].value === data.value) {
selectList.value.splice(i, 1); selectList.value.splice(i, 1);
break; break;
} }
} }
selectList.value.push(item); if (checked) {
} else { if (data.children === undefined) {
selectList.value = [item]; selectList.value.push(data);
}
} else if (data === "1") {
tree.value.setCheckedKeys([]);
selectList.value = [];
}
} else {// 左侧有选择框 + 单选
//不添加重复的数据到右边
for (let i = 0; i < selectList.value.length; i++) {
if (selectList.value[i].value === data.value) {
selectList.value.splice(i, 1);
break;
}
}
if (checked) {
tree.value.setCheckedNodes([data]);
// this.$refs.tree.setCheckedKeys([]);
selectList.value = [data];
} else if (data === "1") {
selectList.value = [];
tree.value.setCheckedKeys([]);
}
} }
} }
// _value = selectList.value
}; };
const handle = (node, check) => {
if (check.isLeaf !== false) {
if (props.multiple) {
//不添加重复的数据到右边
for (let i = 0; i < selectList.value.length; i++) {
if (selectList.value[i].value === node.value) {
selectList.value.splice(i, 1);
break;
}
}
check.checked = true;
selectList.value.push(node);
} else {
check.checked = true;
selectList.value = [node];
}
}
// _value.value = selectList.value
};
const noSelected = (selectItem) => { const noSelected = (selectItem) => {
//右侧的x //左侧无选择框时,右侧显示×
for (let i = 0; i < selectList.value.length; i++) { for (let i = 0; i < selectList.value.length; i++) {
if (selectList.value[i].value === selectItem.value) { if (selectList.value[i].value === selectItem.value) {
selectList.value.splice(i, 1); selectList.value.splice(i, 1);
tree.value.setCheckedKeys(i);
break; break;
} }
} }
selectItem.selected = false; if (props.showCheckbox) {
// 左侧有选择框 + 单选
if (props.multiple === false) {
tree.value.setCheckedKeys([]);
}
}
}; };
const clearSelected = () => { const clearSelected = () => {
//清空 //清空
@@ -262,7 +209,11 @@ const clearSelected = () => {
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning" type: "warning"
}).then(() => { }).then(() => {
selectList.value = []; if (!props.showCheckbox) {
selectList.value = [];
} else {
handleChange("1");
}
}); });
}; };
const selectConfirm = () => { const selectConfirm = () => {
@@ -272,8 +223,9 @@ const selectConfirm = () => {
visible.value = false; visible.value = false;
}; };
defineExpose({ defineExpose({
showUserPicker show
}); });
getList()
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@@ -5,7 +5,7 @@ export const matterTree = (array,data, id) => {
array.push(data[i].label); array.push(data[i].label);
} }
if (data[i].children && data[i].children.length > 0) { if (data[i].children && data[i].children.length > 0) {
matterTree(data[i].children) matterTree(array,data[i].children,id)
} }
} }
return array; return array;

View File

@@ -34,9 +34,10 @@
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="所属公司" prop="companyIds" class="tree-select"> <el-form-item label="所属公司" prop="companyIds" class="tree-select">
<!-- <el-button @click="showCompany">请选择</el-button>--> <div>{{ getName(companyList) }}</div>
<el-tree-select v-model="formData.companyIds" :data="companyOption" <el-button @click="showCompany">{{companyList.length===0?'请选择':'更改'}}</el-button>
filterable clearable :check-strictly="true" multiple/> <!-- <el-tree-select v-model="formData.companyIds" :data="companyOption"-->
<!-- filterable clearable :check-strictly="true" multiple/>-->
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@@ -93,6 +94,7 @@
<el-button color="#DED0B2" v-else @click="handleResubmit">重新提交</el-button> <el-button color="#DED0B2" v-else @click="handleResubmit">重新提交</el-button>
<el-button @click="handleBack">返回</el-button> <el-button @click="handleBack">返回</el-button>
</div> </div>
<company-picker :multiple="true" ref="companyRef" title="请选择所属公司" v-model:value="companyList" @ok="selected"/>
</div> </div>
</template> </template>
@@ -109,12 +111,15 @@ import {
} from "@/api/project-demand/index.js"; } from "@/api/project-demand/index.js";
import FileUpload from "@/components/FileUpload.vue"; import FileUpload from "@/components/FileUpload.vue";
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'; import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
import {ElMessageBox, ElNotification} from "element-plus"; import {ElNotification} from "element-plus";
import {useRoute, useRouter} from 'vue-router' import {useRoute, useRouter} from 'vue-router'
import {getSubCompOpt} from '@/api/user/user.js' import {getSubCompOpt} from '@/api/user/user.js'
import {useTagsView} from '@/stores/tagsview.js' import {useTagsView} from '@/stores/tagsview.js'
import {getFundOption} from "@/api/special-fund"; import {getFundOption} from "@/api/special-fund";
import CompanyPicker from "@/components/DetailComponent/CompanyPicker.vue";
const companyRef = ref()
const companyList = ref([])
const changeDiagram = ref(false) const changeDiagram = ref(false)
const tagsViewStore = useTagsView() const tagsViewStore = useTagsView()
const authStore = useAuthStore() const authStore = useAuthStore()
@@ -124,7 +129,7 @@ const demandForm = ref()
const dateValue = ref() const dateValue = ref()
const formData = ref({ const formData = ref({
requirementName: '', requirementName: '',
companyIds: '', companyIds: [],
collectType: '', collectType: '',
deadline: '', deadline: '',
collectExplain: '', collectExplain: '',
@@ -200,7 +205,24 @@ const tableConfig = reactive({
} }
] ]
}) })
const getName = (list) => {
return list.map(item => item.label).join('')
}
const showCompany = () => {
companyRef.value.show()
}
const selected = (select) => {
let companyInfoList = []
for (let val of select) {
let companyInfo = {
value: val.value,
label: val.label
}
companyInfoList.push(companyInfo)
formData.value.companyIds.push(val.value)
}
companyList.value = companyInfoList
}
const checkFormPrem = (formKey) => { const checkFormPrem = (formKey) => {
if (formPermMap.value.hasOwnProperty(formKey)) { if (formPermMap.value.hasOwnProperty(formKey)) {
let formItem = formPermMap.value[formKey]; let formItem = formPermMap.value[formKey];
@@ -208,7 +230,6 @@ const checkFormPrem = (formKey) => {
} else { } else {
return true; return true;
} }
} }
const handleDownload = (row) => { const handleDownload = (row) => {
@@ -291,6 +312,15 @@ const init = async () => {
}) })
} }
const submitParam = (item) => { const submitParam = (item) => {
console.log('item..',item.companyIds)
if(item.companyIds.length===0){
ElNotification({
title: '提示',
message: '请选择所属公司',
type: 'error'
})
return;
}
let files = [] let files = []
item.fileList.forEach(item => { item.fileList.forEach(item => {
let obj = { let obj = {