基于若依的ruoyi-nbcio流程管理系统增加仿钉钉流程设计(六)

news/2024/7/7 19:54:18

更多ruoyi-nbcio功能请看演示系统

gitee源代码地址

前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio

演示地址:RuoYi-Nbcio后台管理系统

      这节主要讲条件节点与并发节点的有效性检查,主要是增加这两个节点的子节点检查,因为这两个节点需要增加审批人的子节点才能有效,否则检查通不过。

   1、首先增加一个子节点的有效性检查函数

/**
   * 校验子节点必填项完整性,目前主要是针对条件节点与并发节点
   * @param {Node} node - 节点数据
   */
  static checkChildNode ( node, parent ) {
    let valid = false
    if ( this.isConditionNode( node ) ) {
         if (!isEmpty(node.childNode)) {
           valid = true
         }
    }
    if ( this.isConcurrentNode( node ) ) {
        if (!isEmpty(node.childNode)) {
          valid = true
        }
    }
    return valid
  }

2、检查所有节点的时候也增加并发节点检查过程

/**
   * 判断所有节点是否信息完整
   * @param {Node} processData - 整个流程图数据
   * @returns {Boolean}
   */
  static checkAllNode ( processData ) {
    let valid = true
    const loop = ( node, callback, parent ) => {
     
      !this.checkNode( node, parent ) && callback()
      if ( node.childNode ) loop( node.childNode, callback, parent )
      if ( !isEmptyArray( node.conditionNodes ) ) {
        node.conditionNodes.forEach( n => loop( n, callback, node ) )
      }
      if ( !isEmptyArray( node.concurrentNodes ) ) {
        console.log("node.concurrentNodes ", node.concurrentNodes)
        node.concurrentNodes.forEach( n => loop( n, callback, node ) )
      }
    }
    loop( processData, () => valid = false )
    return valid
  }
}

3、单个检查节点修改如下,特别是条件节点与并发节点的修改

/**
   * 校验单个节点必填项完整性
   * @param {Node} node - 节点数据
   */
  static checkNode ( node, parent ) {
    // 抄送人应该可以默认自选
    let valid = true
    const props = node.properties
    this.isStartNode( node )
      && !props.initiator
      && ( valid = false )

    this.isConditionNode( node )
      && !props.isDefault
      && !props.initiator
      && isEmptyArray( props.conditions )
      && !this.checkChildNode ( node, parent )
      && ( valid = false )

    const customSettings = ['myself', 'optional', 'director']
    this.isApproverNode( node )
      && !customSettings.includes( props.assigneeType )
      && isEmptyArray( props.approvers )
      && ( valid = false )


    return valid
  }

4、构造节点增加条件与并发的出错处理

/* 构造节点
    modify by nbacheng 2023-11-02
*/
function NodeFactory(ctx, data, h) {
  if (!data) return
  console.log("NodeFactory data",data)
  const showErrorTip = ctx.verifyMode && NodeUtils.checkNode(data) === false
  const showChildErrorTip = ctx.verifyMode && (NodeUtils.isConditionNode(data) || NodeUtils.isConcurrentNode(data)) && NodeUtils.checkChildNode(data) === false
  let res = [], branchNode = "", selfNode = null ;
    if (showErrorTip) { //通用节点的错误检查做特殊处理
    selfNode = (
      <div class="node-wrap">
        <div class={`node-wrap-box ${data.type} ${ showErrorTip ? 'error' : ''}` }>
          <el-tooltip content="未设置条件" placement="top" effect="dark">
            <div class="error-tip" onClick={this.eventLancher.bind(ctx, "edit", data)}>!!!</div>
          </el-tooltip>
          {nodes[data.type].call(ctx, ctx, data, h)}
          {addNodeButton.call(ctx, ctx, data, h)}
        </div>
      </div>
    );
    } else if (showChildErrorTip) { //对并发与条件节点的错误检查做特殊处理
    selfNode = (
        <div class="node-wrap">
          <div class={`node-wrap-box ${data.type} ${ showChildErrorTip  ? 'error' : ''}` }>
            <el-tooltip content="未设置审批人员节点" placement="top" effect="dark">
              <div class="error-tip" onClick={this.eventLancher.bind(ctx, "edit", data)}>!!!</div>
            </el-tooltip>
            {nodes[data.type].call(ctx, ctx, data, h)}
            {addNodeButton.call(ctx, ctx, data, h)}
          </div>
        </div>
      );
    } else { //正常节点的显示
      selfNode = (
          <div class="node-wrap">
            <div class={`node-wrap-box ${data.type} ${''}` }>
              {nodes[data.type].call(ctx, ctx, data, h)}
              {addNodeButton.call(ctx, ctx, data, h)}
            </div>
          </div>
        );
    }

5、效果图如下:


http://lihuaxi.xjx100.cn/news/1750458.html

相关文章

时间序列聚类的直观方法

一、介绍 我们将使用轮廓分数和一些距离度量来执行时间序列聚类实验&#xff0c;同时利用直观的可视化&#xff0c;让我们看看下面的时间序列&#xff1a; 这些可以被视为具有正弦、余弦、方波和锯齿波的四种不同的周期性时间序列 如果我们添加随机噪声和距原点的距离来沿 y 轴…

【优选算法系列】【专题五位运算】第一节.常见的位运算(面试题 01.01. 判定字符是否唯一和268. 丢失的数字)

文章目录 前言常见的位运算一、判定字符是否唯一 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写二、丢失的数字 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写总结 前言 常见的…

MySQL遍历所有表所有字段查找字符数据

MySQL遍历所有表所有字段查找字符数据 工作中有一些数据查找&#xff0c;但是在那个库那个表那个字段中并不明确&#xff0c;特别是敏感字符查找&#xff0c;如果数据量并不大&#xff0c;我们可以采用遍历整个库、表中字符来查找相关数据来解决该问题。 我们可以写一个存储过…

抛弃繁琐、提高效率:低代码工具助你飞速开发 | 开源专题 No.42

supabase/supabase Stars: 56.9k License: Apache-2.0 Supabase 是一个开源的 Firebase 替代品&#xff0c;使用企业级开源工具构建了 Firebase 的功能。其主要功能包括&#xff1a; 托管 Postgres 数据库身份验证和授权自动生成 API (支持 REST 和 GraphQL)实时订阅函数 (包…

使用Bazel构建高效的Android应用程序

使用Bazel构建高效的Android应用程序 1. 引言 在现代软件开发中&#xff0c;构建工具是至关重要的一环。Bazel是一个开源的构建工具&#xff0c;由Google开发并用于其内部项目多年。它旨在提供高效、可扩展和可靠的构建解决方案。Bazel最初专注于构建大规模软件项目&#xff…

请输出 n 以内的素数 ← Python

【题目描述】 请利用 Python 编程输出 n 以内的素数。【算法代码】 neval(input("Please input an integer:")) x[] for i in range(2,n1):k0for j in range(1,i1):if i%j0:k1if k2:x.append(i) print(x) 【参考文献】https://blog.csdn.net/weixin_49432344/artic…

【Linux网络编程_TCP/UDP_字节序_套接字 实现: FTP 项目_局域网聊天项目 (已开源) 】.md updata:23/11/03

文章目录 TCP/UDP对比端口号作用字节序字节序转换api套接字 socket实现网络通讯服务端 逻辑思路demo&#xff1a; 满血版双方通讯/残血版多方通讯服务端 demo客户端 demo FTP 项目实现sever demo:client demo: 局域网多方通讯 配合线程实现sever demo:client demo: TCP/UDP对比…