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

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

1、修改了流程任务处理后标记关联消息为已读。

    修改文件:\RoadFlow.Data\Message\MessageDao.cs

    image.png

    修改文件:\RoadFlow.Service\Message\MessageService.cs

    image.png

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

    image.png

2、增加了应用设计小计合计功能。

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

    image.png

    image.png

    image.png

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

    image.png

    image.png

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

    image.png

    image.png

    image.png

    修改文件:\RoadFlow.Service\AppDesign\AppDesignRunService.cs

    image.png

    image.png

 /// <summary>
/// 得到运行时列表查询数据
/// </summary>
/// <param name="request">HttpRequest</param>
/// <param name="isExportExcel">是否是导出excel</param>
/// <param name="selectIds">导出时选择列的idList</param>
/// <returns>(JsonObject-{total:总条数,records:记录列表},数据DataTable,AppDesignRunModel)</returns>
public (JsonObject, DataTable?, AppDesignRunModel?) GetListData(HttpRequest request, bool isExportExcel = false, List<string>? selectIds = null)
{
    JsonArray recordsJsonArray = [];
    var appDesignId = request.QueryFormStr("appDesignId").ToLong();//应用id
    var appDesignRunModel = Get(appDesignId);
    if (appDesignRunModel == null)
    {
        return (new JsonObject() { { "total", 0 }, { "records", recordsJsonArray } }, null, null);
    }

    //验证应用授权
    if (IsNotAuth(appDesignRunModel, OrgUserService.GetLoginUserId(request)))
    {
        return (new JsonObject() { { "total", 0 }, { "records", recordsJsonArray } }, null, null);
    }

    var attrJsonObject = JsonUtils.ParseJsonObject(appDesignRunModel.AttrSet);
    var connId = attrJsonObject.GetLong("connId", IdGeneratorUtils.MIN_VALUE);
    var connModel = connService.GetOrDefault(connId);
    if (connModel == null)
    {
        return (new JsonObject() { { "total", 0 }, { "records", recordsJsonArray } }, null, appDesignRunModel);
    }
    var leftJsonObject = "1".Equals(request.QueryFormStr("isLeftQuery").TrimEmpty()) ? JsonUtils.ParseJsonObject(appDesignRunModel.LeftSet) : null;//左栏树节点点击的查询
    var listJsonArray = JsonUtils.ParseJsonArray(appDesignRunModel.ListSet);
    var queryJsonArray = JsonUtils.ParseJsonArray(appDesignRunModel.QuerySet);
    var order = request.FormQueryStr("order");
    if (string.IsNullOrWhiteSpace(order))
    {
        //如果排序为空,则使用应用属性中设置的默认排序。
        order = attrJsonObject.GetString("defaultSort");
    }
    var sql = wildcardService.Replace(attrJsonObject.GetString("sqlString"));
    bool isPager = !isExportExcel && attrJsonObject.GetInt("isPager") == 1;//是否分页,如果是导出不分页
    List<IConditionalModel> conditionalModels;
    //如果是导出并且选择了列则只查询导出列数据
    if (isExportExcel && selectIds != null && selectIds.Count > 0)
    {
        var selectKey = attrJsonObject.GetString("selectKey");
        conditionalModels = [];
        conditionalModels.Add(new ConditionalModel
        {
            FieldName = string.IsNullOrWhiteSpace(selectKey) ? "id" : selectKey,
            ConditionalType = ConditionalType.In,
            CustomParameterValue = selectIds
        });
    }
    else
    {
        conditionalModels = GetQueryFilter(queryJsonArray, leftJsonObject, connModel, request);
    }
    int? number = isPager ? request.FormQueryStr("number").ToInt(1) : null;
    int? size = isPager ? request.FormQueryStr("size").ToInt(10) : null;
    var (total, dt) = ConnService.GetDataTablePage(connModel, sql, conditionalModels, order, size, number);
    if (isExportExcel)
    {
        //如果是导出excel,直接返回。
        return (new JsonObject() { { "total", total }, { "records", recordsJsonArray } }, dt, appDesignRunModel);
    }

    Dictionary<string, (decimal, string)> subTotalDict = [];//要计算小计的字段 
    Dictionary<string, (decimal, string)> sumTotalDict = [];//要计算合计的字段
    foreach (var listJsonNode in listJsonArray)
    {
        if (listJsonNode.GetInt("subTotal") == 1)
        {
            subTotalDict.Add(listJsonNode.GetString("fieldName"), (0, listJsonNode.GetString("showFormat")));
        }
        if (listJsonNode.GetInt("sumTotal") == 1)
        {
            sumTotalDict.Add(listJsonNode.GetString("fieldName"), (0, listJsonNode.GetString("showFormat")));
        }
    }

    var columns = dt.Columns;
    foreach (System.Data.DataRow dr in dt.Rows)
    {
        JsonObject rowJsonObject = [];
        foreach (System.Data.DataColumn dc in columns)
        {
            var objValue = dr.IsNull(dc.ColumnName) ? null : dr[dc.ColumnName];
            SetListJsonObjectValue(rowJsonObject, listJsonArray, dc.ColumnName, objValue, dr);
            if (subTotalDict.TryGetValue(dc.ColumnName, out (decimal, string) value))
            {
                subTotalDict[dc.ColumnName] = (value.Item1 + objValue.ToNotNullString().ToDecimal(), value.Item2);
            }
        }
        recordsJsonArray.Add(rowJsonObject);
    }

    //组织小计
    JsonObject subTotalJsonObject = [];
    foreach (var dict in subTotalDict)
    {
        subTotalJsonObject.Add(dict.Key, string.IsNullOrWhiteSpace(dict.Value.Item2) ? dict.Value.Item1.ToString() : dict.Value.Item1.ToString(dict.Value.Item2));
    }

    //查询合计
    JsonObject sumTotalJsonObject = [];
    if (sumTotalDict.Count > 0)
    {
        List<string> sumFields = [];
        foreach (var sumDict in sumTotalDict)
        {
            sumFields.Add("SUM(" + sumDict.Key + ") AS " + sumDict.Key);
        }
        try
        {
            var sumDt = ConnService.GetDataTable(connModel, sql, sumFields.JoinToString(), conditionalModels);
            if (sumDt.Rows.Count > 0)
            {
                var sumDr = sumDt.Rows[0];
                foreach (var sumDict in sumTotalDict)
                {
                    if (!sumDt.Columns.Contains(sumDict.Key))
                    {
                        continue;
                    }
                    sumTotalJsonObject.Add(sumDict.Key, string.IsNullOrWhiteSpace(sumDict.Value.Item2) ? sumDr[sumDict.Key].ToNotNullString() : sumDr[sumDict.Key].ToNotNullString().ToDecimal().ToString(sumDict.Value.Item2));
                }
            }
        }
        catch (Exception ex)
        {
            logService.Add(ex);
        }
    }

    return (new JsonObject() { { "total", total }, { "records", recordsJsonArray }, { "subTotal", subTotalJsonObject }, { "sumTotal", sumTotalJsonObject } }, dt, appDesignRunModel);
}

