Activiti基础入门

news2024/11/26 9:59:00

文章目录

  • Activiti项目搭建
    • 引用依赖项
    • Activiti服务初始化
    • 数据库配置
    • 配置文件
    • 测试demo
  • Activiti功能服务
    • RepositoryService:
    • RuntimeService:
    • TaskService:
    • HistoryService:
    • ManagementService:
    • DynamicBpmnService:
  • Activiti表分类

Activiti项目搭建

引用依赖项


		<activiti.version>7.0.0.Beta1</activiti.version>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- bpmn 模型处理 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-model</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- bpmn 转换 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-converter</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- bpmn json数据转换 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-json-converter</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- bpmn 布局 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-layout</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- activiti 云支持 -->
        <dependency>
            <groupId>org.activiti.cloud</groupId>
            <artifactId>activiti-cloud-services-api</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>

Activiti服务初始化

@Configuration
public class ActivitiConfiguration {

    @Autowired
    @Qualifier("dataSource")
    private BasicDataSource DataSource;

    @Autowired
    private PlatformTransactionManager platformTransactionManager;


    /**
     * 注册 activiti的配置信息
     */
    @Bean("processEngineConfiguration")
    public SpringProcessEngineConfiguration getProcessEngineConfiguration(){
        SpringProcessEngineConfiguration configuration
                = new SpringProcessEngineConfiguration();
        configuration.setDataSource(DataSource);       // 添加数据源
        configuration.setTransactionManager(platformTransactionManager);    // 添加事务
        configuration.setDatabaseSchemaUpdate("true");  // 如果有表则不创建
        configuration.setDbHistoryUsed(true);   // 允许查看历史信息
        configuration.buildProcessEngine();  //执行创建25张表,如果已经创建就不再创建了
        // 自动部署 bpmn文件
        Resource[] resources = null;
        try {
            resources= new PathMatchingResourcePatternResolver().getResources("classpath*:bpmn/*.bpmn20.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        configuration.setDeploymentResources(resources);
        return configuration;
    }


    /**
     * 注册 ProcessEngineFactoryBean
     */
    @Bean
    public ProcessEngineFactoryBean processEngine(){
        ProcessEngineFactoryBean factoryBean = new ProcessEngineFactoryBean();
        factoryBean.setProcessEngineConfiguration(getProcessEngineConfiguration());

        return factoryBean;
    }

    /**
     * 注册 RepositoryService
     */
    @Bean
    public RepositoryService repositoryService() throws Exception{
        return processEngine().getObject().getRepositoryService();
    }

    /**
     * 注册 RuntimeService
     */
    @Bean
    public RuntimeService runtimeService() throws Exception{
        return processEngine().getObject().getRuntimeService();
    }

    /**
     * 注册 TaskService
     */
    @Bean
    public TaskService taskService() throws Exception{
        return processEngine().getObject().getTaskService();
    }

    /**
     * 注册 HistoryService
     */
    @Bean
    public HistoryService historyService() throws Exception{
        return processEngine().getObject().getHistoryService();
    }
}

数据库配置

@Configuration
public class DataSourceConfiguration {

    @Bean("dataSource")
    public BasicDataSource getDruidDataSource(
            @Value("${spring.datasource.driver-class-name}")
                    String driverClassName, // 数据库驱动程序
            @Value("${spring.datasource.url}")
                    String url, // 数据库连接地址
            @Value("${spring.datasource.username}")
                    String username, // 数据库的用户名
            @Value("${spring.datasource.password}")
                    String password, // 数据库的用户名
            @Value("${spring.datasource.tomcat.min-idle}")
                    int minIdle, // 最小维持连接数
            @Value("${spring.datasource.tomcat.max-active}")
                    int maxActive // 最大连接数
    ) {
        BasicDataSource dataSource = new BasicDataSource(); // 实例化DataSource子类对象
        dataSource.setDriverClassName(driverClassName); // 数据库驱动程序
        dataSource.setUrl(url); // 数据库的连接地址
        dataSource.setUsername(username); // 数据库用户名
        dataSource.setPassword(password); // 数据库密码
        dataSource.setMinIdle(minIdle); // 最小维持的连接数量
        dataSource.setMaxActive(maxActive); // 最大的连接数量
        return dataSource;
    }

}

配置文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///activiti_dev?nullCatalogMeansCurrent=true
    username: root
    password: 123456
    tomcat:
      max-active: 3
      min-idle: 1

测试demo

这是使用springboot项目创建的测试用例

import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.persistence.entity.HistoricFormPropertyEntity;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class BpmDemoApplicationTests {
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private RepositoryService repositoryService;
    @Test
    void contextLoads() {
    }
    /**
     * @description: 创建审批
     * @author: gepengjun
     * @date: 2023/9/3 17:31
     * @param: []
     * @return: void
     **/
    @Test
    public void testCreateProcessInstance(){
        ProcessInstance test1 = runtimeService.startProcessInstanceByKey("test1");
        System.out.println("流程示例id:"+test1.getId());

    }

    /**
     * @description: 完成任务
     * @author: gepengjun
     * @date: 2023/9/3 17:31
     * @param:
     * @return: void
     **/
    @Test
    public void testComplete(){
        taskService.setVariable("37505","variable",true);
        taskService.complete("37505");
    }


    /**
     * @description: 设置流程实例变量
     * @author: gepengjun
     * @date: 2023/9/3 18:34
     * @param: []
     * @return: void
     **/
    @Test
    public void testProcessInstanceVariable(){
        runtimeService.setVariable("12506","taskTest","任务完成没有");
    }

    /**
     * @description: 获取流程实例变量
     * @author: gepengjun
     * @date: 2023/9/3 18:34
     * @param: []
     * @return: void
     **/
    @Test
    public void testGetProcessInstanceVariable(){
        Object taskTest = runtimeService.getVariable("30001", "taskTest");
        System.out.println("这是流程实例变量:"+taskTest.toString());
    }

    /**
     * @description: 在使用task服务获取流程实例变量
     * @author: gepengjun
     * @date: 2023/9/3 18:34
     * @param: []
     * @return: void
     **/
    @Test
    public void testTaskGetProcessInstanceVariable(){
        Object taskTest = taskService.getVariable("30005", "taskTest");
        System.out.println("使用Task服务获取流程实例变量:"+taskTest.toString());
    }

    /**
     * @description: 查询对应节点任务
     * @author: gepengjun
     * @date: 2023/9/3 17:31
     * @param: []
     * @return: void
     **/
    @Test
    public void testByUserName(){
        //根据节点名称获取指定流程实例的任务
        //List<Task> tasks = taskService.createTaskQuery().processInstanceId("37501").taskName("科长").list();
        //获取所有节点名称为“科长”的任务
        List<Task> tasks = taskService.createTaskQuery().taskName("高经理").list();
        for (Task task : tasks) {
            System.out.println("任务名称:"+task.getName());
            System.out.println("任务ID:"+task.getId());
            System.out.println("_______________________________");
        }

    }
    /**
     * @description: 删除流程模板
     * @author: gepengjun
     * @date: 2023/9/3 18:35
     * @param: []
     * @return: void
     **/
    @Test
    public void testRepositoryService(){
        repositoryService.deleteDeployment("1");
    }

}

Activiti功能服务

RepositoryService:

RepositoryService 是 Activiti 中的一个服务接口,用于管理流程定义和部署的操作。通过 RepositoryService,可以执行以下一些常见的操作:

  1. 部署流程定义:使用 createDeployment() 方法创建一个新的部署对象,并通过 addInputStream()addClasspathResource() 等方法添加流程定义的资源文件,在最后使用 deploy() 方法将流程定义部署到引擎中进行使用。

  2. 查询流程定义:使用 createProcessDefinitionQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据流程定义的名称、版本号等进行查询。

  3. 获取流程定义资源:使用 getResourceAsStream() 方法可以获取流程定义的资源文件,例如获取流程图、流程定义的 XML 文件等。

  4. 删除流程定义:使用 deleteDeployment() 方法可以删除已部署的流程定义及其相关资源。

RuntimeService:

RuntimeService 是 Activiti 中的一个服务接口,用于管理流程实例的操作。通过 RuntimeService,可以执行以下一些常见的操作:

  1. 启动流程实例:使用 startProcessInstanceByKey() 方法根据流程定义的键启动一个新的流程实例,或者使用 startProcessInstanceById() 方法根据流程定义的ID启动流程实例。

  2. 查询流程实例:使用 createProcessInstanceQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据流程实例的ID、流程定义的Key等进行查询。

  3. 暂停和恢复流程实例:使用 suspendProcessInstanceById() 方法暂停指定ID的流程实例,使用 activateProcessInstanceById() 方法恢复暂停的流程实例。

  4. 查询任务:使用 createTaskQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据任务的ID、任务的负责人等进行查询。

  5. 设置和获取流程实例变量:使用 setVariable() 方法设置流程实例的变量,使用 getVariable() 方法获取流程实例的变量。

TaskService:

TaskService 是 Activiti 中的一个服务接口,用于管理任务的操作。通过 TaskService,您可以执行以下一些常见的任务相关的操作:

  1. 查询任务:使用 createTaskQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据任务的ID、负责人、所属流程实例等进行查询。

  2. 完成任务:使用 complete() 方法完成指定ID的任务,可以同时设置任务的执行人、变量等信息。

  3. 指派任务:使用 setAssignee() 方法将任务指派给指定的用户或组。

  4. 委派任务:使用 delegateTask() 方法将任务委派给其他人处理。

  5. 签收任务:使用 claim() 方法将任务签收,将当前用户设置为任务的负责人。

  6. 设置和获取任务变量:使用 setVariable() 方法设置任务的变量,使用 getVariable() 方法获取任务的变量。

  7. 创建附件和评论:使用 createAttachment() 方法创建任务的附件,使用 addComment() 方法添加任务的评论。

HistoryService:

HistoryService 是 Activiti 中的一个服务接口,用于管理历史数据的操作。通过 HistoryService,您可以执行以下一些常见的历史数据相关的操作:

  1. 查询历史流程实例:使用 createHistoricProcessInstanceQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据流程实例的ID、流程定义的Key等进行查询。

  2. 查询历史任务:使用 createHistoricTaskInstanceQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据任务的ID、所属流程实例、负责人等进行查询。

  3. 查询历史活动:使用 createHistoricActivityInstanceQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据活动的ID、所属流程实例、活动类型等进行查询。

  4. 查询历史变量:使用 createHistoricVariableInstanceQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据变量的名称、所属流程实例等进行查询。

  5. 查询历史表单数据:使用 createHistoricFormDataQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据表单的ID、所属流程实例等进行查询。

ManagementService:

ManagementService 是 Activiti 中的一个服务接口,用于管理引擎相关的操作。通过 ManagementService,您可以执行以下一些常见的引擎管理操作:

  1. 执行作业:使用 executeJob() 方法手动触发执行作业,例如定时任务、异步任务等。

  2. 暂停和恢复作业:使用 suspendJobById() 方法暂停指定ID的作业,使用 activateJobById() 方法恢复暂停的作业。

  3. 查询作业:使用 createJobQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据作业的ID、作业的状态、作业的类型等进行查询。

  4. 查询引擎表:使用 getTableName() 方法获取指定实体类对应的数据库表名,使用 getTableCount() 方法获取指定表的记录数量。

  5. 强制执行数据库操作:使用 executeCommand() 方法执行自定义的数据库操作命令,例如 SQL 查询、SQL 更新等。

  6. 获取引擎配置信息:使用 getProcessEngineConfiguration() 方法获取当前引擎的配置信息,包括数据库连接信息、流程定义解析器等。

DynamicBpmnService:

DynamicBpmnService 是 Activiti 中的一个服务接口,用于动态修改流程定义和流程实例的相关内容。通过 DynamicBpmnService,您可以执行以下一些常见的动态流程操作:

  1. 动态修改流程定义:使用 changeDeploymentProcessDefinitionKey() 方法修改指定部署ID下流程定义的Key。

  2. 动态修改流程实例:使用 moveActivityIdTo() 方法将当前活动节点移动到指定的目标节点。

  3. 动态添加用户任务节点:使用 addUserTask() 方法在流程定义中动态添加用户任务节点。

  4. 动态删除节点:使用 deleteActivity() 方法删除指定节点及其关联的全部流转信息。

  5. 动态设置节点属性:使用 setActivityProperties() 方法设置指定节点的属性,如节点名称、节点描述等。

  6. 动态设置流程变量:使用 setProcessInstanceVariable() 方法设置流程实例的变量值。

Activiti表分类

在 Activiti 中,表用于存储与流程相关的数据和元数据。Activiti 从逻辑上将其分为五个类别。

  1. ACT_RE_*:包含“RE”表示 Repository,这些表存储了所有与 Activiti 流程定义和流程资源相关的数据和元数据。例如,这些表包括:

MN 流程

  • 定义的数据。
  • ACT_RE_DEPLOYMENT:保存 BPMN 文件和流程图等资源文件的数据。
  1. ACT_RU_*:包含“RU”表示 Runtime,这些表存储了流程运行期间产生的运行时数据。例如,这些表包括:

    • ACT_RU_TASK:保存当前待处理任务的数据。
    • ACT_RU_EXECUTION:保存流程实例和执行数据。
  2. ACT_ID_*:包含“ID”表示 Identity,这些表存储了用户、组和权限等身份验证相关的数据。例如,这些表包括:

    • ACT_ID_USER:保存用户的数据。
    • ACT_ID_GROUP:保存用户组的数据。
  3. ACT_HI_*:包含“HI”表示 History,这些表存储了流程实例的历史记录和统计数据。例如,这些表包括:

    • ACT_HI_PROCINST:保存流程实例的历史数据。
    • ACT_HI_TASKINST:保存任务实例的历史数据。
  4. ACT_GE_*:包含“GE”表示 Generic,这些表存储 Activiti 应用程序和一般工具使用的各种配置数据。例如,这些表包括:

    • ACT_GE_PROPERTY:保存 Activiti 数据和配置的属性数据。
      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/977046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用【宝塔+docker】在云服务器上部署基于SpringBoot 和 Dubbo RPC 的项目:踩坑记录

待部署的项目包括&#xff1a;前端front&#xff0c;服务提供者backend&#xff0c;服务消费者gateway&#xff0c;注册中心nacos 服务器信息&#xff1a;腾讯云入门级服务器2核2G&#xff08;后续有对服务器进行升级&#xff09; 部署工具&#xff1a;前端使用宝塔部署&#x…

【python】logging报错KeyError: ‘formatters‘

报错 Traceback (most recent call last):File "E:\Python\lib\runpy.py", line 194, in _run_module_as_main return _run_code(code, main_globals, None, File &qu…

免费电脑清理工具:清除垃圾文件,提升性能表现

当电脑使用一段时间后&#xff0c;许多已安装的应用程序、文件或其他项目会在硬盘上积累起来。这会导致电脑运行速度变慢&#xff0c;或Windows提示你硬盘空间不足。在这个时候&#xff0c;你需要使用电脑清理工具来清理电脑。 电脑清理软件为用户提供了一种简单的方法…

【计组】2.3浮点数表示和运算

一、浮点数的表示 浮点数尾数的规格化 注&#xff1a;进行左规和右规仅移动数值位符号位不变 解释&#xff1a;尾数的最高数值位必须是一个有效位即算术意义上的1 规格化应用&#xff08;与双符号位结合&#xff09; 规格化浮点数的特点&#xff1a; 其中首位为符号位&#…

Linux之autofs自动挂载服务

目录 Linux之autofs自动挂载服务 产生原因 安装 配置文件分析 文件路径 作用 etc/auto.master文件内容格式 挂载参数 案例 案例1 --- 服务器创建共享目录&#xff0c;客户端实现自动挂载 案例2 --- 自动挂载光盘 Linux之autofs自动挂载服务 产生原因 在一般NFS文件系…

算法训练营day42|动态规划 part04(01背包问题基础(两种解决方案)、416.分割等和子集)

文章目录 01背包----二维dp数组01背包----滚动数组416.分割等和子集思路分析背包解法思考总结 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最…

第三方软件检测机构资质要求有哪些?专业测试报告如何申请?

科技信息的快速发展使得人们对于软件产品极度依赖&#xff0c;因此要想保障产品质量&#xff0c;测试必不可少。作为一家合格的软件检测机构&#xff0c;应当严格遵守相关资质要求&#xff0c;保证测试报告的专业性和可信度。 一、第三方软件检测机构需要具备的资质 1. 认证资…

Allegro如何通过当前PCB查看env的路径操作指导

Allegro如何通过当前PCB查看env的路径操作指导 在用Allegro做PCB设计的之前,所有的快捷键都需要定义到ENV文件中。在添加env文件之前需要找到env文件的路径,如下图 不同机器定义env路径是不一样的 下面介绍如何找到env路径,具体操作如下 点击Tools选择Utlities

巨额亏损,股价遭受重创,Polestar极星汽车已陷入困境

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 8月31日&#xff0c;由吉利汽车&#xff08;00175&#xff09;和沃尔沃汽车合资创建的瑞典电动汽车公司Polestar极星汽车&#xff08;PSNY&#xff09;公布了2023年第二季度财报。 这家电动汽车公司在去年通过SPAC上市后&am…

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南京财经大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南京财经大学图书馆

026:vue中el-progress逆向倒计时方式显示

第026个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

【NKeditor】富文本编辑器上传图片

目录 目的&#xff1a; 效果 实现方法&#xff1a; 1、下载NKeditor插件库 2、部署 3、实现 4、自定义工具栏 目的&#xff1a; 使用NKeditor富文本编辑器上传图片&#xff0c;同时上传到七牛云存储上。后端语言使用ThinkPHP。 效果 实现方法&#xff1a; 1、下载NKe…

【构造】CF Edu 12 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 这种题一定要从小数据入手&#xff0c;不然很有可能走歪思路 先考虑n 1的情况&#xff0c;直接输出即可 然后是n 2的情况&#xff0c;如果相加是质数&#xff0c;就输出2个&#xff0c;否则就输出一个 然后…

使用 【jacoco】对基于 SpringBoot 和 Dubbo RPC 的项目生成测试覆盖率报告:实践+原理

基于 Dubbo RPC 的项目中有一个提供者项目backend、一个消费者项目gateway、以及注册中心nacos。本篇文章记录在windows本地对该框架的测试过程&#xff0c;以及介绍jacoco的基本原理 测试过程 官网下载安装包解压到本地&#xff0c;https://www.jacoco.org/jacoco/ 只需要用…

Bootstrap的标题类(标题样式h1~h6)

Bootstrap 的标题字体大小通常遵循以下样式规则&#xff1a; h1 标题的字体大小为 2.5rem&#xff08;40像素&#xff09;。h2 标题的字体大小为 2rem&#xff08;32像素&#xff09;。h3 标题的字体大小为 1.75rem&#xff08;28像素&#xff09;。h4 标题的字体大小为 1.5re…

《Python魔法大冒险》008 石像怪的挑战:运算符之旅

小鱼和魔法师继续深入魔法森林。不久&#xff0c;他们来到了一个巨大的魔法石圈旁边。石圈中心有一个闪闪发光的魔法水晶&#xff0c;周围则是一些神秘的符号。但令人意外的是&#xff0c;水晶的旁边还有一个巨大的石像怪&#xff0c;它的眼睛散发着红色的光芒&#xff0c;似乎…

CentOS 安装蒲公英

官方教程链接&#xff1a; https://service.oray.com/question/5063.html 教程使用的是2.3版本&#xff0c;官网下载的最新版是2.4&#xff0c;所以命令会有所不同 安装成功后&#xff0c; 任意路径下执行pgyvisitor&#xff0c;调出交互界面pgyvisitor login&#xff0c;登录…

智汇云舟亮相2023服贸会,全面展示视频孪生技术与产品

9月2日-6日&#xff0c;为期5天的2023年中国国际服务贸易交易会&#xff08;以下简称&#xff1a;服贸会&#xff09;在北京首钢园举办。在电信、计算机和信息服务专题展馆中&#xff0c;智汇云舟有幸作为北京市专精特新和数字孪生企业优秀代表受邀参展&#xff0c;并携视频孪生…

【C语言】——调试技巧

目录 ​编辑 ①前言 1.什么是Bug&#xff1f; 2.什么是调试&#xff1f; 2.1调试的基本步骤 2.2Release与Debug 3.常用快捷键 4.如何写出好的代码 4.1常见的coding技巧 &#x1f449;assert() &#x1f449;const() const修饰指针: ①前言 调试是每个程序员都…

计及电池储能寿命损耗的微电网经济调度(matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《考虑寿命损耗的微网电池储能容量优化配置》模型&#xff0c;以购售电成本、燃料成本和储能寿命损耗成本三者之和为目标函数&#xff0c;创新考虑储能寿命损耗约束、放电深度约束和储能循环次…