0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

activiti通过创建流程实例引擎实现不同流程的流转

Android编程精选 来源:CSDN 作者:靖节先生 2022-07-13 09:20 次阅读

1. 什么是工作流

1.1 工作流介绍

工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。

1.2 工作流系统

什么是工作流系统

具有工作流程功能的软件系统。用于更好的管理业务流程。

适用行业,各行各业

比如,消费品行业,制造业,电信服务业,银证险等金融服务业,物流服务业,物业服务业,物业管理,大中型进出口贸易公司,政府事业机构,研究院所及教育服务业等,特别是大的跨国企业和集团公司。

具体场景,凡是涉及到业务流程的所有场景

关键业务流程:订单、报价处理、合同审核、客户电话处理、供应链管理等

行政管理类:出差申请、加班申请、请假申请、用车申请、各种办公用品申请、购买申请、日报周报等凡是原来手工流转处理的行政表单。

人事管理类:员工培训安排、绩效考评、职位变动处理、员工档案信息管理等。

财务相关类:付款请求、应收款处理、日常报销处理、出差报销、预算和计划申请等。

客户服务类:客户信息管理、客户投诉、请求处理、售后服务管理等。

1.3 工作流实现方式

目前常见的工作流程有两种方式:

通过状态字段实现流程控制。原始,适合简单流程控制。

工作流引擎实现流程控制。适用场景更广泛,扩展性更好。

1.4 工作流实现原理

Activiti牛批之处在于,它在不改变代码的前提下实现各种业务流程的管理,适用性,扩展性很优秀。

activiti通过创建流程实例引擎,可以实现不同流程的流转,通过不断读取创建的流程节点实现流程流转。

2. Activiti7概述

2.1 Activiti介绍

Activiti 是一个工作流引擎, activiti 可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言(BPMN2.0)进行定义,业务系统按照预先定义的流程进行执行,实现了业务系统的业务流程由 activiti 进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。

当然这里还有一些小故事,Alfresco 软件在 2010 年 5 月 17 日宣布 Activiti 业务流程管理(BPM)开源项目的正式启动, 其首席架构师由业务流程管理 BPM 的专家 Tom Baeyens 担任, Tom Baeyens 就是原来 jbpm 的架构师,而 jbpm 是一个非常有名的工作流引擎,当然 activiti 也是一个工作流引擎。

下边介绍三个名词概念,就不长篇大论了,简单总结下。

BPM:BPM(Business Process Management),即业务流程管理。

BPM系统:那就是业务流程管理的系统。

BPMN,这个比较噢重要,多说两句,具体往下看。

BPMN(Business Process Model And Notation) - 业务流程模型和符号 是由 BPMI(BusinessProcess Management Initiative)开发的一套标准的业务流程建模符号,使用 BPMN 提供的符号可以创建业务流程。

总结来说就是用来建模业务流程的标准规则,一个个符号!

1d809b58-01d8-11ed-ba43-dac502259ad0.png

2.2 Activiti使用

一般情况下都是通过创建BPMN进行业务流程建模,两种方式,idea插件或者eclipse插件,通过符号创建流程。

idea安装bpmn插件

在 IDEA 的 File 菜单中找到子菜单”Settings”,后面我们再选择左侧的“plugins”菜单,如下图所示

1d93f978-01d8-11ed-ba43-dac502259ad0.png

1db89b34-01d8-11ed-ba43-dac502259ad0.png

3. Activiti环境配置

3.1 创建数据库

CREATEDATABASEactivitiDEFAULTCHARACTERSETutf8;

3.2 初始化数据库表:

创建Maven工程

pYYBAGLOHwWADI4ZAABXW1-YN60483.jpg

加入依赖



4.0.0

com.activiti.demo
activiti_demo
1.0-SNAPSHOT

 

1.6.6
1.2.12



 

org.activiti
activiti-engine
7.0.0.Beta1



org.activiti
activiti-spring
7.0.0.Beta1



org.activiti
activiti-bpmn-model
7.0.0.Beta1



org.activiti
activiti-bpmn-converter
7.0.0.Beta1



org.activiti
activiti-json-converter
7.0.0.Beta1



org.activiti
activiti-bpmn-layout
7.0.0.Beta1



org.activiti.cloud
activiti-cloud-services-api
7.0.0.Beta1



mysql
mysql-connector-java
5.1.40



junit
junit
4.12


 

log4j
log4j
${log4j.version}


org.slf4j
slf4j-api
${slf4j.version}


