Browse Source

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

jason 1 year ago
parent
commit
6b31a32a2d

+ 39 - 2
src/components/SimpleProcessDesignerV2/src/consts.ts

@@ -78,6 +78,8 @@ export interface SimpleFlowNode {
   timeoutHandler?: TimeoutHandler
   // 审批任务拒绝处理
   rejectHandler?: RejectHandler
+  // 审批节点的审批人与发起人相同时,对应的处理类型
+  assignStartUserHandlerType?: number
 }
 // 候选人策略枚举 ( 用于审批节点。抄送节点 )
 export enum CandidateStrategy {
@@ -170,7 +172,7 @@ export type TimeoutHandler = {
   //是否开启超时处理
   enable: boolean
   // 超时执行的动作
-  action?: number
+  type?: number
   // 超时时间设置
   timeDuration?: string
   // 执行动作是自动提醒, 最大提醒次数
@@ -187,6 +189,36 @@ export enum RejectHandlerType {
    */
   RETURN_USER_TASK = 2
 }
+// 用户任务超时处理类型枚举
+export enum TimeoutHandlerType {
+  /**
+   * 自动提醒
+   */
+  REMINDER = 1,
+  /**
+   * 自动同意
+   */
+  APPROVE = 2,
+  /**
+   * 自动拒绝
+   */
+  REJECT = 3
+}
+// 用户任务的审批人与发起人相同时,处理类型枚举
+export enum AssignStartUserHandlerType {
+  /**
+   * 由发起人对自己审批
+   */
+  START_USER_AUDIT = 1,
+  /**
+   * 自动跳过【参考飞书】:1)如果当前节点还有其他审批人,则交由其他审批人进行审批;2)如果当前节点没有其他审批人,则该节点自动通过
+   */
+  SKIP = 2,
+  /**
+   * 转交给部门负责人审批
+   */
+  ASSIGN_DEPT_LEADER
+}
 
 // 时间单位枚举
 export enum TimeUnitType {
@@ -327,7 +359,7 @@ export const TIME_UNIT_TYPES: DictDataVO[] = [
   { label: '天', value: TimeUnitType.DAY }
 ]
 // 超时处理执行动作类型
-export const TIMEOUT_HANDLER_ACTION_TYPES: DictDataVO[] = [
+export const TIMEOUT_HANDLER_TYPES: DictDataVO[] = [
   { label: '自动提醒', value: 1 },
   { label: '自动同意', value: 2 },
   { label: '自动拒绝', value: 3 }
@@ -337,6 +369,11 @@ export const REJECT_HANDLER_TYPES: DictDataVO[] = [
   { label: '驳回到指定节点', value: RejectHandlerType.RETURN_USER_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 = [

+ 7 - 3
src/components/SimpleProcessDesignerV2/src/node.ts

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

+ 38 - 21
src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue

@@ -232,15 +232,15 @@
             </el-form-item>
             <el-form-item
               label="执行动作"
-              prop="timeoutHandlerAction"
+              prop="timeoutHandlerType"
               v-if="configForm.timeoutHandlerEnable"
             >
               <el-radio-group
-                v-model="configForm.timeoutHandlerAction"
-                @change="timeoutActionChanged"
+                v-model="configForm.timeoutHandlerType"
+                @change="timeoutHandlerTypeChanged"
               >
                 <el-radio-button
-                  v-for="item in TIMEOUT_HANDLER_ACTION_TYPES"
+                  v-for="item in TIMEOUT_HANDLER_TYPES"
                   :key="item.value"
                   :value="item.value"
                   :label="item.label"
@@ -276,10 +276,21 @@
             <el-form-item
               label="最大提醒次数"
               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-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>
         </div>
       </el-tab-pane>
@@ -364,14 +375,16 @@ import {
   ApproveMethodType,
   TimeUnitType,
   RejectHandlerType,
-  TIMEOUT_HANDLER_ACTION_TYPES,
+  TIMEOUT_HANDLER_TYPES,
   TIME_UNIT_TYPES,
   REJECT_HANDLER_TYPES,
   DEFAULT_BUTTON_SETTING,
   OPERATION_BUTTON_NAME,
   ButtonSetting,
   MULTI_LEVEL_DEPT,
-  CANDIDATE_STRATEGY
+  CANDIDATE_STRATEGY,
+  ASSIGN_START_USER_HANDLER_TYPES,
+  TimeoutHandlerType
 } from '../consts'
 
 import {
@@ -435,7 +448,7 @@ const formRules = reactive({
   approveRatio: [{ required: true, message: '通过比例不能为空', trigger: 'blur' }],
   returnNodeId: [{ required: true, message: '驳回节点不能为空', trigger: 'change' }],
   timeoutHandlerEnable: [{ required: true }],
-  timeoutHandlerAction: [{ required: true }],
+  timeoutHandlerType: [{ required: true }],
   timeDuration: [{ required: true, message: '超时时间不能为空', trigger: 'blur' }],
   maxRemindCount: [{ required: true, message: '提醒次数不能为空', trigger: 'blur' }]
 })
@@ -499,8 +512,8 @@ const returnTaskList = ref<SimpleFlowNode[]>([])
 // 审批人超时未处理设置
 const {
   timeoutHandlerChange,
-  cTimeoutAction,
-  timeoutActionChanged,
+  cTimeoutType,
+  timeoutHandlerTypeChanged,
   timeUnit,
   timeUnitChange,
   isoTimeDuration,
@@ -532,10 +545,12 @@ const saveConfig = async () => {
   // 设置超时处理
   currentNode.value.timeoutHandler = {
     enable: configForm.value.timeoutHandlerEnable!,
-    action: cTimeoutAction.value,
+    type: cTimeoutType.value,
     timeDuration: isoTimeDuration.value,
     maxRemindCount: cTimeoutMaxRemindCount.value
   }
+  // 设置用户任务的审批人与发起人相同时
+  currentNode.value.assignStartUserHandlerType = configForm.value.assignStartUserHandlerType
   // 设置表单权限
   currentNode.value.fieldsPermission = fieldsPermissionConfig.value
   // 设置按钮权限
@@ -553,7 +568,7 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
   configForm.value.candidateStrategy = node.candidateStrategy!
   // 解析候选人参数
   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
   } else {
     notAllowedMultiApprovers.value = false
@@ -578,8 +593,10 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
     configForm.value.timeDuration = parseInt(parseTime)
     timeUnit.value = convertTimeUnit(parseTimeUnit)
   }
-  configForm.value.timeoutHandlerAction = node.timeoutHandler?.action
+  configForm.value.timeoutHandlerType = node.timeoutHandler?.type
   configForm.value.maxRemindCount = node.timeoutHandler?.maxRemindCount
+  // 1.5 设置用户任务的审批人与发起人相同时
+  configForm.value.assignStartUserHandlerType = node.assignStartUserHandlerType
   // 2. 操作按钮设置
   buttonsSetting.value = cloneDeep(node.buttonsSetting) || DEFAULT_BUTTON_SETTING
   // 3. 表单字段权限配置
@@ -623,21 +640,21 @@ function useTimeoutHandler() {
     if (configForm.value.timeoutHandlerEnable) {
       timeUnit.value = 2
       configForm.value.timeDuration = 6
-      configForm.value.timeoutHandlerAction = 1
+      configForm.value.timeoutHandlerType = 1
       configForm.value.maxRemindCount = 1
     }
   }
   // 超时执行的动作
-  const cTimeoutAction = computed(() => {
+  const cTimeoutType = computed(() => {
     if (!configForm.value.timeoutHandlerEnable) {
       return undefined
     }
-    return configForm.value.timeoutHandlerAction
+    return configForm.value.timeoutHandlerType
   })
 
   // 超时处理动作改变
-  const timeoutActionChanged = () => {
-    if (configForm.value.timeoutHandlerAction === 1) {
+  const timeoutHandlerTypeChanged = () => {
+    if (configForm.value.timeoutHandlerType === TimeoutHandlerType.REMINDER) {
       configForm.value.maxRemindCount = 1 // 超时提醒次数,默认为1
     }
   }
@@ -680,7 +697,7 @@ function useTimeoutHandler() {
     if (!configForm.value.timeoutHandlerEnable) {
       return undefined
     }
-    if (configForm.value.timeoutHandlerAction !== 1) {
+    if (configForm.value.timeoutHandlerType !== TimeoutHandlerType.REMINDER) {
       return undefined
     }
     return configForm.value.maxRemindCount
@@ -688,8 +705,8 @@ function useTimeoutHandler() {
 
   return {
     timeoutHandlerChange,
-    cTimeoutAction,
-    timeoutActionChanged,
+    cTimeoutType,
+    timeoutHandlerTypeChanged,
     timeUnit,
     timeUnitChange,
     isoTimeDuration,