123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- <template>
- <BasicModal v-bind="config" :maxHeight="500" :title="currTitle" v-model:visible="visible" wrapClassName="loginSelectModal">
- <a-form ref="formRef" v-bind="layout" :colon="false" class="loginSelectForm">
- <a-form-item v-if="isMultiTenant" :validate-status="validate_status">
- <!--label内容-->
- <template #label>
- <a-tooltip placement="topLeft">
- <template #title>
- <span>您隶属于多租户,请选择当前所属租户</span>
- </template>
- <a-avatar style="background-color: #87d068" :size="30"> 租户 </a-avatar>
- </a-tooltip>
- </template>
- <!--部门下拉内容-->
- <a-select v-model:value="tenantSelected" placeholder="请选择登录部门" :class="{ 'valid-error': validate_status == 'error' }">
- <template #suffixIcon>
- <Icon icon="ant-design:gold-outline" />
- </template>
- <template v-for="tenant in tenantList" :key="tenant.id">
- <a-select-option :value="tenant.id">{{ tenant.name }}</a-select-option>
- </template>
- </a-select>
- </a-form-item>
- <a-form-item v-if="isMultiDepart" :validate-status="validate_status1">
- <!--label内容-->
- <template #label>
- <a-tooltip placement="topLeft">
- <template #title>
- <span>您隶属于多部门,请选择当前所在部门</span>
- </template>
- <a-avatar style="background-color: rgb(104, 208, 203)" :size="30"> 部门 </a-avatar>
- </a-tooltip>
- </template>
- <!--部门下拉内容-->
- <a-select v-model:value="departSelected" placeholder="请选择登录部门" :class="{ 'valid-error': validate_status1 == 'error' }">
- <template #suffixIcon>
- <Icon icon="ant-design:gold-outline" />
- </template>
- <template v-for="depart in departList" :key="depart.orgCode">
- <a-select-option :value="depart.orgCode">{{ depart.departName }}</a-select-option>
- </template>
- </a-select>
- </a-form-item>
- </a-form>
- <template #footer>
- <a-button @click="close">关闭</a-button>
- <a-button @click="handleSubmit" type="primary">确认</a-button>
- </template>
- </BasicModal>
- </template>
- <script lang="ts" setup>
- import { ref, computed, watch, unref } from 'vue';
- import { Avatar } from 'ant-design-vue';
- import { BasicModal } from '/@/components/Modal';
- import { getUserDeparts, selectDepart } from '/@/views/system/depart/depart.api';
- import { getUserTenants } from '/@/views/system/tenant/tenant.api';
- import { useMessage } from '/@/hooks/web/useMessage';
- import { useUserStore } from '/@/store/modules/user';
- const userStore = useUserStore();
- const { createMessage, notification } = useMessage();
- const props = defineProps({
- title: { type: String, default: '部门选择' },
- closable: { type: Boolean, default: false },
- username: { type: String, default: '' },
- });
- const layout = {
- labelCol: { span: 4 },
- wrapperCol: { span: 18 },
- };
- const config = {
- maskClosable: false,
- closable: false,
- canFullscreen: false,
- width: '500px',
- minHeight: 20,
- maxHeight: 20,
- };
- const currTitle = ref('');
- const isMultiTenant = ref(false);
- const currentTenantName = ref('');
- const tenantSelected = ref();
- const tenantList = ref([]);
- const validate_status = ref('');
- const isMultiDepart = ref(false);
- const currentDepartName = ref('');
- const departSelected = ref('');
- const departList = ref([]);
- const validate_status1 = ref('');
- //弹窗显隐
- const visible = ref(false);
- /**
- * 弹窗打开前处理
- */
- async function show() {
- //加载部门
- await loadDepartList();
- //加载租户
- await loadTenantList();
- //标题配置
- if (unref(isMultiTenant) && unref(isMultiDepart)) {
- currTitle.value = '切换租户和部门';
- } else if (unref(isMultiTenant)) {
- currTitle.value =
- unref(currentTenantName) && unref(currentTenantName).length > 0 ? `租户切换(当前租户 :${unref(currentTenantName)})` : props.title;
- } else if (unref(isMultiDepart)) {
- currTitle.value =
- unref(currentDepartName) && unref(currentDepartName).length > 0 ? `部门切换(当前部门 :${unref(currentDepartName)})` : props.title;
- }
- //model显隐
- if (unref(isMultiTenant) || unref(isMultiDepart)) {
- visible.value = true;
- }
- }
- /**
- *加载部门信息
- */
- async function loadDepartList() {
- const result = await getUserDeparts();
- if (!result.list || result.list.length == 0) {
- return;
- }
- let currentDepart = result.list.filter((item) => item.orgCode == result.orgCode);
- departList.value = result.list;
- departSelected.value = currentDepart && currentDepart.length > 0 ? result.orgCode : '';
- currentDepartName.value = currentDepart && currentDepart.length > 0 ? currentDepart[0].departName : '';
- isMultiDepart.value = true;
- }
- /**
- *加载租户信息
- */
- async function loadTenantList() {
- const result = await getUserTenants();
- if (!result.list || result.list.length == 0) {
- return;
- }
- let tenantId = userStore.getTenant;
- let currentTenant = result.list.filter((item) => item.id == tenantId);
- currentTenantName.value = currentTenant && currentTenant.length > 0 ? currentTenant[0].name : '';
- tenantList.value = result.list;
- tenantSelected.value = tenantId;
- isMultiTenant.value = true;
- }
- /**
- * 提交数据
- */
- async function handleSubmit() {
- if (unref(isMultiTenant) && unref(tenantSelected) == null) {
- validate_status.value = 'error';
- return false;
- }
- if (unref(isMultiDepart) && !unref(departSelected)) {
- validate_status1.value = 'error';
- return false;
- }
- departResolve()
- .then(() => {
- if (unref(isMultiTenant)) {
- userStore.setTenant(unref(tenantSelected));
- }
- createMessage.success('切换成功');
- //切换租户后要刷新首页
- window.location.reload();
- })
- .catch((e) => {
- console.log('登录选择出现问题', e);
- })
- .finally(() => {
- if (unref(isMultiTenant)) {
- userStore.setTenant(unref(tenantSelected));
- }
- close();
- });
- }
- /**
- *切换选择部门
- */
- function departResolve() {
- return new Promise(async (resolve, reject) => {
- if (!unref(isMultiDepart)) {
- resolve();
- } else {
- const result = await selectDepart({
- username: userStore.getUserInfo.username,
- orgCode: unref(departSelected),
- loginTenantId: unref(tenantSelected),
- });
- if (result.userInfo) {
- const userInfo = result.userInfo;
- userStore.setUserInfo(userInfo);
- resolve();
- } else {
- requestFailed(result);
- userStore.logout();
- reject();
- }
- }
- });
- }
- /**
- * 请求失败处理
- */
- function requestFailed(err) {
- notification.error({
- message: '登录失败',
- description: ((err.response || {}).data || {}).message || err.message || '请求出现错误,请稍后再试',
- duration: 4,
- });
- }
- /**
- * 关闭model
- */
- function close() {
- departClear();
- }
- /**
- *初始化数据
- */
- function departClear() {
- currTitle.value = '';
- isMultiTenant.value = false;
- currentTenantName.value = '';
- tenantSelected.value = '';
- tenantList.value = [];
- validate_status.value = '';
- isMultiDepart.value = false;
- currentDepartName.value = '';
- departSelected.value = '';
- departList.value = [];
- validate_status1.value = '';
- visible.value = false;
- }
- /**
- * 监听username
- */
- watch(
- () => props.username,
- (value) => {
- value && loadDepartList();
- }
- );
- defineExpose({
- show,
- });
- </script>
- <style lang="less" scoped>
- .loginSelectForm {
- margin-bottom: -20px;
- }
- .loginSelectModal {
- top: 20px;
- }
- .valid-error .ant-select-selection__placeholder {
- color: #f5222d;
- }
- </style>
|