org.slf4j
slf4j-log4j12
${slf4j.version}

 


org.mybatis
mybatis
3.4.5



commons-dbcp
commons-dbcp
1.4






alfresco
ActivitiReleases
https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/

true


配置日志

#SetrootcategoryprioritytoINFOanditsonlyappendertoCONSOLE.
#log4j.rootCategory=INFO,CONSOLEdebuginfowarnerrorfatal
log4j.rootCategory=debug,CONSOLE,LOGFILE

#SettheenterpriseloggercategorytoFATALanditsonlyappendertoCONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL,CONSOLE

#CONSOLEissettobeaConsoleAppenderusingaPatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601}%-6r[%15.15t]%-5p%30.30c%x-%m


#LOGFILEissettobeaFileappenderusingaPatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601}%-6r[%15.15t]%-5p%30.30c%x-%m

配置activity.cfg.xml


编写代码

/**
*Activiti初始化25张表
*执行的是activiti-engine-7.0.0.Beta1.jar包下对应不同内置好的sql语句
*orgactivitidbdropactiviti.db2.drop.engine.sql
*
*@authorzrj
*@date2020/12/29
*@sinceV1.0
**/
publicclassActivitiInit{

/**
*方式一
*/
@Test
publicvoidGenActivitiTables(){

// 1.创建ProcessEngineConfiguration对象。第一个参数:配置文件名称;第二个参数:processEngineConfiguration的bean的id
ProcessEngineConfigurationprocessEngineConfiguration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml","processEngineConfiguration");
//2.创建ProcessEngine对象
ProcessEngineprocessEngine=processEngineConfiguration.buildProcessEngine();
//3.输出processEngine对象
System.out.println(processEngine);

}

/**
*方式二
*/
@Test
publicvoidGenActivitiTables2(){
//条件:1.activiti配置文件名称:activiti.cfg.xml  2.bean的id="processEngineConfiguration"
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
}
}

3.3 创建数据库表

执行上边的代码。

3.4 数据库表命名规则

1e0a67f2-01d8-11ed-ba43-dac502259ad0.png

Activiti 的表都以 ACT_开头。第二部分是表示表的用途的两个字母标识。用途也和服务的 API 对应。

ACT_RE_*: 'RE'表示 repository。这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。

ACT_RU_*: 'RU'表示 runtime。这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。这样运行时表可以一直很小速度很快。

ACT_HI_*: 'HI'表示 history。这些表包含历史数据,比如历史流程实例, 变量,任务等等。

ACT_GE_*: 'GE'表示 general。通用数据, 用于不同场景下

4. Activiti架构简介

activiti.cfg.xml

activiti 的引擎配置文件,包括:ProcessEngineConfiguration 的定义、数据源定义、事务管理器等,此文件其实就是一个 spring 配置文件,下面是一个基本的配置只配置了 ProcessEngineConfiguration和数据源。

ProcessEngineConfiguration

流程引擎的配置类,通过 ProcessEngineConfiguration 可以创建工作流引擎 ProceccEngine,常用的两种方法。

ProcessEngine

工作流引擎,相当于一个门面接口,通过 ProcessEngineConfiguration 创建 processEngine,通过ProcessEngine 创建各个 service 接口。

Service

通过 ProcessEngine 创建 Service, Service 是工作流引擎提供用于进行工作流部署、执行、管理的服务接口。

1e1c12e0-01d8-11ed-ba43-dac502259ad0.png

5. Activiti入门案例

5.1 流程定义

什么是流程定义

流程定义是线下按照 bpmn2.0 标准去描述 业务流程,通常使用 activiti-explorer(web 控制台)或 activiti-eclipse-designer 插件对业务流程进行建模,这两种方式都遵循 bpmn2.0 标准。本教程使用activiti-eclipse-designer 插件完成流程建模。使用 designer 设计器绘制流程,会生成两个文件:.bpmn和.png

创建bpmn文件

Palette(画板)

在 eclipse 或 idea 中安装 activiti-designer 插件即可使用,画板中包括以下结点:

Connection—连接

Event---事件

Task---任务

Gateway---网关

Container—容器

Boundary event—边界事件

Intermediate event- -中间事件

流程图设计完毕保存生成.bpmn 文件

idea创建bpmn

poYBAGLOHt6ACjdEAACjqsn3kNY798.jpg

pYYBAGLOHrSAEECGAAB6qcUKUAU644.jpg

生成png图片

第一步:将 holiday.bpmn 文件改为扩展名 xml 的文件名称:holiday.xml

第二步:在 holiday.xml 文件上面,点右键并选择 Diagrams 菜单,再选择 Show BPMN2.0 Designe

pYYBAGLOHpiAfCrNAACBBTGeg7k237.jpg

第三步:打开后的效果图如下:

pYYBAGLOHnyAQUzhAABnzxm3NS8897.jpg

打开如下窗口,注意填写文件名及扩展名,选择好保存图片的位置:

poYBAGLOHmCANQhlAABvBfMwgTI324.jpg

第五步:中文乱码的解决

打开 IDEA 安装路径,找到如下的安装目录

1ed2721a-01d8-11ed-ba43-dac502259ad0.png

根据自己所安装的版本来决定,我使用的是 64 位的 idea,所以在 idea64.exe.vmoptions 文件的最后一行追加一条命令:-Dfile.encoding=UTF-8

如下所示

pYYBAGLOHjGAbI5CAACGYDCvMSs945.jpg

一定注意,不要有空格,否则重启 IDEA 时会打不开,然后 重启 IDEA,把原来的 png 图片删掉,再重新生成,即可解决乱码问题

5.2 部署流程

什么是流程部署

将线下定义的流程部署到 activiti 数据库中,这就是流程定义部署,通过调用 activiti 的 api 将流程定义的 bpmn 和 png 两个文件一个一个添加部署到 activiti 中,也可以将两个文件打成 zip 包进行部署。

单个文件部署方式

分别将 bpmn 文件和 png 图片文件部署

压缩包部署方式

