fix : 修复新增需求征集所属公司选择弹框
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
Reference in New Issue
Block a user