ecp_flow_app 3.0.7 copy "ecp_flow_app: ^3.0.7" to clipboard
ecp_flow_app: ^3.0.7 copied to clipboard

流程引擎

ecp_flow_app #

ECP_FLOW_APP是是一套用于解析流程引擎,显示流程处理按钮集的工具库,工具集内包含基础的流程引擎解析/匹配/解析,同时也默认集成实现翼协云流程引擎功能,开箱即用。

此库专为内部项目需求设计,若不符合您的使用场景,敬请谅解。

使用 #

添加依赖 #

ecp_flow_app: <最新版本>

功能列表 #

  • 流程引擎解析
  • 流程处理集动态适配
  • 流程处理集动态展示
  • 自定义流程按钮
  • 翼协云流程引擎开箱即用

实现原理 #

流程引擎分为三个部分,配置/匹配/展示三个流程;现阶段配置已固定,用于匹配阶段生成处理按钮对应的属性;匹配用于指定特定处理功能按钮生成逻辑,而展示阶段则是整合按钮集显示逻辑,三者关系如下:

配置 #


class FlowBtnConfig {
  FlowBtnConfig({
    this.id, //唯一标识
    this.label,//标签
    this.config,//子配置 
    this.disabled,//是否禁用
  });
  ...
}

匹配表 #

abstract class FlowMapper {
  const FlowMapper();
  FlowBtn map(FlowBtnConfig config); //匹配方法
}

流程按钮 #

class FlowBtn extends StatefulWidget {
  final FlowBtnBuilder builder; // 按钮样式实现
  final FlowBtnConfig config; // 流程按钮配置项
  final CommentAction? comment; // 评论实现
  final SubmitAction? submit; // 提交事件
  final Function? onCommentEmpty; // 无评论回调,前提是comment不为空
  final VisibilityPredict predict; //显示预测
...
}

默认Ecp流程按钮 #

class EcpFlowBtn extends FlowBtn {
  final DecorationBuilder? decorationBuilder; // 按钮装饰样式
  final String? label; // 按钮标签
  final TextStyleBuilder? labelStyleBuilder; // 标签文字样式
  final EdgeInsets? labelPadding; // 标签对装饰容器边距
  final String? commentEmptyHint; // 无评论提示

  EcpFlowBtn({
    super.key,
    required super.config,
    required super.predict,
    super.comment,
    super.submit,
    this.decorationBuilder,
    this.label,
    this.labelStyleBuilder,
    this.labelPadding,
    this.commentEmptyHint,
  }) : super(
          builder: (ctx, config) => _btnBuilderImpl(
              ctx,
              config,
              label,
              decorationBuilder?.call(ctx),
              labelStyleBuilder?.call(ctx),
              labelPadding),
          onCommentEmpty: () => _onCommentEmpty(commentEmptyHint),
        ) {
    config.label = label ?? config.label;
  }
}

引擎 #

class FlowEngine extends StatefulWidget {
  final List<FlowBtnConfig> configs; //配置集
  final FlowBuilder builder; // 功能按钮集显示样式实现
  final FlowMapper mapper; // 匹配表
  final dynamic record; // 流程实例
  final Map? extras; // 附加属性表
  final FlowSuccessCallback? onFlowSuccess; // 流程处理成功回调
  final FlowSort? sort; // 功能按钮排序
...
}

使用流程 #

假设我们有一个流程需要**confirm处理,_confirm _**提交前需要做出批示,那我们来实现这样一个功能。

Confirm按钮实现 #

class ConfirmBtn extends EcpFlowBtn {
  ConfirmBtn({
    super.key,
    required super.config,
    super.decorationBuilder = _createDecoration,
    super.labelStyleBuilder = _createTextStyle,
    super.comment = onComment,
    super.submit = _onConfirm,
    super.predict = onPredict,
    super.label = "同意",
    super.labelPadding,
    super.commentEmptyHint = "",
  });
}

匹配表实现 #

class EcpFlowMapper extends FlowMapper {
  const EcpFlowMapper();
  @override
  FlowBtn map(FlowBtnConfig config) {
    switch (config.id) {
      case EcpFlowAction.confirmation:
        return ConfirmBtn(config: config);
      ...
    }
  }
}

引擎实现 #

class EcpFlowEngine extends FlowEngine {
  ...

  EcpFlowEngine({
    required this.flowRecord,
    this.ecpConfigs,
    super.key,
    super.builder,
    super.sort,
    super.mapper = ecpMapper, // map表单
    this.approval = false,
    this.onEcpFlowSuccess,
  }) : super(
          record: flowRecord,
          configs: (ecpConfigs ?? [])..addAll(_defaultConfigs),
          extras: {
            approvalKey: approval,
          },
        );
}

使用 #

 Column(
        children: [
          Text(hint).center().expanded(),
          EcpFlowEngine(
            flowRecord: widget.record,
            ecpConfigs: list,
            approval: true,
            onEcpFlowSuccess: (ctx, config) async {
              setState(() => hint = "${config.label}成功,3秒后退出");
              await Future.delayed(const Duration(seconds: 3));
              if (mounted) {
                Navigator.pop(context, true);
              }
            },
          )
        ],
      )

ECP流程引擎使用 #

ecp流程引擎,是在基础引擎下针对翼协云流程引擎单独实现,其中 **流程按钮功能/匹配表/按钮集展示 **已完成默认实现,开箱即用。

示例代码 #

 EcpFlowEngine(
            flowRecord: widget.record, // 流程实例
            ecpConfigs: list, // 流程配置列表
            approval: true,//是否显示审核相关按钮
            onEcpFlowSuccess: (ctx, config) async { //流程处理成功回调
              setState(() => hint = "${config.label}成功,3秒后退出");
              await Future.delayed(const Duration(seconds: 3));
              if (mounted) {
                Navigator.pop(context, true);
              }
            },
          )