更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统
接上一文章
1、配置文件需要修改,增加相应的内容,如下:
javascript
export default {
start: {
type: "start",
content: "所有人",
properties: { title: '发起人', initiator: 'ALL' }
},
approver: {
type: "approver",
content: "请设置审批人",
properties: { title: '审批人' }
},
copy:{
type: 'copy',
content: '发起人自选',
properties: {
title: '抄送人',
menbers: [],
userOptional: true
}
},
condition: {
type: "condition",
content: "请设置条件",
properties: { title: '条件', conditions: [], initiator: null }
},
concurrent: {
type: "concurrent",
content: "并行任务(同时进行)",
properties: { title: '分支', concurrents: [], initiator: null }
},
delay: {
type: "delay",
content: "等待0分钟",
properties: { title: '延时处理' }
},
trigger: {
type: "trigger",
content: "请设置触发器",
properties: { title: '触发器' }
},
branch: { type: "branch", content: "", properties: {} },
empty: { type: "empty", content: "", properties: {} }
}
2、NodeFactory函数修改如下,主要增加并行分支的处理
javascript
function NodeFactory(ctx, data, h) {
if (!data) return
console.log("NodeFactory data",data)
const showErrorTip = ctx.verifyMode && NodeUtils.checkNode(data) === false
let classstring = `node-wrap-box ${data.type} ${showErrorTip ? 'error' : ''}`
let res = [],
branchNode = "",
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>
);
if (hasConditionBranch(data)) {
// 如果节点是数组 而且是条件分支 添加分支样式包裹
// {data.childNode && NodeFactory.call(ctx, ctx, data.childNode, h)}
console.log("hasConditionBranch data",data)
branchNode = (
<div class="branch-wrap">
<div class="branch-box-wrap">
<div class="branch-box flex justify-center relative">
<button
class="btn"
onClick={this.eventLancher.bind(ctx, "appendConditionNode", data)}
>
添加条件
</button>
{data.conditionNodes.map(d => NodeFactory.call(ctx, ctx, d, h))}
</div>
</div>
{addNodeButton.call(ctx, ctx, data, h, true)}
</div>
);
}
if (isCondition(data)) {
console.log("isCondition data",data)
return (
<div class="col-box">
<div class="center-line"></div>
<div class="top-cover-line"></div>
<div class="bottom-cover-line"></div>
{selfNode}
{branchNode}
{NodeFactory.call(ctx, ctx, data.childNode, h)}
</div>
);
}
if (hasConcurrentBranch(data)) {
console.log("hasConcurrentBranch data",data)
// 如果节点是数组 而且是并行分支 添加分支样式包裹
// {data.childNode && NodeFactory.call(ctx, ctx, data.childNode, h)}
branchNode = (
<div class="branch-wrap">
<div class="branch-box-wrap">
<div class="branch-box flex justify-center relative">
<button
class="btn"
onClick={this.eventLancher.bind(ctx, "addConcurrentNode", data)}
>
添加并行
</button>
{data.concurrentNodes.map(d => NodeFactory.call(ctx, ctx, d, h))}
</div>
</div>
{addNodeButton.call(ctx, ctx, data, h, true)}
</div>
);
}
if (isConcurrent(data)) {
console.log("isConcurrent data",data)
return (
<div class="col-box">
<div class="center-line"></div>
<div class="top-cover-line"></div>
<div class="bottom-cover-line"></div>
{selfNode}
{branchNode}
{NodeFactory.call(ctx, ctx, data.childNode, h)}
</div>
);
}
res.push(selfNode);
branchNode && res.push(branchNode);
data.childNode && res.push(NodeFactory.call(ctx, ctx, data.childNode, h));
return res;
}
3、nodes 节点需要增加我们自己添加的内容,以便后续增加节点的时候正常运行
javascript
let nodes = {
start: createFunc,
approver: createFunc,
copy: createFunc,
delay: createFunc,
trigger: createFunc,
empty: _ => '',
condition: function(ctx, conf, h) {
// <i
// class="el-icon-document-copy icon"
// onClick={this.eventLancher.bind(ctx, "copyNode", conf, ctx.data)}
// ></i>
return (
<section
class="flow-path-card condition"
onClick={this.eventLancher.bind(ctx, "edit", conf)}
>
<header class="header">
<div class="title-box" style="height: 20px;width:160px;">
<span class="title-text">{conf.properties.title}</span>
{
<input
vModel_trim={conf.properties.title}
class="title-input"
style="margin-top:1px;"
onClick={stopPro}
/>
}
</div>
<span class="priority">优先级{conf.properties.priority + 1}</span>
<div class="actions">
<i
class="el-icon-close icon"
onClick={this.eventLancher.bind(
ctx,
"deleteNode",
conf,
ctx.data
)}
></i>
</div>
</header>
<div class="body">
<pre class="text" >{conf.content}</pre>
</div>
<div
class="icon-wrapper left"
onClick={ctx.eventLancher.bind(
ctx,
"increasePriority",
conf,
ctx.data
)}
>
<i class="el-icon-arrow-left icon left-arrow"></i>
</div>
<div
class="icon-wrapper right"
onClick={ctx.eventLancher.bind(
ctx,
"decreasePriority",
conf,
ctx.data
)}
>
<i class="el-icon-arrow-right icon right-arrow"></i>
</div>
</section>
);
},
concurrent: function(ctx, conf, h) {
// <i
// class="el-icon-document-copy icon"
// onClick={this.eventLancher.bind(ctx, "copyNode", conf, ctx.data)}
// ></i>
return (
<section
class="flow-path-card concurrent"
onClick={this.eventLancher.bind(ctx, "edit", conf)}
>
<header class="header">
<div class="title-box" style="height: 20px;width:160px;">
<span class="title-text">{conf.properties.title}</span>
{
<input
vModel_trim={conf.properties.title}
class="title-input"
style="margin-top:1px;"
onClick={stopPro}
/>
}
</div>
<span class="priority">优先级{conf.properties.priority + 1}</span>
<div class="actions">
<i
class="el-icon-close icon"
onClick={this.eventLancher.bind(
ctx,
"deleteNode",
conf,
ctx.data
)}
></i>
</div>
</header>
<div class="body">
<pre class="text" >{conf.content}</pre>
</div>
<div
class="icon-wrapper left"
onClick={ctx.eventLancher.bind(
ctx,
"increasePriority",
conf,
ctx.data
)}
>
<i class="el-icon-arrow-left icon left-arrow"></i>
</div>
<div
class="icon-wrapper right"
onClick={ctx.eventLancher.bind(
ctx,
"decreasePriority",
conf,
ctx.data
)}
>
<i class="el-icon-arrow-right icon right-arrow"></i>
</div>
</section>
);
}
};