更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/
更多nbcio-boot功能请看演示系统
gitee源代码地址
后端代码: https://gitee.com/nbacheng/nbcio-boot
前端代码:https://gitee.com/nbacheng/nbcio-vue.git
在线演示(包括H5) : http://122.227.135.243:9888
1、原先vue2代码如下:
<template>
<div class="panel-tab__content">
<el-form :model="flowConditionForm" label-width="90px" size="small" @submit.prevent>
<el-form-item label="流转类型">
<el-select v-model="flowConditionForm.type" @change="updateFlowType">
<el-option label="普通流转路径" value="normal" />
<el-option label="默认流转路径" value="default" />
<el-option label="条件流转路径" value="condition" />
</el-select>
</el-form-item>
<el-form-item label="条件格式" v-if="flowConditionForm.type === 'condition'" key="condition">
<el-select v-model="flowConditionForm.conditionType">
<el-option label="表达式" value="expression" />
<el-option label="脚本" value="script" />
</el-select>
</el-form-item>
<el-form-item label="表达式" v-if="flowConditionForm.conditionType && flowConditionForm.conditionType === 'expression'" key="express">
<el-input v-model="flowConditionForm.body" clearable @change="updateFlowCondition" />
</el-form-item>
<template v-if="flowConditionForm.conditionType && flowConditionForm.conditionType === 'script'">
<el-form-item label="脚本语言" key="language">
<el-input v-model="flowConditionForm.language" clearable @change="updateFlowCondition" />
</el-form-item>
<el-form-item label="脚本类型" key="scriptType">
<el-select v-model="flowConditionForm.scriptType">
<el-option label="内联脚本" value="inlineScript" />
<el-option label="外部脚本" value="externalScript" />
</el-select>
</el-form-item>
<el-form-item label="脚本" v-if="flowConditionForm.scriptType === 'inlineScript'" key="body">
<el-input v-model="flowConditionForm.body" type="textarea" clearable @change="updateFlowCondition" />
</el-form-item>
<el-form-item label="资源地址" v-if="flowConditionForm.scriptType === 'externalScript'" key="resource">
<el-input v-model="flowConditionForm.resource" clearable @change="updateFlowCondition" />
</el-form-item>
</template>
</el-form>
</div>
</template>
<script>
export default {
name: 'FlowCondition',
props: {
businessObject: Object,
type: String
},
data() {
return {
flowConditionForm: {}
};
},
watch: {
businessObject: {
immediate: true,
handler() {
this.$nextTick(() => this.resetFlowCondition());
}
}
},
methods: {
resetFlowCondition() {
this.bpmnElement = window.bpmnInstances.bpmnElement;
this.bpmnElementSource = this.bpmnElement.source;
this.bpmnElementSourceRef = this.bpmnElement.businessObject.sourceRef;
if (this.bpmnElementSourceRef && this.bpmnElementSourceRef.default && this.bpmnElementSourceRef.default.id === this.bpmnElement.id) {
// 默认
this.flowConditionForm = { type: 'default' };
} else if (!this.bpmnElement.businessObject.conditionExpression) {
// 普通
this.flowConditionForm = { type: 'normal' };
} else {
// 带条件
const conditionExpression = this.bpmnElement.businessObject.conditionExpression;
this.flowConditionForm = { ...conditionExpression, type: 'condition' };
// resource 可直接标识 是否是外部资源脚本
if (this.flowConditionForm.resource) {
this.flowConditionForm['conditionType'] = 'script'
this.flowConditionForm['scriptType'] = 'externalScript'
return;
}
if (conditionExpression.language) {
this.flowConditionForm['conditionType'] = 'script'
this.flowConditionForm['scriptType'] = 'inlineScript'
return;
}
this.flowConditionForm['conditionType'] = 'expression'
}
},
updateFlowType(flowType) {
// 正常条件类
if (flowType === 'condition') {
this.flowConditionRef = window.bpmnInstances.moddle.create('bpmn:FormalExpression');
window.bpmnInstances.modeling.updateProperties(this.bpmnElement, {
conditionExpression: this.flowConditionRef
});
return;
}
// 默认路径
if (flowType === 'default') {
window.bpmnInstances.modeling.updateProperties(this.bpmnElement, {
conditionExpression: null
});
window.bpmnInstances.modeling.updateProperties(this.bpmnElementSource, {
default: this.bpmnElement
});
return;
}
// 正常路径,如果来源节点的默认路径是当前连线时,清除父元素的默认路径配置
if (this.bpmnElementSourceRef.default && this.bpmnElementSourceRef.default.id === this.bpmnElement.id) {
window.bpmnInstances.modeling.updateProperties(this.bpmnElementSource, {
default: null
});
}
window.bpmnInstances.modeling.updateProperties(this.bpmnElement, {
conditionExpression: null
});
},
updateFlowCondition() {
const { conditionType, scriptType, body, resource, language } = this.flowConditionForm;
let condition;
if (conditionType === 'expression') {
condition = window.bpmnInstances.moddle.create('bpmn:FormalExpression', { body });
} else {
if (scriptType === 'inlineScript') {
condition = window.bpmnInstances.moddle.create('bpmn:FormalExpression', { body, language });
this.flowConditionForm['resource'] = ''
} else {
this.flowConditionForm['body'] = ''
condition = window.bpmnInstances.moddle.create('bpmn:FormalExpression', { resource, language });
}
}
window.bpmnInstances.modeling.updateProperties(this.bpmnElement, { conditionExpression: condition });
}
},
beforeUnmount() {
this.bpmnElement = null;
this.bpmnElementSource = null;
this.bpmnElementSourceRef = null;
}
};
</script>
2、修改成vue3的代码如下:
<template>
<div class="panel-tab__content">
<el-form :model="flowConditionForm" label-width="90px" size="small" @submit.prevent>
<el-form-item label="流转类型">
<el-select v-model="flowConditionForm.type" @change="updateFlowType">
<el-option label="普通流转路径" value="normal" />
<el-option label="默认流转路径" value="default" />
<el-option label="条件流转路径" value="condition" />
</el-select>
</el-form-item>
<el-form-item label="条件格式" v-if="flowConditionForm.type === 'condition'" key="condition">
<el-select v-model="flowConditionForm.conditionType">
<el-option label="表达式" value="expression" />
<el-option label="脚本" value="script" />
</el-select>
</el-form-item>
<el-form-item label="表达式" v-if="flowConditionForm.conditionType && flowConditionForm.conditionType === 'expression'" key="express">
<el-input v-model="flowConditionForm.body" clearable @change="updateFlowCondition" />
</el-form-item>
<template v-if="flowConditionForm.conditionType && flowConditionForm.conditionType === 'script'">
<el-form-item label="脚本语言" key="language">
<el-input v-model="flowConditionForm.language" clearable @change="updateFlowCondition" />
</el-form-item>
<el-form-item label="脚本类型" key="scriptType">
<el-select v-model="flowConditionForm.scriptType">
<el-option label="内联脚本" value="inlineScript" />
<el-option label="外部脚本" value="externalScript" />
</el-select>
</el-form-item>
<el-form-item label="脚本" v-if="flowConditionForm.scriptType === 'inlineScript'" key="body">
<el-input v-model="flowConditionForm.body" type="textarea" clearable @change="updateFlowCondition" />
</el-form-item>
<el-form-item label="资源地址" v-if="flowConditionForm.scriptType === 'externalScript'" key="resource">
<el-input v-model="flowConditionForm.resource" clearable @change="updateFlowCondition" />
</el-form-item>
</template>
</el-form>
</div>
</template>
<script lang="ts" setup>
defineOptions({ name: 'FlowCondition' })
const props = defineProps({
businessObject: Object,
type: String
})
const flowConditionForm = ref<any>({})
const bpmnElement = ref()
const bpmnElementSource = ref()
const bpmnElementSourceRef = ref()
const flowConditionRef = ref()
const bpmnInstances = () => (window as any)?.bpmnInstances
watch(
() => props.businessObject,
(val) => {
nextTick(() => {
resetFlowCondition()
})
},
{
immediate: true
}
)
const resetFlowCondition = () => {
bpmnElement.value = bpmnInstances().bpmnElement
bpmnElementSource.value = bpmnElement.value.source
bpmnElementSourceRef.value = bpmnElement.value.businessObject.sourceRef
if (
bpmnElementSourceRef.value &&
bpmnElementSourceRef.value.default &&
bpmnElementSourceRef.value.default.id === bpmnElement.value.id &&
flowConditionForm.value.type == 'default'
) {
// 默认
flowConditionForm.value = { type: 'default' }
} else if (!bpmnElement.value.businessObject.conditionExpression) {
// 普通
flowConditionForm.value = { type: 'normal' }
} else {
// 带条件
const conditionExpression = bpmnElement.value.businessObject.conditionExpression
flowConditionForm.value = { ...conditionExpression, type: 'condition' }
// resource 可直接标识 是否是外部资源脚本
if (flowConditionForm.value.resource) {
flowConditionForm.value['conditionType'] = 'script'
flowConditionForm.value['scriptType'] = 'externalScript'
return
}
if (conditionExpression.language) {
flowConditionForm.value['conditionType'] = 'script'
flowConditionForm.value['scriptType'] = 'inlineScript'
return
}
flowConditionForm.value['conditionType'] = 'expression'
}
}
const updateFlowType = (flowType) => {
// 正常条件类
if (flowType === 'condition') {
flowConditionRef.value = bpmnInstances().moddle.create('bpmn:FormalExpression')
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
conditionExpression: flowConditionRef.value
})
return
}
// 默认路径
if (flowType === 'default') {
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
conditionExpression: null
})
bpmnInstances().modeling.updateProperties(toRaw(bpmnElementSource.value), {
default: bpmnElement.value
})
return
}
// 正常路径,如果来源节点的默认路径是当前连线时,清除父元素的默认路径配置
if (
bpmnElementSourceRef.value.default &&
bpmnElementSourceRef.value.default.id === bpmnElement.value.id
) {
bpmnInstances().modeling.updateProperties(toRaw(bpmnElementSource.value), {
default: null
})
}
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
conditionExpression: null
})
}
const updateFlowCondition = () => {
let { conditionType, scriptType, body, resource, language } = flowConditionForm.value
let condition
if (conditionType === 'expression') {
condition = bpmnInstances().moddle.create('bpmn:FormalExpression', { body })
} else {
if (scriptType === 'inlineScript') {
condition = bpmnInstances().moddle.create('bpmn:FormalExpression', { body, language })
// this.$set(this.flowConditionForm, "resource", "");
flowConditionForm.value['resource'] = ''
} else {
// this.$set(this.flowConditionForm, "body", "");
flowConditionForm.value['body'] = ''
condition = bpmnInstances().moddle.create('bpmn:FormalExpression', {
resource,
language
})
}
}
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
conditionExpression: condition
})
}
onBeforeUnmount(() => {
bpmnElement.value = null
bpmnElementSource.value = null
bpmnElementSourceRef.value = null
})
</script>
3、效果图如下: