.NET CORE开源工作流引擎 - 可视化流程设计器 - 工作流表单设计器 - .NET快速开发平台 - .NET三层代码生成器 - 通用权限管理

.NET MVC CORE开源工作流平台,可视化流程设计器
RoadFlow-Plus8.3.6升级说明

1、增加了应用设计可设置表格说明。

    修改文件:\RoadFlow.WebUI\src\roadui-pages\app-design\design\attr.vue

    image.png

    修改文件:\RoadFlow.WebUI\src\roadui-pages\app-design\design\design.js

    image.png

2、流程管理增加保密等级。

    数据表 rf_flow增加字段:

    image.png

    修改文件:\RoadFlow.Model\Flow\FlowModel.cs

    image.png

    修改文件:\RoadFlow.WebApi\Controllers\RoadFlowWebApi\Flow\FlowController.cs

    image.png

    image.png

    修改文件:\RoadFlow.Data\Flow\FlowDao.cs

    image.png

    修改文件:\RoadFlow.Service\Flow\FlowService.cs

    image.png

    修改文件:\RoadFlow.WebUI\src\roadui-pages\flow\design\attr.vue

    image.png

    image.png

    修改文件:\RoadFlow.WebUI\src\roadui-pages\flow\design\index.vue

    image.png

3、修改了金额转换大写方法可能会不准的问题。

    修改文件:\RoadFlow.WebUI\src\roadui-assets\utils.js

    image.png

    //数字转换为大写金额
    capitalization(n) {
        if (!this.isNumberString(n)) {
            return '';
        }
        if ("0" == n) {
            return "零";
        } else if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n)) {
            return "";
        }
        var unit = "千百拾亿千百拾万千百拾元角分", str = "";
        n += "00";
        var p = n.indexOf('.');
        if (p >= 0)
            n = n.substring(0, p) + n.substr(p + 1, 2);
        unit = unit.substr(unit.length - n.length);
        for (var i = 0; i < n.length; i++)
            str += '零壹贰叁肆伍陆柒捌玖'.charAt(n.charAt(i)) + unit.charAt(i);
        return str.replace(/零(千|百|拾|角)/g, "零").replace(/(零)+/g, "零").replace(/零(万|亿|元)/g, "$1").replace(/(亿)万|壹(拾)/g, "$1$2").replace(/^元零?|零分/g, "").replace(/元$/g, "元整");
    },

4、增加了流程设计步骤可以设置宽度和高度。

    修改文件:\RoadFlow.WebUI\src\roadui-pages\flow\design\step.vue

    image.png

     <tr>
        <th>宽度</th>
        <td>
            <el-input-number v-model="stepSet.base.nodeWidth" @change="updateNode(stepId,{'data':{'nodeWidth':utils.len(stepSet.base.nodeWidth)>0?stepSet.base.nodeWidth+'px':''}})" :min="50" :max="800" style="width:135px;margin-right:18px;" controls-position="right"></el-input-number>
            <span>
                高度<el-input-number v-model="stepSet.base.nodeHeight" @change="updateNode(stepId,{'data':{'nodeHeight':utils.len(stepSet.base.nodeHeight)>0?stepSet.base.nodeHeight+'px':''}})" :min="50" :max="800" style="width:135px;margin-left:12px;" controls-position="right"></el-input-number>
            </span>
        </td>
        <th>备注说明</th>
        <td>
            <el-input v-model="stepSet.base.note" clearable></el-input>
        </td>
    </tr>

    修改文件:\RoadFlow.WebUI\src\roadui-pages\flow\design\design.vue

    image.png

    修改文件:\RoadFlow.WebUI\src\roadui-pages\flow\design\custom-node.vue

    image.png

 :style="{'width':props.data.nodeWidth||'136px','height':props.data.nodeHeight||'60px'}"

    image.png

    <style>
        .rf-flow-node { background-color: var(--el-color-info-light-7); border-radius: 6px; box-shadow: 0 0 6px 1px rgba(0,0,0,0.09); }
        .rf-flow-node-top { width: 100%; height: 8px; background: var(--el-color-primary); border-radius: 6px 6px 0 0; }
        .rf-flow-node:hover, .rf-flow-node-selected { background-color: var(--el-color-primary-light-8) }
        .rf-flow-node-text { height: calc(100% - 14px); width: initial; padding: 2px 4px; text-align: center; display: grid; justify-content: center; align-content:center; color: var(--el-text-color-primary); }
        .rf-flow-node-text-i { height: initial; }
        .rf-flow-node-text-i i { font-size: 18px; vertical-align: -3px; }
        .rf-flow-node-text-text { height: initial; text-align: left; padding-left: 3px; }
        .rf-flow-node-text label { height: inherit; display: grid; align-items: center; justify-content: center; align-content: center; }
        .rf-flow-handle { width: 10px; height: 10px; background-color: var(--el-color-info); }
    </style>

