Merge branch 'feature/bpm' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 into feature/bpm

pull/452/head
jason 2024-08-17 13:18:49 +08:00
commit 6b31a32a2d
3 changed files with 84 additions and 26 deletions

View File

@ -78,6 +78,8 @@ export interface SimpleFlowNode {
timeoutHandler?: TimeoutHandler timeoutHandler?: TimeoutHandler
// 审批任务拒绝处理 // 审批任务拒绝处理
rejectHandler?: RejectHandler rejectHandler?: RejectHandler
// 审批节点的审批人与发起人相同时,对应的处理类型
assignStartUserHandlerType?: number
} }
// 候选人策略枚举 用于审批节点。抄送节点 ) // 候选人策略枚举 用于审批节点。抄送节点 )
export enum CandidateStrategy { export enum CandidateStrategy {
@ -170,7 +172,7 @@ export type TimeoutHandler = {
//是否开启超时处理 //是否开启超时处理
enable: boolean enable: boolean
// 超时执行的动作 // 超时执行的动作
action?: number type?: number
// 超时时间设置 // 超时时间设置
timeDuration?: string timeDuration?: string
// 执行动作是自动提醒, 最大提醒次数 // 执行动作是自动提醒, 最大提醒次数
@ -187,6 +189,36 @@ export enum RejectHandlerType {
*/ */
RETURN_USER_TASK = 2 RETURN_USER_TASK = 2
} }
// 用户任务超时处理类型枚举
export enum TimeoutHandlerType {
/**
*
*/
REMINDER = 1,
/**
*
*/
APPROVE = 2,
/**
*
*/
REJECT = 3
}
// 用户任务的审批人与发起人相同时,处理类型枚举
export enum AssignStartUserHandlerType {
/**
*
*/
START_USER_AUDIT = 1,
/**
* 12
*/
SKIP = 2,
/**
*
*/
ASSIGN_DEPT_LEADER
}
// 时间单位枚举 // 时间单位枚举
export enum TimeUnitType { export enum TimeUnitType {
@ -327,7 +359,7 @@ export const TIME_UNIT_TYPES: DictDataVO[] = [
{ label: '天', value: TimeUnitType.DAY } { label: '天', value: TimeUnitType.DAY }
] ]
// 超时处理执行动作类型 // 超时处理执行动作类型
export const TIMEOUT_HANDLER_ACTION_TYPES: DictDataVO[] = [ export const TIMEOUT_HANDLER_TYPES: DictDataVO[] = [
{ label: '自动提醒', value: 1 }, { label: '自动提醒', value: 1 },
{ label: '自动同意', value: 2 }, { label: '自动同意', value: 2 },
{ label: '自动拒绝', value: 3 } { label: '自动拒绝', value: 3 }
@ -337,6 +369,11 @@ export const REJECT_HANDLER_TYPES: DictDataVO[] = [
{ label: '驳回到指定节点', value: RejectHandlerType.RETURN_USER_TASK } { label: '驳回到指定节点', value: RejectHandlerType.RETURN_USER_TASK }
// { label: '结束任务', value: RejectHandlerType.FINISH_TASK } // { label: '结束任务', value: RejectHandlerType.FINISH_TASK }
] ]
export const ASSIGN_START_USER_HANDLER_TYPES: DictDataVO[] = [
{ label: '由发起人对自己审批', value: 1 },
{ label: '自动跳过', value: 2 },
{ label: '转交给部门负责人审批', value: 3 }
]
// 比较运算符 // 比较运算符
export const COMPARISON_OPERATORS: DictDataVO = [ export const COMPARISON_OPERATORS: DictDataVO = [

View File

@ -10,7 +10,9 @@ import {
NodeType, NodeType,
ApproveMethodType, ApproveMethodType,
RejectHandlerType, RejectHandlerType,
NODE_DEFAULT_NAME NODE_DEFAULT_NAME,
AssignStartUserHandlerType,
ASSIGN_START_USER_HANDLER_TYPES
} from './consts' } from './consts'
export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref<SimpleFlowNode> { export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref<SimpleFlowNode> {
const node = ref<SimpleFlowNode>(props.flowNode) const node = ref<SimpleFlowNode>(props.flowNode)
@ -103,7 +105,8 @@ export type UserTaskFormType = {
rejectHandlerType?: RejectHandlerType rejectHandlerType?: RejectHandlerType
returnNodeId?: string returnNodeId?: string
timeoutHandlerEnable?: boolean timeoutHandlerEnable?: boolean
timeoutHandlerAction?: number timeoutHandlerType?: number
assignStartUserHandlerType?: AssignStartUserHandlerType
timeDuration?: number timeDuration?: number
maxRemindCount?: number maxRemindCount?: number
buttonsSetting: any[] buttonsSetting: any[]
@ -139,9 +142,10 @@ export function useNodeForm(nodeType: NodeType) {
approveMethod: ApproveMethodType.RRANDOM_SELECT_ONE_APPROVE, approveMethod: ApproveMethodType.RRANDOM_SELECT_ONE_APPROVE,
approveRatio: 100, approveRatio: 100,
rejectHandlerType: RejectHandlerType.FINISH_PROCESS, rejectHandlerType: RejectHandlerType.FINISH_PROCESS,
assignStartUserHandlerType: AssignStartUserHandlerType.START_USER_AUDIT,
returnNodeId: '', returnNodeId: '',
timeoutHandlerEnable: false, timeoutHandlerEnable: false,
timeoutHandlerAction: 1, timeoutHandlerType: 1,
timeDuration: 6, // 默认 6小时 timeDuration: 6, // 默认 6小时
maxRemindCount: 1, // 默认 提醒 1次 maxRemindCount: 1, // 默认 提醒 1次
buttonsSetting: [] buttonsSetting: []

View File

@ -232,15 +232,15 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="执行动作" label="执行动作"
prop="timeoutHandlerAction" prop="timeoutHandlerType"
v-if="configForm.timeoutHandlerEnable" v-if="configForm.timeoutHandlerEnable"
> >
<el-radio-group <el-radio-group
v-model="configForm.timeoutHandlerAction" v-model="configForm.timeoutHandlerType"
@change="timeoutActionChanged" @change="timeoutHandlerTypeChanged"
> >
<el-radio-button <el-radio-button
v-for="item in TIMEOUT_HANDLER_ACTION_TYPES" v-for="item in TIMEOUT_HANDLER_TYPES"
:key="item.value" :key="item.value"
:value="item.value" :value="item.value"
:label="item.label" :label="item.label"
@ -276,10 +276,21 @@
<el-form-item <el-form-item
label="最大提醒次数" label="最大提醒次数"
prop="maxRemindCount" prop="maxRemindCount"
v-if="configForm.timeoutHandlerEnable && configForm.timeoutHandlerAction === 1" v-if="configForm.timeoutHandlerEnable && configForm.timeoutHandlerType === 1"
> >
<el-input-number v-model="configForm.maxRemindCount" :min="1" :max="10" /> <el-input-number v-model="configForm.maxRemindCount" :min="1" :max="10" />
</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>
</div>
</el-radio-group>
</el-form-item>
</el-form> </el-form>
</div> </div>
</el-tab-pane> </el-tab-pane>
@ -364,14 +375,16 @@ import {
ApproveMethodType, ApproveMethodType,
TimeUnitType, TimeUnitType,
RejectHandlerType, RejectHandlerType,
TIMEOUT_HANDLER_ACTION_TYPES, TIMEOUT_HANDLER_TYPES,
TIME_UNIT_TYPES, TIME_UNIT_TYPES,
REJECT_HANDLER_TYPES, REJECT_HANDLER_TYPES,
DEFAULT_BUTTON_SETTING, DEFAULT_BUTTON_SETTING,
OPERATION_BUTTON_NAME, OPERATION_BUTTON_NAME,
ButtonSetting, ButtonSetting,
MULTI_LEVEL_DEPT, MULTI_LEVEL_DEPT,
CANDIDATE_STRATEGY CANDIDATE_STRATEGY,
ASSIGN_START_USER_HANDLER_TYPES,
TimeoutHandlerType
} from '../consts' } from '../consts'
import { import {
@ -435,7 +448,7 @@ const formRules = reactive({
approveRatio: [{ required: true, message: '通过比例不能为空', trigger: 'blur' }], approveRatio: [{ required: true, message: '通过比例不能为空', trigger: 'blur' }],
returnNodeId: [{ required: true, message: '驳回节点不能为空', trigger: 'change' }], returnNodeId: [{ required: true, message: '驳回节点不能为空', trigger: 'change' }],
timeoutHandlerEnable: [{ required: true }], timeoutHandlerEnable: [{ required: true }],
timeoutHandlerAction: [{ required: true }], timeoutHandlerType: [{ required: true }],
timeDuration: [{ required: true, message: '超时时间不能为空', trigger: 'blur' }], timeDuration: [{ required: true, message: '超时时间不能为空', trigger: 'blur' }],
maxRemindCount: [{ required: true, message: '提醒次数不能为空', trigger: 'blur' }] maxRemindCount: [{ required: true, message: '提醒次数不能为空', trigger: 'blur' }]
}) })
@ -499,8 +512,8 @@ const returnTaskList = ref<SimpleFlowNode[]>([])
// //
const { const {
timeoutHandlerChange, timeoutHandlerChange,
cTimeoutAction, cTimeoutType,
timeoutActionChanged, timeoutHandlerTypeChanged,
timeUnit, timeUnit,
timeUnitChange, timeUnitChange,
isoTimeDuration, isoTimeDuration,
@ -532,10 +545,12 @@ const saveConfig = async () => {
// //
currentNode.value.timeoutHandler = { currentNode.value.timeoutHandler = {
enable: configForm.value.timeoutHandlerEnable!, enable: configForm.value.timeoutHandlerEnable!,
action: cTimeoutAction.value, type: cTimeoutType.value,
timeDuration: isoTimeDuration.value, timeDuration: isoTimeDuration.value,
maxRemindCount: cTimeoutMaxRemindCount.value maxRemindCount: cTimeoutMaxRemindCount.value
} }
//
currentNode.value.assignStartUserHandlerType = configForm.value.assignStartUserHandlerType
// //
currentNode.value.fieldsPermission = fieldsPermissionConfig.value currentNode.value.fieldsPermission = fieldsPermissionConfig.value
// //
@ -553,7 +568,7 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
configForm.value.candidateStrategy = node.candidateStrategy! configForm.value.candidateStrategy = node.candidateStrategy!
// //
parseCandidateParam(node.candidateStrategy!, node?.candidateParam) parseCandidateParam(node.candidateStrategy!, node?.candidateParam)
if (configForm.value.deptIds && configForm.value.deptIds.length > 1) { if (configForm.value.userIds && configForm.value.userIds.length > 1) {
notAllowedMultiApprovers.value = true notAllowedMultiApprovers.value = true
} else { } else {
notAllowedMultiApprovers.value = false notAllowedMultiApprovers.value = false
@ -578,8 +593,10 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
configForm.value.timeDuration = parseInt(parseTime) configForm.value.timeDuration = parseInt(parseTime)
timeUnit.value = convertTimeUnit(parseTimeUnit) timeUnit.value = convertTimeUnit(parseTimeUnit)
} }
configForm.value.timeoutHandlerAction = node.timeoutHandler?.action configForm.value.timeoutHandlerType = node.timeoutHandler?.type
configForm.value.maxRemindCount = node.timeoutHandler?.maxRemindCount configForm.value.maxRemindCount = node.timeoutHandler?.maxRemindCount
// 1.5
configForm.value.assignStartUserHandlerType = node.assignStartUserHandlerType
// 2. // 2.
buttonsSetting.value = cloneDeep(node.buttonsSetting) || DEFAULT_BUTTON_SETTING buttonsSetting.value = cloneDeep(node.buttonsSetting) || DEFAULT_BUTTON_SETTING
// 3. // 3.
@ -623,21 +640,21 @@ function useTimeoutHandler() {
if (configForm.value.timeoutHandlerEnable) { if (configForm.value.timeoutHandlerEnable) {
timeUnit.value = 2 timeUnit.value = 2
configForm.value.timeDuration = 6 configForm.value.timeDuration = 6
configForm.value.timeoutHandlerAction = 1 configForm.value.timeoutHandlerType = 1
configForm.value.maxRemindCount = 1 configForm.value.maxRemindCount = 1
} }
} }
// //
const cTimeoutAction = computed(() => { const cTimeoutType = computed(() => {
if (!configForm.value.timeoutHandlerEnable) { if (!configForm.value.timeoutHandlerEnable) {
return undefined return undefined
} }
return configForm.value.timeoutHandlerAction return configForm.value.timeoutHandlerType
}) })
// //
const timeoutActionChanged = () => { const timeoutHandlerTypeChanged = () => {
if (configForm.value.timeoutHandlerAction === 1) { if (configForm.value.timeoutHandlerType === TimeoutHandlerType.REMINDER) {
configForm.value.maxRemindCount = 1 // 1 configForm.value.maxRemindCount = 1 // 1
} }
} }
@ -680,7 +697,7 @@ function useTimeoutHandler() {
if (!configForm.value.timeoutHandlerEnable) { if (!configForm.value.timeoutHandlerEnable) {
return undefined return undefined
} }
if (configForm.value.timeoutHandlerAction !== 1) { if (configForm.value.timeoutHandlerType !== TimeoutHandlerType.REMINDER) {
return undefined return undefined
} }
return configForm.value.maxRemindCount return configForm.value.maxRemindCount
@ -688,8 +705,8 @@ function useTimeoutHandler() {
return { return {
timeoutHandlerChange, timeoutHandlerChange,
cTimeoutAction, cTimeoutType,
timeoutActionChanged, timeoutHandlerTypeChanged,
timeUnit, timeUnit,
timeUnitChange, timeUnitChange,
isoTimeDuration, isoTimeDuration,