Skip to content

Commit 50df1f3

Browse files
YunaiVgitee-org
authored andcommitted
!713 feat: 子流程-超时设置
Merge pull request !713 from Lesan/feature/bpm-子流程
2 parents b0d839a + dc577fc commit 50df1f3

File tree

3 files changed

+148
-13
lines changed

3 files changed

+148
-13
lines changed

src/components/SimpleProcessDesignerV2/src/NodeHandler.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,9 @@ const addNode = (type: number) => {
303303
skipStartUserNode: false,
304304
startUserSetting: {
305305
type: 1
306+
},
307+
timeoutSetting: {
308+
enable: false
306309
}
307310
}
308311
}

src/components/SimpleProcessDesignerV2/src/consts.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -815,22 +815,26 @@ export const TRIGGER_TYPES: DictDataVO[] = [
815815
export type ChildProcessSetting = {
816816
calledProcessDefinitionKey: string
817817
calledProcessDefinitionName: string
818-
async: boolean
819-
inVariables?: IOParameter[]
820-
outVariables?: IOParameter[]
821-
skipStartUserNode: boolean
822-
startUserSetting: StartUserSetting
818+
async: boolean,
819+
inVariables?: IOParameter[],
820+
outVariables?: IOParameter[],
821+
skipStartUserNode: boolean,
822+
startUserSetting: StartUserSetting,
823+
timeoutSetting: TimeoutSetting,
823824
}
824-
825825
export type IOParameter = {
826826
source: string
827827
sourceExpression: string
828828
target: string
829829
targetExpression: string
830830
}
831-
832831
export type StartUserSetting = {
833832
type: number
834833
formField?: string
835834
emptyType?: number
836835
}
836+
export type TimeoutSetting = {
837+
enable: boolean,
838+
type?: DelayTypeEnum,
839+
timeExpression?: string,
840+
}

src/components/SimpleProcessDesignerV2/src/nodes-config/ChildProcessNodeConfig.vue

Lines changed: 134 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,60 @@
192192
/>
193193
</el-select>
194194
</el-form-item>
195+
196+
<el-divider content-position="left">超时设置</el-divider>
197+
<el-form-item label="启用开关" prop="timeoutEnable">
198+
<el-switch
199+
v-model="configForm.timeoutEnable"
200+
active-text="开启"
201+
inactive-text="关闭"
202+
/>
203+
</el-form-item>
204+
<div v-if="configForm.timeoutEnable">
205+
<el-form-item prop="timeoutType">
206+
<el-radio-group v-model="configForm.timeoutType">
207+
<el-radio-button
208+
v-for="item in DELAY_TYPE"
209+
:key="item.value"
210+
:label="item.label"
211+
:value="item.value"
212+
/>
213+
</el-radio-group>
214+
</el-form-item>
215+
<el-form-item v-if="configForm.timeoutType === DelayTypeEnum.FIXED_TIME_DURATION">
216+
<el-form-item prop="timeDuration">
217+
<el-input-number
218+
class="mr-2"
219+
:style="{ width: '100px' }"
220+
v-model="configForm.timeDuration"
221+
:min="1"
222+
controls-position="right"
223+
/>
224+
</el-form-item>
225+
<el-select v-model="configForm.timeUnit" class="mr-2" :style="{ width: '100px' }">
226+
<el-option
227+
v-for="item in TIME_UNIT_TYPES"
228+
:key="item.value"
229+
:label="item.label"
230+
:value="item.value"
231+
/>
232+
</el-select>
233+
<el-text>后进入下一节点</el-text>
234+
</el-form-item>
235+
<el-form-item
236+
v-if="configForm.timeoutType === DelayTypeEnum.FIXED_DATE_TIME"
237+
prop="dateTime"
238+
>
239+
<el-date-picker
240+
class="mr-2"
241+
v-model="configForm.dateTime"
242+
type="datetime"
243+
placeholder="请选择日期和时间"
244+
value-format="YYYY-MM-DDTHH:mm:ss"
245+
/>
246+
<el-text>后进入下一节点</el-text>
247+
</el-form-item>
248+
</div>
195249
</el-form>
196250
</div>
197251
</el-tab-pane>
@@ -208,10 +262,17 @@
208262
<script setup lang="ts">
209263
import { getModelList } from '@/api/bpm/model'
210264
import { getForm } from '@/api/bpm/form'
211-
import { SimpleFlowNode, NodeType } from '../consts'
265+
import {
266+
SimpleFlowNode,
267+
NodeType,
268+
TIME_UNIT_TYPES,
269+
TimeUnitType,
270+
DelayTypeEnum,
271+
DELAY_TYPE
272+
} from '../consts'
212273
import { useWatchNode, useDrawer, useNodeName, useFormFieldsAndStartUser } from '../node'
213274
import { parseFormFields } from '@/components/FormCreate/src/utils'
214-
275+
import { convertTimeUnit } from '../utils'
215276
defineOptions({
216277
name: 'ChildProcessNodeConfig'
217278
})
@@ -242,16 +303,26 @@ const formRules = reactive({
242303
startUserEmptyType: [
243304
{ required: true, message: '当子流程发起人为空时不能为空', trigger: 'change' }
244305
],
245-
startUserFormField: [{ required: true, message: '发起人表单不能为空', trigger: 'change' }]
306+
startUserFormField: [{ required: true, message: '发起人表单不能为空', trigger: 'change' }],
307+
timeoutEnable: [{ required: true, message: '超时设置是否开启不能为空', trigger: 'change' }],
308+
timeoutType: [{ required: true, message: '超时设置时间不能为空', trigger: 'change' }],
309+
timeDuration: [{ required: true, message: '超时设置时间不能为空', trigger: 'change' }],
310+
dateTime: [{ required: true, message: '超时设置时间不能为空', trigger: 'change' }]
246311
})
247312
const configForm = ref({
313+
async: false,
248314
calledProcessDefinitionKey: '',
249315
skipStartUserNode: false,
250316
inVariables: [],
251317
outVariables: [],
252318
startUserType: 1,
253319
startUserEmptyType: 1,
254-
startUserFormField: ''
320+
startUserFormField: '',
321+
timeoutEnable: false,
322+
timeoutType: DelayTypeEnum.FIXED_TIME_DURATION,
323+
timeDuration: 1,
324+
timeUnit: TimeUnitType.HOUR,
325+
dateTime: ''
255326
})
256327
const childProcessOptions = ref()
257328
const formFieldOptions = useFormFieldsAndStartUser()
@@ -269,18 +340,39 @@ const saveConfig = async () => {
269340
)
270341
currentNode.value.name = nodeName.value!
271342
if (currentNode.value.childProcessSetting) {
343+
// 1. 是否异步
272344
currentNode.value.childProcessSetting.async = configForm.value.async
345+
// 2. 调用流程
273346
currentNode.value.childProcessSetting.calledProcessDefinitionKey = childInfo.key
274347
currentNode.value.childProcessSetting.calledProcessDefinitionName = childInfo.name
348+
// 3. 是否跳过发起人
275349
currentNode.value.childProcessSetting.skipStartUserNode = configForm.value.skipStartUserNode
350+
// 4. 主->子变量
276351
currentNode.value.childProcessSetting.inVariables = configForm.value.inVariables
352+
// 5. 子->主变量
277353
currentNode.value.childProcessSetting.outVariables = configForm.value.outVariables
354+
// 6. 发起人设置
278355
currentNode.value.childProcessSetting.startUserSetting.type = configForm.value.startUserType
279356
currentNode.value.childProcessSetting.startUserSetting.emptyType =
280357
configForm.value.startUserEmptyType
281358
currentNode.value.childProcessSetting.startUserSetting.formField =
282359
configForm.value.startUserFormField
360+
// 7. 超时设置
361+
currentNode.value.childProcessSetting.timeoutSetting = {
362+
enable: configForm.value.timeoutEnable
363+
}
364+
if (configForm.value.timeoutEnable) {
365+
currentNode.value.childProcessSetting.timeoutSetting.type = configForm.value.timeoutType
366+
if (configForm.value.timeoutType === DelayTypeEnum.FIXED_TIME_DURATION) {
367+
currentNode.value.childProcessSetting.timeoutSetting.timeExpression = getIsoTimeDuration()
368+
}
369+
if (configForm.value.timeoutType === DelayTypeEnum.FIXED_DATE_TIME) {
370+
currentNode.value.childProcessSetting.timeoutSetting.timeExpression =
371+
configForm.value.dateTime
372+
}
373+
}
283374
}
375+
284376
currentNode.value.showText = `调用子流程:${childInfo.name}`
285377
settingVisible.value = false
286378
return true
@@ -290,15 +382,39 @@ const saveConfig = async () => {
290382
const showChildProcessNodeConfig = (node: SimpleFlowNode) => {
291383
nodeName.value = node.name
292384
if (node.childProcessSetting) {
385+
// 1. 是否异步
293386
configForm.value.async = node.childProcessSetting.async
387+
// 2. 调用流程
294388
configForm.value.calledProcessDefinitionKey =
295-
node.childProcessSetting.calledProcessDefinitionKey
389+
node.childProcessSetting?.calledProcessDefinitionKey
390+
// 3. 是否跳过发起人
296391
configForm.value.skipStartUserNode = node.childProcessSetting.skipStartUserNode
392+
// 4. 主->子变量
297393
configForm.value.inVariables = node.childProcessSetting.inVariables
394+
// 5. 子->主变量
298395
configForm.value.outVariables = node.childProcessSetting.outVariables
396+
// 6. 发起人设置
299397
configForm.value.startUserType = node.childProcessSetting.startUserSetting.type
300398
configForm.value.startUserEmptyType = node.childProcessSetting.startUserSetting.emptyType ?? 1
301399
configForm.value.startUserFormField = node.childProcessSetting.startUserSetting.formField ?? ''
400+
// 7. 超时设置
401+
configForm.value.timeoutEnable = node.childProcessSetting.timeoutSetting.enable ?? false
402+
if (configForm.value.timeoutEnable) {
403+
configForm.value.timeoutType =
404+
node.childProcessSetting.timeoutSetting.type ?? DelayTypeEnum.FIXED_TIME_DURATION
405+
// 固定时长
406+
if (configForm.value.timeoutType === DelayTypeEnum.FIXED_TIME_DURATION) {
407+
const strTimeDuration = node.childProcessSetting.timeoutSetting.timeExpression ?? ''
408+
let parseTime = strTimeDuration.slice(2, strTimeDuration.length - 1)
409+
let parseTimeUnit = strTimeDuration.slice(strTimeDuration.length - 1)
410+
configForm.value.timeDuration = parseInt(parseTime)
411+
configForm.value.timeUnit = convertTimeUnit(parseTimeUnit)
412+
}
413+
// 固定日期时间
414+
if (configForm.value.timeoutType === DelayTypeEnum.FIXED_DATE_TIME) {
415+
configForm.value.dateTime = node.childProcessSetting.timeoutSetting.timeExpression ?? ''
416+
}
417+
}
302418
}
303419
loadFormInfo()
304420
}
@@ -331,7 +447,19 @@ const loadFormInfo = async () => {
331447
parseFormFields(JSON.parse(fieldStr), childFormFieldOptions.value)
332448
})
333449
}
334-
console.log(childFormFieldOptions.value)
450+
}
451+
const getIsoTimeDuration = () => {
452+
let strTimeDuration = 'PT'
453+
if (configForm.value.timeUnit === TimeUnitType.MINUTE) {
454+
strTimeDuration += configForm.value.timeDuration + 'M'
455+
}
456+
if (configForm.value.timeUnit === TimeUnitType.HOUR) {
457+
strTimeDuration += configForm.value.timeDuration + 'H'
458+
}
459+
if (configForm.value.timeUnit === TimeUnitType.DAY) {
460+
strTimeDuration += configForm.value.timeDuration + 'D'
461+
}
462+
return strTimeDuration
335463
}
336464
337465
onMounted(async () => {

0 commit comments

Comments
 (0)