/**
*流程定义的部署
* activiti表有哪些?
*act_re_deployment部署信息
*act_re_procdef流程定义的一些信息
*act_ge_bytearray流程定义的bpmn文件及png文件
*
*@authorzrj
*@date2020/12/29
*@sinceV1.0
**/
publicclassActivitiDeployment{

/**
*方式一
*分别将bpmn文件和png图片文件部署
*/
@Test
publicvoidactivitiDeploymentTest(){
//1.创建ProcessEngine对象
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();

//2.得到RepositoryService实例
RepositoryServicerepositoryService=processEngine.getRepositoryService();

//3.进行部署
Deploymentdeployment=repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")
.addClasspathResource("diagram/holiday.png")
.name("请假申请单流程")
.deploy();

//4.输出部署的一些信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}

/**
*方式二
*将holiday.bpmn和holiday.png压缩成zip包
*/
@Test
publicvoidactivitiDeploymentTest2(){
//1.创建ProcessEngine对象
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();

//2.得到RepositoryService实例
RepositoryServicerepositoryService=processEngine.getRepositoryService();

//3.转化出ZipInputStream流对象
InputStreamis=ActivitiDeployment.class.getClassLoader().getResourceAsStream("diagram/holidayBPMN.zip");

//将inputstream流转化为ZipInputStream流
ZipInputStreamzipInputStream=newZipInputStream(is);

//3.进行部署
Deploymentdeployment=repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.name("请假申请单流程")
.deploy();

//4.输出部署的一些信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}

}

操作数据表

-- activiti表有哪些?
--部署信息
select*fromact_re_deployment;

--流程定义的一些信息
select*fromact_re_procdef;

--流程定义的bpmn文件及png文件
select*fromact_ge_bytearray;

5.3 启动流程

/**
*启动流程实例:
*前提是先已经完成流程定义的部署工作
*背后影响的表:
*act_hi_actinst已完成的活动信息
*act_hi_identitylink参与者信息
*act_hi_procinst流程实例
*act_hi_taskinst任务实例
*act_ru_execution执行表
*act_ru_identitylink参与者信息
*act_ru_task任务
*
*@authorzrj
*@date2020/12/29
*@sinceV1.0
**/
publicclassActivitiStartInstance{
publicstaticvoidmain(String[]args){
//1.得到ProcessEngine对象
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();

//2.得到RunService对象
RuntimeServiceruntimeService=processEngine.getRuntimeService();

//3.创建流程实例流程定义的key需要知道holiday
ProcessInstanceprocessInstance=runtimeService.startProcessInstanceByKey("holiday");

//4.输出实例的相关信息
System.out.println("流程部署ID"+processInstance.getDeploymentId());
System.out.println("流程定义ID"+processInstance.getProcessDefinitionId());
System.out.println("流程实例ID"+processInstance.getId());
System.out.println("活动ID"+processInstance.getActivityId());

}
}

5.4 流程定义查询

/**
*流程定义查询
*
*@authorzrj
*@date2020/12/29
*@sinceV1.0
**/
publicclassQueryProceccDefinition{

@Test
publicvoidqueryProceccDefinition(){
//流程定义key
StringprocessDefinitionKey="holiday";
//1.得到ProcessEngine对象
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();

//获取repositoryService
RepositoryServicerepositoryService=processEngine.getRepositoryService();
//查询流程定义
ProcessDefinitionQueryprocessDefinitionQuery=repositoryService.createProcessDefinitionQuery();
//遍历查询结果
Listlist=processDefinitionQuery
.processDefinitionKey(processDefinitionKey)
.orderByProcessDefinitionVersion().desc().list();

for(ProcessDefinitionprocessDefinition:list){
System.out.println("------------------------");
System.out.println("流程部署 id :"+processDefinition.getDeploymentId());
System.out.println("流程定义id:"+processDefinition.getId());
System.out.println("流程定义名称:"+processDefinition.getName());
System.out.println("流程定义key:"+processDefinition.getKey());
System.out.println("流程定义版本:"+processDefinition.getVersion());
}
}
}

5.5 流程定义删除

/**
*删除指定流程id的流程
*/
publicvoiddeleteDeployment(){
//流程部署id
StringdeploymentId="8801";
//1.得到ProcessEngine对象
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();

//通过流程引擎获取repositoryService
RepositoryServicerepositoryService=processEngine.getRepositoryService();
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment(deploymentId);
//设置true级联删除流程定义,即使该流程有流程实例启动也可以删除,设
//置为false非级别删除方式,如果流程
repositoryService.deleteDeployment(deploymentId,true);
}

5.6 流程定义资源查询

/**
*获取资源
*/
@Test
publicvoidgetProcessResources()throwsIOException{
//流程定义id
StringprocessDefinitionId="";
//1.得到ProcessEngine对象
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();
//获取repositoryService
RepositoryServicerepositoryService=processEngine.getRepositoryService();
//流程定义对象
ProcessDefinitionprocessDefinition=repositoryService
.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
//获取bpmn
Stringresource_bpmn=processDefinition.getResourceName();
//获取png
Stringresource_png=processDefinition.getDiagramResourceName();
//资源信息
System.out.println("bpmn:"+resource_bpmn);
System.out.println("png:"+resource_png);
Filefile_png=newFile("d:/purchasingflow01.png");
Filefile_bpmn=newFile("d:/purchasingflow01.bpmn");
//输出bpmn
InputStreamresourceAsStream=null;
resourceAsStream=repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),resource_bpmn);
FileOutputStreamfileOutputStream=newFileOutputStream(file_bpmn);
byte[]b=newbyte[1024];
intlen=-1;
while((len=resourceAsStream.read(b,0,1024))!=-1){
fileOutputStream.write(b,0,len);
}
//输出图片
resourceAsStream=repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),resource_png);
fileOutputStream=newFileOutputStream(file_png);
//byte[]b=newbyte[1024];
//intlen=-1;
while((len=resourceAsStream.read(b,0,1024))!=-1){
fileOutputStream.write(b,0,len);
}
}


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    7500

    浏览量

    88032
  • 工作流
    +关注

    关注

    0

    文章

    44

    浏览量

    12431
  • Activiti
    +关注

    关注

    0

    文章

    4

    浏览量

    2760

