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


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

    gitee源代码地址

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

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

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

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

    1. /**
    2. * 校验子节点必填项完整性,目前主要是针对条件节点与并发节点
    3. * @param {Node} node - 节点数据
    4. */
    5. static checkChildNode ( node, parent ) {
    6. let valid = false
    7. if ( this.isConditionNode( node ) ) {
    8. if (!isEmpty(node.childNode)) {
    9. valid = true
    10. }
    11. }
    12. if ( this.isConcurrentNode( node ) ) {
    13. if (!isEmpty(node.childNode)) {
    14. valid = true
    15. }
    16. }
    17. return valid
    18. }

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

    1. /**
    2. * 判断所有节点是否信息完整
    3. * @param {Node} processData - 整个流程图数据
    4. * @returns {Boolean}
    5. */
    6. static checkAllNode ( processData ) {
    7. let valid = true
    8. const loop = ( node, callback, parent ) => {
    9. !this.checkNode( node, parent ) && callback()
    10. if ( node.childNode ) loop( node.childNode, callback, parent )
    11. if ( !isEmptyArray( node.conditionNodes ) ) {
    12. node.conditionNodes.forEach( n => loop( n, callback, node ) )
    13. }
    14. if ( !isEmptyArray( node.concurrentNodes ) ) {
    15. console.log("node.concurrentNodes ", node.concurrentNodes)
    16. node.concurrentNodes.forEach( n => loop( n, callback, node ) )
    17. }
    18. }
    19. loop( processData, () => valid = false )
    20. return valid
    21. }
    22. }

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

    1. /**
    2. * 校验单个节点必填项完整性
    3. * @param {Node} node - 节点数据
    4. */
    5. static checkNode ( node, parent ) {
    6. // 抄送人应该可以默认自选
    7. let valid = true
    8. const props = node.properties
    9. this.isStartNode( node )
    10. && !props.initiator
    11. && ( valid = false )
    12. this.isConditionNode( node )
    13. && !props.isDefault
    14. && !props.initiator
    15. && isEmptyArray( props.conditions )
    16. && !this.checkChildNode ( node, parent )
    17. && ( valid = false )
    18. const customSettings = ['myself', 'optional', 'director']
    19. this.isApproverNode( node )
    20. && !customSettings.includes( props.assigneeType )
    21. && isEmptyArray( props.approvers )
    22. && ( valid = false )
    23. return valid
    24. }

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

    1. /* 构造节点
    2. modify by nbacheng 2023-11-02
    3. */
    4. function NodeFactory(ctx, data, h) {
    5. if (!data) return
    6. console.log("NodeFactory data",data)
    7. const showErrorTip = ctx.verifyMode && NodeUtils.checkNode(data) === false
    8. const showChildErrorTip = ctx.verifyMode && (NodeUtils.isConditionNode(data) || NodeUtils.isConcurrentNode(data)) && NodeUtils.checkChildNode(data) === false
    9. let res = [], branchNode = "", selfNode = null ;
    10. if (showErrorTip) { //通用节点的错误检查做特殊处理
    11. selfNode = (
    12. <div class="node-wrap">
    13. <div class={`node-wrap-box ${data.type} ${ showErrorTip ? 'error' : ''}` }>
    14. <el-tooltip content="未设置条件" placement="top" effect="dark">
    15. <div class="error-tip" onClick={this.eventLancher.bind(ctx, "edit", data)}>!!!div>
    16. el-tooltip>
    17. {nodes[data.type].call(ctx, ctx, data, h)}
    18. {addNodeButton.call(ctx, ctx, data, h)}
    19. div>
    20. div>
    21. );
    22. } else if (showChildErrorTip) { //对并发与条件节点的错误检查做特殊处理
    23. selfNode = (
    24. <div class="node-wrap">
    25. <div class={`node-wrap-box ${data.type} ${ showChildErrorTip ? 'error' : ''}` }>
    26. <el-tooltip content="未设置审批人员节点" placement="top" effect="dark">
    27. <div class="error-tip" onClick={this.eventLancher.bind(ctx, "edit", data)}>!!!div>
    28. el-tooltip>
    29. {nodes[data.type].call(ctx, ctx, data, h)}
    30. {addNodeButton.call(ctx, ctx, data, h)}
    31. div>
    32. div>
    33. );
    34. } else { //正常节点的显示
    35. selfNode = (
    36. <div class="node-wrap">
    37. <div class={`node-wrap-box ${data.type} ${''}` }>
    38. {nodes[data.type].call(ctx, ctx, data, h)}
    39. {addNodeButton.call(ctx, ctx, data, h)}
    40. div>
    41. div>
    42. );
    43. }

    5、效果图如下:

  • 相关阅读:
    将自定义 GitHub 徽章添加到您的代码库
    基于微信小程序的在线测试系统
    心情碎片~
    OpenSign:安全可靠的电子签名解决方案 | 开源日报 No.76
    mysql视图
    什么?电路板上还要喷漆?
    2022/8/4 树上差分+线段树
    VSCode打开 C(嵌入式) 工程的一些记录
    JP《乡村振兴振兴战略下传统村落文化旅游设计》许少辉书香续,山水长
    记一次hook mac地址实现伪装硬件码
  • 原文地址:https://blog.csdn.net/qq_40032778/article/details/134185908