|
@@ -3,7 +3,7 @@
|
|
:append-to-body="true"
|
|
:append-to-body="true"
|
|
v-model="settingVisible"
|
|
v-model="settingVisible"
|
|
:show-close="false"
|
|
:show-close="false"
|
|
- :size="550"
|
|
|
|
|
|
+ :size="580"
|
|
:before-close="saveConfig"
|
|
:before-close="saveConfig"
|
|
class="justify-start"
|
|
class="justify-start"
|
|
>
|
|
>
|
|
@@ -19,12 +19,13 @@
|
|
:placeholder="nodeName"
|
|
:placeholder="nodeName"
|
|
/>
|
|
/>
|
|
<div v-else class="node-name">
|
|
<div v-else class="node-name">
|
|
- {{ nodeName }} <Icon class="ml-1" icon="ep:edit-pen" :size="16" @click="clickIcon()" />
|
|
|
|
|
|
+ {{ nodeName }}
|
|
|
|
+ <Icon class="ml-1" icon="ep:edit-pen" :size="16" @click="clickIcon()" />
|
|
</div>
|
|
</div>
|
|
<div class="divide-line"></div>
|
|
<div class="divide-line"></div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
- <div class="flex flex-items-center mb-3">
|
|
|
|
|
|
+ <div v-if="currentNode.type === NodeType.USER_TASK_NODE" class="flex flex-items-center mb-3">
|
|
<span class="font-size-16px mr-3">审批类型 :</span>
|
|
<span class="font-size-16px mr-3">审批类型 :</span>
|
|
<el-radio-group v-model="approveType">
|
|
<el-radio-group v-model="approveType">
|
|
<el-radio
|
|
<el-radio
|
|
@@ -38,22 +39,21 @@
|
|
</el-radio-group>
|
|
</el-radio-group>
|
|
</div>
|
|
</div>
|
|
<el-tabs type="border-card" v-model="activeTabName" v-if="approveType === ApproveType.USER">
|
|
<el-tabs type="border-card" v-model="activeTabName" v-if="approveType === ApproveType.USER">
|
|
- <el-tab-pane label="审批人" name="user">
|
|
|
|
|
|
+ <el-tab-pane :label="`${nodeTypeName}人`" name="user">
|
|
<div>
|
|
<div>
|
|
<el-form ref="formRef" :model="configForm" label-position="top" :rules="formRules">
|
|
<el-form ref="formRef" :model="configForm" label-position="top" :rules="formRules">
|
|
- <el-form-item label="审批人设置" prop="candidateStrategy">
|
|
|
|
|
|
+ <el-form-item :label="`${nodeTypeName}人设置`" prop="candidateStrategy">
|
|
<el-radio-group
|
|
<el-radio-group
|
|
v-model="configForm.candidateStrategy"
|
|
v-model="configForm.candidateStrategy"
|
|
@change="changeCandidateStrategy"
|
|
@change="changeCandidateStrategy"
|
|
>
|
|
>
|
|
- <el-radio
|
|
|
|
- v-for="(dict, index) in CANDIDATE_STRATEGY"
|
|
|
|
- :key="index"
|
|
|
|
- :value="dict.value"
|
|
|
|
- :label="dict.value"
|
|
|
|
- >
|
|
|
|
- {{ dict.label }}
|
|
|
|
- </el-radio>
|
|
|
|
|
|
+ <el-row>
|
|
|
|
+ <el-col v-for="(dict, index) in CANDIDATE_STRATEGY" :key="index" :span="8">
|
|
|
|
+ <el-radio :value="dict.value" :label="dict.value">
|
|
|
|
+ {{ dict.label }}
|
|
|
|
+ </el-radio>
|
|
|
|
+ </el-col>
|
|
|
|
+ </el-row>
|
|
</el-radio-group>
|
|
</el-radio-group>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item
|
|
<el-form-item
|
|
@@ -61,7 +61,13 @@
|
|
label="指定角色"
|
|
label="指定角色"
|
|
prop="roleIds"
|
|
prop="roleIds"
|
|
>
|
|
>
|
|
- <el-select v-model="configForm.roleIds" clearable multiple style="width: 100%">
|
|
|
|
|
|
+ <el-select
|
|
|
|
+ filterable
|
|
|
|
+ v-model="configForm.roleIds"
|
|
|
|
+ clearable
|
|
|
|
+ multiple
|
|
|
|
+ style="width: 100%"
|
|
|
|
+ >
|
|
<el-option
|
|
<el-option
|
|
v-for="item in roleOptions"
|
|
v-for="item in roleOptions"
|
|
:key="item.id"
|
|
:key="item.id"
|
|
@@ -99,7 +105,13 @@
|
|
prop="postIds"
|
|
prop="postIds"
|
|
span="24"
|
|
span="24"
|
|
>
|
|
>
|
|
- <el-select v-model="configForm.postIds" clearable multiple style="width: 100%">
|
|
|
|
|
|
+ <el-select
|
|
|
|
+ filterable
|
|
|
|
+ v-model="configForm.postIds"
|
|
|
|
+ clearable
|
|
|
|
+ multiple
|
|
|
|
+ style="width: 100%"
|
|
|
|
+ >
|
|
<el-option
|
|
<el-option
|
|
v-for="item in postOptions"
|
|
v-for="item in postOptions"
|
|
:key="item.id"
|
|
:key="item.id"
|
|
@@ -114,7 +126,13 @@
|
|
prop="userIds"
|
|
prop="userIds"
|
|
span="24"
|
|
span="24"
|
|
>
|
|
>
|
|
- <el-select v-model="configForm.userIds" clearable multiple style="width: 100%">
|
|
|
|
|
|
+ <el-select
|
|
|
|
+ filterable
|
|
|
|
+ v-model="configForm.userIds"
|
|
|
|
+ clearable
|
|
|
|
+ multiple
|
|
|
|
+ style="width: 100%"
|
|
|
|
+ >
|
|
<el-option
|
|
<el-option
|
|
v-for="item in userOptions"
|
|
v-for="item in userOptions"
|
|
:key="item.id"
|
|
:key="item.id"
|
|
@@ -128,7 +146,13 @@
|
|
label="指定用户组"
|
|
label="指定用户组"
|
|
prop="userGroups"
|
|
prop="userGroups"
|
|
>
|
|
>
|
|
- <el-select v-model="configForm.userGroups" clearable multiple style="width: 100%">
|
|
|
|
|
|
+ <el-select
|
|
|
|
+ filterable
|
|
|
|
+ v-model="configForm.userGroups"
|
|
|
|
+ clearable
|
|
|
|
+ multiple
|
|
|
|
+ style="width: 100%"
|
|
|
|
+ >
|
|
<el-option
|
|
<el-option
|
|
v-for="item in userGroupOptions"
|
|
v-for="item in userGroupOptions"
|
|
:key="item.id"
|
|
:key="item.id"
|
|
@@ -142,13 +166,13 @@
|
|
label="表单内用户字段"
|
|
label="表单内用户字段"
|
|
prop="formUser"
|
|
prop="formUser"
|
|
>
|
|
>
|
|
- <el-select v-model="configForm.formUser" clearable style="width: 100%">
|
|
|
|
|
|
+ <el-select filterable v-model="configForm.formUser" clearable style="width: 100%">
|
|
<el-option
|
|
<el-option
|
|
v-for="(item, idx) in userFieldOnFormOptions"
|
|
v-for="(item, idx) in userFieldOnFormOptions"
|
|
:key="idx"
|
|
:key="idx"
|
|
:label="item.title"
|
|
:label="item.title"
|
|
:value="item.field"
|
|
:value="item.field"
|
|
- :disabled ="!item.required"
|
|
|
|
|
|
+ :disabled="!item.required"
|
|
/>
|
|
/>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -157,13 +181,13 @@
|
|
label="表单内部门字段"
|
|
label="表单内部门字段"
|
|
prop="formDept"
|
|
prop="formDept"
|
|
>
|
|
>
|
|
- <el-select v-model="configForm.formDept" clearable style="width: 100%">
|
|
|
|
|
|
+ <el-select filterable v-model="configForm.formDept" clearable style="width: 100%">
|
|
<el-option
|
|
<el-option
|
|
v-for="(item, idx) in deptFieldOnFormOptions"
|
|
v-for="(item, idx) in deptFieldOnFormOptions"
|
|
:key="idx"
|
|
:key="idx"
|
|
:label="item.title"
|
|
:label="item.title"
|
|
:value="item.field"
|
|
:value="item.field"
|
|
- :disabled ="!item.required"
|
|
|
|
|
|
+ :disabled="!item.required"
|
|
/>
|
|
/>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -179,7 +203,7 @@
|
|
prop="deptLevel"
|
|
prop="deptLevel"
|
|
span="24"
|
|
span="24"
|
|
>
|
|
>
|
|
- <el-select v-model="configForm.deptLevel" clearable>
|
|
|
|
|
|
+ <el-select filterable v-model="configForm.deptLevel" clearable>
|
|
<el-option
|
|
<el-option
|
|
v-for="(item, index) in MULTI_LEVEL_DEPT"
|
|
v-for="(item, index) in MULTI_LEVEL_DEPT"
|
|
:key="index"
|
|
:key="index"
|
|
@@ -201,7 +225,7 @@
|
|
style="width: 100%"
|
|
style="width: 100%"
|
|
/>
|
|
/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="多人审批方式" prop="approveMethod">
|
|
|
|
|
|
+ <el-form-item :label="`多人${nodeTypeName}方式`" prop="approveMethod">
|
|
<el-radio-group v-model="configForm.approveMethod" @change="approveMethodChanged">
|
|
<el-radio-group v-model="configForm.approveMethod" @change="approveMethodChanged">
|
|
<div class="flex-col">
|
|
<div class="flex-col">
|
|
<div
|
|
<div
|
|
@@ -230,92 +254,102 @@
|
|
</el-radio-group>
|
|
</el-radio-group>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
|
|
|
- <el-divider content-position="left">审批人拒绝时</el-divider>
|
|
|
|
- <el-form-item prop="rejectHandlerType">
|
|
|
|
- <el-radio-group v-model="configForm.rejectHandlerType">
|
|
|
|
- <div class="flex-col">
|
|
|
|
- <div v-for="(item, index) in REJECT_HANDLER_TYPES" :key="index">
|
|
|
|
- <el-radio :key="item.value" :value="item.value" :label="item.label" />
|
|
|
|
|
|
+ <div v-if="currentNode.type === NodeType.USER_TASK_NODE">
|
|
|
|
+ <el-divider content-position="left">审批人拒绝时</el-divider>
|
|
|
|
+ <el-form-item prop="rejectHandlerType">
|
|
|
|
+ <el-radio-group v-model="configForm.rejectHandlerType">
|
|
|
|
+ <div class="flex-col">
|
|
|
|
+ <div v-for="(item, index) in REJECT_HANDLER_TYPES" :key="index">
|
|
|
|
+ <el-radio :key="item.value" :value="item.value" :label="item.label" />
|
|
|
|
+ </div>
|
|
</div>
|
|
</div>
|
|
- </div>
|
|
|
|
- </el-radio-group>
|
|
|
|
- </el-form-item>
|
|
|
|
- <el-form-item
|
|
|
|
- v-if="configForm.rejectHandlerType == RejectHandlerType.RETURN_USER_TASK"
|
|
|
|
- label="驳回节点"
|
|
|
|
- prop="returnNodeId"
|
|
|
|
- >
|
|
|
|
- <el-select v-model="configForm.returnNodeId" clearable style="width: 100%">
|
|
|
|
- <el-option
|
|
|
|
- v-for="item in returnTaskList"
|
|
|
|
- :key="item.id"
|
|
|
|
- :label="item.name"
|
|
|
|
- :value="item.id"
|
|
|
|
- />
|
|
|
|
- </el-select>
|
|
|
|
- </el-form-item>
|
|
|
|
-
|
|
|
|
- <el-divider content-position="left">审批人超时未处理时</el-divider>
|
|
|
|
- <el-form-item label="启用开关" prop="timeoutHandlerEnable">
|
|
|
|
- <el-switch
|
|
|
|
- v-model="configForm.timeoutHandlerEnable"
|
|
|
|
- active-text="开启"
|
|
|
|
- inactive-text="关闭"
|
|
|
|
- @change="timeoutHandlerChange"
|
|
|
|
- />
|
|
|
|
- </el-form-item>
|
|
|
|
- <el-form-item
|
|
|
|
- label="执行动作"
|
|
|
|
- prop="timeoutHandlerType"
|
|
|
|
- v-if="configForm.timeoutHandlerEnable"
|
|
|
|
- >
|
|
|
|
- <el-radio-group
|
|
|
|
- v-model="configForm.timeoutHandlerType"
|
|
|
|
- @change="timeoutHandlerTypeChanged"
|
|
|
|
|
|
+ </el-radio-group>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item
|
|
|
|
+ v-if="configForm.rejectHandlerType == RejectHandlerType.RETURN_USER_TASK"
|
|
|
|
+ label="驳回节点"
|
|
|
|
+ prop="returnNodeId"
|
|
>
|
|
>
|
|
- <el-radio-button
|
|
|
|
- v-for="item in TIMEOUT_HANDLER_TYPES"
|
|
|
|
- :key="item.value"
|
|
|
|
- :value="item.value"
|
|
|
|
- :label="item.label"
|
|
|
|
|
|
+ <el-select
|
|
|
|
+ filterable
|
|
|
|
+ v-model="configForm.returnNodeId"
|
|
|
|
+ clearable
|
|
|
|
+ style="width: 100%"
|
|
|
|
+ >
|
|
|
|
+ <el-option
|
|
|
|
+ v-for="item in returnTaskList"
|
|
|
|
+ :key="item.id"
|
|
|
|
+ :label="item.name"
|
|
|
|
+ :value="item.id"
|
|
|
|
+ />
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div v-if="currentNode.type === NodeType.USER_TASK_NODE">
|
|
|
|
+ <el-divider content-position="left">审批人超时未处理时</el-divider>
|
|
|
|
+ <el-form-item label="启用开关" prop="timeoutHandlerEnable">
|
|
|
|
+ <el-switch
|
|
|
|
+ v-model="configForm.timeoutHandlerEnable"
|
|
|
|
+ active-text="开启"
|
|
|
|
+ inactive-text="关闭"
|
|
|
|
+ @change="timeoutHandlerChange"
|
|
/>
|
|
/>
|
|
- </el-radio-group>
|
|
|
|
- </el-form-item>
|
|
|
|
- <el-form-item label="超时时间设置" v-if="configForm.timeoutHandlerEnable">
|
|
|
|
- <span class="mr-2">当超过</span>
|
|
|
|
- <el-form-item prop="timeDuration">
|
|
|
|
- <el-input-number
|
|
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item
|
|
|
|
+ label="执行动作"
|
|
|
|
+ prop="timeoutHandlerType"
|
|
|
|
+ v-if="configForm.timeoutHandlerEnable"
|
|
|
|
+ >
|
|
|
|
+ <el-radio-group
|
|
|
|
+ v-model="configForm.timeoutHandlerType"
|
|
|
|
+ @change="timeoutHandlerTypeChanged"
|
|
|
|
+ >
|
|
|
|
+ <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="configForm.timeoutHandlerEnable">
|
|
|
|
+ <span class="mr-2">当超过</span>
|
|
|
|
+ <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
|
|
|
|
+ filterable
|
|
|
|
+ v-model="timeUnit"
|
|
class="mr-2"
|
|
class="mr-2"
|
|
:style="{ width: '100px' }"
|
|
:style="{ width: '100px' }"
|
|
- v-model="configForm.timeDuration"
|
|
|
|
- :min="1"
|
|
|
|
- controls-position="right"
|
|
|
|
- />
|
|
|
|
|
|
+ @change="timeUnitChange"
|
|
|
|
+ >
|
|
|
|
+ <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>
|
|
- <el-select
|
|
|
|
- v-model="timeUnit"
|
|
|
|
- class="mr-2"
|
|
|
|
- :style="{ width: '100px' }"
|
|
|
|
- @change="timeUnitChange"
|
|
|
|
|
|
+ <el-form-item
|
|
|
|
+ label="最大提醒次数"
|
|
|
|
+ prop="maxRemindCount"
|
|
|
|
+ v-if="configForm.timeoutHandlerEnable && configForm.timeoutHandlerType === 1"
|
|
>
|
|
>
|
|
- <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="configForm.timeoutHandlerEnable && configForm.timeoutHandlerType === 1"
|
|
|
|
- >
|
|
|
|
- <el-input-number v-model="configForm.maxRemindCount" :min="1" :max="10" />
|
|
|
|
- </el-form-item>
|
|
|
|
|
|
+ <el-input-number v-model="configForm.maxRemindCount" :min="1" :max="10" />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </div>
|
|
|
|
|
|
- <el-divider content-position="left">审批人为空时</el-divider>
|
|
|
|
|
|
+ <el-divider content-position="left">{{ nodeTypeName }}人为空时</el-divider>
|
|
<el-form-item prop="assignEmptyHandlerType">
|
|
<el-form-item prop="assignEmptyHandlerType">
|
|
<el-radio-group v-model="configForm.assignEmptyHandlerType">
|
|
<el-radio-group v-model="configForm.assignEmptyHandlerType">
|
|
<div class="flex-col">
|
|
<div class="flex-col">
|
|
@@ -332,6 +366,7 @@
|
|
span="24"
|
|
span="24"
|
|
>
|
|
>
|
|
<el-select
|
|
<el-select
|
|
|
|
+ filterable
|
|
v-model="configForm.assignEmptyHandlerUserIds"
|
|
v-model="configForm.assignEmptyHandlerUserIds"
|
|
clearable
|
|
clearable
|
|
multiple
|
|
multiple
|
|
@@ -346,20 +381,44 @@
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
|
|
|
- <el-divider content-position="left">审批人与提交人为同一人时</el-divider>
|
|
|
|
- <el-form-item prop="assignStartUserHandlerType">
|
|
|
|
- <el-radio-group v-model="configForm.assignStartUserHandlerType">
|
|
|
|
- <div class="flex-col">
|
|
|
|
- <div v-for="(item, index) in ASSIGN_START_USER_HANDLER_TYPES" :key="index">
|
|
|
|
- <el-radio :key="item.value" :value="item.value" :label="item.label" />
|
|
|
|
|
|
+ <div v-if="currentNode.type === NodeType.USER_TASK_NODE">
|
|
|
|
+ <el-divider content-position="left">审批人与提交人为同一人时</el-divider>
|
|
|
|
+ <el-form-item prop="assignStartUserHandlerType">
|
|
|
|
+ <el-radio-group v-model="configForm.assignStartUserHandlerType">
|
|
|
|
+ <div class="flex-col">
|
|
|
|
+ <div v-for="(item, index) in ASSIGN_START_USER_HANDLER_TYPES" :key="index">
|
|
|
|
+ <el-radio :key="item.value" :value="item.value" :label="item.label" />
|
|
|
|
+ </div>
|
|
</div>
|
|
</div>
|
|
- </div>
|
|
|
|
- </el-radio-group>
|
|
|
|
- </el-form-item>
|
|
|
|
|
|
+ </el-radio-group>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div v-if="currentNode.type === NodeType.USER_TASK_NODE">
|
|
|
|
+ <el-divider content-position="left">是否需要签名</el-divider>
|
|
|
|
+ <el-form-item prop="signEnable">
|
|
|
|
+ <el-switch v-model="configForm.signEnable" active-text="是" inactive-text="否" />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div v-if="currentNode.type === NodeType.USER_TASK_NODE">
|
|
|
|
+ <el-divider content-position="left">审批意见</el-divider>
|
|
|
|
+ <el-form-item prop="reasonRequire">
|
|
|
|
+ <el-switch
|
|
|
|
+ v-model="configForm.reasonRequire"
|
|
|
|
+ active-text="必填"
|
|
|
|
+ inactive-text="非必填"
|
|
|
|
+ />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </div>
|
|
</el-form>
|
|
</el-form>
|
|
</div>
|
|
</div>
|
|
</el-tab-pane>
|
|
</el-tab-pane>
|
|
- <el-tab-pane label="操作按钮设置" name="buttons">
|
|
|
|
|
|
+ <el-tab-pane
|
|
|
|
+ label="操作按钮设置"
|
|
|
|
+ v-if="currentNode.type === NodeType.USER_TASK_NODE"
|
|
|
|
+ name="buttons"
|
|
|
|
+ >
|
|
<div class="button-setting-pane">
|
|
<div class="button-setting-pane">
|
|
<div class="button-setting-desc">操作按钮</div>
|
|
<div class="button-setting-desc">操作按钮</div>
|
|
<div class="button-setting-title">
|
|
<div class="button-setting-title">
|
|
@@ -395,9 +454,15 @@
|
|
<div class="field-permit-title">
|
|
<div class="field-permit-title">
|
|
<div class="setting-title-label first-title"> 字段名称 </div>
|
|
<div class="setting-title-label first-title"> 字段名称 </div>
|
|
<div class="other-titles">
|
|
<div class="other-titles">
|
|
- <span class="setting-title-label">只读</span>
|
|
|
|
- <span class="setting-title-label">可编辑</span>
|
|
|
|
- <span class="setting-title-label">隐藏</span>
|
|
|
|
|
|
+ <span class="setting-title-label cursor-pointer" @click="updatePermission('READ')">
|
|
|
|
+ 只读
|
|
|
|
+ </span>
|
|
|
|
+ <span class="setting-title-label cursor-pointer" @click="updatePermission('WRITE')">
|
|
|
|
+ 可编辑
|
|
|
|
+ </span>
|
|
|
|
+ <span class="setting-title-label cursor-pointer" @click="updatePermission('NONE')">
|
|
|
|
+ 隐藏
|
|
|
|
+ </span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div
|
|
<div
|
|
@@ -435,6 +500,13 @@
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</el-tab-pane>
|
|
</el-tab-pane>
|
|
|
|
+ <el-tab-pane label="监听器" name="listener">
|
|
|
|
+ <UserTaskListener
|
|
|
|
+ ref="userTaskListenerRef"
|
|
|
|
+ v-model="configForm"
|
|
|
|
+ :form-field-options="formFieldOptions"
|
|
|
|
+ />
|
|
|
|
+ </el-tab-pane>
|
|
</el-tabs>
|
|
</el-tabs>
|
|
<template #footer>
|
|
<template #footer>
|
|
<el-divider />
|
|
<el-divider />
|
|
@@ -470,7 +542,8 @@ import {
|
|
ASSIGN_EMPTY_HANDLER_TYPES,
|
|
ASSIGN_EMPTY_HANDLER_TYPES,
|
|
AssignEmptyHandlerType,
|
|
AssignEmptyHandlerType,
|
|
FieldPermissionType,
|
|
FieldPermissionType,
|
|
- ProcessVariableEnum
|
|
|
|
|
|
+ ProcessVariableEnum,
|
|
|
|
+ TRANSACTOR_DEFAULT_BUTTON_SETTING
|
|
} from '../consts'
|
|
} from '../consts'
|
|
|
|
|
|
import {
|
|
import {
|
|
@@ -484,6 +557,7 @@ import {
|
|
import { defaultProps } from '@/utils/tree'
|
|
import { defaultProps } from '@/utils/tree'
|
|
import { cloneDeep } from 'lodash-es'
|
|
import { cloneDeep } from 'lodash-es'
|
|
import { convertTimeUnit, getApproveTypeText } from '../utils'
|
|
import { convertTimeUnit, getApproveTypeText } from '../utils'
|
|
|
|
+import UserTaskListener from './components/UserTaskListener.vue'
|
|
defineOptions({
|
|
defineOptions({
|
|
name: 'UserTaskNodeConfig'
|
|
name: 'UserTaskNodeConfig'
|
|
})
|
|
})
|
|
@@ -572,7 +646,7 @@ const {
|
|
handleCandidateParam,
|
|
handleCandidateParam,
|
|
parseCandidateParam,
|
|
parseCandidateParam,
|
|
getShowText
|
|
getShowText
|
|
-} = useNodeForm(NodeType.USER_TASK_NODE)
|
|
|
|
|
|
+} = useNodeForm(currentNode.value.type)
|
|
const configForm = tempConfigForm as Ref<UserTaskFormType>
|
|
const configForm = tempConfigForm as Ref<UserTaskFormType>
|
|
|
|
|
|
// 改变审批人设置策略
|
|
// 改变审批人设置策略
|
|
@@ -609,9 +683,16 @@ const {
|
|
cTimeoutMaxRemindCount
|
|
cTimeoutMaxRemindCount
|
|
} = useTimeoutHandler()
|
|
} = useTimeoutHandler()
|
|
|
|
|
|
-// 保存配置
|
|
|
|
|
|
+const userTaskListenerRef = ref()
|
|
|
|
+
|
|
|
|
+/** 节点类型名称 */
|
|
|
|
+const nodeTypeName = computed(() => {
|
|
|
|
+ return currentNode.value.type === NodeType.TRANSACTOR_NODE ? '办理' : '审批'
|
|
|
|
+})
|
|
|
|
+
|
|
|
|
+/** 保存配置 */
|
|
const saveConfig = async () => {
|
|
const saveConfig = async () => {
|
|
- activeTabName.value = 'user'
|
|
|
|
|
|
+ // activeTabName.value = 'user'
|
|
// 设置审批节点名称
|
|
// 设置审批节点名称
|
|
currentNode.value.name = nodeName.value!
|
|
currentNode.value.name = nodeName.value!
|
|
// 设置审批类型
|
|
// 设置审批类型
|
|
@@ -624,7 +705,8 @@ const saveConfig = async () => {
|
|
}
|
|
}
|
|
|
|
|
|
if (!formRef) return false
|
|
if (!formRef) return false
|
|
- const valid = await formRef.value.validate()
|
|
|
|
|
|
+ if (!userTaskListenerRef) return false
|
|
|
|
+ const valid = (await formRef.value.validate()) && (await userTaskListenerRef.value.validate())
|
|
if (!valid) return false
|
|
if (!valid) return false
|
|
const showText = getShowText()
|
|
const showText = getShowText()
|
|
if (!showText) return false
|
|
if (!showText) return false
|
|
@@ -663,13 +745,38 @@ const saveConfig = async () => {
|
|
currentNode.value.fieldsPermission = fieldsPermissionConfig.value
|
|
currentNode.value.fieldsPermission = fieldsPermissionConfig.value
|
|
// 设置按钮权限
|
|
// 设置按钮权限
|
|
currentNode.value.buttonsSetting = buttonsSetting.value
|
|
currentNode.value.buttonsSetting = buttonsSetting.value
|
|
|
|
+ // 创建任务监听器
|
|
|
|
+ currentNode.value.taskCreateListener = {
|
|
|
|
+ enable: configForm.value.taskCreateListenerEnable ?? false,
|
|
|
|
+ path: configForm.value.taskCreateListenerPath,
|
|
|
|
+ header: configForm.value.taskCreateListener?.header,
|
|
|
|
+ body: configForm.value.taskCreateListener?.body
|
|
|
|
+ }
|
|
|
|
+ // 指派任务监听器
|
|
|
|
+ currentNode.value.taskAssignListener = {
|
|
|
|
+ enable: configForm.value.taskAssignListenerEnable ?? false,
|
|
|
|
+ path: configForm.value.taskAssignListenerPath,
|
|
|
|
+ header: configForm.value.taskAssignListener?.header,
|
|
|
|
+ body: configForm.value.taskAssignListener?.body
|
|
|
|
+ }
|
|
|
|
+ // 完成任务监听器
|
|
|
|
+ currentNode.value.taskCompleteListener = {
|
|
|
|
+ enable: configForm.value.taskCompleteListenerEnable ?? false,
|
|
|
|
+ path: configForm.value.taskCompleteListenerPath,
|
|
|
|
+ header: configForm.value.taskCompleteListener?.header,
|
|
|
|
+ body: configForm.value.taskCompleteListener?.body
|
|
|
|
+ }
|
|
|
|
+ // 签名
|
|
|
|
+ currentNode.value.signEnable = configForm.value.signEnable
|
|
|
|
+ // 审批意见
|
|
|
|
+ currentNode.value.reasonRequire = configForm.value.reasonRequire
|
|
|
|
|
|
currentNode.value.showText = showText
|
|
currentNode.value.showText = showText
|
|
settingVisible.value = false
|
|
settingVisible.value = false
|
|
return true
|
|
return true
|
|
}
|
|
}
|
|
|
|
|
|
-// 显示审批节点配置, 由父组件传过来
|
|
|
|
|
|
+/** 显示审批节点配置, 由父组件传过来 */
|
|
const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
|
|
const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
|
|
nodeName.value = node.name
|
|
nodeName.value = node.name
|
|
// 1 审批类型
|
|
// 1 审批类型
|
|
@@ -689,13 +796,13 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
|
|
configForm.value.approveRatio = node.approveRatio!
|
|
configForm.value.approveRatio = node.approveRatio!
|
|
}
|
|
}
|
|
// 2.3 设置审批拒绝处理
|
|
// 2.3 设置审批拒绝处理
|
|
- configForm.value.rejectHandlerType = node.rejectHandler!.type
|
|
|
|
|
|
+ configForm.value.rejectHandlerType = node.rejectHandler?.type
|
|
configForm.value.returnNodeId = node.rejectHandler?.returnNodeId
|
|
configForm.value.returnNodeId = node.rejectHandler?.returnNodeId
|
|
const matchNodeList = []
|
|
const matchNodeList = []
|
|
emits('find:returnTaskNodes', matchNodeList)
|
|
emits('find:returnTaskNodes', matchNodeList)
|
|
returnTaskList.value = matchNodeList
|
|
returnTaskList.value = matchNodeList
|
|
// 2.4 设置审批超时处理
|
|
// 2.4 设置审批超时处理
|
|
- configForm.value.timeoutHandlerEnable = node.timeoutHandler!.enable
|
|
|
|
|
|
+ configForm.value.timeoutHandlerEnable = node.timeoutHandler?.enable
|
|
if (node.timeoutHandler?.enable && node.timeoutHandler?.timeDuration) {
|
|
if (node.timeoutHandler?.enable && node.timeoutHandler?.timeDuration) {
|
|
const strTimeDuration = node.timeoutHandler.timeDuration
|
|
const strTimeDuration = node.timeoutHandler.timeDuration
|
|
let parseTime = strTimeDuration.slice(2, strTimeDuration.length - 1)
|
|
let parseTime = strTimeDuration.slice(2, strTimeDuration.length - 1)
|
|
@@ -711,16 +818,44 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
|
|
// 2.6 设置用户任务的审批人与发起人相同时
|
|
// 2.6 设置用户任务的审批人与发起人相同时
|
|
configForm.value.assignStartUserHandlerType = node.assignStartUserHandlerType
|
|
configForm.value.assignStartUserHandlerType = node.assignStartUserHandlerType
|
|
// 3. 操作按钮设置
|
|
// 3. 操作按钮设置
|
|
- buttonsSetting.value = cloneDeep(node.buttonsSetting) || DEFAULT_BUTTON_SETTING
|
|
|
|
|
|
+ buttonsSetting.value =
|
|
|
|
+ cloneDeep(node.buttonsSetting) ||
|
|
|
|
+ (node.type === NodeType.TRANSACTOR_NODE
|
|
|
|
+ ? TRANSACTOR_DEFAULT_BUTTON_SETTING
|
|
|
|
+ : DEFAULT_BUTTON_SETTING)
|
|
// 4. 表单字段权限配置
|
|
// 4. 表单字段权限配置
|
|
getNodeConfigFormFields(node.fieldsPermission)
|
|
getNodeConfigFormFields(node.fieldsPermission)
|
|
|
|
+ // 5. 监听器
|
|
|
|
+ // 5.1 创建任务
|
|
|
|
+ configForm.value.taskCreateListenerEnable = node.taskCreateListener?.enable
|
|
|
|
+ configForm.value.taskCreateListenerPath = node.taskCreateListener?.path
|
|
|
|
+ configForm.value.taskCreateListener = {
|
|
|
|
+ header: node.taskCreateListener?.header ?? [],
|
|
|
|
+ body: node.taskCreateListener?.body ?? []
|
|
|
|
+ }
|
|
|
|
+ // 5.2 指派任务
|
|
|
|
+ configForm.value.taskAssignListenerEnable = node.taskAssignListener?.enable
|
|
|
|
+ configForm.value.taskAssignListenerPath = node.taskAssignListener?.path
|
|
|
|
+ configForm.value.taskAssignListener = {
|
|
|
|
+ header: node.taskAssignListener?.header ?? [],
|
|
|
|
+ body: node.taskAssignListener?.body ?? []
|
|
|
|
+ }
|
|
|
|
+ // 5.3 完成任务
|
|
|
|
+ configForm.value.taskCompleteListenerEnable = node.taskCompleteListener?.enable
|
|
|
|
+ configForm.value.taskCompleteListenerPath = node.taskCompleteListener?.path
|
|
|
|
+ configForm.value.taskCompleteListener = {
|
|
|
|
+ header: node.taskCompleteListener?.header ?? [],
|
|
|
|
+ body: node.taskCompleteListener?.body ?? []
|
|
|
|
+ }
|
|
|
|
+ // 6. 签名
|
|
|
|
+ configForm.value.signEnable = node?.signEnable ?? false
|
|
|
|
+ // 7. 审批意见
|
|
|
|
+ configForm.value.reasonRequire = node?.reasonRequire ?? false
|
|
}
|
|
}
|
|
|
|
|
|
defineExpose({ openDrawer, showUserTaskNodeConfig }) // 暴露方法给父组件
|
|
defineExpose({ openDrawer, showUserTaskNodeConfig }) // 暴露方法给父组件
|
|
|
|
|
|
-/**
|
|
|
|
- * @description 操作按钮设置
|
|
|
|
- */
|
|
|
|
|
|
+/** 操作按钮设置 */
|
|
function useButtonsSetting() {
|
|
function useButtonsSetting() {
|
|
const buttonsSetting = ref<ButtonSetting[]>()
|
|
const buttonsSetting = ref<ButtonSetting[]>()
|
|
// 操作按钮显示名称可编辑
|
|
// 操作按钮显示名称可编辑
|
|
@@ -741,9 +876,7 @@ function useButtonsSetting() {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-/**
|
|
|
|
- * @description 审批人超时未处理配置
|
|
|
|
- */
|
|
|
|
|
|
+/** 审批人超时未处理配置 */
|
|
function useTimeoutHandler() {
|
|
function useTimeoutHandler() {
|
|
// 时间单位
|
|
// 时间单位
|
|
const timeUnit = ref(TimeUnitType.HOUR)
|
|
const timeUnit = ref(TimeUnitType.HOUR)
|
|
@@ -826,6 +959,18 @@ function useTimeoutHandler() {
|
|
cTimeoutMaxRemindCount
|
|
cTimeoutMaxRemindCount
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+/** 批量更新权限 */
|
|
|
|
+const updatePermission = (type: string) => {
|
|
|
|
+ fieldsPermissionConfig.value.forEach((field) => {
|
|
|
|
+ field.permission =
|
|
|
|
+ type === 'READ'
|
|
|
|
+ ? FieldPermissionType.READ
|
|
|
|
+ : type === 'WRITE'
|
|
|
|
+ ? FieldPermissionType.WRITE
|
|
|
|
+ : FieldPermissionType.NONE
|
|
|
|
+ })
|
|
|
|
+}
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
<style lang="scss" scoped>
|