原文标题:工作流引擎 Activiti 入门详解

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    优化企业运营流程,华为云 Flexusx 实例下 Odoo ERP 系统的完整解决方案

    开源的 企业全业务链管理平台 ,Flexus X 实例能够完美承载并优化 ERP 系统的运行,实现业务流程的高度自动化与智能化。而 Odoo ERP 系统的全面集成,则让 企业在采购、库存、财务、营销、CRM 等多个环节
    的头像 发表于 12-30 14:55 51次阅读
    优化企业运营<b class='flag-5'>流程</b>,华为云 Flexusx <b class='flag-5'>实例</b>下 Odoo ERP 系统的完整解决方案

    Vivado之实现布局布线流程介绍

    一、前言 本文将介绍Vivado进行综合,以及布局布线的内部流程,熟悉该流程后结合Settings中对应的配置选项,对于时序收敛调试将更具有针对性。 二、Implementation(实现
    的头像 发表于 12-06 09:08 403次阅读
    Vivado之<b class='flag-5'>实现</b>布局布线<b class='flag-5'>流程</b>介绍

    MOSFET晶体管的工艺制造流程

    本文通过图文并茂的方式生动展示了MOSFET晶体管的工艺制造流程,并阐述了芯片的制造原理。   MOSFET的工艺流程 芯片制造工艺流程包括光刻、刻蚀、扩散、薄膜、离子注入、化学机械研
    的头像 发表于 11-24 09:13 1165次阅读
    MOSFET晶体管的工艺制造<b class='flag-5'>流程</b>

    易控智驾正式通过汽车功能安全流程认证

    近日,易控智驾正式通过「ISO26262:2018 ASIL-D」汽车功能安全流程认证,并获得由国际知名认证机构SGS颁发的功能安全流程认证证书。这不仅标志着易控智驾在功能安全研发流程
    的头像 发表于 11-21 09:46 796次阅读
    易控智驾正式<b class='flag-5'>通过</b>汽车功能安全<b class='flag-5'>流程</b>认证

    数字设计ic芯片流程

    主要介绍芯片的设计流程                                                                    &
    发表于 11-20 15:57 0次下载

    接单流程设计探索

    划分。而这个标准并不是在接口定义的初期就规划好的,通常会经历业务不断增长而带来的需求迭代、业务融合、组织架构调整或升级引起的流程优化与拆分。这样一些系列事件下来,可能一个接单应用会流转到多个部门,接单流程就会越
    的头像 发表于 10-31 10:56 187次阅读
    接单<b class='flag-5'>流程</b>设计探索

    逻辑组件中的流程块节点通常出于什么用途

    逻辑组件中的流程块节点是流程图、状态图、序列图等图表中的基本元素,它们用于表示业务流程、工作流程、算法步骤、系统状态等。这些节点在软件开发、项目管理、自动化控制、工程设计、科学研究等领
    的头像 发表于 10-15 14:38 163次阅读

    赛福纳斯通过ISO 26262 ASIL-D功能安全流程认证

    近日,杭州赛福纳斯科技有限公司(以下简称“赛福纳斯”)顺利通过ISO 26262:2018 ASIL-D汽车功能安全流程认证,并获得由全球领先的检验检测认证机构DEKRA德凯颁发的功能安全流程认证证书。
    的头像 发表于 08-23 10:11 635次阅读

    流程工业和离散工业是什么?

    流程工业和离散工业是两种不同类型的工业生产方式。 流程工业是指以连续流程为基础的生产方式,其生产过程是连续的、稳定的。典型的流程工业包括石化、化工、制药和食品加工等行业。在
    的头像 发表于 05-09 14:01 757次阅读

    HarmonyOS开发实例:【分布式数据管理】

    eTS中分布式数据管理的使用,包括KVManager对象实例创建和KVStore数据流转的使用。
    的头像 发表于 04-11 09:57 940次阅读
    HarmonyOS开发<b class='flag-5'>实例</b>:【分布式数据管理】

    现场可编程门阵列设计流程

    现场可编程门阵列(FPGA)设计流程是一个综合性的过程,它涵盖了从需求分析到最终实现的各个环节。下面将详细介绍FPGA设计流程的主要步骤。
    的头像 发表于 03-16 16:38 1969次阅读

    fpga原型验证流程

    FPGA原型验证流程是确保FPGA(现场可编程门阵列)设计正确性和功能性的关键步骤。它涵盖了从设计实现到功能验证的整个过程,是FPGA开发流程中不可或缺的一环。
    的头像 发表于 03-15 15:05 1600次阅读

    ANC项目流程

    介绍自动降噪ANC的调试流程
    发表于 01-31 09:22 3次下载

    PCB设计流程详解

    做任何复杂的事情,都会有着规定的流程,PCB设计也不例外,但是设计流程不是固定,我们团队提供的只是一个参考,不同的项目,不同的情况,以及不同的工程师设计习惯,都有着不一样的设计流程,但是我们的目标都一致,就是设计好我们的PCB。
    的头像 发表于 01-10 16:11 4675次阅读
    PCB设计<b class='flag-5'>流程</b>详解

    SOLIDWORKS 2024通过自动化和缩短工作流程实现智能工作

    随着科技的快速发展,工程设计和制造业正在经历变革。在这个过程中,SOLIDWORKS 2024的发布为我们提供了一个全新的视角,以实现更智能的工作流程。本文将探讨SOLIDWORKS 2024如何通过自动化和缩短工作
    的头像 发表于 01-10 11:37 560次阅读
    SOLIDWORKS 2024<b class='flag-5'>通过</b>自动化和缩短工作<b class='flag-5'>流程</b>来<b class='flag-5'>实现</b>智能工作