j-roadflow-plus-8.3.6升级日志

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

    修改文件:src/web/element/src/roadui-pages/app-design/design/attr.vue

    image.png

    修改文件:src/web/element/src/roadui-pages/app-design/design/design.js

    image.png

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

    数据表rf_flow增加字段:

    image.png

    修改文件:src/web/element/src/roadui-pages/flow/design/attr.vue

    image.png

    image.png    

    修改文件:src/main/java/cn/tzsoft/roadflow/model/flow/FlowModel.java

    image.png

    image.png

    修改文件:src/main/java/cn/tzsoft/roadflow/dao/flow/FlowDao.java

    image.png

    修改文件:src/main/java/cn/tzsoft/roadflow/service/flow/FlowService.java

    image.png

    修改文件:src/main/java/cn/tzsoft/roadflow/controller/roadflowwebapi/flow/FlowController.java

    image.png

    image.png

    修改文件:src/web/element/src/roadui-pages/flow/design/index.vue

    image.png

    增加数据字典项:

    image.png

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

    修改文件:src\web\element\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、增加了流程设计步骤可以设置宽度和高度。

    修改文件:src/web/element/src/roadui-pages/flow/design/step.vue

    image.png

    修改文件:src/web/element/src/roadui-pages/flow/design/design.vue

    image.png

    修改文件:src/web/element/src/roadui-pages/flow/design/custom-node.vue

    image.png

    image.png

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

    修改文件:src/main/java/cn/tzsoft/roadflow/service/flow/FlowExecuteService.java

    image.png

    //region 如果下一步有会签策略,则退回通过了要判断策略去完成会签同级步骤的任务。
    if (backCompleted) {
        //2026-4-6修改会签策略判断,修复了会签起点到会签步骤之间有多个步骤的情况。
        //判断逻辑-如果当前退回步骤是会签起点的后一个步骤才去判断(如果没有设置会签起点步骤,则默认就是起点后一个步骤)。
        ArrayNode allNextStepsArrayNode = flowService.getAllNextSteps(currentFlowTaskModel.getStepId(), flowJsonNode);
        int stepStrategy = 0;//后续步骤会签策略
        long stepStrategyStart = IdGeneratorUtils.MIN_VALUE;//会签起点步骤id
        long stepStrategyId = IdGeneratorUtils.MIN_VALUE;//会签步骤id
        for (JsonNode nextStepJsonNode : allNextStepsArrayNode) {
            long nextStepId = JSONUtils.getLong(nextStepJsonNode, "id", IdGeneratorUtils.MIN_VALUE);
            JsonNode nextStepStrategyJsonNode = JSONUtils.getJsonNode(JSONUtils.getJsonNode(stepSets, "s_" + NumberUtils.longToString(nextStepId)), "strategy");
            int nextStepStrategy = JSONUtils.getInt(nextStepStrategyJsonNode, "stepStrategy");
            if (nextStepStrategy > 0) {
                stepStrategy = nextStepStrategy;
                stepStrategyStart = JSONUtils.getLong(nextStepStrategyJsonNode, "stepStrategyStart", IdGeneratorUtils.MIN_VALUE);
                stepStrategyId = nextStepId;
                break;
            }
        }
        boolean isCheckStrategy = stepStrategy > 0;//是否要检查同级会签退回
        if (isCheckStrategy) {
            //如果设置了会签起点,则判断当前退回步骤前一步是不是会签起点
            if (IdGeneratorUtils.isId(stepStrategyStart)) {
                boolean prevIsInStartStep = false;
                ArrayNode prevSteps = flowService.getPrevSteps(currentFlowTaskModel.getStepId(), flowJsonNode);
                for (JsonNode prevStep : prevSteps) {
                    if (JSONUtils.getLong(prevStep, "id") == stepStrategyStart) {
                        prevIsInStartStep = true;
                        break;
                    }
                }
                isCheckStrategy = prevIsInStartStep;
            }
        }
        if (isCheckStrategy) {
            boolean stepStrategyBackIsPass = false;//是否要标记同级会签任务。
            if (stepStrategy > 0) {
                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) {
                ArrayNode prevStepsArrayNode = flowService.getPrevSteps(stepStrategyId, flowJsonNode);//会签步骤的所有前面步骤
                for (JsonNode prevStepJsonNode : prevStepsArrayNode) {
                    Long prevStepId = JSONUtils.getRefLong(prevStepJsonNode, "id");
                    //如果是当前步骤则跳过
                    if (prevStepId.equals(currentFlowTaskModel.getStepId())) {
                        continue;
                    }
                    List<Long> prevStepIdList = new ArrayList<>();
                    if (IdGeneratorUtils.isId(stepStrategyStart)) {
                        //如果设置了起点步骤,则要查询起点步骤到会签前一步之间的步骤。
                        ArrayNode middleArrayNode = flowService.getMiddleSteps(stepStrategyStart, prevStepId, flowJsonNode);
                        for (JsonNode middleJsonNode : middleArrayNode) {
                            Long sId = JSONUtils.getRefLong(middleJsonNode, "id");
                            if (IdGeneratorUtils.isId(sId)) {
                                prevStepIdList.add(sId);
                            }
                        }
                    } else {
                        //如果没有设置起点步骤,则只查询会签前一步
                        prevStepIdList.add(prevStepId);
                    }
                    //循环将步骤上未处理的任务设置为他人已退回,将等待中的任务删除。
                    for (Long pStepId : prevStepIdList) {
                        flowGroupTasks.stream().filter(s -> s.getStepId().equals(pStepId) && s.getStatus() < 1).forEach((task) -> {
                            if (task.getStatus() == 0) {
                                task.setStatus(1);
                                task.setHandleType(5);
                                updateTasks.add(task);
                            } else if (task.getStatus() == -1) {
                                deleteTasks.add(task);
                            }
                        });
                    }
                }
            }
        }
    }
    //endregio

6、修改了日期时间控件默认值格式问题。

    修改文件:src/web/element/src/roadui-pages/form/design/design.js

    image.png

    修改文件:src/main/java/cn/tzsoft/roadflow/service/form/FormService.java

    image.png

7、增加了表单设计标签label可自定义插槽。

    修改文件:src/web/element/src/roadui-assets/utils.js

    

    修改文件:src/web/element/src/roadui-pages/form/design/design.js

    image.png

    image.png

    每个方法做同样修改。

    image.png

    修改文件:src/web/element/src/roadui-pages/form/design/index.vue

    image.png

    以下文件作同样修改:

    src/web/element/src/roadui-pages/form/design/controls/table-ctl.vue

    src/web/element/src/roadui-pages/form/design/controls/tab-ctl.vue

    src/web/element/src/roadui-pages/form/design/controls/space-ctl.vue

    src/web/element/src/roadui-pages/form/design/controls/layout-ctl.vue

    src/web/element/src/roadui-pages/form/design/controls/div-ctl.vue

    src/web/element/src/roadui-pages/form/design/controls/collapse-ctl.vue

    src/web/element/src/roadui-pages/form/design/controls/card-ctl.vue


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