Activiti 基础总结一


Activiti是一款业务流程管理框架,对业务进行管理。

Activiti依靠23张表,存放流程数据。业务数据需要自己建表存储。

package test;

import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
/**
 * 一个完整的流程
 */
public class TestProcess {
	ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); //获取流程引擎
	/**
	 * 流程定义和部署对象
	 */
	@Test
	public void DeployProcess(){
		Deployment deployment=processEngine.getRepositoryService()  // 获取流程定义相关的Service
			.createDeployment()                                     // 创建一个部署对象
			.name("HELLO WORD")												// 添加部署名称							
			.addClasspathResource("diagrams/helloword.bpmn")								// 在classPath加载文件,一次加载一个文件
			.addClasspathResource("diagrams/helloword.png")
			.deploy();												// 完成部署
		
		System.out.println("部署ID:"+deployment.getId());
		System.out.println("部署名称:"+deployment.getName());
	}
	
	/**
	 * 启动流程实例
	 */
	@Test
	public void startProcessInstance(){
		String processDefinitionKey="helloword";   //流程定义的key
		ProcessInstance processInstance=processEngine.getRuntimeService()  //获取与正在执行的流程实例和执行对象相关的service
				.startProcessInstanceByKey(processDefinitionKey);  //启动流程实例,key对应bpmn文件中的id
		System.out.println("流程实例ID:"+processInstance.getId());
		System.out.println("流程定义ID:"+processInstance.getProcessDefinitionId());
	}
	
	/**
	 * 查询个人任务
	 */
	@Test
	public void queryPersionalTask(){		
		String assignee="王五";
		List<Task> list=processEngine.getTaskService()  //获取正在执行的任务管理相关的service
				.createTaskQuery()  //创建任务查询对象
				.taskAssignee(assignee)  //指定办理人
				.list(); 
		for(Task task:list){
			System.out.println("任务ID:"+task.getId());
			System.out.println("任务名称:"+task.getName());
			System.out.println("任务的创建时间:"+task.getCreateTime());
			System.out.println("任务的办理人:"+task.getAssignee());
			System.out.println("流程实例ID:"+task.getProcessInstanceId());
			System.out.println("执行对象ID:"+task.getExecutionId());
			System.out.println("流程定义ID:"+task.getProcessDefinitionId());
		}
	}
	
	
	/**
	 * 完成任务
	 */
	@Test
	public void completeTask(){
		String taskId="1302";
				processEngine.getTaskService()  //获取正在执行的任务管理相关的service 
				.complete(taskId);  //完成任务
				System.out.println("完成任务:"+taskId);
	}
	
	
	
	
	
	
	
}



package test;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;

import bean.VarBean;
/**
 * 流程变量
 *
 */
public class ProcessVar {
	ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); //获取流程引擎
	/**
	 * 流程定义和部署对象
	 */
	@Test
	public void DeployProcess(){
		InputStream inputStreampng=this.getClass().getClassLoader().getResourceAsStream("diagrams/processVar.png");
		InputStream inputStreambpmn=this.getClass().getClassLoader().getResourceAsStream("diagrams/processVar.bpmn");
		
		Deployment deployment=processEngine.getRepositoryService()  // 获取流程定义相关的Service
			.createDeployment()                                     // 创建一个部署对象
			.name("流程定义—流程变量")												// 添加部署名称							
			.addInputStream("processVar.png", inputStreampng)  //使用资源文件名称与输入流加载资源
			.addInputStream("processVar.bpmn", inputStreambpmn)  //使用资源文件名称与输入流加载资源
			.deploy();												// 完成部署
		
		System.out.println("部署ID:"+deployment.getId());
		System.out.println("部署名称:"+deployment.getName());
	}
	
	/**
	 * 启动流程实例
	 */
	@Test
	public void startProcessInstance(){
		String processDefinitionKey="processVar";   //流程定义的key
		ProcessInstance processInstance=processEngine.getRuntimeService()  //获取与正在执行的流程实例和执行对象相关的service
				.startProcessInstanceByKey(processDefinitionKey);  //启动流程实例,key对应bpmn文件中的id
		System.out.println("流程实例ID:"+processInstance.getId());
		System.out.println("流程定义ID:"+processInstance.getProcessDefinitionId());
	}
	
	/**
	 * 模拟设置和获取流程变量的值
	 */
	@Test
	public void setAndgetVar(){
		RuntimeService runtimeService=processEngine.getRuntimeService();  //与正在执行的流程实例和正在执行对象相关的service
		TaskService taskSerice=processEngine.getTaskService();  //与正在执行的任务相关的service
		//设置流程变量的值
//		runtimeService.setVariable(executionId, variableName, value);  //使用执行对象ID设置参数名称和值,一次设置一个值
//		runtimeService.setVariables(executionId, variables); //使用执行对象ID和map设置参数名称和值
//		taskSerice.setVariable(taskId, variableName, value); //使用任务ID设置参数名称和值
//		taskSerice.setVariables(taskId, variables);  //使用任务ID和map设置参数和名称
//		runtimeService.startProcessInstanceByKey(processDefinitionKey, variables)  //启动流程实例的时候用map设置参数
//		taskSerice.complete(taskId, variables);  //完成任务的时候使用map设置参数
//		使用javabean传递数据  x需要实现序列化
//		VarBean vb=new VarBean();  //使用javabean设置流程变量
//		vb.setId(1);
//		vb.setName("a");
//		taskSerice.setVariable(taskId, "人员信息", vb);
		
		
		//获取流程变量的值
//		runtimeService.getVariable(executionId, variableName)  //使用执行对象ID和参数名称获取参数值
//		runtimeService.getVariables(executionId)  //使用执行对象ID获取封装流程变量名称和值的map
//		runtimeService.getVariables(executionId, variableNames) //使用执行对象ID和放置了参数名称的集合作为参数返回对应参数的map
		
//		taskSerice.getVariable(taskId, variableName)  //使用任务ID和参数名称获取参数值
//		taskSerice.getVariables(taskId)  //使用任务ID获取封装流程变量名称和值的map
//		taskSerice.getVariables(taskId, variableNames) //使用任务ID和放置了参数名称的集合作为参数返回对应参数的map
		
//		VarBean vb=	(VarBean) taskSerice.getVariable(taskId, "人员信息");  //javabean方式获取
		
	}
	
	/**
	 * 设置流程变量
	 */
	@Test
	public void setVar(){
		String taskId="3204";
		TaskService taskSerice=processEngine.getTaskService();  //与正在执行的任务相关的service
//		taskSerice.setVariableLocal(taskId, "请假天数", 3);  //带local会绑定taskId
//		taskSerice.setVariable(taskId, "请假日期", new Date());
//		taskSerice.setVariable(taskId, "请假原因", "回家探亲");
//		System.out.println("设置流程变量OK");
		VarBean vb=new VarBean();  //使用javabean设置流程变量
		vb.setId(1);
		vb.setName("a");
		taskSerice.setVariable(taskId, "人员信息", vb);
		System.out.println("设置流程变量OK");
	}
	
	/**
	 * 获取流程变量
	 */
	@Test
	public void getVar(){
		String taskId="3204";
		TaskService taskSerice=processEngine.getTaskService();  //与正在执行的任务相关的service
//			Integer day=	(Integer) taskSerice.getVariable(taskId, "请假天数");
//			Date d=	(Date) taskSerice.getVariable(taskId, "请假日期");
//			String c=	(String) taskSerice.getVariable(taskId, "请假原因");
//			System.out.println(day+","+d+","+c);
		
			VarBean vb=	(VarBean) taskSerice.getVariable(taskId, "人员信息");
			System.out.println(vb.getId()+","+vb.getName());
						
	}
	/**
	 * 完成任务
	 */
	@Test
	public void completeTask(){
		String taskId="3402";
				processEngine.getTaskService()  //获取正在执行的任务管理相关的service 
				.complete(taskId);  //完成任务
				System.out.println("完成任务:"+taskId);
	}
	
	/**
	 * 查询流程变量的历史表
	 */
	@Test
	public void queryProcessVarHis(){
		List<HistoricVariableInstance>	list=	processEngine.getHistoryService()
				.createHistoricVariableInstanceQuery()   //创建历史流程变量查询对象
				.variableName("请假天数")
				.list();
		for(HistoricVariableInstance hvi:list){
			System.out.println(hvi.getId()+","+hvi.getProcessInstanceId()+","+hvi.getVariableName()+","
					+hvi.getVariableTypeName()+","+hvi.getValue());
		}		
	}
}



package test;

import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
/**
 * 流程实例和执行对象
 *
 */
public class ProcessInstanceAndExe {
	ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
	/**
	 * 使用zip方式部署对象和流程定义
	 */
	@Test
	public void DeployProcessByzip(){
		InputStream in=this.getClass().getClassLoader().getResourceAsStream("diagrams/helloword.zip");
		ZipInputStream zis=new ZipInputStream(in);
		
		System.out.println(11112);
		Deployment deployment=processEngine.getRepositoryService()  // 获取流程定义相关的Service
			.createDeployment()                                     // 创建一个部署对象
			.name("流程定义和部署对象")												// 添加部署名称							
//			.addClasspathResource("diagrams/helloword.bpmn")								// 在classPath加载文件,一次加载一个文件
//			.addClasspathResource("diagrams/helloword.png")
			
			.addZipInputStream(zis)			
			.deploy();												// 完成部署
		
		System.out.println("部署ID:"+deployment.getId());
		System.out.println("部署名称:"+deployment.getName());
	}
	