3、增加了我的发起流程中可以复制再次发起功能。

    修改文件:\RoadFlow.WebUI\src\roadui-pages\flow\run\my-start.vue

    image.png

    image.png

  //复制一份表单数据再发起流程
const copyStart = (task) => {
    utils.confirm('您确定要复制并发起流程吗?', () => {
        loading.value = true;
        ajax.post('/Flow/Flow/CopyMyStart?groupId=' + task.groupId).then((res) => {
            if (res.code === 0) {
                const newTask = res.data;
                const menu = {
                    id: 'flow_run_' + newTask.id,
                    name: newTask.title,
                    icon: 'icon-draft-line',
                    url: '/flow/run/index.vue?flowId=' + newTask.flowId + '&flowVersionId=' + newTask.flowVersionId + '&stepId=' + newTask.stepId + '&taskId=' + newTask.id + '&instanceId=' + newTask.instanceId + '&groupId=' + newTask.groupId,
                    openMode: 0
                };
                index_openPage(menu);
            } else {
                let msg = '操作失败!';
                if (res.code === 1) {
                    msg = '没有找到任务!';
                } else if (res.code === 2) {
                    msg = '未找到流程运行时实体!';
                }
                utils.msg(msg, false);
            }
            loading.value = false;
        }).catch(() => {
            loading.value = false;
        });
    });
};

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

    image.png

  /// <summary>
