mirror of
https://gitee.com/hhyykk/ipms-sjy-ui.git
synced 2025-07-30 10:44:07 +08:00
仿钉钉流程设计器- 删除第1版,新增连续多级部分负责人策略
This commit is contained in:
@@ -146,9 +146,9 @@ onMounted(async () => {
|
||||
processNodeTree.value = {
|
||||
name: '开始',
|
||||
type: NodeType.START_EVENT_NODE,
|
||||
id: 'StartEvent_1', // TODO @jason:这个我们要不要 StartEvent 哈?
|
||||
id: 'StartEvent',
|
||||
childNode: {
|
||||
id: 'EndEvent_1',
|
||||
id: 'EndEvent',
|
||||
name: '结束',
|
||||
type: NodeType.END_EVENT_NODE
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
// @ts-ignore
|
||||
import { DictDataVO } from '@/api/system/dict/types'
|
||||
|
||||
/**
|
||||
* 节点类型
|
||||
*/
|
||||
@@ -85,13 +86,17 @@ export enum CandidateStrategy {
|
||||
*/
|
||||
ROLE = 10,
|
||||
/**
|
||||
* 指定部门成员
|
||||
* 部门成员
|
||||
*/
|
||||
DEPT_MEMBER = 20,
|
||||
/**
|
||||
* 部门的负责人
|
||||
*/
|
||||
DEPT_LEADER = 21,
|
||||
/**
|
||||
* 连续多级部门的负责人
|
||||
*/
|
||||
MULTI_LEVEL_DEPT_LEADER = 23,
|
||||
/**
|
||||
* 指定岗位
|
||||
*/
|
||||
@@ -108,6 +113,14 @@ export enum CandidateStrategy {
|
||||
* 发起人自己
|
||||
*/
|
||||
START_USER = 36,
|
||||
/**
|
||||
* 发起人部门负责人
|
||||
*/
|
||||
START_USER_DEPT_LEADER = 37,
|
||||
/**
|
||||
* 发起人连续多级部门的负责人
|
||||
*/
|
||||
START_USER_MULTI_LEVEL_DEPT_LEADER = 38,
|
||||
/**
|
||||
* 指定用户组
|
||||
*/
|
||||
@@ -280,6 +293,21 @@ NODE_DEFAULT_NAME.set(NodeType.USER_TASK_NODE, '审批人')
|
||||
NODE_DEFAULT_NAME.set(NodeType.COPY_TASK_NODE, '抄送人')
|
||||
NODE_DEFAULT_NAME.set(NodeType.CONDITION_NODE, '条件')
|
||||
|
||||
// 候选人策略。暂时不从字典中取。 后续可能调整。控制显示顺序
|
||||
export const CANDIDATE_STRATEGY: DictDataVO[] = [
|
||||
{ label: '指定成员', value: CandidateStrategy.USER },
|
||||
{ label: '指定角色', value: CandidateStrategy.ROLE },
|
||||
{ label: '部门成员', value: CandidateStrategy.DEPT_MEMBER },
|
||||
{ label: '部门负责人', value: CandidateStrategy.DEPT_LEADER },
|
||||
{ label: '连续多级部门负责人', value: CandidateStrategy.MULTI_LEVEL_DEPT_LEADER },
|
||||
{ label: '发起人自选', value: CandidateStrategy.START_USER_SELECT },
|
||||
{ label: '发起人本人', value: CandidateStrategy.START_USER },
|
||||
{ label: '发起人部门负责人', value: CandidateStrategy.START_USER_DEPT_LEADER },
|
||||
{ label: '发起人连续部门负责人', value: CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER },
|
||||
{ label: '用户组', value: CandidateStrategy.USER_GROUP },
|
||||
{ label: '流程表达式', value: CandidateStrategy.EXPRESSION }
|
||||
]
|
||||
|
||||
export const APPROVE_METHODS: DictDataVO[] = [
|
||||
{ label: '随机挑选一人审批', value: ApproveMethodType.RRANDOM_SELECT_ONE_APPROVE },
|
||||
{ label: '多人会签(按通过比例%)', value: ApproveMethodType.APPROVE_BY_RATIO },
|
||||
@@ -355,3 +383,21 @@ export const DEFAULT_BUTTON_SETTING: ButtonSetting[] = [
|
||||
{ id: OpsButtonType.ADD_SIGN, displayName: '加签', enable: false },
|
||||
{ id: OpsButtonType.RETURN, displayName: '回退', enable: false }
|
||||
]
|
||||
|
||||
export const MULTI_LEVEL_DEPT: DictDataVO = [
|
||||
{ label: '第1级部门', value: 1 },
|
||||
{ label: '第2级部门', value: 2 },
|
||||
{ label: '第3级部门', value: 3 },
|
||||
{ label: '第4级部门', value: 4 },
|
||||
{ label: '第5级部门', value: 5 },
|
||||
{ label: '第6级部门', value: 6 },
|
||||
{ label: '第7级部门', value: 7 },
|
||||
{ label: '第8级部门', value: 8 },
|
||||
{ label: '第9级部门', value: 9 },
|
||||
{ label: '第10级部门', value: 10 },
|
||||
{ label: '第11级部门', value: 11 },
|
||||
{ label: '第12级部门', value: 12 },
|
||||
{ label: '第13级部门', value: 13 },
|
||||
{ label: '第14级部门', value: 14 },
|
||||
{ label: '第15级部门', value: 15 }
|
||||
]
|
||||
|
@@ -89,9 +89,16 @@ export function useFormFieldsPermission() {
|
||||
}
|
||||
|
||||
export type UserTaskFormType = {
|
||||
candidateParamArray: any[]
|
||||
//candidateParamArray: any[]
|
||||
candidateStrategy: CandidateStrategy
|
||||
approveMethod: ApproveMethodType
|
||||
roleIds?: number[] // 角色
|
||||
deptIds?: number[] // 部门
|
||||
deptLevel?: number // 部门层级
|
||||
userIds?: number[] // 用户
|
||||
userGroups?: number[] // 用户组
|
||||
postIds?: number[] // 岗位
|
||||
expression?: string // 流程表达式
|
||||
approveRatio?: number
|
||||
rejectHandlerType?: RejectHandlerType
|
||||
returnNodeId?: string
|
||||
@@ -103,8 +110,15 @@ export type UserTaskFormType = {
|
||||
}
|
||||
|
||||
export type CopyTaskFormType = {
|
||||
candidateParamArray: any[]
|
||||
// candidateParamArray: any[]
|
||||
candidateStrategy: CandidateStrategy
|
||||
roleIds?: number[] // 角色
|
||||
deptIds?: number[] // 部门
|
||||
deptLevel?: number // 部门层级
|
||||
userIds?: number[] // 用户
|
||||
userGroups?: number[] // 用户组
|
||||
postIds?: number[] // 岗位
|
||||
expression?: string // 流程表达式
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -120,7 +134,7 @@ export function useNodeForm(nodeType: NodeType) {
|
||||
const configForm = ref<UserTaskFormType | CopyTaskFormType>()
|
||||
if (nodeType === NodeType.USER_TASK_NODE) {
|
||||
configForm.value = {
|
||||
candidateParamArray: [],
|
||||
//candidateParamArray: [],
|
||||
candidateStrategy: CandidateStrategy.USER,
|
||||
approveMethod: ApproveMethodType.RRANDOM_SELECT_ONE_APPROVE,
|
||||
approveRatio: 100,
|
||||
@@ -134,7 +148,7 @@ export function useNodeForm(nodeType: NodeType) {
|
||||
}
|
||||
} else {
|
||||
configForm.value = {
|
||||
candidateParamArray: [],
|
||||
//candidateParamArray: [],
|
||||
candidateStrategy: CandidateStrategy.USER
|
||||
}
|
||||
}
|
||||
@@ -143,10 +157,10 @@ export function useNodeForm(nodeType: NodeType) {
|
||||
let showText = ''
|
||||
// 指定成员
|
||||
if (configForm.value?.candidateStrategy === CandidateStrategy.USER) {
|
||||
if (configForm.value.candidateParamArray?.length > 0) {
|
||||
if (configForm.value?.userIds!.length > 0) {
|
||||
const candidateNames: string[] = []
|
||||
userOptions?.value.forEach((item) => {
|
||||
if (configForm.value?.candidateParamArray.includes(item.id)) {
|
||||
if (configForm.value?.userIds!.includes(item.id)) {
|
||||
candidateNames.push(item.nickname)
|
||||
}
|
||||
})
|
||||
@@ -155,10 +169,10 @@ export function useNodeForm(nodeType: NodeType) {
|
||||
}
|
||||
// 指定角色
|
||||
if (configForm.value?.candidateStrategy === CandidateStrategy.ROLE) {
|
||||
if (configForm.value.candidateParamArray?.length > 0) {
|
||||
if (configForm.value.roleIds!.length > 0) {
|
||||
const candidateNames: string[] = []
|
||||
roleOptions?.value.forEach((item) => {
|
||||
if (configForm.value?.candidateParamArray.includes(item.id)) {
|
||||
if (configForm.value?.roleIds!.includes(item.id)) {
|
||||
candidateNames.push(item.name)
|
||||
}
|
||||
})
|
||||
@@ -168,29 +182,32 @@ export function useNodeForm(nodeType: NodeType) {
|
||||
// 指定部门
|
||||
if (
|
||||
configForm.value?.candidateStrategy === CandidateStrategy.DEPT_MEMBER ||
|
||||
configForm.value?.candidateStrategy === CandidateStrategy.DEPT_LEADER
|
||||
configForm.value?.candidateStrategy === CandidateStrategy.DEPT_LEADER ||
|
||||
configForm.value?.candidateStrategy === CandidateStrategy.MULTI_LEVEL_DEPT_LEADER
|
||||
) {
|
||||
if (configForm.value?.candidateParamArray?.length > 0) {
|
||||
if (configForm.value?.deptIds!.length > 0) {
|
||||
const candidateNames: string[] = []
|
||||
deptOptions?.value.forEach((item) => {
|
||||
if (configForm.value?.candidateParamArray.includes(item.id)) {
|
||||
if (configForm.value?.deptIds!.includes(item.id!)) {
|
||||
candidateNames.push(item.name)
|
||||
}
|
||||
})
|
||||
if (configForm.value.candidateStrategy === CandidateStrategy.DEPT_MEMBER) {
|
||||
showText = `部门成员:${candidateNames.join(',')}`
|
||||
} else {
|
||||
} else if (configForm.value.candidateStrategy === CandidateStrategy.DEPT_LEADER) {
|
||||
showText = `部门的负责人:${candidateNames.join(',')}`
|
||||
} else {
|
||||
showText = `多级部门的负责人:${candidateNames.join(',')}`
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 指定岗位
|
||||
if (configForm.value?.candidateStrategy === CandidateStrategy.POST) {
|
||||
if (configForm.value.candidateParamArray?.length > 0) {
|
||||
if (configForm.value.postIds!.length > 0) {
|
||||
const candidateNames: string[] = []
|
||||
postOptions?.value.forEach((item) => {
|
||||
if (configForm.value?.candidateParamArray.includes(item.id)) {
|
||||
if (configForm.value?.postIds!.includes(item.id!)) {
|
||||
candidateNames.push(item.name)
|
||||
}
|
||||
})
|
||||
@@ -199,10 +216,10 @@ export function useNodeForm(nodeType: NodeType) {
|
||||
}
|
||||
// 指定用户组
|
||||
if (configForm.value?.candidateStrategy === CandidateStrategy.USER_GROUP) {
|
||||
if (configForm.value?.candidateParamArray?.length > 0) {
|
||||
if (configForm.value?.userGroups!.length > 0) {
|
||||
const candidateNames: string[] = []
|
||||
userGroupOptions?.value.forEach((item) => {
|
||||
if (configForm.value?.candidateParamArray.includes(item.id)) {
|
||||
if (configForm.value?.userGroups!.includes(item.id)) {
|
||||
candidateNames.push(item.name)
|
||||
}
|
||||
})
|
||||
@@ -218,16 +235,116 @@ export function useNodeForm(nodeType: NodeType) {
|
||||
if (configForm.value?.candidateStrategy === CandidateStrategy.START_USER) {
|
||||
showText = `发起人自己`
|
||||
}
|
||||
|
||||
// 发起人的部门负责人
|
||||
if (configForm.value?.candidateStrategy === CandidateStrategy.START_USER_DEPT_LEADER) {
|
||||
showText = `发起人的部门负责人`
|
||||
}
|
||||
// 发起人的部门负责人
|
||||
if (
|
||||
configForm.value?.candidateStrategy === CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER
|
||||
) {
|
||||
showText = `发起人连续部门负责人`
|
||||
}
|
||||
// 流程表达式
|
||||
if (configForm.value?.candidateStrategy === CandidateStrategy.EXPRESSION) {
|
||||
if (configForm.value.candidateParamArray?.length > 0) {
|
||||
showText = `流程表达式:${configForm.value.candidateParamArray[0]}`
|
||||
}
|
||||
showText = `流程表达式:${configForm.value.expression}`
|
||||
}
|
||||
return showText
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理候选人参数的赋值
|
||||
*/
|
||||
const handleCandidateParam = () => {
|
||||
let candidateParam: undefined | string = undefined
|
||||
if (!configForm.value) {
|
||||
return candidateParam
|
||||
}
|
||||
switch (configForm.value.candidateStrategy) {
|
||||
case CandidateStrategy.USER:
|
||||
candidateParam = configForm.value.userIds!.join(',')
|
||||
break
|
||||
case CandidateStrategy.ROLE:
|
||||
candidateParam = configForm.value.roleIds!.join(',')
|
||||
break
|
||||
case CandidateStrategy.POST:
|
||||
candidateParam = configForm.value.postIds!.join(',')
|
||||
break
|
||||
case CandidateStrategy.USER_GROUP:
|
||||
candidateParam = configForm.value.userGroups!.join(',')
|
||||
break
|
||||
case CandidateStrategy.EXPRESSION:
|
||||
candidateParam = configForm.value.expression!
|
||||
break
|
||||
case CandidateStrategy.DEPT_MEMBER:
|
||||
case CandidateStrategy.DEPT_LEADER:
|
||||
candidateParam = configForm.value.deptIds!.join(',')
|
||||
break
|
||||
// 发起人部门负责人
|
||||
case CandidateStrategy.START_USER_DEPT_LEADER:
|
||||
case CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER:
|
||||
candidateParam = configForm.value.deptLevel + ''
|
||||
break
|
||||
// 指定连续多级部门的负责人
|
||||
case CandidateStrategy.MULTI_LEVEL_DEPT_LEADER: {
|
||||
// TODO 是否允许选多个部门
|
||||
const deptIds = configForm.value.deptIds!.join(',')
|
||||
candidateParam = deptIds.concat(',' + configForm.value.deptLevel + '')
|
||||
break
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
return candidateParam
|
||||
}
|
||||
/**
|
||||
* 解析候选人参数
|
||||
*/
|
||||
const parseCandidateParam = (
|
||||
candidateStrategy: CandidateStrategy,
|
||||
candidateParam: string | undefined
|
||||
) => {
|
||||
if (!configForm.value || !candidateParam) {
|
||||
return
|
||||
}
|
||||
switch (candidateStrategy) {
|
||||
case CandidateStrategy.USER: {
|
||||
configForm.value.userIds = candidateParam.split(',').map((item) => +item)
|
||||
break
|
||||
}
|
||||
case CandidateStrategy.ROLE:
|
||||
configForm.value.roleIds = candidateParam.split(',').map((item) => +item)
|
||||
break
|
||||
case CandidateStrategy.POST:
|
||||
configForm.value.postIds = candidateParam.split(',').map((item) => +item)
|
||||
break
|
||||
case CandidateStrategy.USER_GROUP:
|
||||
configForm.value.userGroups = candidateParam.split(',').map((item) => +item)
|
||||
break
|
||||
case CandidateStrategy.EXPRESSION:
|
||||
configForm.value.expression = candidateParam
|
||||
break
|
||||
case CandidateStrategy.DEPT_MEMBER:
|
||||
case CandidateStrategy.DEPT_LEADER:
|
||||
configForm.value.deptIds = candidateParam.split(',').map((item) => +item)
|
||||
break
|
||||
// 发起人部门负责人
|
||||
case CandidateStrategy.START_USER_DEPT_LEADER:
|
||||
case CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER:
|
||||
configForm.value.deptLevel = +candidateParam
|
||||
break
|
||||
// 指定连续多级部门的负责人
|
||||
case CandidateStrategy.MULTI_LEVEL_DEPT_LEADER: {
|
||||
// 暂时只能选一个部门
|
||||
const paramArray = candidateParam.split(',')
|
||||
configForm.value.deptIds = [+paramArray[0]]
|
||||
configForm.value.deptLevel = +paramArray[1]
|
||||
break
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
return {
|
||||
configForm,
|
||||
roleOptions,
|
||||
@@ -235,6 +352,8 @@ export function useNodeForm(nodeType: NodeType) {
|
||||
userOptions,
|
||||
userGroupOptions,
|
||||
deptTreeOptions,
|
||||
handleCandidateParam,
|
||||
parseCandidateParam,
|
||||
getShowText
|
||||
}
|
||||
}
|
||||
|
@@ -46,14 +46,9 @@
|
||||
<el-form-item
|
||||
v-if="configForm.candidateStrategy == CandidateStrategy.ROLE"
|
||||
label="指定角色"
|
||||
prop="candidateParamArray"
|
||||
prop="roleIds"
|
||||
>
|
||||
<el-select
|
||||
v-model="configForm.candidateParamArray"
|
||||
clearable
|
||||
multiple
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-select v-model="configForm.roleIds" clearable multiple style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in roleOptions"
|
||||
:key="item.id"
|
||||
@@ -68,12 +63,12 @@
|
||||
configForm.candidateStrategy == CandidateStrategy.DEPT_LEADER
|
||||
"
|
||||
label="指定部门"
|
||||
prop="candidateParamArray"
|
||||
prop="deptIds"
|
||||
span="24"
|
||||
>
|
||||
<el-tree-select
|
||||
ref="treeRef"
|
||||
v-model="configForm.candidateParamArray"
|
||||
v-model="configForm.deptIds"
|
||||
:data="deptTreeOptions"
|
||||
:props="defaultProps"
|
||||
empty-text="加载中,请稍后"
|
||||
@@ -86,15 +81,10 @@
|
||||
<el-form-item
|
||||
v-if="configForm.candidateStrategy == CandidateStrategy.POST"
|
||||
label="指定岗位"
|
||||
prop="candidateParamArray"
|
||||
prop="postIds"
|
||||
span="24"
|
||||
>
|
||||
<el-select
|
||||
v-model="configForm.candidateParamArray"
|
||||
clearable
|
||||
multiple
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-select v-model="configForm.postIds" clearable multiple style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in postOptions"
|
||||
:key="item.id"
|
||||
@@ -106,15 +96,10 @@
|
||||
<el-form-item
|
||||
v-if="configForm.candidateStrategy == CandidateStrategy.USER"
|
||||
label="指定用户"
|
||||
prop="candidateParamArray"
|
||||
prop="userIds"
|
||||
span="24"
|
||||
>
|
||||
<el-select
|
||||
v-model="configForm.candidateParamArray"
|
||||
clearable
|
||||
multiple
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-select v-model="configForm.userIds" clearable multiple style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in userOptions"
|
||||
:key="item.id"
|
||||
@@ -126,14 +111,9 @@
|
||||
<el-form-item
|
||||
v-if="configForm.candidateStrategy === CandidateStrategy.USER_GROUP"
|
||||
label="指定用户组"
|
||||
prop="candidateParamArray"
|
||||
prop="userGroups"
|
||||
>
|
||||
<el-select
|
||||
v-model="configForm.candidateParamArray"
|
||||
clearable
|
||||
multiple
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-select v-model="configForm.userGroups" clearable multiple style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in userGroupOptions"
|
||||
:key="item.id"
|
||||
@@ -146,11 +126,11 @@
|
||||
<el-form-item
|
||||
v-if="configForm.candidateStrategy === CandidateStrategy.EXPRESSION"
|
||||
label="流程表达式"
|
||||
prop="candidateParamArray"
|
||||
prop="expression"
|
||||
>
|
||||
<el-input
|
||||
type="textarea"
|
||||
v-model="configForm.candidateParamArray[0]"
|
||||
v-model="configForm.expression"
|
||||
clearable
|
||||
style="width: 100%"
|
||||
/>
|
||||
@@ -200,7 +180,7 @@
|
||||
</el-drawer>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { SimpleFlowNode, CandidateStrategy, NodeType } from '../consts'
|
||||
import { SimpleFlowNode, CandidateStrategy, NodeType, CANDIDATE_STRATEGY } from '../consts'
|
||||
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
||||
import {
|
||||
useWatchNode,
|
||||
@@ -235,7 +215,12 @@ const formRef = ref() // 表单 Ref
|
||||
// 表单校验规则
|
||||
const formRules = reactive({
|
||||
candidateStrategy: [{ required: true, message: '抄送人设置不能为空', trigger: 'change' }],
|
||||
candidateParamArray: [{ required: true, message: '选项不能为空', trigger: 'blur' }]
|
||||
userIds: [{ required: true, message: '用户不能为空', trigger: 'change' }],
|
||||
roleIds: [{ required: true, message: '角色不能为空', trigger: 'change' }],
|
||||
deptIds: [{ required: true, message: '部门不能为空', trigger: 'change' }],
|
||||
userGroups: [{ required: true, message: '用户组不能为空', trigger: 'change' }],
|
||||
postIds: [{ required: true, message: '岗位不能为空', trigger: 'change' }],
|
||||
expression: [{ required: true, message: '流程表达式不能为空', trigger: 'blur' }]
|
||||
})
|
||||
|
||||
const {
|
||||
@@ -245,12 +230,14 @@ const {
|
||||
userOptions,
|
||||
userGroupOptions,
|
||||
deptTreeOptions,
|
||||
getShowText
|
||||
getShowText,
|
||||
handleCandidateParam,
|
||||
parseCandidateParam
|
||||
} = useNodeForm(NodeType.COPY_TASK_NODE)
|
||||
const configForm = tempConfigForm as Ref<CopyTaskFormType>
|
||||
// 抄送人策略, 去掉发起人自选 和 发起人自己
|
||||
const copyUserStrategies = computed(() => {
|
||||
return getIntDictOptions(DICT_TYPE.BPM_TASK_CANDIDATE_STRATEGY).filter(
|
||||
return CANDIDATE_STRATEGY.filter(
|
||||
(item) =>
|
||||
item.value !== CandidateStrategy.START_USER_SELECT &&
|
||||
item.value !== CandidateStrategy.START_USER
|
||||
@@ -258,7 +245,12 @@ const copyUserStrategies = computed(() => {
|
||||
})
|
||||
// 改变抄送人设置策略
|
||||
const changeCandidateStrategy = () => {
|
||||
configForm.value.candidateParamArray = []
|
||||
configForm.value.userIds = []
|
||||
configForm.value.deptIds = []
|
||||
configForm.value.roleIds = []
|
||||
configForm.value.postIds = []
|
||||
configForm.value.userGroups = []
|
||||
configForm.value.deptLevel = 1
|
||||
}
|
||||
// 保存配置
|
||||
const saveConfig = async () => {
|
||||
@@ -269,7 +261,7 @@ const saveConfig = async () => {
|
||||
const showText = getShowText()
|
||||
if (!showText) return false
|
||||
currentNode.value.name = nodeName.value!
|
||||
currentNode.value.candidateParam = configForm.value.candidateParamArray?.join(',')
|
||||
handleCandidateParam()
|
||||
currentNode.value.candidateStrategy = configForm.value.candidateStrategy
|
||||
currentNode.value.showText = showText
|
||||
currentNode.value.fieldsPermission = fieldsPermissionConfig.value
|
||||
@@ -281,14 +273,7 @@ const showCopyTaskNodeConfig = (node: SimpleFlowNode) => {
|
||||
nodeName.value = node.name
|
||||
// 抄送人设置
|
||||
configForm.value.candidateStrategy = node.candidateStrategy!
|
||||
const strCandidateParam = node?.candidateParam
|
||||
if (node.candidateStrategy === CandidateStrategy.EXPRESSION) {
|
||||
configForm.value.candidateParamArray[0] = strCandidateParam
|
||||
} else {
|
||||
if (strCandidateParam) {
|
||||
configForm.value.candidateParamArray = strCandidateParam.split(',').map((item) => +item)
|
||||
}
|
||||
}
|
||||
parseCandidateParam(node.candidateStrategy!, node?.candidateParam)
|
||||
// 表单字段权限
|
||||
getNodeConfigFormFields(node.fieldsPermission)
|
||||
}
|
||||
|
@@ -34,7 +34,7 @@
|
||||
@change="changeCandidateStrategy"
|
||||
>
|
||||
<el-radio
|
||||
v-for="(dict, index) in getIntDictOptions(DICT_TYPE.BPM_TASK_CANDIDATE_STRATEGY)"
|
||||
v-for="(dict, index) in CANDIDATE_STRATEGY"
|
||||
:key="index"
|
||||
:value="dict.value"
|
||||
:label="dict.value"
|
||||
@@ -47,14 +47,9 @@
|
||||
<el-form-item
|
||||
v-if="configForm.candidateStrategy == CandidateStrategy.ROLE"
|
||||
label="指定角色"
|
||||
prop="candidateParamArray"
|
||||
prop="roleIds"
|
||||
>
|
||||
<el-select
|
||||
v-model="configForm.candidateParamArray"
|
||||
clearable
|
||||
multiple
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-select v-model="configForm.roleIds" clearable multiple style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in roleOptions"
|
||||
:key="item.id"
|
||||
@@ -66,15 +61,16 @@
|
||||
<el-form-item
|
||||
v-if="
|
||||
configForm.candidateStrategy == CandidateStrategy.DEPT_MEMBER ||
|
||||
configForm.candidateStrategy == CandidateStrategy.DEPT_LEADER
|
||||
configForm.candidateStrategy == CandidateStrategy.DEPT_LEADER ||
|
||||
configForm.candidateStrategy == CandidateStrategy.MULTI_LEVEL_DEPT_LEADER
|
||||
"
|
||||
label="指定部门"
|
||||
prop="candidateParamArray"
|
||||
prop="deptIds"
|
||||
span="24"
|
||||
>
|
||||
<el-tree-select
|
||||
ref="treeRef"
|
||||
v-model="configForm.candidateParamArray"
|
||||
v-model="configForm.deptIds"
|
||||
:data="deptTreeOptions"
|
||||
:props="defaultProps"
|
||||
empty-text="加载中,请稍后"
|
||||
@@ -85,17 +81,31 @@
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
v-if="configForm.candidateStrategy == CandidateStrategy.POST"
|
||||
label="指定岗位"
|
||||
prop="candidateParamArray"
|
||||
v-if="
|
||||
configForm.candidateStrategy == CandidateStrategy.MULTI_LEVEL_DEPT_LEADER ||
|
||||
configForm.candidateStrategy == CandidateStrategy.START_USER_DEPT_LEADER ||
|
||||
configForm.candidateStrategy == CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER
|
||||
"
|
||||
:label="deptLevelLabel!"
|
||||
prop="deptLevel"
|
||||
span="24"
|
||||
>
|
||||
<el-select
|
||||
v-model="configForm.candidateParamArray"
|
||||
clearable
|
||||
multiple
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-select v-model="configForm.deptLevel" clearable>
|
||||
<el-option
|
||||
v-for="(item, index) in MULTI_LEVEL_DEPT"
|
||||
:key="index"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
v-if="configForm.candidateStrategy == CandidateStrategy.POST"
|
||||
label="指定岗位"
|
||||
prop="postIds"
|
||||
span="24"
|
||||
>
|
||||
<el-select v-model="configForm.postIds" clearable multiple style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in postOptions"
|
||||
:key="item.id"
|
||||
@@ -107,11 +117,11 @@
|
||||
<el-form-item
|
||||
v-if="configForm.candidateStrategy == CandidateStrategy.USER"
|
||||
label="指定用户"
|
||||
prop="candidateParamArray"
|
||||
prop="userIds"
|
||||
span="24"
|
||||
>
|
||||
<el-select
|
||||
v-model="configForm.candidateParamArray"
|
||||
v-model="configForm.userIds"
|
||||
clearable
|
||||
multiple
|
||||
style="width: 100%"
|
||||
@@ -128,14 +138,9 @@
|
||||
<el-form-item
|
||||
v-if="configForm.candidateStrategy === CandidateStrategy.USER_GROUP"
|
||||
label="指定用户组"
|
||||
prop="candidateParamArray"
|
||||
prop="userGroups"
|
||||
>
|
||||
<el-select
|
||||
v-model="configForm.candidateParamArray"
|
||||
clearable
|
||||
multiple
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-select v-model="configForm.userGroups" clearable multiple style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in userGroupOptions"
|
||||
:key="item.id"
|
||||
@@ -147,11 +152,11 @@
|
||||
<el-form-item
|
||||
v-if="configForm.candidateStrategy === CandidateStrategy.EXPRESSION"
|
||||
label="流程表达式"
|
||||
prop="candidateParamArray"
|
||||
prop="expression"
|
||||
>
|
||||
<el-input
|
||||
type="textarea"
|
||||
v-model="configForm.candidateParamArray[0]"
|
||||
v-model="configForm.expression"
|
||||
clearable
|
||||
style="width: 100%"
|
||||
/>
|
||||
@@ -364,9 +369,11 @@ import {
|
||||
REJECT_HANDLER_TYPES,
|
||||
DEFAULT_BUTTON_SETTING,
|
||||
OPERATION_BUTTON_NAME,
|
||||
ButtonSetting
|
||||
ButtonSetting,
|
||||
MULTI_LEVEL_DEPT,
|
||||
CANDIDATE_STRATEGY
|
||||
} from '../consts'
|
||||
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
||||
|
||||
import {
|
||||
useWatchNode,
|
||||
useNodeName,
|
||||
@@ -390,6 +397,15 @@ const props = defineProps({
|
||||
const emits = defineEmits<{
|
||||
'find:returnTaskNodes': [nodeList: SimpleFlowNode[]]
|
||||
}>()
|
||||
const deptLevelLabel = computed(() => {
|
||||
let label = '部门负责人来源'
|
||||
if (configForm.value.candidateStrategy == CandidateStrategy.MULTI_LEVEL_DEPT_LEADER) {
|
||||
label = label + '(指定部门向上)'
|
||||
} else {
|
||||
label = label + '(发起人部门向上)'
|
||||
}
|
||||
return label
|
||||
})
|
||||
// 监控节点的变化
|
||||
const currentNode = useWatchNode(props)
|
||||
// 抽屉配置
|
||||
@@ -409,7 +425,12 @@ const formRef = ref() // 表单 Ref
|
||||
// 表单校验规则
|
||||
const formRules = reactive({
|
||||
candidateStrategy: [{ required: true, message: '审批人设置不能为空', trigger: 'change' }],
|
||||
candidateParamArray: [{ required: true, message: '该选项不能为空', trigger: 'change' }],
|
||||
userIds: [{ required: true, message: '用户不能为空', trigger: 'change' }],
|
||||
roleIds: [{ required: true, message: '角色不能为空', trigger: 'change' }],
|
||||
deptIds: [{ required: true, message: '部门不能为空', trigger: 'change' }],
|
||||
userGroups: [{ required: true, message: '用户组不能为空', trigger: 'change' }],
|
||||
postIds: [{ required: true, message: '岗位不能为空', trigger: 'change' }],
|
||||
expression: [{ required: true, message: '流程表达式不能为空', trigger: 'blur' }],
|
||||
approveMethod: [{ required: true, message: '多人审批方式不能为空', trigger: 'change' }],
|
||||
approveRatio: [{ required: true, message: '通过比例不能为空', trigger: 'blur' }],
|
||||
returnNodeId: [{ required: true, message: '驳回节点不能为空', trigger: 'change' }],
|
||||
@@ -426,6 +447,8 @@ const {
|
||||
userOptions,
|
||||
userGroupOptions,
|
||||
deptTreeOptions,
|
||||
handleCandidateParam,
|
||||
parseCandidateParam,
|
||||
getShowText
|
||||
} = useNodeForm(NodeType.USER_TASK_NODE)
|
||||
const configForm = tempConfigForm as Ref<UserTaskFormType>
|
||||
@@ -433,7 +456,12 @@ const configForm = tempConfigForm as Ref<UserTaskFormType>
|
||||
const notAllowedMultiApprovers = ref(false)
|
||||
// 改变审批人设置策略
|
||||
const changeCandidateStrategy = () => {
|
||||
configForm.value.candidateParamArray = []
|
||||
configForm.value.userIds = []
|
||||
configForm.value.deptIds = []
|
||||
configForm.value.roleIds = []
|
||||
configForm.value.postIds = []
|
||||
configForm.value.userGroups = []
|
||||
configForm.value.deptLevel = 1
|
||||
configForm.value.approveMethod = ApproveMethodType.RRANDOM_SELECT_ONE_APPROVE
|
||||
if (
|
||||
configForm.value.candidateStrategy === CandidateStrategy.START_USER ||
|
||||
@@ -447,7 +475,8 @@ const changeCandidateStrategy = () => {
|
||||
// 改变审批候选人
|
||||
const changedCandidateUsers = () => {
|
||||
if (
|
||||
configForm.value.candidateParamArray?.length <= 1 &&
|
||||
configForm.value.userIds &&
|
||||
configForm.value.userIds?.length <= 1 &&
|
||||
configForm.value.candidateStrategy === CandidateStrategy.USER
|
||||
) {
|
||||
configForm.value.approveMethod = ApproveMethodType.RRANDOM_SELECT_ONE_APPROVE
|
||||
@@ -488,7 +517,8 @@ const saveConfig = async () => {
|
||||
if (!showText) return false
|
||||
currentNode.value.name = nodeName.value!
|
||||
currentNode.value.candidateStrategy = configForm.value.candidateStrategy
|
||||
currentNode.value.candidateParam = configForm.value.candidateParamArray?.join(',')
|
||||
// 处理 candidateParam 参数
|
||||
currentNode.value.candidateParam = handleCandidateParam()
|
||||
// 设置审批方式
|
||||
currentNode.value.approveMethod = configForm.value.approveMethod
|
||||
if (configForm.value.approveMethod === ApproveMethodType.APPROVE_BY_RATIO) {
|
||||
@@ -521,19 +551,9 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
|
||||
nodeName.value = node.name
|
||||
//1.1 审批人设置
|
||||
configForm.value.candidateStrategy = node.candidateStrategy!
|
||||
const strCandidateParam = node?.candidateParam
|
||||
if (node.candidateStrategy === CandidateStrategy.EXPRESSION) {
|
||||
configForm.value.candidateParamArray[0] = strCandidateParam
|
||||
} else {
|
||||
if (strCandidateParam) {
|
||||
configForm.value.candidateParamArray = strCandidateParam.split(',').map((item) => +item)
|
||||
}
|
||||
}
|
||||
if (
|
||||
(configForm.value.candidateParamArray?.length <= 1 &&
|
||||
node.candidateStrategy === CandidateStrategy.USER) ||
|
||||
node.candidateStrategy === CandidateStrategy.START_USER
|
||||
) {
|
||||
// 解析候选人参数
|
||||
parseCandidateParam(node.candidateStrategy!, node?.candidateParam)
|
||||
if (configForm.value.deptIds && configForm.value.deptIds.length > 1) {
|
||||
notAllowedMultiApprovers.value = true
|
||||
} else {
|
||||
notAllowedMultiApprovers.value = false
|
||||
|
Reference in New Issue
Block a user