	/**
	 * 启动流程实例
	 */
	@Test
	public void startProcessInstance(){
		String processDefinitionKey="helloword";   //流程定义的key
		ProcessInstance processInstance=processEngine.getRuntimeService()  //获取与正在执行的流程实例和执行对象相关的service
				.startProcessInstanceByKey(processDefinitionKey);  //启动流程实例,key对应bpmn文件中的id
		System.out.println("流程实例ID:"+processInstance.getId());
		System.out.println("流程定义ID:"+processInstance.getProcessDefinitionId());
	}
	
	/**
	 * 查询个人任务
	 */
	@Test
	public void queryPersionalTask(){		
		String assignee="王五";
		List<Task> list=processEngine.getTaskService()  //获取正在执行的任务管理相关的service
				.createTaskQuery()  //创建任务查询对象
				//条件查询
				.taskAssignee(assignee)  //指定办理人
//				.processDefinitionId(processDefinitionId) //使用流程定义id查询
//				.processInstanceId(processInstanceId)  //流程实例ID查询
//				.executionId(executionId)  //执行对象ID查询
//				.taskCandidateUser(candidateUser)  //组任务的办理人查询
				//排序
//				.orderByTaskCreateTime().asc() //按创建时间升序排列
				//返回结果
//				.singleResult() //返回单个对象
//				.count() //返回结果数量
//				.listPage(firstResult, maxResults) //分页查询
				.list();  //返回列表
		for(Task task:list){
			System.out.println("任务ID:"+task.getId());
			System.out.println("任务名称:"+task.getName());
			System.out.println("任务的创建时间:"+task.getCreateTime());
			System.out.println("任务的办理人:"+task.getAssignee());
			System.out.println("流程实例ID:"+task.getProcessInstanceId());
			System.out.println("执行对象ID:"+task.getExecutionId());
			System.out.println("流程定义ID:"+task.getProcessDefinitionId());
		}
	}
	
	/**
	 * 完成任务
	 */
	@Test
	public void completeTask(){
		String taskId="2302";
				processEngine.getTaskService()  //获取正在执行的任务管理相关的service 
				.complete(taskId);  //完成任务
				System.out.println("完成任务:"+taskId);
	}
	/**
	 * 查询流程状态,判断流程是否执行完毕
	 */
	@Test
	public void isProcessEnd(){
		String processInstanceId="2101";
		ProcessInstance pi=	processEngine.getRuntimeService()
				.createProcessInstanceQuery()
				.processInstanceId(processInstanceId)
				.singleResult();
		if(pi==null){
			System.out.println("执行完毕");
		}else{
			System.out.println("未执行完");
		}
	}
	/**
	 * 查询历史任务表
	 */
	@Test
	public void queryHistoryTaskInst(){
		String 	taskAssignee="张三";
		List<HistoricTaskInstance> list=processEngine.getHistoryService()  //与历史数据相关的service
				.createHistoricTaskInstanceQuery()  //创建历史任务的查询
				.taskAssignee(taskAssignee)  //使用办理人查询
				.list();
		for(HistoricTaskInstance hti:list){
			System.out.println(hti.getId()+","+hti.getName()+","+hti.getProcessInstanceId()+","+hti.getStartTime()+hti.getDurationInMillis());
		}		
	}
	/**
	 * 查询历史流程实例表
	 */
	@Test
	public void queryHistoryProcessInstance(){
		String processInstanceId="1601";
		HistoricProcessInstance hpi=processEngine.getHistoryService() //与历史数据相关的service
				.createHistoricProcessInstanceQuery()  //创建历史流程实例查询
				.processInstanceId(processInstanceId)  //使用流程实例id作为查询条件
				.singleResult();
		System.out.println(hpi.getId()+","+hpi.getProcessDefinitionId()+","+hpi.getStartTime()+","+hpi.getEndTime()+","+hpi.getDurationInMillis());
	}
}




package test;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.io.FileUtils;
import org.junit.Test;

/**
 * 流程定义
 *
 */
