<!-- 选择人员组件 @desc 单选 弹窗 --> <template> <view> <base-popup ref="basePopup" @handleConfirmClick="personConfirmClick" :title="'选择人员'" > <view> <u-collapse> <!-- 手风琴headImageUr1 --> <u-collapse-item v-for="(item, index) in dataList" :key="index" :title="item.o_OrganName" class="department" :name="index" > <u-icon name="star-fill" size="20" slot="icon" :color="color" class="el-icon-star-on star" :class="{ active: item.active }" ></u-icon> <u-list :height="'auto'" v-if="item.personList && item.personList.length > 0"> <u-list-item v-for="(elItem, elIndex) in item.personList" :key="elIndex" > <u-cell :title="elItem.p_PersonName + ' ' + elItem.p_Telphone" @click="selectPerson(elItem)" > <base-avatar slot="icon" shape="square" size="35" :text=" elItem.p_PersonName ? elItem.p_PersonName.slice(-2) : '' " bg-color="#3c9cff" color="#ffffff" font-size="10" :src="elItem.headImageUrl" customStyle="margin: -3px 5px -3px 0" ></base-avatar> <u-icon name="checkbox-mark" slot="right-icon" size="20" :color="color" class="el-icon-star-on star" :class="{ active: elItem.p_PersonID == chooseData.p_PersonID }" ></u-icon> </u-cell> </u-list-item> </u-list> <view v-else class="empty">暂无数据</view> </u-collapse-item> </u-collapse> <u-toast ref="uToast"></u-toast> </view> </base-popup> </view> </template> <script> import baseAvatar from "@/components/baseAvatar/index.vue"; import basePopup from "@/components/basePopup/index.vue"; import { PersonList, GetOrganTree } from "@/api/system/basePerson"; import config from "@/config"; import { getUserInfo } from "@/utils/auth"; export default { components: { basePopup, baseAvatar, }, data() { return { dataList: [], selectedDataList: [], personLoading: false, color: "f0f0f0", configData: {}, chooseData: {}, }; }, methods: { // 打开弹窗 openDialog(selectedDataList = [], type) { this.configData = config; this.$refs.basePopup.isShowPopup = true; this.selectedDataList = []; this.getMenuData(selectedDataList); }, // 人员确定 personConfirmClick() { if (JSON.stringify(this.chooseData) == "{}") { this.$refs.uToast.show({ type: "warning", message: "请选择人员!", }); return; } this.$emit("personConfirmClick", this.chooseData); this.$refs.basePopup.isShowPopup = false; }, // 获得组织图 async getMenuData(selectedDataList) { this.personLoading = true; setTimeout(() => { this.personLoading = false; }, 5000); let params = { CompanyID: getUserInfo().companyID, }; let res = await GetOrganTree(params); let dataList = JSON.parse(res.data[0]); let departmentList = []; function setDepartmentList(data) { data.forEach((item) => { let arr = { o_OrganName: item.label, personList: [], active: false, }; departmentList.push(arr); if (item.children && item.children.length > 0) { setDepartmentList(item.children); } }); } setDepartmentList(dataList); this.getPersonList(departmentList, selectedDataList); }, // 获得人员列表 async getPersonList(departmentList, selectedDataList) { let params = { page: "1", limit: "999", departmentID: "", }; let res = await PersonList(params); if (res.code === 1) { departmentList.forEach((el) => { res.data[1].forEach((item) => { if (el.o_OrganName == item.o_OrganName) { let personArr = { o_OrganName: item.o_OrganName, p_PersonName: item.p_PersonName, p_PersonID: item.p_PersonID, p_Telphone: item.p_Telphone, headImageUrl: item.headImageUrl ? this.configData.baseUrl + String(item.headImageUrl).split("/wwwroot")[1] : "", active: false, }; el.personList.push(personArr); } }); }); this.dataList = departmentList; this.dataList.forEach((el) => { el.personList.forEach((elItem) => { selectedDataList.forEach((item) => { if (item.p_PersonID == elItem.p_PersonID) { elItem.active = true; this.selectedDataList.push(elItem); } }); }); }); this.personLoading = false; } }, selectPerson(val) { this.chooseData = val; }, }, }; </script> <style scoped lang="scss"> $activeColor: var(--bg-color, "#00aaff"); ::v-deep .u-collapse-item__content__text { padding: 0; } ::v-deep .u-list-item.u-list-item- .u-cell .u-line { border-bottom: 0 solid rgb(214, 215, 217) !important; } .empty { text-align: center; font-size: 14px; color: #919398; padding: 10px 0; } .dataBox { padding: 10rpx 0; border-bottom: 2rpx solid #ccc; min-height: 100rpx; display: flex; align-items: center; } .personBox { border-radius: 6rpx; text-align: center; background-color: #f0f0f0; color: #817582; padding: 20rpx 0; cursor: pointer; min-width: 200rpx; .name { } .phone { font-size: 24rpx; margin-top: 10rpx; } } .personBox { margin-right: 20rpx; margin-bottom: 10rpx; } .personBox.active { color: #fff; background-color: #3c9cff; } .department { .el-icon-star-on { color: #f0f0f0; } } .el-icon-star-on.active { color: #3c9cff; } .personItem { display: flex; align-items: center; flex-wrap: wrap; } </style>