/// 复制我的发起流程重新发起流程
/// </summary>
/// <param name="groupId">组id</param>
/// <returns>ResponseModel</returns>
[HttpPost]
[UserValidate]
public ResponseModel CopyMyStart([FromQuery] long? groupId)
{
    var groupTasks = flowTaskService.GetGroupList(groupId);
    if (groupTasks.Count == 0)
    {
        return ResponseResult.Error(1);
    }
    var flowTaskModel = groupTasks.Where(s => s.PrevId == IdGeneratorUtils.MIN_VALUE).FirstOrDefault();
    if (flowTaskModel == null)
    {
        return ResponseResult.Error(1);
    }
    var flowJsonObject = flowService.GetFlowVersionJsonObject(flowTaskModel.FlowVersionId);
    if (flowJsonObject.IsEmpty())
    {
        return ResponseResult.Error(2);
    }
    var attrJsonNode = flowJsonObject.GetJsonNode("attr");
    var startStepId = attrJsonNode.GetLong("startStepId");
    var stepSetJsonObject = FlowService.GetStepSetJsonObject(startStepId, flowJsonObject);
    var stepBaseSetJsonNode = stepSetJsonObject.GetJsonNode("base");
    var appId = stepBaseSetJsonNode.GetLong("appId");
    var formTemplateJsonObject = formService.GetTemplateJsonObjectByAppId(appId);

    var formData = formService.GetFormData(appId, flowTaskModel.InstanceId, []);
    //清空formData中的流水号,保存数据时重新生成。
    var serialNumberJsonArray = formTemplateJsonObject.GetJsonArray("serialNumber");
    if (!serialNumberJsonArray.IsEmpty())
    {
        foreach (var serialNumberJson in serialNumberJsonArray)
        {
            var fieldId = serialNumberJson.GetString("id");
            if (!string.IsNullOrWhiteSpace(fieldId))
            {
                formData[fieldId] = "";
            }
        }
    }
    var (userId, userName) = OrgUserService.GetLoginUserIdAndName(Request);
    JsonObject paramsJsonObject = new()
    {
        { "type", "save" },
        { "flowId", flowTaskModel.FlowId.ToString() },
        { "flowVersionId", flowTaskModel.FlowVersionId.ToString() },
        { "stepId", flowTaskModel.StepId.ToString() },
        { "title", flowTaskModel.Title },
        { "senderId",  userId.ToString() },
        { "senderName", userName }
    };
    var resultJsonObject = flowExecuteService.Execute(paramsJsonObject, formData);
    var code = resultJsonObject.GetInt("code");
    if (code != 0)
    {
        return ResponseResult.Error(code);
    }
    return ResponseResult.Success(resultJsonObject.GetJsonNode("currentTask"));
}

4、增加人大金仓数据库支持。

    修改文件:\RoadFlow.WebApi\appsettings.json

    image.png

    修改文件:\RoadFlow.Data\SqlSugarHelper.cs

    image.png

5、增加了应用设计列内容过长时是否隐藏选项。

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

    image.png

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

    image.png

6、增加了应用设计导出设置时可设置导入时是否转换。

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

    image.png

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

    image.png

    修改文件:\RoadFlow.Service\AppDesign\AppDesignRunService.cs

    image.png

    image.png

    修改表rf_design_export增加字段:

    image.png

    实体类修改:\RoadFlow.Model\AppDesign\AppDesignExportModel.cs

    image.png

7、修改了应用设计导出选中行时导出为空的问题。

    修改文件:\RoadFlow.Service\AppDesign\AppDesignRunService.cs

    image.png

8、修改了HTML富文本编辑器为Tinymce。

    安装组件:npm install @tinymce/tinymce-vue@6.0.1

    卸载组件:npm uninstall @wangeditor/editor-for-vue

    修改文件:\RoadFlow.WebUI\src\roadui-components\rf-editor.vue

    增加目录及文件:\RoadFlow.WebUI\public\tinymce

    修改文件:\RoadFlow.WebUI\index.html

    image.png

    image.png

    修改文件:\RoadFlow.WebUI\src\roadui-pages\form\design\controls\editor-ctl.vue

    image.png

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

    image.png

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