iot-ui-vue/src/views/system/NoticeRule/components/Save/index.vue

271 lines
7.8 KiB
Vue

<template>
<j-modal
:width="900"
visible
title="配置通知方式"
@cancel="emit('close')"
@ok="onSave"
>
<j-steps :current="current" size="small" @change="onChange">
<j-step v-for="item in stepList" :title="item" :key="item" />
</j-steps>
<div style="margin: 20px">
<template v-if="current === 0">
<NotifyWay
:value="formModel.channelProvider"
:name="formModel.name"
@change="onWayChange"
/>
</template>
<template v-if="current === 1">
<NotifyConfig
:value="formModel.channelConfiguration.notifierId"
:notifyType="formModel.channelProvider"
@change="onConfigChange"
/>
</template>
<template v-if="current === 2">
<NotifyTemplate
:value="formModel.channelConfiguration.templateId"
:notifierId="formModel.channelConfiguration.notifierId"
@change="onTemplateChange"
/>
</template>
<template v-if="current === 3">
<VariableDefinitions
:variableDefinitions="_variableDefinitions"
:value="formModel.channelConfiguration.variables"
:notify="formModel"
ref="variableRef"
/>
</template>
<template v-if="current === 4">
<Role v-model="formModel.grant.role.idList" />
</template>
</div>
<template #footer>
<j-space>
<j-button v-if="current === 0" @click="emit('close')"
>取消</j-button
>
<j-button v-else @click="onPrev">上一步</j-button>
<j-button
type="primary"
@click="onNext"
v-if="current !== stepList.length - 1"
>下一步</j-button
>
<j-button
:loading="loading"
type="primary"
@click="onSave"
v-else
>确认</j-button
>
</j-space>
</template>
</j-modal>
</template>
<script lang="ts" setup>
import NotifyWay from './components/NotifyWay.vue';
import NotifyConfig from './components/NotifyConfig.vue';
import NotifyTemplate from './components/NotifyTemplate.vue';
import VariableDefinitions from './components/VariableDefinitions.vue';
import Role from '../Role/index.vue';
import { onlyMessage } from '@/utils/comm';
import Template from '@/api/notice/template';
import { variableMap } from '../../data';
import { cloneDeep } from 'lodash-es';
type GrantType = {
role: {
idList?: string[];
};
permissions: any[];
};
type ConfigurationType = {
notifierId: string;
templateId: string;
variables: any;
};
const emit = defineEmits(['close', 'save']);
const props = defineProps({
data: {
type: Object,
default: () => {},
},
loading: {
type: Boolean,
default: false,
},
provider: {
type: String,
default: '',
},
});
const stepList = [
'选择通知方式',
'选择通知配置',
'选择通知模板',
'配置模板变量',
'配置用户权限',
];
const current = ref<number>(0);
const variable = ref([]);
const formModel = reactive<{
id?: string;
name: string;
channelConfiguration: Partial<ConfigurationType>;
grant: GrantType;
channelProvider: string;
}>({
name: '',
channelProvider: '',
grant: {
permissions: [],
role: {},
},
channelConfiguration: {},
});
const variableRef = ref();
const _variableDefinitions = computed(() => {
const arr = ['user', 'org'];
return variable.value.filter((item: any) => {
const _type = item.expands?.businessType || item.type || '';
return !arr.includes(_type);
});
});
const handleVariable = (obj: any) => {
const arr = ['user', 'org'];
const _array = variable.value
.filter((item: any) => {
const _type = item.expands?.businessType || item.type || '';
return arr.includes(_type);
})
.map((i: any) => i?.id);
const _variable = variableMap.get(formModel.channelProvider);
const _obj = {};
[...new Set([..._array, _variable]).values()].map((item: string) => {
_obj[item] = {
source: 'relation',
relation: {
objectType: 'user',
objectSource: {
source: 'upper',
upperKey: 'subscriber',
},
},
};
});
formModel.channelConfiguration.variables = {
..._obj,
...obj,
};
};
const jumpStep = async (val: number) => {
if (val === 0) {
current.value = val;
} else if (val === 1) {
if (formModel.channelProvider) {
current.value = val;
} else {
onlyMessage('请选择通知方式', 'error');
}
} else if (val === 2) {
if (formModel.channelConfiguration.notifierId) {
current.value = val;
} else {
onlyMessage('请选择通知配置', 'error');
}
} else if (val === 3) {
if (formModel.channelConfiguration.templateId) {
const resp = await Template.getTemplateDetail(
formModel.channelConfiguration.templateId,
);
if (resp.status === 200) {
variable.value = resp.result?.variableDefinitions || [];
current.value = val;
}
} else {
onlyMessage('请选择通知模板', 'error');
}
} else if (val === 4) {
if (variable.value.length) {
if (_variableDefinitions.value.length) {
const obj = await variableRef.value.onSave();
if (obj) {
handleVariable(obj);
current.value = val;
} else {
onlyMessage('请配置模版变量', 'error');
}
} else {
handleVariable({});
current.value = val;
}
} else {
current.value = val;
}
}
};
const onWayChange = (obj: any) => {
// 如果数据变化,清除后面的值
if (formModel.channelProvider !== obj.value) {
formModel.channelConfiguration.notifierId = '';
formModel.channelConfiguration.templateId = '';
formModel.channelConfiguration.variables = {};
}
formModel.channelProvider = obj?.value;
formModel.name = obj?.label;
};
const onConfigChange = (obj: any) => {
// 如果数据变化,清除后面的值
if (formModel.channelConfiguration?.notifierId !== obj?.value) {
formModel.channelConfiguration.templateId = '';
formModel.channelConfiguration.variables = {};
}
formModel.channelConfiguration.notifierId = obj?.value;
};
const onTemplateChange = (obj: any) => {
// 如果数据变化,清除后面的值
if (formModel.channelConfiguration?.templateId !== obj?.value) {
formModel.channelConfiguration.variables = {};
}
formModel.channelConfiguration.templateId = obj?.value;
};
watchEffect(() => {
Object.assign(formModel, cloneDeep(props.data));
});
const onPrev = () => {
current.value -= 1;
};
const onNext = () => {
jumpStep(current.value + 1);
};
const onChange = (cur: number) => {
jumpStep(cur);
};
const onSave = () => {
formModel.grant.permissions =
props.provider === 'alarm'
? [{ id: 'alarm-config', actions: ['query'] }]
: [];
emit('save', formModel);
};
</script>