public class ProcessDef {
	ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); //获取流程引擎
	/**
	 * 流程定义和部署对象
	 */
	@Test
	public void DeployProcess(){
		Deployment deployment=processEngine.getRepositoryService()  // 获取流程定义相关的Service
			.createDeployment()                                     // 创建一个部署对象
			.name("流程定义和部署对象")												// 添加部署名称							
			.addClasspathResource("diagrams/helloword.bpmn")								// 在classPath加载文件,一次加载一个文件
			.addClasspathResource("diagrams/helloword.png")
			.deploy();												// 完成部署
		
		System.out.println("部署ID:"+deployment.getId());
		System.out.println("部署名称:"+deployment.getName());
	}
	/**
	 * 使用zip方式部署对象和流程定义
	 */
	@Test
	public void DeployProcessByzip(){
		InputStream in=this.getClass().getClassLoader().getResourceAsStream("diagrams/helloword.zip");
		ZipInputStream zis=new ZipInputStream(in);
		
		System.out.println(11112);
		Deployment deployment=processEngine.getRepositoryService()  // 获取流程定义相关的Service
			.createDeployment()                                     // 创建一个部署对象
			.name("流程定义和部署对象")												// 添加部署名称							
//			.addClasspathResource("diagrams/helloword.bpmn")								// 在classPath加载文件,一次加载一个文件
//			.addClasspathResource("diagrams/helloword.png")
			
			.addZipInputStream(zis)			
			.deploy();												// 完成部署
		
		System.out.println("部署ID:"+deployment.getId());
		System.out.println("部署名称:"+deployment.getName());
	}
	
	/**
	 * 流程定义查询
	 */
	@Test
	public void findProcessDefinition(){
		List<ProcessDefinition> list=processEngine.getRepositoryService()
			.createProcessDefinitionQuery()
			//条件查询
//			.deploymentId("") //部署对象的ID查询
//			.processDefinitionId("") //使用流程定义ID查询
//			.processDefinitionKey("") //使用流程定义的key查询
//			.processDefinitionNameLike("") //使用流程定义的名称模糊查询
//			//排序
//			.orderByProcessDefinitionVersion().asc() //使用流程定义 的版本升序排列
//			.orderByProcessDefinitionName().desc() //使用流程定义的名称降序排列
			//返回结果
			.list()  //返回一个集合列表,封装流程定义
//			.singleResult() //返回唯一结果集
//			.count() //返回结果集数量
//			.listPage(firstResult, maxResults)  //分页查询			
			;
		for(ProcessDefinition pf:list){
			System.out.println("流程定义ID:"+pf.getId());
			System.out.println("流程定义的名称:"+pf.getName());  //对应bpmn文件的name
			System.out.println("流程定义的key:"+pf.getKey());  //对应bpmn文件中的id
			System.out.println("流程定义的版本:"+pf.getVersion()); //当key相同 版本从1升级
			System.out.println("资源名称pmn文件:"+pf.getResourceName());
			System.out.println("资源名称ong文件:"+pf.getDiagramResourceName());
			System.out.println("部署对象ID:"+pf.getDeploymentId());
	
		}
	}
	/**
	 * 删除流程定义
	 */
	@Test
	public void delProcessDefinition(){
		//不带级联的删除,流程启动后无法删除
//		String deploymentId="606";
//				processEngine.getRepositoryService()
//				.deleteDeployment(deploymentId);	//使用部署ID完成删除   //不带级联的删除
		//级联的删除,流程是否启动都能删除成功
				String deploymentId="5401";
				processEngine.getRepositoryService()
				.deleteDeployment(deploymentId,true);	//使用部署ID完成删除   //不带级联的删除
		System.out.println("删除成功");
	}
	
	
	/**
	 * 查看流程图片
	 */
	@Test
	public void viewPic(){
		String deploymentId="1001";
		String resourceName="";  //图片名称
		//将生成图片放在文件夹下
		
			List<String> list=processEngine.getRepositoryService()
				.getDeploymentResourceNames(deploymentId);//获取资源名称 bpmn和png
			
			for(String s:list){				
				if(s.indexOf(".png")>-1){
					resourceName=s;					
				}
			}	
			//获取图片的输入流
				InputStream is=processEngine.getRepositoryService()
						.getResourceAsStream(deploymentId, resourceName);
				
			//将图片生成到F盘下
				File f=new File("F:/"+resourceName);
				System.out.println("F:/"+resourceName);
				try {
					
					FileUtils.copyInputStreamToFile(is, f);  //将输入流的图片写到file中
					System.out.println("复制成功");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			
	}
	/**
	 * 查询最新版本流程定义
	 */
	@Test
	public void findLastVersionProcessDefinition(){
		List<ProcessDefinition> list=processEngine.getRepositoryService()
					.createProcessDefinitionQuery()
					.orderByProcessDefinitionVersion()
					.asc()   //按照流程定义的版本对流程定义列表升序排列
					.list();
		Map<String, ProcessDefinition> map=new LinkedHashMap();
		for(ProcessDefinition pd:list){
			map.put(pd.getKey(), pd);   //key相同,后面的流程定义对象覆盖前面的,版本最新的在list的后面			
		}
		List<ProcessDefinition> l=new ArrayList(map.values()); //把map中的全部值,放在list
		for(ProcessDefinition pf:l){
			System.out.println("流程定义ID:"+pf.getId());
			System.out.println("流程定义的名称:"+pf.getName());  //对应bpmn文件的name
			System.out.println("流程定义的key:"+pf.getKey());  //对应bpmn文件中的id
			System.out.println("流程定义的版本:"+pf.getVersion()); //当key相同 版本从1升级
			System.out.println("资源名称pmn文件:"+pf.getResourceName());
			System.out.println("资源名称ong文件:"+pf.getDiagramResourceName());
			System.out.println("部署对象ID:"+pf.getDeploymentId());
		}

	}
	
	/**
	 * 使用流程定义的key删除(删除key相同的所有不同的流程定义)
	 */
	@Test
	public void delProcessDefinitionBykey(){
		String processDefinitionKey="helloword";
		List<ProcessDefinition> list=processEngine.getRepositoryService()
				.createProcessDefinitionQuery()
				.processDefinitionKey(processDefinitionKey)
				.list();
		String deploymentId="";
		for(ProcessDefinition pd:list){
			deploymentId=pd.getDeploymentId();
			processEngine.getRepositoryService()
			.deleteDeployment(deploymentId,true);
		}
		System.out.println("del ok");
	}
}



