¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <BasicModal v-bind="config" @register="registerModal" :title="currTitle" wrapClassName="loginSelectModal" v-model:visible="visible"> |
| | | <a-form ref="formRef" :model="formState" :rules="rules" v-bind="layout" :colon="false" class="loginSelectForm"> |
| | | <!--å¤ç§æ·éæ©--> |
| | | <a-form-item v-if="isMultiTenant" name="tenantId" :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> |
| | | <template #extra v-if="validate_status == 'error'"> |
| | | <span style="color: #ed6f6f">è¯·éæ©ç»å½ç§æ·</span> |
| | | </template> |
| | | <!--ç§æ·ä¸æå
容--> |
| | | <a-select |
| | | v-model:value="formState.tenantId" |
| | | @change="handleTenantChange" |
| | | placeholder="è¯·éæ©ç»å½ç§æ·" |
| | | :class="{ 'valid-error': validate_status == 'error' }" |
| | | > |
| | | <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" :colon="false"> |
| | | <!--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> |
| | | <template #extra v-if="validate_status1 == 'error'"> |
| | | <span style="color: #ed6f6f">è¯·éæ©ç»å½é¨é¨</span> |
| | | </template> |
| | | <!--é¨é¨ä¸æå
容--> |
| | | <a-select |
| | | v-model:value="formState.orgCode" |
| | | @change="handleDepartChange" |
| | | placeholder="è¯·éæ©ç»å½é¨é¨" |
| | | :class="{ 'valid-error': validate_status1 == 'error' }" |
| | | > |
| | | <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="handleSubmit" type="primary">确认</a-button> |
| | | </template> |
| | | </BasicModal> |
| | | </template> |
| | | |
| | | <script lang="ts"> |
| | | import { defineComponent, ref, computed, watch, unref, reactive, UnwrapRef } from 'vue'; |
| | | import { Avatar } from 'ant-design-vue'; |
| | | import { BasicModal, useModalInner } from '/@/components/Modal'; |
| | | import { useMessage } from '/@/hooks/web/useMessage'; |
| | | import { useUserStore } from '/@/store/modules/user'; |
| | | import { defHttp } from '/@/utils/http/axios'; |
| | | interface FormState { |
| | | orgCode: string | undefined; |
| | | tenantId: number; |
| | | } |
| | | export default defineComponent({ |
| | | name: 'loginSelect', |
| | | components: { |
| | | Avatar, |
| | | BasicModal, |
| | | }, |
| | | emits: ['success', 'register'], |
| | | setup(props, { emit }) { |
| | | const userStore = useUserStore(); |
| | | const { notification } = useMessage(); |
| | | //ç§æ·é
ç½® |
| | | const isMultiTenant = ref(false); |
| | | const tenantList = ref([]); |
| | | const validate_status = ref(''); |
| | | //é¨é¨é
ç½® |
| | | const isMultiDepart = ref(false); |
| | | const departList = ref([]); |
| | | const validate_status1 = ref(''); |
| | | //å¼¹çªæ¾é |
| | | const visible = ref(false); |
| | | //ç»å½ç¨æ· |
| | | const username = ref(''); |
| | | //表å |
| | | const formRef = ref(); |
| | | //éæ©çç§æ·é¨é¨ä¿¡æ¯ |
| | | const formState: UnwrapRef<FormState> = reactive({ |
| | | orgCode: undefined, |
| | | tenantId: null, |
| | | }); |
| | | |
| | | const config = { |
| | | maskClosable: false, |
| | | closable: false, |
| | | canFullscreen: false, |
| | | width: '500px', |
| | | minHeight: 20, |
| | | maxHeight: 20, |
| | | }; |
| | | //å¼¹çªæä½ |
| | | const [registerModal, { closeModal }] = useModalInner(); |
| | | |
| | | //å½åæ é¢ |
| | | const currTitle = computed(() => { |
| | | if (unref(isMultiDepart) && unref(isMultiTenant)) { |
| | | return 'è¯·éæ©ç§æ·åé¨é¨'; |
| | | } else if (unref(isMultiDepart) && !unref(isMultiTenant)) { |
| | | return 'è¯·éæ©é¨é¨'; |
| | | } else if (!unref(isMultiDepart) && unref(isMultiTenant)) { |
| | | return 'è¯·éæ©ç§æ·'; |
| | | } |
| | | }); |
| | | |
| | | const rules = ref({ |
| | | tenantId: [{ required: unref(isMultiTenant), type: 'number', message: 'è¯·éæ©ç§æ·', trigger: 'change' }], |
| | | orgCode: [{ required: unref(isMultiDepart), message: 'è¯·éæ©é¨é¨', trigger: 'change' }], |
| | | }); |
| | | |
| | | const layout = { |
| | | labelCol: { span: 4 }, |
| | | wrapperCol: { span: 18 }, |
| | | }; |
| | | /** |
| | | * å¤çé¨é¨æ
åµ |
| | | */ |
| | | function bizDepart(loginResult) { |
| | | //妿ç»å½æ¥å£è¿åäºç¨æ·ä¸æ¬¡ç»å½ç§æ·IDï¼åä¸éè¦éæ°éæ© |
| | | if(loginResult.userInfo?.orgCode && loginResult.userInfo?.orgCode!==''){ |
| | | isMultiDepart.value = false; |
| | | return; |
| | | } |
| | | |
| | | let multi_depart = loginResult.multi_depart; |
| | | console.log("loginResult::",loginResult); |
| | | //0:æ é¨é¨ 1:ä¸ä¸ªé¨é¨ 2:å¤ä¸ªé¨é¨ |
| | | if (multi_depart == 0) { |
| | | notification.warn({ |
| | | message: 'æç¤º', |
| | | description: `æ¨å°æªå½å±é¨é¨,请确认账å·ä¿¡æ¯`, |
| | | duration: 3, |
| | | }); |
| | | isMultiDepart.value = false; |
| | | } else if (multi_depart == 2) { |
| | | isMultiDepart.value = true; |
| | | departList.value = loginResult.departs; |
| | | } else { |
| | | isMultiDepart.value = false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å¤çç§æ·æ
åµ |
| | | */ |
| | | function bizTenantList(loginResult) { |
| | | //妿ç»å½æ¥å£è¿åäºç¨æ·ä¸æ¬¡ç»å½ç§æ·IDï¼åä¸éè¦éæ°éæ© |
| | | if(loginResult.userInfo?.loginTenantId && loginResult.userInfo?.loginTenantId!==0){ |
| | | isMultiTenant.value = false; |
| | | return; |
| | | } |
| | | |
| | | let tenantArr = loginResult.tenantList; |
| | | if (Array.isArray(tenantArr)) { |
| | | if (tenantArr.length === 0) { |
| | | isMultiTenant.value = false; |
| | | userStore.setTenant(formState.tenantId); |
| | | } else if (tenantArr.length === 1) { |
| | | formState.tenantId = tenantArr[0].id; |
| | | isMultiTenant.value = false; |
| | | userStore.setTenant(formState.tenantId); |
| | | } else { |
| | | isMultiTenant.value = true; |
| | | tenantList.value = tenantArr; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 确认éä¸çç§æ·åé¨é¨ä¿¡æ¯ |
| | | */ |
| | | function handleSubmit() { |
| | | if (unref(isMultiTenant) && !formState.tenantId) { |
| | | validate_status.value = 'error'; |
| | | return false; |
| | | } |
| | | if (unref(isMultiDepart) && !formState.orgCode) { |
| | | validate_status1.value = 'error'; |
| | | return false; |
| | | } |
| | | formRef.value |
| | | .validate() |
| | | .then(() => { |
| | | departResolve() |
| | | .then(() => { |
| | | userStore.setTenant(formState.tenantId); |
| | | emit('success'); |
| | | }) |
| | | .catch((e) => { |
| | | console.log('ç»å½éæ©åºç°é®é¢', e); |
| | | }) |
| | | .finally(() => { |
| | | close(); |
| | | }); |
| | | }) |
| | | .catch((err) => { |
| | | console.log('è¡¨åæ ¡éªæªéè¿error', err); |
| | | }); |
| | | } |
| | | /** |
| | | *忢鿩é¨é¨ |
| | | */ |
| | | function departResolve() { |
| | | return new Promise((resolve, reject) => { |
| | | if (!unref(isMultiDepart) && !unref(isMultiTenant)) { |
| | | resolve(); |
| | | } else { |
| | | let params = { orgCode: formState.orgCode,loginTenantId: formState.tenantId, username: unref(username) }; |
| | | defHttp.put({ url: '/sys/selectDepart', params }).then((res) => { |
| | | if (res.userInfo) { |
| | | userStore.setUserInfo(res.userInfo); |
| | | resolve(); |
| | | } else { |
| | | requestFailed(res); |
| | | userStore.logout(); |
| | | reject(); |
| | | } |
| | | }); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * 请æ±å¤±è´¥å¤ç |
| | | */ |
| | | function requestFailed(err) { |
| | | notification.error({ |
| | | message: 'ç»å½å¤±è´¥', |
| | | description: ((err.response || {}).data || {}).message || err.message || '请æ±åºç°é误ï¼è¯·ç¨ååè¯', |
| | | duration: 4, |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * å
³émodel |
| | | */ |
| | | function close() { |
| | | closeModal(); |
| | | reset(); |
| | | } |
| | | /** |
| | | * å¼¹çªæå¼åå¤ç |
| | | */ |
| | | async function show(loginResult) { |
| | | console.log("showLoginResult::", loginResult); |
| | | if (loginResult) { |
| | | username.value = userStore.username; |
| | | await reset(); |
| | | await bizDepart(loginResult); |
| | | await bizTenantList(loginResult); |
| | | if (!unref(isMultiDepart) && !unref(isMultiTenant)) { |
| | | emit('success', userStore.getUserInfo); |
| | | } else { |
| | | visible.value = true; |
| | | } |
| | | } |
| | | //ç»å½å¼¹çªå®æåï¼å°ç»å½çæ è¯è®¾ç½®æfalse |
| | | loginResult.isLogin = false; |
| | | userStore.setLoginInfo(loginResult); |
| | | } |
| | | |
| | | /** |
| | | *éç½®æ°æ® |
| | | */ |
| | | function reset() { |
| | | tenantList.value = []; |
| | | validate_status.value = ''; |
| | | |
| | | departList.value = []; |
| | | validate_status1.value = ''; |
| | | } |
| | | |
| | | function handleTenantChange(e) { |
| | | validate_status.value = ''; |
| | | } |
| | | |
| | | function handleDepartChange(e) { |
| | | validate_status1.value = ''; |
| | | } |
| | | |
| | | return { |
| | | registerModal, |
| | | visible, |
| | | tenantList, |
| | | isMultiTenant, |
| | | validate_status, |
| | | isMultiDepart, |
| | | departList, |
| | | validate_status1, |
| | | formState, |
| | | rules, |
| | | layout, |
| | | formRef, |
| | | currTitle, |
| | | config, |
| | | handleTenantChange, |
| | | handleDepartChange, |
| | | show, |
| | | handleSubmit, |
| | | }; |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="less" scoped> |
| | | .loginSelectForm { |
| | | margin-bottom: -20px; |
| | | } |
| | | |
| | | .loginSelectModal { |
| | | top: 10px; |
| | | } |
| | | </style> |