From 8e07ca68f70169799aea5947a4c4677b104b7e14 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期五, 28 二月 2025 11:53:30 +0800
Subject: [PATCH] Merge branch 'master' of https://gitee.com/xiaochen991015/xizang

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java              |  238 ++++++++--------
 ruoyi-system/pom.xml                                                                                |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/task/exceptions/TimeException.java                      |   37 ++
 ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java                             |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/StateProcessJob.java                          |   45 +++
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java          |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/task/base/QuartzManager.java                            |  128 +++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/task/base/TimeJobType.java                              |   28 ++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java            |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java                     |   44 ++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java                  |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java                   |   26 +
 ruoyi-system/src/main/resources/mapper/system/StateProcessInstanceActionMapper.xml                  |   24 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java       |   72 ++--
 ruoyi-system/src/main/java/com/ruoyi/system/task/utils/SpringContextsUtil.java                      |   37 ++
 ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java                              |   30 ++
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java                                  |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java                   |   23 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisConfiguration.java            |   34 +-
 20 files changed, 599 insertions(+), 197 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
index 46e24ae..a00e890 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
@@ -1,6 +1,5 @@
 package com.ruoyi.web.controller.api;
 
-import com.aizuda.bpm.engine.entity.FlwTask;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -8,18 +7,15 @@
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.domain.BaseEntity;
 import com.ruoyi.common.core.domain.BaseModel;
 import com.ruoyi.common.core.domain.BasePage;
 import com.ruoyi.common.core.domain.entity.SysUser;
-import com.ruoyi.common.core.page.PageDomain;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.exception.GlobalException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.system.bo.*;
 import com.ruoyi.system.model.StateProcessModule;
 import com.ruoyi.system.model.StateProcessTemplate;
-import com.ruoyi.system.model.TContract;
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.service.StateProcessModuleService;
 import com.ruoyi.system.service.StateProcessTemplateService;
@@ -32,7 +28,10 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
index 48feee9..d77bafd 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
@@ -3,34 +3,39 @@
 
 import cn.afterturn.easypoi.excel.ExcelExportUtil;
 import cn.afterturn.easypoi.excel.entity.ExportParams;
-import cn.hutool.core.util.ObjectUtil;
-import com.aizuda.bpm.engine.core.FlowCreator;
+import com.aizuda.bpm.engine.entity.FlwTask;
+import com.aizuda.bpm.mybatisplus.mapper.FlwTaskMapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.collect.ImmutableMap;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.constant.DictConstants;
-import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.enums.ProcessCategoryEnum;
-import com.ruoyi.common.utils.*;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.DictUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.WebUtils;
 import com.ruoyi.system.bo.ProcessStartBO;
-import com.ruoyi.system.dto.*;
+import com.ruoyi.system.dto.RevokeDTO;
+import com.ruoyi.system.dto.SetContractDto;
+import com.ruoyi.system.dto.TContractDTO;
+import com.ruoyi.system.dto.TerminateContractDTO;
 import com.ruoyi.system.export.ContractExport;
-import com.ruoyi.system.export.OpticalInspectionExport;
 import com.ruoyi.system.model.*;
 import com.ruoyi.system.query.TContractBillQuery;
 import com.ruoyi.system.query.TContractQuery;
-import com.ruoyi.system.query.THouseQuery;
-import com.ruoyi.system.query.TUserHistoryQuery;
 import com.ruoyi.system.service.*;
+import com.ruoyi.system.task.base.QuartzManager;
+import com.ruoyi.system.task.base.TimeJobType;
+import com.ruoyi.system.task.jobs.StateProcessJob;
 import com.ruoyi.system.vo.BillVO;
 import com.ruoyi.system.vo.CheckAcceptRecordVO;
-import com.ruoyi.system.vo.HouseVO;
+import com.ruoyi.system.vo.TContractVO;
 import com.ruoyi.web.controller.tool.NumberToChineseUtils;
 import com.ruoyi.web.controller.tool.WordUtil;
-import io.swagger.annotations.Api;
-import com.ruoyi.system.vo.TContractVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -45,7 +50,6 @@
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
@@ -106,7 +110,21 @@
             variable.put("projectId", dto.getId());
             processStartBO.setVariable(variable);
             //开启工作流程