package test;

import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricVariableInstance;
import org.junit.Test;
/**
 * 历史表相关的查询
 *
 */
public class HisroryQuery {
	ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); //获取流程引擎
	
	/**
	 * 查询历史流程实例表
	 */
	@Test
	public void queryHistoryProcessInstance(){
		String processInstanceId="3201";
		HistoricProcessInstance hpi=processEngine.getHistoryService() //与历史数据相关的service
				.createHistoricProcessInstanceQuery()  //创建历史流程实例查询
				.processInstanceId(processInstanceId)  //使用流程实例id作为查询条件
				.singleResult();
		System.out.println(hpi.getId()+","+hpi.getProcessDefinitionId()+","+hpi.getStartTime()+","+hpi.getEndTime()+","+hpi.getDurationInMillis());
	}
	/**
	 * 查询历史活动表
	 */
	@Test
	public void queryHistoryAct(){
		String processInstanceId="3201";
		List<HistoricActivityInstance> list=		processEngine.getHistoryService()
				.createHistoricActivityInstanceQuery()  //创建历史活动的查询对象
				.orderByHistoricActivityInstanceStartTime().asc()
				.processInstanceId(processInstanceId)
				.list();
		if(list!=null&&list.size()>0){
			for(HistoricActivityInstance hai:list){
				System.out.println(hai.getActivityId()+","+hai.getProcessDefinitionId()+","+
			hai.getActivityType()+","+hai.getStartTime()+","+hai.getTaskId()+","+hai.getProcessInstanceId());
			}
		}
	}
	/**
	 * 查询历史任务表
	 */
	@Test
	public void queryHistoryTaskInst(){
		String processInstanceId="3201";
		List<HistoricTaskInstance> list=processEngine.getHistoryService()  //与历史数据相关的service
				.createHistoricTaskInstanceQuery()  //创建历史任务的查询
				.processInstanceId(processInstanceId)  //使用流程实例ID查询
				.list();
		for(HistoricTaskInstance hti:list){
			System.out.println(hti.getId()+","+hti.getName()+","+hti.getProcessInstanceId()+","+hti.getStartTime()+hti.getDurationInMillis());
		}		
	}
	/**
	 * 查询流程变量的历史表
	 */
	@Test
	public void queryProcessVarHis(){
		String processInstanceId="3201";
		List<HistoricVariableInstance>	list=	processEngine.getHistoryService()
				.createHistoricVariableInstanceQuery()   //创建历史流程变量查询对象
				.processInstanceId(processInstanceId)
				.list();
		for(HistoricVariableInstance hvi:list){
			System.out.println(hvi.getId()+","+hvi.getProcessInstanceId()+","+hvi.getVariableName()+","
					+hvi.getVariableTypeName()+","+hvi.getValue());
		}		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值