|
@@ -0,0 +1,189 @@
|
|
|
+<template>
|
|
|
+ <el-drawer
|
|
|
+ :append-to-body="true"
|
|
|
+ v-model="settingVisible"
|
|
|
+ :show-close="false"
|
|
|
+ :size="550"
|
|
|
+ :before-close="saveConfig"
|
|
|
+ >
|
|
|
+ <template #header>
|
|
|
+ <div class="config-header">
|
|
|
+ <input
|
|
|
+ v-if="showInput"
|
|
|
+ type="text"
|
|
|
+ class="config-editable-input"
|
|
|
+ @blur="blurEvent()"
|
|
|
+ v-mountedFocus
|
|
|
+ v-model="nodeName"
|
|
|
+ :placeholder="nodeName"
|
|
|
+ />
|
|
|
+ <div v-else class="node-name">
|
|
|
+ {{ nodeName }} <Icon class="ml-1" icon="ep:edit-pen" :size="16" @click="clickIcon()" />
|
|
|
+ </div>
|
|
|
+ <div class="divide-line"></div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <div>
|
|
|
+ <el-form ref="formRef" :model="configForm" label-position="top" :rules="formRules">
|
|
|
+ <el-form-item label="延迟时间" prop="delayType">
|
|
|
+ <el-radio-group v-model="configForm.delayType">
|
|
|
+ <el-radio-button
|
|
|
+ v-for="item in DELAY_TYPE"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ />
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item v-if="configForm.delayType === DelayTypeEnum.FIXED_TIME_DURATION">
|
|
|
+ <el-form-item prop="timeDuration">
|
|
|
+ <el-input-number
|
|
|
+ class="mr-2"
|
|
|
+ :style="{ width: '100px' }"
|
|
|
+ v-model="configForm.timeDuration"
|
|
|
+ :min="1"
|
|
|
+ controls-position="right"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-select v-model="configForm.timeUnit" class="mr-2" :style="{ width: '100px' }">
|
|
|
+ <el-option
|
|
|
+ v-for="item in TIME_UNIT_TYPES"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ <el-text>后进入下一节点</el-text>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item v-if="configForm.delayType === DelayTypeEnum.FIXED_DATE_TIME" prop="dateTime">
|
|
|
+ <el-date-picker
|
|
|
+ class="mr-2"
|
|
|
+ v-model="configForm.dateTime"
|
|
|
+ type="datetime"
|
|
|
+ placeholder="请选择日期和时间"
|
|
|
+ value-format="YYYY-MM-DDTHH:mm:ss"
|
|
|
+ />
|
|
|
+ <el-text>后进入下一节点</el-text>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
+ <template #footer>
|
|
|
+ <el-divider />
|
|
|
+ <div>
|
|
|
+ <el-button type="primary" @click="saveConfig">确 定</el-button>
|
|
|
+ <el-button @click="closeDrawer">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-drawer>
|
|
|
+</template>
|
|
|
+<script setup lang="ts">
|
|
|
+import {
|
|
|
+ SimpleFlowNode,
|
|
|
+ NodeType,
|
|
|
+ TIME_UNIT_TYPES,
|
|
|
+ TimeUnitType,
|
|
|
+ DelayTypeEnum,
|
|
|
+ DELAY_TYPE
|
|
|
+} from '../consts'
|
|
|
+import { useWatchNode, useDrawer, useNodeName } from '../node'
|
|
|
+import { convertTimeUnit } from '../utils'
|
|
|
+defineOptions({
|
|
|
+ name: 'DelayTimerNodeConfig'
|
|
|
+})
|
|
|
+const props = defineProps({
|
|
|
+ flowNode: {
|
|
|
+ type: Object as () => SimpleFlowNode,
|
|
|
+ required: true
|
|
|
+ }
|
|
|
+})
|
|
|
+// 抽屉配置
|
|
|
+const { settingVisible, closeDrawer, openDrawer } = useDrawer()
|
|
|
+// 当前节点
|
|
|
+const currentNode = useWatchNode(props)
|
|
|
+// 节点名称
|
|
|
+const { nodeName, showInput, clickIcon, blurEvent } = useNodeName(NodeType.DELAY_TIMER_NODE)
|
|
|
+// 抄送人表单配置
|
|
|
+const formRef = ref() // 表单 Ref
|
|
|
+// 表单校验规则
|
|
|
+const formRules = reactive({
|
|
|
+ delayType: [{ required: true, message: '延迟时间不能为空', trigger: 'change' }],
|
|
|
+ timeDuration: [{ required: true, message: '延迟时间不能为空', trigger: 'change' }],
|
|
|
+ dateTime: [{ required: true, message: '延迟时间不能为空', trigger: 'change' }]
|
|
|
+})
|
|
|
+// 配置表单数据
|
|
|
+const configForm = ref({
|
|
|
+ delayType: DelayTypeEnum.FIXED_TIME_DURATION,
|
|
|
+ timeDuration: 1,
|
|
|
+ timeUnit: TimeUnitType.HOUR,
|
|
|
+ dateTime: ''
|
|
|
+})
|
|
|
+// 保存配置
|
|
|
+const saveConfig = async () => {
|
|
|
+ if (!formRef) return false
|
|
|
+ const valid = await formRef.value.validate()
|
|
|
+ if (!valid) return false
|
|
|
+ const showText = getShowText()
|
|
|
+ if (!showText) return false
|
|
|
+ currentNode.value.showText = showText
|
|
|
+ if (configForm.value.delayType === DelayTypeEnum.FIXED_TIME_DURATION) {
|
|
|
+ currentNode.value.delaySetting = {
|
|
|
+ delayType: configForm.value.delayType,
|
|
|
+ delayTime: getIsoTimeDuration()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (configForm.value.delayType === DelayTypeEnum.FIXED_DATE_TIME) {
|
|
|
+ currentNode.value.delaySetting = {
|
|
|
+ delayType: configForm.value.delayType,
|
|
|
+ delayTime: configForm.value.dateTime
|
|
|
+ }
|
|
|
+ }
|
|
|
+ settingVisible.value = false
|
|
|
+ return true
|
|
|
+}
|
|
|
+const getShowText = (): string => {
|
|
|
+ let showText = ''
|
|
|
+ if (configForm.value.delayType === DelayTypeEnum.FIXED_TIME_DURATION) {
|
|
|
+ showText = `延迟${configForm.value.timeDuration}${TIME_UNIT_TYPES.find((item) => item.value === configForm.value.timeUnit).label}`
|
|
|
+ }
|
|
|
+ if (configForm.value.delayType === DelayTypeEnum.FIXED_DATE_TIME) {
|
|
|
+ showText = `延迟至${configForm.value.dateTime.replace('T', ' ')}`
|
|
|
+ }
|
|
|
+ return showText
|
|
|
+}
|
|
|
+const getIsoTimeDuration = () => {
|
|
|
+ let strTimeDuration = 'PT'
|
|
|
+ if (configForm.value.timeUnit === TimeUnitType.MINUTE) {
|
|
|
+ strTimeDuration += configForm.value.timeDuration + 'M'
|
|
|
+ }
|
|
|
+ if (configForm.value.timeUnit === TimeUnitType.HOUR) {
|
|
|
+ strTimeDuration += configForm.value.timeDuration + 'H'
|
|
|
+ }
|
|
|
+ if (configForm.value.timeUnit === TimeUnitType.DAY) {
|
|
|
+ strTimeDuration += configForm.value.timeDuration + 'D'
|
|
|
+ }
|
|
|
+ return strTimeDuration
|
|
|
+}
|
|
|
+// 显示延迟器节点配置, 由父组件传过来
|
|
|
+const showDelayTimerNodeConfig = (node: SimpleFlowNode) => {
|
|
|
+ nodeName.value = node.name
|
|
|
+ if (node.delaySetting) {
|
|
|
+ configForm.value.delayType = node.delaySetting.delayType
|
|
|
+ // 固定时长
|
|
|
+ if (configForm.value.delayType === DelayTypeEnum.FIXED_TIME_DURATION) {
|
|
|
+ const strTimeDuration = node.delaySetting.delayTime
|
|
|
+ let parseTime = strTimeDuration.slice(2, strTimeDuration.length - 1)
|
|
|
+ let parseTimeUnit = strTimeDuration.slice(strTimeDuration.length - 1)
|
|
|
+ configForm.value.timeDuration = parseInt(parseTime)
|
|
|
+ configForm.value.timeUnit = convertTimeUnit(parseTimeUnit)
|
|
|
+ }
|
|
|
+ // 固定日期时间
|
|
|
+ if (configForm.value.delayType === DelayTypeEnum.FIXED_DATE_TIME) {
|
|
|
+ configForm.value.dateTime = node.delaySetting.delayTime
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+defineExpose({ openDrawer, showDelayTimerNodeConfig }) // 暴露方法给父组件
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped></style>
|