提交 c9e5476b authored 作者: kxjia's avatar kxjia

修改工作流多实例问题

上级 c90615cf
...@@ -63,7 +63,8 @@ const editableColumns = [ ...@@ -63,7 +63,8 @@ const editableColumns = [
] ]
const defaultProperties = [ const defaultProperties = [
{ name: 'isApprove', value: 'false' } { name: 'isApprove', value: 'false' },
{ name: 'isEdit', value: 'false' },
] ]
onMounted(() => { onMounted(() => {
......
<template> <template>
<div class="panel-tab__content"> <div class="panel-tab__content">
<a-form layout="horizontal" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }" @submit.prevent size="small"> <a-form layout="horizontal" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }" @submit.prevent size="small">
<a-form-item label="参数说明">
<a-button size="small" type="primary" @click="dialogVisible = true">查看</a-button>
</a-form-item>
<a-form-item label="回路特性"> <a-form-item label="回路特性">
<a-select v-model:value="loopCharacteristics" @change="changeLoopCharacteristicsType"> <a-select v-model:value="loopCharacteristics" @change="handleLoopTypeChange">
<!--bpmn:MultiInstanceLoopCharacteristics-->
<a-select-option value="ParallelMultiInstance">并行多重事件</a-select-option> <a-select-option value="ParallelMultiInstance">并行多重事件</a-select-option>
<a-select-option value="SequentialMultiInstance">时序多重事件</a-select-option> <a-select-option value="SequentialMultiInstance">时序多重事件</a-select-option>
<!--bpmn:StandardLoopCharacteristics-->
<a-select-option value="StandardLoop">循环事件</a-select-option>
<a-select-option value="Null"></a-select-option> <a-select-option value="Null"></a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="多实例模式" v-if="loopCharacteristics !== 'Null' && loopCharacteristics !== 'StandardLoop'"> <a-form-item label="多实例模式" v-if="loopCharacteristics && loopCharacteristics !== 'Null'">
<a-radio-group v-model:value="multiInstanceMode" @change="changeMultiInstanceMode"> <a-radio-group v-model:value="multiInstanceMode" @change="handleModeChange">
<a-radio value="counterSign">会签(全部完成)</a-radio> <a-radio value="counterSign">会签(全部完成)</a-radio>
<a-radio value="orSign">或签(任一完成)</a-radio> <a-radio value="orSign">或签(任一完成)</a-radio>
<a-radio value="normal">普通</a-radio> <a-radio value="normal">普通</a-radio>
</a-radio-group> </a-radio-group>
</a-form-item> </a-form-item>
<template v-if="loopCharacteristics === 'ParallelMultiInstance' || loopCharacteristics === 'SequentialMultiInstance'"> <template v-if="loopCharacteristics === 'ParallelMultiInstance' || loopCharacteristics === 'SequentialMultiInstance'">
<a-form-item label="循环基数" key="loopCardinality"> <a-form-item label="循环基数">
<a-input v-model:value="loopInstanceForm.loopCardinality" allow-clear @change="updateLoopCardinality" /> <a-input v-model:value="loopInstanceForm.loopCardinality" @blur="updateLoopCardinality" />
</a-form-item> </a-form-item>
<a-form-item label="集合" key="collection"> <a-form-item label="集合">
<a-input v-model:value="loopInstanceForm.collection" allow-clear @change="updateLoopBase" /> <a-input v-model:value="loopInstanceForm.collection" @blur="updateLoopBase" />
</a-form-item> </a-form-item>
<a-form-item label="元素变量" key="elementVariable"> <a-form-item label="元素变量">
<a-input v-model:value="loopInstanceForm.elementVariable" allow-clear @change="updateLoopBase" /> <a-input v-model:value="loopInstanceForm.elementVariable" @blur="updateLoopBase" />
</a-form-item> </a-form-item>
<a-form-item label="完成条件" key="completionCondition"> <a-form-item label="完成条件">
<a-input v-model:value="loopInstanceForm.completionCondition" allow-clear @change="updateLoopCondition" /> <a-input v-model:value="loopInstanceForm.completionCondition" @blur="updateLoopCondition" />
</a-form-item> </a-form-item>
<a-form-item label="异步状态" key="async"> <a-form-item label="异步状态">
<a-checkbox v-model:checked="loopInstanceForm.asyncBefore" @change="() => updateLoopAsync('asyncBefore')"> <a-checkbox v-model:checked="loopInstanceForm.asyncBefore" @change="() => updateLoopAsync('asyncBefore')">
异步前 异步前
</a-checkbox> </a-checkbox>
...@@ -49,43 +43,16 @@ ...@@ -49,43 +43,16 @@
排除 排除
</a-checkbox> </a-checkbox>
</a-form-item> </a-form-item>
<a-form-item <a-form-item label="重试周期" v-if="loopInstanceForm.asyncAfter || loopInstanceForm.asyncBefore">
label="重试周期" <a-input v-model:value="loopInstanceForm.timeCycle" @blur="updateLoopTimeCycle" />
key="timeCycle"
v-if="loopInstanceForm.asyncAfter || loopInstanceForm.asyncBefore"
>
<a-input v-model:value="loopInstanceForm.timeCycle" allow-clear @change="updateLoopTimeCycle" />
</a-form-item> </a-form-item>
</template> </template>
</a-form> </a-form>
<!-- 参数说明 -->
<a-modal
v-model:open="dialogVisible"
title="多实例参数"
width="680px"
:footer="null"
@cancel="dialogVisible = false"
>
<a-descriptions :column="1" bordered>
<a-descriptions-item label="使用说明">按照BPMN2.0规范的要求,用于为每个实例创建执行的父执行,会提供下列变量:</a-descriptions-item>
<a-descriptions-item label="collection(集合变量)">传入List参数, 一般为用户ID集合</a-descriptions-item>
<a-descriptions-item label="elementVariable(元素变量)">List中单个参数的名称</a-descriptions-item>
<a-descriptions-item label="loopCardinality(基数)">List循环次数</a-descriptions-item>
<a-descriptions-item label="isSequential(串并行)">Parallel: 并行多实例,Sequential: 串行多实例</a-descriptions-item>
<a-descriptions-item label="completionCondition(完成条件)">任务出口条件</a-descriptions-item>
<a-descriptions-item label="nrOfInstances(实例总数)">实例总数</a-descriptions-item>
<a-descriptions-item label="nrOfActiveInstances(未完成数)">当前活动的(即未完成的),实例数量。对于顺序多实例,这个值总为1</a-descriptions-item>
<a-descriptions-item label="nrOfCompletedInstances(已完成数)">已完成的实例数量</a-descriptions-item>
<a-descriptions-item label="loopCounter">给定实例在for-each循环中的index</a-descriptions-item>
</a-descriptions>
</a-modal>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, watch, reactive, nextTick, onMounted } from 'vue' import { ref, watch, reactive, onMounted, toRaw } from 'vue'
import { StrUtil } from '../common/StrUtil'
import { useModelerStore } from '../store/modeler-store.js' import { useModelerStore } from '../store/modeler-store.js'
interface LoopInstanceForm { interface LoopInstanceForm {
...@@ -93,12 +60,10 @@ interface LoopInstanceForm { ...@@ -93,12 +60,10 @@ interface LoopInstanceForm {
loopCardinality?: string loopCardinality?: string
collection?: string collection?: string
elementVariable?: string elementVariable?: string
asyncAfter?: boolean timeCycle?: string
asyncBefore?: boolean asyncBefore?: boolean
asyncAfter?: boolean
exclusive?: boolean exclusive?: boolean
timeCycle?: string
extensionElements?: any[]
[key: string]: any
} }
const props = defineProps<{ const props = defineProps<{
...@@ -108,75 +73,104 @@ const props = defineProps<{ ...@@ -108,75 +73,104 @@ const props = defineProps<{
const modelerStore = useModelerStore() const modelerStore = useModelerStore()
// 响应式数据
const dialogVisible = ref(false)
const loopCharacteristics = ref("") const loopCharacteristics = ref("")
const multiInstanceMode = ref("normal") const multiInstanceMode = ref("normal")
const loopInstanceForm = reactive<LoopInstanceForm>({}) const loopInstanceForm = reactive<LoopInstanceForm>({
const multiLoopInstance = ref<any>(null) completionCondition: '',
loopCardinality: '',
const defaultLoopInstanceForm: LoopInstanceForm = { collection: '',
completionCondition: "", elementVariable: '',
loopCardinality: "", timeCycle: '',
extensionElements: [],
asyncAfter: false,
asyncBefore: false, asyncBefore: false,
asyncAfter: false,
exclusive: false exclusive: false
})
const getBpmnModeler = () => toRaw(modelerStore.modeler)
const getModdle = () => toRaw(modelerStore.moddle)
const getModeling = () => {
const modeler = getBpmnModeler()
if (!modeler) return null
return modeler.get('modeling')
} }
const createLoopCharacteristics = (extra?: Record<string, any>) => {
const moddle = getModdle()
const element = toRaw(modelerStore.element)
console.log('[multiInstance] createLoopCharacteristics, element:', element?.id)
console.log('[multiInstance] loopCharacteristics exists:', !!element?.businessObject?.loopCharacteristics)
if (!moddle || !element) return null
const lc = toRaw(element.businessObject?.loopCharacteristics)
console.log('[multiInstance] lc:', lc)
if (!lc) return null
// 监听 id 变化 let condition = null
watch(() => props.id, (newVal) => { if (multiInstanceMode.value === 'counterSign') {
console.log('[multiInstance] id changed:', newVal, 'store element:', modelerStore.element?.id) condition = moddle.create("bpmn:FormalExpression", {
if (StrUtil.isNotBlank(newVal) && modelerStore.element) { body: '${nrOfCompletedInstances >= nrOfInstances}'
nextTick(() => {
getElementLoop(modelerStore.element.businessObject)
}) })
} else if (multiInstanceMode.value === 'orSign') {
condition = moddle.create("bpmn:FormalExpression", {
body: '${nrOfActiveInstances == 0}'
})
} else if (loopInstanceForm.completionCondition) {
condition = moddle.create("bpmn:FormalExpression", { body: loopInstanceForm.completionCondition })
} }
}, { immediate: true })
onMounted(() => { let cardinality = null
console.log('[multiInstance] mounted, id:', props.id, 'store element:', modelerStore.element?.id) if (loopInstanceForm.loopCardinality) {
if (props.id && modelerStore.element) { cardinality = moddle.create("bpmn:FormalExpression", { body: loopInstanceForm.loopCardinality })
getElementLoop(modelerStore.element.businessObject)
} }
})
// 获取元素循环配置 return moddle.create("bpmn:MultiInstanceLoopCharacteristics", {
const getElementLoop = (businessObject: any) => { isSequential: lc.isSequential,
if (!businessObject.loopCharacteristics) { loopCardinality: cardinality,
completionCondition: condition,
collection: loopInstanceForm.collection,
elementVariable: loopInstanceForm.elementVariable,
asyncBefore: loopInstanceForm.asyncBefore,
asyncAfter: loopInstanceForm.asyncAfter,
exclusive: loopInstanceForm.exclusive,
...extra
})
}
const loadElementData = () => {
const element = toRaw(modelerStore.element)
if (!element?.businessObject) return
const bo = toRaw(element.businessObject)
if (!bo?.loopCharacteristics) {
loopCharacteristics.value = "Null" loopCharacteristics.value = "Null"
Object.assign(loopInstanceForm, {})
return return
} }
if (businessObject.loopCharacteristics.$type === "bpmn:StandardLoopCharacteristics") { const lc = toRaw(bo.loopCharacteristics)
loopCharacteristics.value = "StandardLoop" if (!lc) return
Object.assign(loopInstanceForm, {})
return
}
if (businessObject.loopCharacteristics.isSequential) { if (lc.isSequential) {
loopCharacteristics.value = "SequentialMultiInstance" loopCharacteristics.value = "SequentialMultiInstance"
} else { } else {
loopCharacteristics.value = "ParallelMultiInstance" loopCharacteristics.value = "ParallelMultiInstance"
} }
// 合并配置 loopInstanceForm.loopCardinality = lc.loopCardinality?.body || ''
Object.assign(loopInstanceForm, { loopInstanceForm.collection = lc.collection || ''
...defaultLoopInstanceForm, loopInstanceForm.elementVariable = lc.elementVariable || ''
...businessObject.loopCharacteristics, loopInstanceForm.completionCondition = lc.completionCondition?.body || ''
completionCondition: businessObject.loopCharacteristics?.completionCondition?.body ?? "", loopInstanceForm.asyncBefore = lc.asyncBefore || false
loopCardinality: businessObject.loopCharacteristics?.loopCardinality?.body ?? "" loopInstanceForm.asyncAfter = lc.asyncAfter || false
}) loopInstanceForm.exclusive = lc.exclusive || false
// 读取多实例模式 if (lc.completionCondition?.body) {
if (businessObject.loopCharacteristics?.completionCondition) { const body = lc.completionCondition.body
const condition = businessObject.loopCharacteristics.completionCondition?.body || '' if (body && body.includes('nrOfCompletedInstances')) {
if (condition.includes('${nrOfCompletedInstances') && condition.includes('nrOfInstances')) {
multiInstanceMode.value = 'counterSign' multiInstanceMode.value = 'counterSign'
} else if (condition.includes('${nrOfActiveInstances') === 0) { } else if (body && body.includes('nrOfActiveInstances')) {
multiInstanceMode.value = 'orSign' multiInstanceMode.value = 'orSign'
} else { } else {
multiInstanceMode.value = 'normal' multiInstanceMode.value = 'normal'
...@@ -184,141 +178,161 @@ const getElementLoop = (businessObject: any) => { ...@@ -184,141 +178,161 @@ const getElementLoop = (businessObject: any) => {
} else { } else {
multiInstanceMode.value = 'normal' multiInstanceMode.value = 'normal'
} }
// 保留当前元素 businessObject 上的 loopCharacteristics 实例
multiLoopInstance.value = businessObject.loopCharacteristics
// 更新表单
if (
businessObject.loopCharacteristics.extensionElements &&
businessObject.loopCharacteristics.extensionElements.values &&
businessObject.loopCharacteristics.extensionElements.values.length
) {
loopInstanceForm.timeCycle = businessObject.loopCharacteristics.extensionElements.values[0].body
}
} }
// 改变循环特性类型 const handleLoopTypeChange = (type: string) => {
const changeLoopCharacteristicsType = (type: string) => { const modeler = getBpmnModeler()
// 切换类型取消原表单配置 const moddle = getModdle()
Object.assign(loopInstanceForm, defaultLoopInstanceForm) const element = toRaw(modelerStore.element)
const modeling = getModeling()
// 取消多实例配置 if (!modeling || !moddle || !element) return
if (type === "Null") {
modelerStore.modeling.updateProperties(modelerStore.element, { loopCharacteristics: null })
return
}
// 配置循环 if (type === "Null") {
if (type === "StandardLoop") { modeling.updateProperties(element, { loopCharacteristics: null })
const loopCharacteristicsObject = modelerStore.moddle.create("bpmn:StandardLoopCharacteristics") multiInstanceMode.value = "normal"
modelerStore.modeling.updateProperties(modelerStore.element, {
loopCharacteristics: loopCharacteristicsObject
})
multiLoopInstance.value = null
return return
} }
// 时序 let newLc
if (type === "SequentialMultiInstance") { if (type === "SequentialMultiInstance") {
multiLoopInstance.value = modelerStore.moddle.create("bpmn:MultiInstanceLoopCharacteristics", { newLc = moddle.create("bpmn:MultiInstanceLoopCharacteristics", {
isSequential: true isSequential: true
}) })
} else { } else {
multiLoopInstance.value = modelerStore.moddle.create("bpmn:MultiInstanceLoopCharacteristics") newLc = moddle.create("bpmn:MultiInstanceLoopCharacteristics", {
isSequential: false
})
} }
modelerStore.modeling.updateProperties(modelerStore.element, { modeling.updateProperties(element, { loopCharacteristics: newLc })
loopCharacteristics: multiLoopInstance.value
})
} }
// 改变多实例模式 const handleModeChange = () => {
const changeMultiInstanceMode = (mode: string) => { const element = toRaw(modelerStore.element)
if (!multiLoopInstance.value) return const modeling = getModeling()
let condition = null console.log('[multiInstance] handleModeChange, multiInstanceMode:', multiInstanceMode.value)
if (mode === 'counterSign') { console.log('[multiInstance] element:', element?.id)
// 会签: 全部人完成才结束 console.log('[multiInstance] modeling:', modeling)
condition = modelerStore.moddle.create("bpmn:FormalExpression", {
body: '${nrOfCompletedInstances >= nrOfInstances}' if (!modeling || !element) {
}) console.error('[multiInstance] modeling or element is null')
} else if (mode === 'orSign') { return
// 或签: 任一人完成就结束
condition = modelerStore.moddle.create("bpmn:FormalExpression", {
body: '${nrOfActiveInstances == 0}'
})
} }
modelerStore.modeling.updateModdleProperties(modelerStore.element, multiLoopInstance.value, { if (!element.businessObject?.loopCharacteristics) {
completionCondition: condition console.log('[multiInstance] no loopCharacteristics, creating new')
}) handleLoopTypeChange("ParallelMultiInstance")
return
}
const newLc = createLoopCharacteristics()
console.log('[multiInstance] newLc:', newLc)
if (newLc) {
modeling.updateProperties(element, { loopCharacteristics: newLc })
console.log('[multiInstance] updated loopCharacteristics')
}
} }
// 循环基数 const updateLoopCardinality = () => {
const updateLoopCardinality = (cardinality: string) => { const element = toRaw(modelerStore.element)
let loopCardinality = null const modeling = getModeling()
if (cardinality && cardinality.length) {
loopCardinality = modelerStore.moddle.create("bpmn:FormalExpression", { body: cardinality }) if (!modeling || !element) return
if (!element.businessObject?.loopCharacteristics) return
const newLc = createLoopCharacteristics()
if (newLc) {
modeling.updateProperties(element, { loopCharacteristics: newLc })
} }
modelerStore.modeling.updateModdleProperties(modelerStore.element, multiLoopInstance.value, {
loopCardinality
})
} }
// 完成条件 const updateLoopBase = () => {
const updateLoopCondition = (condition: string) => { const element = toRaw(modelerStore.element)
let completionCondition = null const modeling = getModeling()
if (condition && condition.length) {
completionCondition = modelerStore.moddle.create("bpmn:FormalExpression", { body: condition }) if (!modeling || !element) return
if (!element.businessObject?.loopCharacteristics) return
const newLc = createLoopCharacteristics()
if (newLc) {
modeling.updateProperties(element, { loopCharacteristics: newLc })
} }
modelerStore.modeling.updateModdleProperties(modelerStore.element, multiLoopInstance.value, {
completionCondition
})
} }
// 重试周期 const updateLoopCondition = () => {
const updateLoopTimeCycle = (timeCycle: string) => { const element = toRaw(modelerStore.element)
const extensionElements = modelerStore.moddle.create("bpmn:ExtensionElements", { const modeling = getModeling()
if (!modeling || !element) return
if (!element.businessObject?.loopCharacteristics) return
const newLc = createLoopCharacteristics()
if (newLc) {
modeling.updateProperties(element, { loopCharacteristics: newLc })
}
}
const updateLoopAsync = (type: string) => {
const element = toRaw(modelerStore.element)
const modeling = getModeling()
if (!modeling || !element) return
if (!element.businessObject?.loopCharacteristics) return
const newLc = createLoopCharacteristics()
if (newLc) {
modeling.updateProperties(element, { loopCharacteristics: newLc })
}
}
const updateLoopTimeCycle = () => {
const element = toRaw(modelerStore.element)
const modeling = getModeling()
const moddle = getModdle()
if (!modeling || !element || !moddle) return
if (!element.businessObject?.loopCharacteristics) return
const extElements = moddle.create("bpmn:ExtensionElements", {
values: [ values: [
modelerStore.moddle.create(`flowable:FailedJobRetryTimeCycle`, { moddle.create("flowable:FailedJobRetryTimeCycle", {
body: timeCycle body: loopInstanceForm.timeCycle
}) })
] ]
}) })
modelerStore.modeling.updateModdleProperties(modelerStore.element, multiLoopInstance.value, {
extensionElements
})
}
// 直接更新的基础信息 const newLc = createLoopCharacteristics({ extensionElements: extElements })
const updateLoopBase = () => { if (newLc) {
modelerStore.modeling.updateModdleProperties(modelerStore.element, multiLoopInstance.value, { modeling.updateProperties(element, { loopCharacteristics: newLc })
collection: loopInstanceForm.collection || null, }
elementVariable: loopInstanceForm.elementVariable || null
})
} }
// 各异步状态 onMounted(() => {
const updateLoopAsync = (key: string) => { if (props.id) {
const { asyncBefore, asyncAfter } = loopInstanceForm loadElementData()
let asyncAttr: Record<string, any> = {} }
})
if (!asyncBefore && !asyncAfter) { watch(() => props.id, (newId) => {
loopInstanceForm.exclusive = false if (newId) {
asyncAttr = { asyncBefore: false, asyncAfter: false, exclusive: false, extensionElements: null } loadElementData()
} else {
asyncAttr[key] = loopInstanceForm[key]
} }
})
modelerStore.modeling.updateModdleProperties(modelerStore.element, multiLoopInstance.value, asyncAttr) watch(() => modelerStore.element, () => {
} if (props.id) {
loadElementData()
}
})
</script> </script>
<style lang="scss"> <style lang="scss">
.panel-tab__content { .panel-tab__content {
.ant-checkbox-wrapper { .ant-radio-group {
margin-right: 8px; width: 100%;
} }
} }
</style> </style>
\ No newline at end of file
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
@sendWorkFlow="handleDefinitionSend" @sendWorkFlow="handleDefinitionSend"
@endWorkFlow="handleDefinitionEnd" @endWorkFlow="handleDefinitionEnd"
@open-multi-form="handleOpenMultiForm" @open-multi-form="handleOpenMultiForm"
@open-flow-form="handleOpenFlowForm"
:todo-list="todoList" :todo-list="todoList"
/> />
<WorkFlowFormDrawer <WorkFlowFormDrawer
...@@ -152,6 +151,7 @@ ...@@ -152,6 +151,7 @@
if (!data.procInsId) { if (!data.procInsId) {
await handleDefinitionStart(data) await handleDefinitionStart(data)
} }
await setCurrentNodeById(data);
dataId.value = data.id; dataId.value = data.id;
deployId.value = currentNode.value.deployId || ''; deployId.value = currentNode.value.deployId || '';
...@@ -210,7 +210,9 @@ ...@@ -210,7 +210,9 @@
} }
}; };
const handleDrawerClose = () => { drawerVisible.value = false; }; const handleDrawerClose = () => {
drawerVisible.value = false;
};
const handleMultiFormDataUpdate = (_data: any) => { const handleMultiFormDataUpdate = (_data: any) => {
const currentFormComponent = getCurrentFormComponent(); const currentFormComponent = getCurrentFormComponent();
if (currentFormComponent?.handleRefresh) { if (currentFormComponent?.handleRefresh) {
...@@ -245,6 +247,7 @@ ...@@ -245,6 +247,7 @@
} }
async function handleOpenMultiForm(data: any) { async function handleOpenMultiForm(data: any) {
deployId.value = currentNode.value.deployId || ''; deployId.value = currentNode.value.deployId || '';
procInsId.value = data.procInsId || ''; procInsId.value = data.procInsId || '';
drawerVisible.value = true; drawerVisible.value = true;
...@@ -267,9 +270,7 @@ ...@@ -267,9 +270,7 @@
nextTick(() => { nextTick(() => {
if(resData.formUrl) { if(resData.formUrl) {
mainFormUrl.value = resData.formUrl mainFormUrl.value = resData.formUrl
alert(mainFormUrl.value)
mainFormListUrl.value = resData.formListurl || '' mainFormListUrl.value = resData.formListurl || ''
alert(mainFormListUrl.value)
} else { } else {
mainFormUrl.value = "" mainFormUrl.value = ""
refInnerForm.value.iniData(resData) refInnerForm.value.iniData(resData)
...@@ -288,6 +289,15 @@ ...@@ -288,6 +289,15 @@
startTime: undefined, startTime: undefined,
}); });
const setCurrentNodeById = async (nodeId: string) =>{
const nodes = workflowNodes.value;
const index = nodes.findIndex(node => node.id === nodeId);
if (index !== -1) {
currentMultiFormIndex.value = index;
currentNode.value = nodes[index];
}
}
onMounted(async () => { onMounted(async () => {
await nextTick(); await nextTick();
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
import BaosongAllocDrawer from '../form/BaosongAllocDrawer.vue'; import BaosongAllocDrawer from '../form/BaosongAllocDrawer.vue';
const [registerModal, { openModal }] = useModal(); const [registerModal, { openModal }] = useModal();
const refAllocDrawer = ref<InstanceType<typeof BaosongAllocDrawer>>(); const refAllocDrawer = ref();
const { tableContext } = useListPage({ const { tableContext } = useListPage({
tableProps: { tableProps: {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论