5、修改了流程处理多步骤平行会签的问题。

    修改文件:\RoadFlow.Service\Flow\FlowTaskService.cs

    image.png

    image.png

    #region 如果下一步有会签策略,则退回通过了要判断策略去完成会签同级步骤的任务。
    if (backCompleted)
    {
        //2026-4-6修改会签策略判断,修复了会签起点到会签步骤之间有多个步骤的情况。
        //判断逻辑-如果当前退回步骤是会签起点的后一个步骤才去判断(如果没有设置会签起点步骤,则默认就是起点后一个步骤)。
        var allNextStepsJsonArray = FlowService.GetAllNextSteps(currentFlowTaskModel.StepId, flowJsonObject);
        var stepStrategy = 0;//后续步骤会签策略
        var stepStrategyStart = IdGeneratorUtils.MIN_VALUE;//会签起点步骤id
        var stepStrategyId = IdGeneratorUtils.MIN_VALUE;//会签步骤id
        foreach (var nextStepsJsonNode in allNextStepsJsonArray)
        {
            var nextStepId = nextStepsJsonNode.GetLong("id");
            var nextStepStrategySetJsonNode = stepSetsJsonNode.GetJsonNode("s_" + nextStepId.ToString()).GetJsonNode("strategy");
            var nexStepStrategy = nextStepStrategySetJsonNode.GetInt("stepStrategy");
            if (nexStepStrategy > 0)
            {
                stepStrategy = nexStepStrategy;//如果后续步骤中有会签,则表示是会签中间步骤,直接跳出循环。
                stepStrategyStart = nextStepStrategySetJsonNode.GetLong("stepStrategyStart", IdGeneratorUtils.MIN_VALUE);
                stepStrategyId = nextStepId;
                break;
            }
        }
        var isCheckStrategy = stepStrategy > 0;//是否要检查同级会签退回
        if (isCheckStrategy)
        {
            //如果设置了会签起点,则判断当前退回步骤前一步是不是会签起点
            if (IdGeneratorUtils.IsId(stepStrategyStart))
            {
                var prevIsInStartStep = false;
                var prevSteps = FlowService.GetPrevSteps(currentFlowTaskModel.StepId, flowJsonObject);
                foreach (var prevStepsJsonNode in prevSteps)
                {
                    if (prevStepsJsonNode.GetLong("id") == stepStrategyStart)
                    {
                        prevIsInStartStep = true;
                        break;
                    }
                }
                isCheckStrategy = prevIsInStartStep;
            }
        }
        if (isCheckStrategy)
        {
            bool stepStrategyBackIsPass = false;//是否要标记同级会签任务
            switch (stepStrategy)
            {
                case 1://所有步骤通过
                       //如果是所有步骤通过,当前步骤已经退回了,说明不满足所有步骤通过的条件,则要将同级步骤任务标记为他人已退回。
                    stepStrategyBackIsPass = true;
                    break;
                case 2://一个步骤通过
                       //如果是一个步骤通过,当前步骤退回了不修改其他同级步骤的任务。
                    stepStrategyBackIsPass = false;
                    break;
                case 3://依据步骤通过比例
                       //ArrayNode prevStepsArrayNode = flowService.getPrevSteps(nextStepId, flowJsonNode);//会签步骤的所有前面步骤
                       //double stepStrategyPercentage = JSONUtils.getDouble(nextStepStrategyJsonNode, "stepStrategyPercentage");//步骤会签比例
                    break;
            }
            if (stepStrategyBackIsPass)
            {
                var prevStepsJsonArray = FlowService.GetPrevSteps(stepStrategyId, flowJsonObject);//会签步骤的所有前面步骤
                foreach (var prevStepsJsonNode in prevStepsJsonArray)
                {
                    var prevStepId = prevStepsJsonNode.GetLong("id");
                    //如果是当前步骤则跳过
                    if (prevStepId == currentFlowTaskModel.StepId)
                    {
                        continue;
                    }
                    List<long> prevStepIdList = [];
                    if (IdGeneratorUtils.IsId(stepStrategyStart))
                    {
                        //如果设置了起点步骤,则要查询起点步骤到会签前一步之间的步骤。
                        var middleStepsJsonArray = FlowService.GetMiddleSteps(stepStrategyStart, prevStepId, flowJsonObject);
                        foreach (var middleStepsJsonNode in middleStepsJsonArray)
                        {
                            var middleStepId = middleStepsJsonNode.GetLong("id");
                            if (IdGeneratorUtils.IsId(middleStepId))
                            {
                                prevStepIdList.Add(middleStepId);
                            }
                        }
                    }
                    else
                    {
                        //如果没有设置起点步骤,则只查询会签前一步
                        prevStepIdList.Add(prevStepId);
                    }
                    //循环将步骤上未处理的任务设置为他人已退回,将等待中的任务删除。
                    foreach (var prevStepIdLong in prevStepIdList)
                    {
                        foreach (var taskModel in groupTasks.Where(s => s.StepId == prevStepIdLong && s.Status < 1))
                        {
                            if (taskModel.Status == 0)
                            {
                                taskModel.Status = 1;
                                taskModel.HandleType = 5;
                                updateTasks.Add(taskModel);
                            }
                            else if (taskModel.Status == -1)
                            {
                                deleteTasks.Add(taskModel);
                            }
                        }
                    }
                }
            }
        }
    }
    #endregion


联系QQ:493501010电话:136 0832 5512(微信同号)邮箱:493501010@qq.com
© 2014 - 2026 重庆天知软件技术有限公司 版权所有