Activiti 根据模型ID,或者流程定义ID获取节点列表

activiti根据当前节点获取下一个UseTask节点 以前写过一篇文章activiti根据当前节点获取下一个节点信息,当时的需求只是需要获取下一个节点而已,并没有要求获得什么类型的节点,所以下一个节点可能是任何节点,在最近的项目中的需求是根据当前的节点获取下一个UseTask节点,为当前审批人选择下一个审批人提示,所以前面的文章所给出的信心就不能够实现当前功能。 所以本文所述为获取下一个任务节点。根据上一篇文章,可以获取到下一个节点的信息,如果我们获 阅读详情
public void viewProgress(){
		String modelId = "150019";//模型ID
		logger.info("[开始]-获取流程节点");
		try {
//			byte[] bytes = repositoryService.getModelEditorSource(modelId);
//			if (null == bytes){
//				System.out.println("模型数据为空,模型不存在");
//			}
//			JsonNode modelNode = new ObjectMapper().readTree(bytes);
//			BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(modelNode);
			
			//根据流程定义id来获取BpmnModel对象
			String processDefinitionId="level-2:16:150077";
			BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
			if (null == bpmnModel){
				System.out.println("模型数据为空,模型不存在");
			}
			List<Process> processList = bpmnModel.getProcesses();
			if (CollectionUtil.isNotEmpty(processList)){
				List<Element> list = new ArrayList<>();
				processList.forEach(process -> {
					Collection<FlowElement> elementList = process.getFlowElements();
					for (FlowElement flowElement : elementList) {
						if (StrUtil.isBlank(flowElement.getName())){
							continue;
						}
						Element element = new Element();
						element.setId(flowElement.getId());
						element.setName(flowElement.getName());
						if (flowElement instanceof StartEvent){
							element.setType("Start");
						}else if (flowElement instanceof UserTask){
							element.setType("Task");
						}else if (flowElement instanceof EndEvent){
							element.setType("End");
						}else if (flowElement instanceof SequenceFlow){
							// 流程连接线
							continue;
						}else if (flowElement instanceof ExclusiveGateway){
							// 流程网关
							continue;
						}
						list.add(element);
						System.out.println("ID:"+flowElement.getId()+",Name:"+flowElement.getName());
					}
				});
			}
			logger.info("[完成]-获取流程节点");
		} catch (Exception e) {
			logger.error("【异常】-获取流节点失败!" + e.getMessage());
		}
	}

返回结果:

{
  "code": 0,
  "msg": null,
  "data": [
    {
      "id": "sid-9C08BB63-9E1A-4A7F-8B32-C01D3C11B8AA",
      "name": "start",
      "type": "Start"
    },
    {
      "id": "sid-3187B379-E85F-4EAC-8958-2A7952CBA551",
      "name": "HR",
      "type": "Task"
    },
    {
      "id": "sid-6133B0EC-C24F-4CBF-BB0D-9629B37FA42B",
      "name": "CEO",
      "type": "Task"
    },
    {
      "id": "sid-B7AC198D-E5C2-4240-B26F-ADFE8705360A",
      "name": "End",
      "type": "End"
    }
  ]
}

 

