feat: bpm设计器适配simple设计器,超时审批
parent
be33226178
commit
97b1ac6ad3
|
@ -1329,6 +1329,34 @@
|
|||
"isAttr": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "BoundaryEventType",
|
||||
"superClass": ["Element"],
|
||||
"meta": {
|
||||
"allowedIn": ["bpmn:BoundaryEvent"]
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"name": "value",
|
||||
"type": "Integer",
|
||||
"isBody": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "TimeoutHandlerType",
|
||||
"superClass": ["Element"],
|
||||
"meta": {
|
||||
"allowedIn": ["bpmn:BoundaryEvent"]
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"name": "value",
|
||||
"type": "Integer",
|
||||
"isBody": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"emumerations": []
|
||||
|
|
|
@ -1,13 +1,252 @@
|
|||
<template>
|
||||
<div>
|
||||
定时边界事件(非中断)
|
||||
<el-divider content-position="left">审批人超时未处理时</el-divider>
|
||||
<el-form-item label="启用开关" prop="timeoutHandlerEnable">
|
||||
<el-switch
|
||||
v-model="timeoutHandlerEnable"
|
||||
active-text="开启"
|
||||
inactive-text="关闭"
|
||||
@change="timeoutHandlerChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="执行动作" prop="timeoutHandlerType" v-if="timeoutHandlerEnable">
|
||||
<el-radio-group v-model="timeoutHandlerType.value" @change="onTimeoutHandlerTypeChanged">
|
||||
<el-radio-button
|
||||
v-for="item in TIMEOUT_HANDLER_TYPES"
|
||||
:key="item.value"
|
||||
:value="item.value"
|
||||
:label="item.label"
|
||||
/>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="超时时间设置" v-if="timeoutHandlerEnable">
|
||||
<span class="mr-2">当超过</span>
|
||||
<el-form-item prop="timeDuration">
|
||||
<el-input-number
|
||||
class="mr-2"
|
||||
:style="{ width: '100px' }"
|
||||
v-model="timeDuration"
|
||||
:min="1"
|
||||
controls-position="right"
|
||||
@change="() => updateTimeModdle()"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-select
|
||||
v-model="timeUnit"
|
||||
class="mr-2"
|
||||
:style="{ width: '100px' }"
|
||||
@change="onTimeUnitChange"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in TIME_UNIT_TYPES"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
未处理
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="最大提醒次数"
|
||||
prop="maxRemindCount"
|
||||
v-if="timeoutHandlerEnable && timeoutHandlerType.value === 1"
|
||||
>
|
||||
<el-input-number
|
||||
v-model="maxRemindCount"
|
||||
:min="1"
|
||||
:max="10"
|
||||
@change="() => updateTimeModdle()"
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
// TODO 未来继续完善
|
||||
import {
|
||||
TimeUnitType,
|
||||
TIME_UNIT_TYPES,
|
||||
TIMEOUT_HANDLER_TYPES,
|
||||
} from '@/components/SimpleProcessDesignerV2/src/consts'
|
||||
import { convertTimeUnit } from '@/components/SimpleProcessDesignerV2/src/utils'
|
||||
|
||||
defineOptions({ name: 'ElementCustomConfig4BoundaryEventTimer' })
|
||||
const props = defineProps({
|
||||
id: String,
|
||||
type: String
|
||||
})
|
||||
const prefix = inject('prefix')
|
||||
|
||||
const bpmnElement = ref()
|
||||
const bpmnInstances = () => (window as any)?.bpmnInstances
|
||||
|
||||
const timeoutHandlerEnable = ref(false)
|
||||
const boundaryEventType = ref()
|
||||
const timeoutHandlerType = ref({
|
||||
value: undefined
|
||||
})
|
||||
const timeModdle = ref()
|
||||
const timeDuration = ref(6)
|
||||
const timeUnit = ref(TimeUnitType.HOUR)
|
||||
const maxRemindCount = ref(1)
|
||||
|
||||
const elExtensionElements = ref()
|
||||
const otherExtensions = ref()
|
||||
const configExtensions = ref([])
|
||||
const eventDefinition = ref()
|
||||
|
||||
const resetElement = () => {
|
||||
bpmnElement.value = bpmnInstances().bpmnElement
|
||||
eventDefinition.value = bpmnElement.value.businessObject.eventDefinitions[0]
|
||||
|
||||
// 获取元素扩展属性 或者 创建扩展属性
|
||||
elExtensionElements.value =
|
||||
bpmnElement.value.businessObject?.extensionElements ??
|
||||
bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: [] })
|
||||
|
||||
// 是否开启自定义用户任务超时处理
|
||||
boundaryEventType.value = elExtensionElements.value.values?.filter(
|
||||
(ex) => ex.$type === `${prefix}:BoundaryEventType`
|
||||
)?.[0]
|
||||
if (boundaryEventType.value && boundaryEventType.value.value === 1) {
|
||||
timeoutHandlerEnable.value = true
|
||||
configExtensions.value.push(boundaryEventType.value)
|
||||
}
|
||||
|
||||
// 执行动作
|
||||
timeoutHandlerType.value = elExtensionElements.value.values?.filter(
|
||||
(ex) => ex.$type === `${prefix}:TimeoutHandlerType`
|
||||
)?.[0]
|
||||
if (timeoutHandlerType.value) {
|
||||
configExtensions.value.push(timeoutHandlerType.value)
|
||||
if (eventDefinition.value.timeCycle) {
|
||||
const timeStr = eventDefinition.value.timeCycle.body
|
||||
const maxRemindCountStr = timeStr.split('/')[0]
|
||||
const timeDurationStr = timeStr.split('/')[1]
|
||||
console.log(maxRemindCountStr)
|
||||
maxRemindCount.value = parseInt(maxRemindCountStr.slice(1))
|
||||
timeDuration.value = parseInt(timeDurationStr.slice(2, timeDurationStr.length - 1))
|
||||
timeUnit.value = convertTimeUnit(timeDurationStr.slice(timeDurationStr.length - 1))
|
||||
timeModdle.value = eventDefinition.value.timeCycle
|
||||
}
|
||||
if (eventDefinition.value.timeDuration) {
|
||||
const timeDurationStr = eventDefinition.value.timeDuration.body
|
||||
timeDuration.value = parseInt(timeDurationStr.slice(2, timeDurationStr.length - 1))
|
||||
timeUnit.value = convertTimeUnit(timeDurationStr.slice(timeDurationStr.length - 1))
|
||||
timeModdle.value = eventDefinition.value.timeDuration
|
||||
}
|
||||
}
|
||||
|
||||
// 保留剩余扩展元素,便于后面更新该元素对应属性
|
||||
otherExtensions.value =
|
||||
elExtensionElements.value.values?.filter(
|
||||
(ex) =>
|
||||
ex.$type !== `${prefix}:BoundaryEventType` && ex.$type !== `${prefix}:TimeoutHandlerType`
|
||||
) ?? []
|
||||
}
|
||||
|
||||
const timeoutHandlerChange = (val) => {
|
||||
timeoutHandlerEnable.value = val
|
||||
if (val) {
|
||||
// 启用自定义用户任务超时处理
|
||||
// 边界事件类型 --- 超时
|
||||
boundaryEventType.value = bpmnInstances().moddle.create(`${prefix}:BoundaryEventType`, {
|
||||
value: 1
|
||||
})
|
||||
configExtensions.value.push(boundaryEventType.value)
|
||||
// 超时处理类型
|
||||
timeoutHandlerType.value = bpmnInstances().moddle.create(`${prefix}:TimeoutHandlerType`, {
|
||||
value: 1
|
||||
})
|
||||
configExtensions.value.push(timeoutHandlerType.value)
|
||||
// 超时时间表达式
|
||||
timeDuration.value = 6
|
||||
timeUnit.value = 2
|
||||
maxRemindCount.value = 1
|
||||
timeModdle.value = bpmnInstances().moddle.create(`bpmn:Expression`, {
|
||||
body: 'PT6H'
|
||||
})
|
||||
eventDefinition.value.timeDuration = timeModdle.value
|
||||
} else {
|
||||
// 关闭自定义用户任务超时处理
|
||||
configExtensions.value = []
|
||||
delete eventDefinition.value.timeDuration
|
||||
delete eventDefinition.value.timeCycle
|
||||
}
|
||||
updateElementExtensions()
|
||||
}
|
||||
|
||||
const onTimeoutHandlerTypeChanged = () => {
|
||||
maxRemindCount.value = 1
|
||||
updateElementExtensions()
|
||||
updateTimeModdle()
|
||||
}
|
||||
|
||||
const onTimeUnitChange = () => {
|
||||
// 分钟,默认是 60 分钟
|
||||
if (timeUnit.value === TimeUnitType.MINUTE) {
|
||||
timeDuration.value = 60
|
||||
}
|
||||
// 小时,默认是 6 个小时
|
||||
if (timeUnit.value === TimeUnitType.HOUR) {
|
||||
timeDuration.value = 6
|
||||
}
|
||||
// 天, 默认 1天
|
||||
if (timeUnit.value === TimeUnitType.DAY) {
|
||||
timeDuration.value = 1
|
||||
}
|
||||
updateTimeModdle()
|
||||
}
|
||||
|
||||
const updateTimeModdle = () => {
|
||||
if (maxRemindCount.value > 1) {
|
||||
timeModdle.value.body = 'R' + maxRemindCount.value + '/' + isoTimeDuration()
|
||||
if (!eventDefinition.value.timeCycle) {
|
||||
delete eventDefinition.value.timeDuration
|
||||
eventDefinition.value.timeCycle = timeModdle.value
|
||||
}
|
||||
} else {
|
||||
timeModdle.value.body = isoTimeDuration()
|
||||
if (!eventDefinition.value.timeDuration) {
|
||||
delete eventDefinition.value.timeCycle
|
||||
eventDefinition.value.timeDuration = timeModdle.value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const isoTimeDuration = () => {
|
||||
let strTimeDuration = 'PT'
|
||||
if (timeUnit.value === TimeUnitType.MINUTE) {
|
||||
strTimeDuration += timeDuration.value + 'M'
|
||||
}
|
||||
if (timeUnit.value === TimeUnitType.HOUR) {
|
||||
strTimeDuration += timeDuration.value + 'H'
|
||||
}
|
||||
if (timeUnit.value === TimeUnitType.DAY) {
|
||||
strTimeDuration += timeDuration.value + 'D'
|
||||
}
|
||||
return strTimeDuration
|
||||
}
|
||||
|
||||
const updateElementExtensions = () => {
|
||||
const extensions = bpmnInstances().moddle.create('bpmn:ExtensionElements', {
|
||||
values: [...otherExtensions.value, ...configExtensions.value]
|
||||
})
|
||||
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
|
||||
extensionElements: extensions
|
||||
})
|
||||
}
|
||||
|
||||
watch(
|
||||
() => props.id,
|
||||
(val) => {
|
||||
val &&
|
||||
val.length &&
|
||||
nextTick(() => {
|
||||
resetElement()
|
||||
})
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
|
Loading…
Reference in New Issue