-            stateProcessTemplateService.start(processStartBO);
+            Boolean start = stateProcessTemplateService.start(processStartBO);
+            if(start){
+                FlwTask flwTask = flwTaskMapper.selectOne(Wrappers.lambdaQuery(FlwTask.class)
+                        .like(FlwTask::getVariable, dto.getId())
+                        .orderByDesc(FlwTask::getCreateTime)
+                        .last("LIMIT 1"));
+                if(Objects.nonNull(flwTask)){
+                    // 添加定时任务
+                    Map<String, ? extends Object> maps =
+                            new ImmutableMap.Builder<String, Long>().
+                                    put("id", flwTask.getId())
+                                    .build();
+                    QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name+flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT,new Date(new Date().getTime()+10*1000L), maps);
+                }
+            }
         }
         if (dto.getIsIncreasing()){
             TContractRentType tContractRentType = new TContractRentType();
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisConfiguration.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisConfiguration.java
index 5390dc1..b2cbb16 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisConfiguration.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisConfiguration.java
@@ -1,17 +1,17 @@
-package com.ruoyi.web.controller.interceptor;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class MybatisConfiguration {
- 
-    /**
-     * 注册拦截器
-     */
-    @Bean
-    public MybatisInterceptor getMybatisInterceptor() {
-        return new MybatisInterceptor();
-    }
-    
-}
\ No newline at end of file
+//package com.ruoyi.web.controller.interceptor;
+//
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//
+//@Configuration
+//public class MybatisConfiguration {
+//
+//    /**
+//     * 注册拦截器
+//     */
+//    @Bean
+//    public MybatisInterceptor getMybatisInterceptor() {
+//        return new MybatisInterceptor();
+//    }
+//
+//}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java
index 8c232f4..fcbd5dc 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java
@@ -1,119 +1,119 @@
-package com.ruoyi.web.controller.interceptor;
-
-import com.ruoyi.framework.web.service.TokenService;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.executor.Executor;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.SqlCommandType;
-import org.apache.ibatis.plugin.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.lang.reflect.Field;
-import java.time.LocalDateTime;
-import java.util.*;
-
-@Slf4j
-@Component
-@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) })
-public class MybatisInterceptor implements Interceptor {
-
-    @Autowired
-    private TokenService tokenService;
-
-    @Override
-    public Object intercept(Invocation invocation) throws Throwable {
-        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
-        if("com.ruoyi.system.mapper.SysLogininforMapper.insertLogininfor".equals(mappedStatement.getId())){
-            return invocation.proceed();
-        }
-        // sql类型:insert、update、select、delete
-        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
-        Object parameter = invocation.getArgs()[1];
-
-        if (parameter == null) {
-            return invocation.proceed();
-        }
- 
-        // 当sql为新增或更新类型时,自动填充操作人相关信息
-        if (SqlCommandType.INSERT == sqlCommandType) {
-
-            Field[] fields = getAllFields(parameter);
-            for (Field field : fields) {
-                try {
-                    // 注入创建人
-                    if ("createBy".equals(field.getName())) {
-                        // 获取当前登录用户信息
-                        if(Objects.nonNull(tokenService.getLoginUser())){
-                            String userName = tokenService.getLoginUser().getUser().getUserName();
-                            field.setAccessible(true);
-                            field.set(parameter, userName);
-                            field.setAccessible(false);
-                        }
-                    }
-                    //注入创建时间
-                    if ("createTime".equals(field.getName())) {
-                        field.setAccessible(true);
-//                        field.set(parameter, LocalDateTime.now());
-                        field.setAccessible(false);
-                    } 
-                } catch (Exception e) {
-                    log.error("failed to insert data, exception = ", e);
-                }
-            }
-        }
-        if (SqlCommandType.UPDATE == sqlCommandType) {
-            Field[] fields = getAllFields(parameter);
-            for (Field field : fields) {
-                try {
-                    if ("updateBy".equals(field.getName())) {
-                        // 获取当前登录用户信息
-                        if(Objects.nonNull(tokenService.getLoginUser())){
-                            String userName = tokenService.getLoginUser().getUser().getUserName();
-                            field.setAccessible(true);
-                            field.set(parameter, userName);
-                            field.setAccessible(false);
-                        }
-                    }
-                    if ("updateTime".equals(field.getName())) {
-                        field.setAccessible(true);
-//                        field.set(parameter, new Date());
-                        field.setAccessible(false);
-                    }
-                } catch (Exception e) {
-                    log.error("failed to update data, exception = ", e);
-                }
-            }
-        }
-        return invocation.proceed();
-    }
- 
-    @Override
-    public Object plugin(Object target) {
-        return Plugin.wrap(target, this);
-    }
- 
-    @Override
-    public void setProperties(Properties properties) {
-        // TODO Auto-generated method stub
-    }
- 
-    /**
-     * 获取类的所有属性,包括父类
-     *
-     * @param object
-     * @return
-     */
-    private Field[] getAllFields(Object object) {
-        Class<?> clazz = object.getClass();
-        List<Field> fieldList = new ArrayList<>();
-        while (clazz != null) {
-            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
-            clazz = clazz.getSuperclass();
-        }
-        Field[] fields = new Field[fieldList.size()];
-        fieldList.toArray(fields);
-        return fields;
-    }
- 
-}
\ No newline at end of file
+//package com.ruoyi.web.controller.interceptor;
+//
+//import com.ruoyi.framework.web.service.TokenService;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.ibatis.executor.Executor;
+//import org.apache.ibatis.mapping.MappedStatement;
+//import org.apache.ibatis.mapping.SqlCommandType;
+//import org.apache.ibatis.plugin.*;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Component;
+//
+//import java.lang.reflect.Field;
+//import java.time.LocalDateTime;
+//import java.util.*;
+//
+//@Slf4j
+//@Component
+//@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) })
+//public class MybatisInterceptor implements Interceptor {
+//
+//    @Autowired
+//    private TokenService tokenService;
+//
+//    @Override
+//    public Object intercept(Invocation invocation) throws Throwable {
+//        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
+//        if("com.ruoyi.system.mapper.SysLogininforMapper.insertLogininfor".equals(mappedStatement.getId())){
+//            return invocation.proceed();
+//        }
+//        // sql类型:insert、update、select、delete
+//        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
+//        Object parameter = invocation.getArgs()[1];
+//
+//        if (parameter == null) {
+//            return invocation.proceed();
+//        }
+//
+//        // 当sql为新增或更新类型时,自动填充操作人相关信息
+//        if (SqlCommandType.INSERT == sqlCommandType) {
+//
+//            Field[] fields = getAllFields(parameter);
+//            for (Field field : fields) {
+//                try {
+//                    // 注入创建人
+//                    if ("createBy".equals(field.getName())) {
+//                        // 获取当前登录用户信息
+//                        if(Objects.nonNull(tokenService.getLoginUser())){
+//                            String userName = tokenService.getLoginUser().getUser().getUserName();
+//                            field.setAccessible(true);
+//                            field.set(parameter, userName);
+//                            field.setAccessible(false);
+//                        }
+//                    }
+//                    //注入创建时间
+//                    if ("createTime".equals(field.getName())) {
+//                        field.setAccessible(true);
+////                        field.set(parameter, LocalDateTime.now());
+//                        field.setAccessible(false);
+//                    }
+//                } catch (Exception e) {
+//                    log.error("failed to insert data, exception = ", e);
+//                }
+//            }
+//        }
+//        if (SqlCommandType.UPDATE == sqlCommandType) {
+//            Field[] fields = getAllFields(parameter);
+//            for (Field field : fields) {
+//                try {
+//                    if ("updateBy".equals(field.getName())) {
+//                        // 获取当前登录用户信息
+//                        if(Objects.nonNull(tokenService.getLoginUser())){
+//                            String userName = tokenService.getLoginUser().getUser().getUserName();
+//                            field.setAccessible(true);
+//                            field.set(parameter, userName);
+//                            field.setAccessible(false);
+//                        }
+//                    }
+//                    if ("updateTime".equals(field.getName())) {
+//                        field.setAccessible(true);
+////                        field.set(parameter, new Date());
+//                        field.setAccessible(false);
+//                    }
+//                } catch (Exception e) {
+//                    log.error("failed to update data, exception = ", e);
+//                }
+//            }
+//        }
+//        return invocation.proceed();
+//    }
+//
+//    @Override
+//    public Object plugin(Object target) {
+//        return Plugin.wrap(target, this);
+//    }
+//
+//    @Override
+//    public void setProperties(Properties properties) {
+//        // TODO Auto-generated method stub
+//    }
+//
+//    /**
+//     * 获取类的所有属性,包括父类
+//     *
+//     * @param object
+//     * @return
+//     */
+//    private Field[] getAllFields(Object object) {
+//        Class<?> clazz = object.getClass();
+//        List<Field> fieldList = new ArrayList<>();
+//        while (clazz != null) {
+//            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
+//            clazz = clazz.getSuperclass();
+//        }
+//        Field[] fields = new Field[fieldList.size()];
+//        fieldList.toArray(fields);
+//        return fields;
+//    }
+//
+//}
\ No newline at end of file
diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml
index da794d7..b55145b 100644
--- a/ruoyi-system/pom.xml
+++ b/ruoyi-system/pom.xml
@@ -32,6 +32,10 @@
 <!--                </exclusion>-->
 <!--            </exclusions>-->
         </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-quartz</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>cn.afterturn</groupId>
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java
index a009e7d..b52551e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java
@@ -1,5 +1,6 @@
 package com.ruoyi.system.bo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -26,5 +27,10 @@
      * 图片
      */
     private String pictures;