Activiti6---获取节点信息 文章目录1. 说明2. 获取上一节点的方式3. 获取下一节点的方式 1. 说明 在应用中可能需要获取当前节点的上一个节点的信息,或者下一个节点的信息。 2. 获取上一节点的方式 如下能够获取到上一个节点的key,可以用来进行回退等功能实现。 /** * 根据流程实例id获取上一个节点的信息 */ @Test public void queryUpOneNode(){ Task task = taskService.createTaskQuery() 阅读详情

相关推荐

activiti 根据模型id部署流程

感觉每次画流程图好麻烦,但是又无可奈何,生无可恋,项目上我都是用流程设计器画好了。 通过流程设计器保存的流程信息其中都会保存到act_re_model 里面,根据model_id 部署流程 部署流程关键代码 根据act_re_model 中的id_ 部署流程 将RepositoryService注入进来就可以了 // 获取模型 Model model = repositoryService.getModel(id); ObjectNode obj...

穷水叮咚的博客 3476

activiti学习资料(获取所有活动节点)

Activiti学习资料--获取流程定义的所有活动节点 java代码如下: ProcessDefinitionEntity def = (ProcessDefinitionEntity) ((RepositoryServiceImpl)repositoryService).getDeployedProcessDefinition(actDefId); List activitiList =

不了了之专栏 5204

activiti根据当前节点获取下一个节点信息

在流程中使用监听器判断当前节点是否需要经过,否则跳转到下一个节点,如下图 当提交申请之后,当前提交人为部门负责人,那么部门负责人节点就不需要走了,直接到下一个节点,但是下一个节点是什么并不知道,就可以使用下面的代码获取到下一个节点信息直接跳转到下一个节点。 /** * 获取当前流程的下一个节点 * @param procInstanceId * @return

chenfengdejuanlian的专栏 3万+

使用activity 获取流程中的各个节点id,并导出到excel中

activity 使用

‘Sword 1369

利用Matlab实现矩形波导电磁场分布图的绘制

1.利用Matlab实现矩形波导电磁场分布图的绘制;2.学会使用 Matlab 进行数值计算,并绘出相应的图形;通过Matlab 计算并绘出任意时刻金属矩形波导的主模 TE10 模的电磁场分布图。波导尺寸、工作频率及时刻均由外部给定。(1)矩形波导中传输的主模为TE10模。设金属波导尺寸为a*b,TE10模的截止波长为2*a。其电磁场分量可推导表示如下:.......1-1上式中各参量如下:......1-2。

qq_26335381的博客 3059

windows11 远程桌面连接 通过代理连接RDP桌面报错 错误代码0x904 拓展错误代码0x7

打开windows Defender防火墙设置--允许应用通过防火墙更改设置--允许其他应用浏览--进入C:\WINDOWS\system32目录选择mstsc.exe进入C:\Windows\SysWOW64目录h'qmstsc.exe添加后列表里多了一个远程桌面连接,还有一个Remote Desktop Connection,配置网络权限后保存连接成功。

weixin_43978891的博客 1万+

activiti6获取流程图上所有节点

activiti6显示流程图所有节点。

weixin_45818332的博客 1348

Cadence Allegro安装全攻略:从准备到优化的完整指南

本文提供了一份详尽的Cadence Allegro安装教程,涵盖从系统准备、硬件要求到获取安装文件的完整前期工作。指南逐步解析了自定义安装、路径选择及核心组件配置,并重点阐述了许可证服务器的环境变量设置与服务启动等关键激活步骤,最后给出了首次启动验证、个性化优化及常见问题排错方案,助您高效完成安装与配置。

weixin_29243063的博客 188

SpringBoot +Activiti 根据模型Id,查询节点列表

本文基于:Activiti 模型管理 Model 模型管理需求: 在模型管理功能基础上添加动态配置外置表单,注意不是内置表单。 温馨提示:不管是内置表单还是外置表单,都是配置在指定模型的节点之上所有我们就必须更新模型Id查询指定模型涉及的节点列表信息。 Model 模型管理之新增表单配置功能: 选择转正流程模型,查看节点列表: 温馨提示:这里还欠缺将自定义表单绑定值指定节点上。这个功能会在后期 实现。 SpringBoot 之Activiti Model 模型管理后台 Spring.

zhouzhiwengang的专栏 2319

最优化方法与数学建模

在本篇博客中,我们将探讨最优化方法在数学建模中的应用。首先,我们将介绍几种常见的最优化方法,如梯度下降、牛顿法和遗传算法。接着,我们将详细阐述这些方法的原理和算法。最后,我们将通过一个数学建模案例,展示如何使用Matlab实现这些方法。本文旨在为大家提供一个清晰的思路,以便更好地理解和应用最优化方法。

YOLO 439

置顶必读(1) | 《YOLOv26实战:从入门到深度优化》专栏导读与完整目录导航(持续更新中)

🏆 本文收录于 《YOLOv26实战:从入门到深度优化》 专栏。 本专栏系统梳理并持续复现 YOLOv26 官方特性、核心改进、多任务支持、部署优化与行业落地,内容坚持 持续更新 + 深度拆解 + 工程落地导向,不仅讲“怎么用”,更讲“为什么这样设计、如何真正落地到项目中”。

**My Coding Family** 9万+

Activiti7学习四之任务查询、任务处理、流程定义的查询

任务查询 任务启动后,任务负责人就能查询自己当前能够处理的任务了,查询出来的任务都是当前用户的代办任务。 任务处理任务负责人查询出来的待办的人,选择任务处理,完成任务。 当前任务张三已经通过,任务流向到了经理李四哪儿。该李四查询任务并处理任务。 流程定义的信息查询 查询流程相关的信息,包括流程的定义,流程的部署,流程定义的版本。 输出结果: 流程定义的id: evection:1:12504 定义流程是起的id 流程定义的name: 是定义流程的时候给流程起的名字 流程定义的key:evection

枣泥馅的博客 5272

从微服务到 Agent 服务:架构思维的迁移

微服务的概念最早在2014年由Martin Fowler提出,核心是“将单体应用拆分为一组小的服务,每个服务运行在独立的进程中,服务之间采用轻量级的通信机制互相协作,每个服务围绕具体业务构建,并且可以独立部署到生产环境”。单一职责:每个微服务只负责一个业务领域的功能,比如订单服务只处理订单相关的逻辑,用户服务只处理用户相关的逻辑被动响应:微服务是“哑的”,只有收到外部请求的时候才会执行逻辑,本身没有主动决策的能力固定流程:微服务的逻辑是硬编码的,执行流程是提前定义好的,只能按照程序员写的代码处理请求。

AI智能探索者的博客 275

activiti,根据流程实例id,获取下一个userTask节点的配置信息

activiti,根据流程实例id,获取下个userTask节点的配置信息,需要在每个节点都添加complete的监听器   public class Competeistener implements TaskListener {       private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngi...

qq_25927437的博客 1万+

cartographer ceres后端优化

这里引用一篇文章作用一:用户可以选择使用Problem::AddParameterBlock显式添加参数块;在显式添加的时候ceres会内部进行额外的正确性检查。当Problem::AddParameterBlock()不存在时,Problem::AddResidualBlock()会隐式添加参数块,因此不需要显式调用Problem::AddParameterBlock()函数。ps:类似构造函数,显式构造函数。

南北粉面馆 804

【Py/Java/C++/C/JS/Go六种语言OD独家2024E卷真题】20天拿下华为OD笔试之【固定滑窗】2024E-考勤信息【欧弟算法】全网注释最详细分类最全的华为OD真题题解

可上练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【优快云】否则不通过)

weixin_48157259的博客 620

activiti流程图上获取各节点的信息获取

背景:        由于项目的需要,当用户在查看流程图时,当点击某个流程图片上的节点时,需要提示一些信息,这就需要获取各个节点的信息,此处获取id和name的值。                           注意:这个并不是流程图的高亮,即当点击网点申请环节时,获取该节点的id和name,即B001和网点申请,点击部门申请时,获取B002和部门经理审批解释说明: 博文来源:http://...

fh1810038的博客 3万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

activiti,根据任务id获取该任务节点配置的获选人或者获选组

具体的实现代码如下: /** * @Title: getDefUsersByTaskId * @Description: TODO(根据任务id获取该节点的配置用户或者角色id) * @param taskId 任务id * @return * @return List&lt;String&gt; (当前任务节点配置的用户id列表) ...

qq_25927437的博客 8836

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

activiti根据当前节点获取下一个节点任务信息

在流程中使用监听器判断当前节点是否需要经过,否则跳转到下一个节点,如下图 当提交申请之后,当前提交人为部门负责人,那么部门负责人节点就不需要走了,直接到下一个节点,但是下一个节点是什么并不知道,就可以使用下面的代码获取到下一个节点信息直接跳转到下一个节点。 /** * 获取当前流程的下一个节点 * @param procInstanceId * @return */ public static String getNextNode(String procI

不抛弃、不放弃:Aaron莫言 6164

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Activiti获取流程节点、流程图,驳回,终止

最近项目,用到流程。第一次用,就自己做了一下小结: 1. ===================================下面这段代码是获取流程线信息============================= //         //processDefinitionId 对应表ACT_RE_PROCDEF主键信息         String processDefinitionId="...

xuqian1638的博客 1万+

activiti,根据任务节点id判断该节点是否为会签节点

具体实现代码如下所示: /** * @Title: isMultiInstance * @Description: TODO(根据任务节点id判断该节点是否为会签节点) * @param taskId 任务节点id * @return * @return boolean (这里用一句话描述返回结果说明) */ public boolean isMultiInstance(St...

qq_25927437的博客 6666

根据流程部署ID来获取流程定义图片

使用下面的一串代码的前提:已知流程部署ID,中间可能会由于空指针异常而报错,使用时需个人进行优化 需要注意的是下面的这一串代码中,各种服务是通过ActivitiRule而创建的,而ActivitiRule这个是在测试环境下面才能使用的类,开发时可以使用自动注解来创建Activiti6的7大服务接口。 /** * 根据流程部署ID获取流程部署图片文件输入流,并将其写到指定的文件中 */ p...

北辰 1322

Activiti工作流流程图获取可以根据部署id或者流程定义id获取工作流的步骤全图,非实时节点步骤图

/** * 两种情况 * @param deploymentId * @param procDefId * @param response */ @GetMapping("/proc/viewImage") @ResponseBody public void viewImage(String deploymentId,String procDefId, HttpServletResponse response){ String imageName=null; if (String.

沉淀的博客 2824

activiti学习资料(获取下一步节点)

activiti如何获取下一步节点 ACTIVITI相对于JBPM来说,比较年轻,用的人少,中文方面的资料更少,我根据网上到处找得资料以及看官方文档总结出来了代码,非常不容易啊。废话不多说,直接上代码吧:  首先是根据流程ID获取当前任务:  List tasks = taskService.createTaskQuery().processInstanceId(procInst

不了了之专栏 2726

activiti-根据processDefinitinId查询流程图所有节点信息

代码如下: BpmnModel bpmnModel = repositoryService.getBpmnModel("流程定义的ID"); //process中包含所有的节点信息,包括流程线 Process process = bpmnModel.getProcessById(“流程定义的KEY”); //获取第一个节点信息 FlowElement startElement = proce...

weixin_39102174的博客 5842
上一篇: Spring Boot Activiti 由于“X-Frame-Options“指令设为“DENY“ 跨域问题
下一篇: Feign 启动熔断java.lang.IllegalStateException: Incompatible fallback instance. Fallback/fallbackFactory
JavaAlpha
博客等级 码龄18年 910粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值