康来智慧冷链系统 - 前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

126 lines
4.2 KiB

<template>
<div id="formPreview" v-loading="state.loading"/>
</template>
<script lang="ts" setup>
import { PropType, reactive, onDeactivated } from 'vue';
import { loadMicroApp, MicroApp } from 'qiankun';
import { getSubDefineProps } from '/@/qiankun/state';
import { GlStateEnum } from '/@/enums/microAppEnum';
import { useMicroAppStore } from '/@/store/modules/microApp';
import { apps } from '/@/qiankun/apps';
import { getFormDefinitionJson } from '/@/api/platform/workflow/extension/controller/formDefinitionJson';
import { FORM_DESIGN_APP_COMPONENTS } from '/@/enums/microAppEnum';
import { useMessage } from '/@/hooks/web/useMessage';
import { startProcessDefinition, auditTask } from '/@/api/platform/workflow/controller/form';
import type { Workflow } from '/@/api/platform/workflow/entity/workflow';
const props = defineProps({
taskFormData: {
type: Array as PropType<Recordable[]>,
default: () => []
},
disabled: {
type: Boolean as PropType<boolean>,
default: false
},
readonly: {
type: Boolean as PropType<boolean>,
default: false
}
});
interface WindowState {
formDesignApp: MicroApp;
formData: Recordable;
options: Recordable;
loading: boolean;
}
const state = reactive<WindowState>({
formDesignApp: undefined!,
loading: false,
formData: {},
options: {}
});
const formDesignProps = {
style: { 'min-height': '50px' },
options: {},
disabled: props.disabled,
readonly: props.readonly,
value: state.formData,
handleValueChange: (formData: Recordable) =>
formDesignProps.value = state.formData = formData
};
const microAppStore = useMicroAppStore();
const { createMessage } = useMessage();
async function init(formJsonId: string) {
if (formJsonId) {
state.loading = true;
state.formData = {};
// 处理表单json数据渲染
try {
const data = await getFormDefinitionJson(formJsonId);
if (!data.json) throw Error('当前数据没有json结构体');
formDesignProps.options = eval('(' + data.json + ')');
const disableIds: string[] = [], showIds: string[] = [];
props.taskFormData.forEach((item) => {
if (item.value !== undefined) {
state.formData[item.id] = item.value;
}
if (item.readable === true) {
showIds.push(item.id);
}
if (item.writable === false) {
disableIds.push(item.id);
}
});
// todo: 待优化
formDesignProps.value = state.formData;
state.formDesignApp?.unmount();
state.formDesignApp = loadMicroApp(Object.assign({} , apps.find(item => item.name == 'form-design'), {
container: '#formPreview',
props: {
...getSubDefineProps(),
mountApp: FORM_DESIGN_APP_COMPONENTS.PREVIEW,
// 表单设计器props
[GlStateEnum.FORM_DESIGN_APP_PROPS_KEY]: formDesignProps
}
}), { sandbox: { experimentalStyleIsolation: true }});
state.formDesignApp.mountPromise.then(() => {
const formPreviewApp: Recordable = microAppStore.getFormDesignApp(FORM_DESIGN_APP_COMPONENTS.PREVIEW),
formRef: Recordable = formPreviewApp.getRef().$refs['form-preview'];
formRef.setShowIds(showIds);
formRef.setDisableIds(disableIds);
state.loading = false;
});
} catch(e: any) {
createMessage.error(e);
state.loading = false;
}
} else createMessage.info('没有关联流程表单!');
}
onDeactivated(() => {
state.formDesignApp?.unmount();
});
async function startFormProcessDefinition(data: Partial<Workflow>, callback: Fn) {
const processVarsity = Object.assign(data.vars || {}, state.formData);
const processInsId = await startProcessDefinition({ ...data, vars: processVarsity });
callback(processInsId);
}
async function auditFormTask(data: Partial<Workflow>, callback: Fn) {
const processVarsity = Object.assign(data.vars || {}, state.formData);
await auditTask({...data, vars: processVarsity});
callback();
}
defineExpose({
init,
startFormProcessDefinition,
auditFormTask
});
</script>