+    /**
+     * 审批用户id
+     */
+    @ApiModelProperty(value = "前端忽略")
+    private Long userId;
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java
index 81dcaa1..be2c3dc 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java
@@ -4,4 +4,6 @@
 import com.ruoyi.system.model.StateProcessInstanceAction;
 
 public interface StateProcessInstanceActionMapper extends BaseMapper<StateProcessInstanceAction> {
+    void saveData(StateProcessInstanceAction stateProcessInstanceAction);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java
index e1501db..0ed879b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java
@@ -1,20 +1,22 @@
 package com.ruoyi.system.model;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.ruoyi.common.core.domain.BaseModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
 @Data
 @EqualsAndHashCode(callSuper = false)
 @ApiModel(value = "工作流-实例操作记录表")
 @TableName(value = "state_process_instance_action")
-public class StateProcessInstanceAction extends BaseModel {
+public class StateProcessInstanceAction implements Serializable {
 
     @TableId(value = "id", type = IdType.ASSIGN_ID)
     private String id;
@@ -45,6 +47,17 @@
     @ApiModelProperty(value = "图片")
     @TableField("pictures")
     private String pictures;
+    /**
+     * 删除  未删除
+     */
+    @TableField("`disabled`")
+    @TableLogic
+    private Boolean disabled;
+
+    @ApiModelProperty(value = "记录创建时间,前端忽略")
+    @TableField("create_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
 
     @TableField(exist = false)
     private String nickName;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java
index e2141dd..c4a5b44 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java
@@ -1,12 +1,14 @@
 package com.ruoyi.system.query;
 
 import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.util.List;
 
 @Data
+@ApiModel("租户详情-缴费账单列表查询")
 public class TBillAppletQuery extends BasePage {
     /**
      * 缴费状态 1=未缴费 2=待确认 3=已缴费 4=已逾期
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java
index 85b5090..58bee7e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java
@@ -4,4 +4,7 @@
 import com.ruoyi.system.model.StateProcessInstanceAction;
 
 public interface StateProcessInstanceActionService extends IService<StateProcessInstanceAction> {
+
+    void saveData(StateProcessInstanceAction stateProcessInstanceAction);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
index 598e73b..48bf079 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
@@ -25,19 +25,21 @@
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.google.common.collect.ImmutableMap;
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.enums.ProcessCategoryEnum;
 import com.ruoyi.common.enums.SubmitStatusEnum;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.system.service.ISysRoleService;
 import com.ruoyi.system.service.TContractService;
+import com.ruoyi.system.task.base.QuartzManager;
+import com.ruoyi.system.task.base.TimeJobType;
+import com.ruoyi.system.task.jobs.StateProcessJob;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
@@ -93,6 +95,15 @@
                     if (ObjectUtil.isEmpty(flwHisTask)) {
                         return true;
                     }
+
+                    // 添加定时任务
+                    Map<String, ? extends Object> maps =
+                            new ImmutableMap.Builder<String, Long>().
+                                    put("id", flwTask.getId())
+                                    .build();
+                    QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name+flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT,new Date(new Date().getTime()+10*1000L), maps);
+
+
                     //对比发起人和节点审批人
                     if (nodeAssigneeList.stream().noneMatch(t -> Objects.equals(t.getId(), flwHisTask.getCreateId()))) {
                         return true;
@@ -135,6 +146,15 @@
                     if (ObjectUtil.isEmpty(flwHisTask)) {
                         return true;
                     }
+
+                    // 添加定时任务
+                    Map<String, ? extends Object> maps =
+                            new ImmutableMap.Builder<String, Long>().
+                                    put("id", flwTask.getId())
+                                    .build();
+                    QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name+flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT,new Date(new Date().getTime()+10*1000L), maps);
+
+
                     //对比发起人和节点审批人
                     if (flwTaskActors.stream().noneMatch(t -> Objects.equals(t.getActorId(), flwHisTask.getCreateId()))) {
                         return true;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java
index 45a3d5a..013972a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java
@@ -8,4 +8,8 @@
 
 @Service
 public class StateProcessInstanceActionServiceImpl extends ServiceImpl<StateProcessInstanceActionMapper, StateProcessInstanceAction> implements StateProcessInstanceActionService {
+    @Override
+    public void saveData(StateProcessInstanceAction stateProcessInstanceAction) {
+        this.baseMapper.saveData(stateProcessInstanceAction);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
index afbd802..7c3da74 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
@@ -22,6 +22,7 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.ImmutableMap;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.BaseModel;
 import com.ruoyi.common.core.domain.entity.SysUser;
@@ -580,40 +581,29 @@
             new PageInfo<>();
         }
 
-        List<String> instanceId = flwHisTaskList.stream().map(FlwTask::getInstanceId)
+        List<String> instanceIds = flwHisTaskList.stream().map(FlwTask::getInstanceId)
                 .map(String::valueOf).collect(Collectors.toList());
         //分页查询任务中心任务
-        LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>();
-        if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) {
-            stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName());
-        }
-        if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) {
-            stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName());
-        }
-        if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) {
-            stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy());
-        }
-        if (ObjectUtil.isEmpty(instanceId)) {
-            return new PageInfo<>();
-        }
-        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId);
-        stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
-        PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
-        PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
-        //转换类
-        List<ProcessTaskListVO> processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class);
-
-        // 查询合同信息
-        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
-            // 查询合同信息
-            TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
-            processTaskListVO.setContract(contract);
-        }
-
-        pageInfo.setRecords(processTaskListVOS);
+//        LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>();
+//        if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) {
+//            stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName());
+//        }
+//        if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) {
+//            stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName());
+//        }
+//        if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) {
+//            stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy());
+//        }
+//        if (ObjectUtil.isEmpty(instanceId)) {
+//            return new PageInfo<>();
+//        }
+//        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId);
+//        stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
+        processTaskListBO.setInstanceIds(instanceIds);
+        PageInfo<ProcessTaskListVO> processTaskListVOS = stateTaskCenterService.pageList(processTaskListBO);
 
         if (ObjectUtil.isEmpty(processTaskListVOS)) {
-            return pageInfo;
+            return new PageInfo<>();
         }
         Map<Long, List<FlwHisTask>> flwHisTaskMap = flwHisTaskList.stream().collect(Collectors.groupingBy(FlwHisTask::getInstanceId));
         //查询原因
@@ -622,7 +612,7 @@
                 Wrappers.<StateProcessInstanceAction>lambdaQuery().in(StateProcessInstanceAction::getNodeId, taskIds));
         Map<String, StateProcessInstanceAction> actionMap = actions.stream().collect(Collectors.toMap(StateProcessInstanceAction::getNodeId, Function.identity()));
 
-        List<String> updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
+        List<String> updateUserId = processTaskListVOS.getRecords().stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
         Map<Long, SysUser> sysUserMap;
         if (!CollectionUtils.isEmpty(updateUserId)) {
             List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
@@ -636,7 +626,7 @@
             sysUserMap = new HashMap<>();
         }
 
-        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
+        for (ProcessTaskListVO processTaskListVO : processTaskListVOS.getRecords()) {
             List<FlwHisTask> flwHisTasks = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId()));
             if (ObjectUtil.isNotEmpty(flwHisTaskMap)) {
                 //当某个用户在同一个模块审批流的多个节点都存在时,多次审核后,已审核列表页报错
@@ -659,7 +649,7 @@
                 processTaskListVO.setCreateBy(sysUser.getNickName());
             }
         }
-        return pageInfo;
+        return processTaskListVOS;
     }
     @Override
     public PageInfo<ProcessTaskListVO> dealTaskPageApplet(ProcessTaskListBO processTaskListBO) {
@@ -912,12 +902,16 @@
         if (ObjectUtil.isNull(flwTask)) {
             throw new GlobalException("任务已处理或者不存在");
         }
-        flowLongEngine.executeTask(taskId, currentFlowCreator());
+        if(Objects.nonNull(processAgreeBO.getUserId())){
+            flowLongEngine.executeTask(taskId, currentFlowCreator(processAgreeBO.getUserId()));
+        }else {
+            flowLongEngine.executeTask(taskId, currentFlowCreator());
+        }
         // 动作执行记录
         StateProcessInstanceAction stateProcessInstanceAction = new StateProcessInstanceAction();
         stateProcessInstanceAction.setId(IdUtils.simpleUUID());
         stateProcessInstanceAction.setInstanceId(flwTask.getInstanceId().toString());
-        stateProcessInstanceAction.setAuditorId(String.valueOf(SecurityUtils.getUserId()));
+        stateProcessInstanceAction.setAuditorId(String.valueOf(processAgreeBO.getUserId()));
         stateProcessInstanceAction.setActionType(StateProcessActionEnum.APPROVED.getValue());
         stateProcessInstanceAction.setNodeId(processAgreeBO.getTaskId());
         stateProcessInstanceAction.setRemark(processAgreeBO.getRemark());
@@ -1208,6 +1202,7 @@
 
         // 查询历史任务
         List<FlwHisTask> flwHisTasks = flwHisTaskMapper.selectList(Wrappers.<FlwHisTask>lambdaQuery().eq(FlwHisTask::getInstanceId, instanceId));
+
         processDetailVO.setFlwHisTasks(flwHisTasks);
 
         List<StateProcessInstanceAction> list = stateProcessInstanceActionService.list(Wrappers.<StateProcessInstanceAction>lambdaQuery().eq(StateProcessInstanceAction::getInstanceId, instanceId)
@@ -1309,5 +1304,12 @@
         }
         return FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName());
     }
+    private FlowCreator currentFlowCreator(Long userId) {
+        if (null == userId) {
+            throw new GlobalException("非法用户");
+        }
+        SysUser sysUser = sysUserService.selectUserById(userId);
+        return FlowCreator.of(String.valueOf(sysUser.getUserId()), sysUser.getNickName());
+    }
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java
new file mode 100644
index 0000000..720445d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java
@@ -0,0 +1,30 @@
+package com.ruoyi.system.task.base;
+
+import com.aizuda.bpm.mybatisplus.mapper.FlwTaskActorMapper;
+import com.aizuda.bpm.mybatisplus.mapper.FlwTaskMapper;
+import com.ruoyi.system.service.StateProcessTemplateService;
+import com.ruoyi.system.task.utils.SpringContextsUtil;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractJob implements Job{
+	protected Logger logger = LoggerFactory.getLogger(getClass());
+
+	@Override
+	public abstract void execute(JobExecutionContext context) throws JobExecutionException;
+
+	protected StateProcessTemplateService stateProcessTemplateService;
+	protected FlwTaskMapper flwTaskMapper;
+	protected FlwTaskActorMapper flwTaskActorMapper;
+
+	public AbstractJob(){
+		this.stateProcessTemplateService = SpringContextsUtil.getBean(StateProcessTemplateService.class);
+		this.flwTaskMapper = SpringContextsUtil.getBean(FlwTaskMapper.class);
+		this.flwTaskActorMapper = SpringContextsUtil.getBean(FlwTaskActorMapper.class);
+	}
+
+	 
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/base/QuartzManager.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/QuartzManager.java
new file mode 100644
index 0000000..90a0017
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/QuartzManager.java
@@ -0,0 +1,128 @@
+package com.ruoyi.system.task.base;
+
+import org.quartz.*;
+import org.quartz.impl.StdSchedulerFactory;
+
+import java.util.Date;
+import java.util.Map;
+
+public class QuartzManager {
+	private static SchedulerFactory factory = new StdSchedulerFactory();
+	private static final String TRIGGER_NAME_PREFIX = "TRIGGER_PREFIX_";
+	private static final String JOB_NAME_PREFIX = "JOB_PREFIX_";
+	
+	/**
+	 * 添加定时任务:具体某个时间点执行一次的任务,如:在某个2015-06-01 12:00发送一条消息
+	 * 
+	 * @param jobName
+	 *            具体的任务名+ID标识唯一
+	 * @param jobType
+	 * @param date
+	 * @param jp
+	 */
+	public synchronized static void addJob(Class<? extends Job> jobClass, String jobName, TimeJobType jobType, Date date,
+                                           Map<String,  ? extends Object> jp) {
+		//logger.debug("ADD JOB {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date);
+		try {
+			Scheduler sched = factory.getScheduler();
+			JobDetail job = JobBuilder.newJob(jobClass).withIdentity(JOB_NAME_PREFIX + jobName, jobType.getType())
+					.setJobData(new JobDataMap(jp)).build();
+
+			SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
+					.withIdentity(TRIGGER_NAME_PREFIX + jobName, jobType.getType()).startAt(date).build();
+			removeJob(jobName, jobType);
+			
+			sched.scheduleJob(job, trigger);
+
+			if (!sched.isShutdown()) {
+				sched.start();
+			}
+		} catch (Exception e) {
+			//logger.error("ADD JOB exception {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date);
+		}
+	}
+	
+	   /**
+	    * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) 
+	    * @param jobName 
+	    * @param time 
+	    */  
+	    public synchronized static void modifyJobTime(String jobName,TimeJobType jobType, Date time) {  
+	    	 //logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time);
+	        try {  
+	        	JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType());
+				TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType());
+				
+				
+	            Scheduler sched = factory.getScheduler();  
+	            SimpleTrigger trigger = (SimpleTrigger) sched.getTrigger(key);  
+	            if(trigger == null) {  
+	                return;  
+	            }  
+	            Date oldTime = trigger.getStartTime();
+	          
+	            if (oldTime.getTime() != time.getTime()) {  
+	                JobDetail jobDetail = sched.getJobDetail(jobKey);  
+	                Class<? extends Job> objJobClass = jobDetail.getJobClass();  
+	                removeJob(jobName,jobType);  
+	                Map<String, Object> jp = jobDetail.getJobDataMap();
+	                addJob(objJobClass, jobName, jobType, time, jp); 
+	            }  
+	        } catch (Exception e) {  
+	           // logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time);
+	        }  
+	    }
+
+	/**
+	 * 移除一个任务
+	 * 
+	 * @param jobName
+	 */
+	public synchronized static void removeJob(String jobName, TimeJobType jobType) {
+		try {
+			JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType());
+			TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType());
+			Scheduler sched = factory.getScheduler();
+
+			JobDetail detail = sched.getJobDetail(jobKey);
+			if (detail != null) {
+				sched.pauseJob(jobKey);
+				sched.pauseTrigger(key);// 停止触发器
+				sched.unscheduleJob(key);// 移除触发器
+				sched.deleteJob(jobKey);// 删除任务
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * 启动所有定时任务
+	 */
+	public synchronized static void startJobs() {
+		try {
+			Scheduler sched = factory.getScheduler();
+			sched.start();
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * 关闭所有定时任务
+	 */
+	public synchronized static void shutdownJobs() {
+		try {
+			Scheduler sched = factory.getScheduler();
+			if (!sched.isShutdown()) {
+				sched.shutdown();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/base/TimeJobType.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/TimeJobType.java
new file mode 100644
index 0000000..8bacc4a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/TimeJobType.java
@@ -0,0 +1,28 @@
+package com.ruoyi.system.task.base;
+
+/**
+ * @Description 按时间点发布的任务类型
+ * @date 2025年2月17日 下午7:22:28
+ */
+public enum TimeJobType {
+	AUTO_AUDIT("auto_audit","自动审核");
+	private String type;
+	private String desc;
+	private TimeJobType(String type, String desc) {
+		this.type = type;
+		this.desc = desc;
+	}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getDesc() {
+		return desc;
+	}
+	public void setDesc(String desc) {
+		this.desc = desc;
+	}
+	
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/exceptions/TimeException.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/exceptions/TimeException.java
new file mode 100644
index 0000000..efd9cf8
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/exceptions/TimeException.java
@@ -0,0 +1,37 @@
+package com.ruoyi.system.task.exceptions;
+
+/** 
+ * @文件说明:定时器任务执行异常 
+ * @版权所有:成都喜来达
+ * @项目名称: fengsheng
+ * @创建者: Leeyns 
+ * @创建日期: 2016年5月18日
+ * @最近修改者:Leeyns 
+ * @最近修改日期:2016年5月18日
+ */ 
+public class TimeException extends Exception {
+
+	/**
+	 *  TODO
+	 */
+	private static final long serialVersionUID = 5703430073981692250L;
+
+	private String message;
+	
+	public TimeException() {
+		super();
+	}
+	
+	public TimeException(String message) {
+		super(message);
+		this.message = message;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/StateProcessJob.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/StateProcessJob.java
new file mode 100644
index 0000000..c4ad3a2
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/StateProcessJob.java
@@ -0,0 +1,45 @@
+package com.ruoyi.system.task.jobs;
+
+import com.aizuda.bpm.engine.entity.FlwTaskActor;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.system.bo.ProcessAgreeBO;
+import com.ruoyi.system.task.base.AbstractJob;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import java.util.Objects;
+
+/**
+ * 发票定时任务
+ * @author Administrator
+ *
+ */
+public class StateProcessJob extends AbstractJob {
+	
+	public static final String name = "stateProcess_";
+	
+	@Override
+	public void execute(JobExecutionContext context)
+			throws JobExecutionException {
+		JobDataMap maps = context.getMergedJobDataMap();
+		Long taskId = maps.getLong("id");
+		try {
+			System.err.println("执行定时任务");
+			ProcessAgreeBO processAgreeBO = new ProcessAgreeBO();
+			processAgreeBO.setTaskId(String.valueOf(taskId));
+			FlwTaskActor flwTaskActor = flwTaskActorMapper.selectOne(Wrappers.lambdaQuery(FlwTaskActor.class).eq(FlwTaskActor::getTaskId, taskId).last("LIMIT 1"));
+			if(Objects.isNull(flwTaskActor)){
+				System.err.println("该任务不存在");
+				return;
+			}
+			processAgreeBO.setRemark("自动审批");
+			processAgreeBO.setUserId(Long.valueOf(flwTaskActor.getActorId()));
+			stateProcessTemplateService.agree(processAgreeBO);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+	}
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/utils/SpringContextsUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/utils/SpringContextsUtil.java
new file mode 100644
index 0000000..558257f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/utils/SpringContextsUtil.java
@@ -0,0 +1,37 @@
+package com.ruoyi.system.task.utils;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SpringContextsUtil implements ApplicationContextAware{
+
+	private static ApplicationContext applicationContext;
+	 
+	@Override	
+	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {		
+		if (SpringContextsUtil.applicationContext == null) {			
+			SpringContextsUtil.applicationContext = applicationContext;		
+		}	
+	} 	
+	// 获取applicationContext	
+	public static ApplicationContext getApplicationContext() {		
+		return applicationContext;	
+	} 	
+	// 通过name获取 Bean.	
+	public static Object getBean(String name) {		
+		return getApplicationContext().getBean(name);	
+	} 	
+	// 通过class获取Bean.	
+	public static <T> T getBean(Class<T> clazz) {		
+		return getApplicationContext().getBean(clazz);	
+	} 	
+	// 通过name,以及Clazz返回指定的Bean	
+	public static <T> T getBean(String name, Class<T> clazz) {	
+		System.out.println(getApplicationContext().getBean(name, clazz));
+		return getApplicationContext().getBean(name, clazz);	
+	}
+    
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/StateProcessInstanceActionMapper.xml b/ruoyi-system/src/main/resources/mapper/system/StateProcessInstanceActionMapper.xml
new file mode 100644
index 0000000..6dbf513
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/StateProcessInstanceActionMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.StateProcessInstanceActionMapper">
+
+
+    <insert id="saveData">
+        insert into state_process_instance_action(
+            id,
+            instance_id,
+            auditor_id,
+            action_type,
+            node_id,
+            remark,
+            pictures
+            values
+                (#{id},
+                #{instanceId},
+                #{auditorId},
+                #{actionType},
+                #{nodeId},
+                #{remark},
+                #{pictures})
+    </insert>
+</mapper>
\ No newline at end of file

--
Gitblit v1.7.1