From 04d2f146d27f9e4dbfb52d71b3092db764629167 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期四, 20 二月 2025 13:47:52 +0800
Subject: [PATCH] Merge branch 'master' of https://gitee.com/xiaochen991015/xizang

---
 ruoyi-admin/src/main/resources/application-test.yml                                                 |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessModuleMapper.java                    |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java                               |   42 +
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessCreateBO.java                                 |   21 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessExtInstanceServiceImpl.java    |   11 
 ruoyi-system/src/main/resources/mapper/system/StateProcessTemplateMapper.xml                        |   15 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java                  |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java            |    7 
 ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml                          |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TCheckAcceptRecordVO.java                            |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessModuleServiceImpl.java         |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessModuleService.java                  |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java       |  630 +++++++++++++++++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java                     |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessModuleUpdateBO.java                           |   19 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java                                  |   26 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessExtInstanceService.java             |    7 
 ruoyi-admin/pom.xml                                                                                 |    7 
 ruoyi-common/src/main/java/com/ruoyi/common/enums/StateProcessActionEnum.java                       |   26 +
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java                               |   27 +
 ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessExtInstance.java                      |   19 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessStartBO.java                                  |   57 ++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessTemplateMapper.java                  |   15 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessUpdateBO.java                                 |   22 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java          |    7 
 ruoyi-applet/pom.xml                                                                                |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java                       |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessTemplate.java                         |   25 +
 ruoyi-common/pom.xml                                                                                |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessExtInstanceMapper.java               |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessModule.java                           |   25 +
 ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java                              |   22 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java                  |  191 +++++++
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTemplatePageBO.java                           |   12 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/DeployBO.java                                        |   15 
 ruoyi-common/src/main/java/com/ruoyi/common/exception/state/StateErrorCode.java                     |   19 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java            |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessRefuseBO.java                                 |   27 +
 ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java                   |   24 
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java                |   41 +
 41 files changed, 1,456 insertions(+), 16 deletions(-)

diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 109418f..97f4520 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -100,13 +100,6 @@
 <!--            </exclusions>-->
         </dependency>
 
-        <!--二维码开发工具集-->
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>4.6.10</version>
-        </dependency>
-
         <!-- zxing生成二维码 -->
         <dependency>
             <groupId>com.google.zxing</groupId>
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
new file mode 100644
index 0000000..abb00c3
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
@@ -0,0 +1,191 @@
+package com.ruoyi.web.controller.api;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.service.ISysUserService;
+import com.ruoyi.system.service.StateProcessModuleService;
+import com.ruoyi.system.service.StateProcessTemplateService;
+import com.ruoyi.system.vo.ProcessTaskListVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Api(tags = "审批流程管理")
+@RequestMapping("/state-process")
+@RestController
+@RequiredArgsConstructor
+public class StateProcessController {
+
+    private final StateProcessTemplateService processTemplateService;
+    private final StateProcessModuleService processModuleService;
+    private final ISysUserService sysUserService;
+
+    //应用流程分页列表
+    @ApiOperation("应用流程分页列表")
+    @PostMapping("/module/page")
+    public AjaxResult<List<StateProcessModule>> modulePage(@RequestBody BasePage basePage) {
+        LambdaQueryWrapper<StateProcessModule> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.orderByAsc(StateProcessModule::getCategory);
+        //查询应用流程列表
+        List<StateProcessModule> result = processModuleService.list(queryWrapper);
+        List<String> updateUserId = result.stream().map(BaseModel::getUpdateBy).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(updateUserId)){
+            //根据用户id查询用户信息
+            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
+            Map<Long, SysUser> sysUserMap;
+            if (!CollectionUtils.isEmpty(sysUsers)){
+                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
+            } else {
+                sysUserMap = new HashMap<>();
+            }
+            //遍历列表,设置更新人名称
+            result.forEach(e -> {
+                SysUser sysUser = sysUserMap.get(e.getUpdateBy());
+                if (Objects.nonNull(sysUser)){
+                    e.setUpdateBy(sysUser.getNickName());
+                }
+            });
+        }
+        return AjaxResult.success(result);
+    }
+    //修改应用流程
+    @Log(title = "审批流程管理-修改应用流程", businessType = BusinessType.UPDATE)
+    @ApiOperation("修改应用流程")
+    @PostMapping("/module/update")
+    public AjaxResult<PageInfo<StateProcessModule>> moduleUpdate(@RequestBody ProcessModuleUpdateBO processModuleUpdateBO) {
+        StateProcessTemplate stateProcessTemplate = processTemplateService.getById(processModuleUpdateBO.getTemplateId());
+        if (Objects.isNull(stateProcessTemplate)) {
+            return AjaxResult.success();
+        }
+        StateProcessModule stateProcessModule = new StateProcessModule();
+        stateProcessModule.setId(processModuleUpdateBO.getId());
+        stateProcessModule.setTemplateId(processModuleUpdateBO.getTemplateId());
+        stateProcessModule.setTemplateName(stateProcessTemplate.getTemplateName());
+        stateProcessModule.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
+        stateProcessModule.setCreateTime(LocalDateTime.now());
+        stateProcessModule.setUpdateTime(LocalDateTime.now());
+        stateProcessModule.setRemark(processModuleUpdateBO.getRemark());
+        processModuleService.updateById(stateProcessModule);
+        return AjaxResult.success();
+    }
+
+    //流程模版分页
+    @ApiOperation("流程模版分页")
+    @PostMapping("/template/page")
+    public AjaxResult<Page<StateProcessTemplate>> page(ProcessTemplatePageBO request) {
+        Page<StateProcessTemplate> templatePage = processTemplateService.page(request);
+        return AjaxResult.success(templatePage);
+    }
+
+    //查询流程模版
+    @ApiOperation("查询流程模版")
+    @GetMapping("/template/getById")
+    public AjaxResult<StateProcessTemplate> selectById(@RequestParam String id) {
+        return AjaxResult.success(processTemplateService.getById(id));
+    }
+
+    //修改并部署模版
+    @Log(title = "审批流程管理-修改并部署模版", businessType = BusinessType.UPDATE)
+    @ApiOperation("修改并部署模版")
+    @PostMapping("/template/update")
+    public AjaxResult<Boolean> update(@RequestBody ProcessUpdateBO processUpdateBO) {
+        return AjaxResult.success(processTemplateService.update(processUpdateBO));
+    }
+
+    //删除模版
+    @Log(title = "审批流程管理-删除模版", businessType = BusinessType.DELETE)
+    @ApiOperation("删除模版")
+    @GetMapping("/template/deleteById")
+    public AjaxResult<Boolean> deleteById(@RequestParam String id) {
+        StateProcessTemplate template = processTemplateService.getById(id);
+        //查询是否存在使用的
+        LambdaUpdateWrapper<StateProcessModule> moduleLambdaUpdateWrapper = new LambdaUpdateWrapper<>();;
+        moduleLambdaUpdateWrapper.eq(StateProcessModule::getTemplateId, template.getId());
+        if (processModuleService.getBaseMapper().exists(moduleLambdaUpdateWrapper)) {
+            throw new GlobalException("该模版在应用流程中已使用!");
+        }
+        //根据key修改所有版本为已删除
+        boolean result = processTemplateService.remove(Wrappers.lambdaQuery(StateProcessTemplate.class)
+                .eq(StateProcessTemplate::getTemplateKey, template.getTemplateKey()));
+        return AjaxResult.success(result);
+    }
+
+    //创建并部署模版
+    @Log(title = "审批流程管理-创建并部署模版", businessType = BusinessType.INSERT)
+    @ApiOperation("创建并部署模版")
+    @PostMapping("/template/create")
+    public AjaxResult<Boolean> create(@RequestBody ProcessCreateBO processCreateBO) {
+        return AjaxResult.success(processTemplateService.create(processCreateBO));
+    }
+
+    //流程发起
+    @Log(title = "审批流程管理-流程发起", businessType = BusinessType.INSERT)
+    @ApiOperation("流程发起")
+    @PostMapping("/start")
+    public AjaxResult<Boolean> start(@RequestBody ProcessStartBO processStartBO) {
+        return AjaxResult.success(processTemplateService.start(processStartBO));
+    }
+
+    //待办
+    @ApiOperation("待办列表")
+    @PostMapping("/wait/task/page")
+    public AjaxResult<PageInfo<ProcessTaskListVO>> waitTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
+        return AjaxResult.success(processTemplateService.waitTaskPage(processTemplatePageBO));
+    }
+
+    //已办
+    @ApiOperation("已办列表")
+    @PostMapping("/deal/task/page")
+    public AjaxResult<PageInfo<ProcessTaskListVO>> dealTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
+        return AjaxResult.success(processTemplateService.dealTaskPage(processTemplatePageBO));
+    }
+
+    //抄送
+    @ApiOperation("抄送列表")
+    @PostMapping("/copy/task/page")
+    public AjaxResult<PageInfo<ProcessTaskListVO>> copyTaskPage(@RequestBody ProcessTaskListBO processTaskListBO){
+        return AjaxResult.success(processTemplateService.copyTaskPage(processTaskListBO));
+    }
+
+    //审核通过
+    @Log(title = "审批流程管理-审核通过", businessType = BusinessType.UPDATE)
+    @ApiOperation("审核通过")
+    @PostMapping("/agree")
+    public AjaxResult<Object> agree(@RequestBody ProcessAgreeBO processAgreeBO) {
+        processTemplateService.agree(processAgreeBO);
+        return AjaxResult.success();
+    }
+
+    //审核拒绝
+    @Log(title = "审批流程管理-审核拒绝", businessType = BusinessType.UPDATE)
+    @ApiOperation("审核拒绝")
+    @PostMapping("/refuse")
+    public AjaxResult<Object> refuse(@RequestBody ProcessRefuseBO processRefuseBO) {
+        processTemplateService.refuse(processRefuseBO);
+        return AjaxResult.success();
+    }
+
+}
diff --git a/ruoyi-admin/src/main/resources/application-test.yml b/ruoyi-admin/src/main/resources/application-test.yml
index 0c6013b..54159c4 100644
--- a/ruoyi-admin/src/main/resources/application-test.yml
+++ b/ruoyi-admin/src/main/resources/application-test.yml
@@ -220,3 +220,9 @@
     bucketAddr: ap-chengdu
     rootSrc: https://xzgttest-1305134071.cos.ap-chengdu.myqcloud.com/
     location: xizang
+sms:
+  enable: true
+  appId: 1400957506
+  secretid: AKIDCF5EF2c0DE1e5JK8r4EGJF4mNsMgp26x
+  secretkey: lLl184rUyFOOE0d5KNGC3kmfNsCWk4GU
+  sign: 四川金达通信工程
\ No newline at end of file
diff --git a/ruoyi-applet/pom.xml b/ruoyi-applet/pom.xml
index f18e8ca..b02986c 100644
--- a/ruoyi-applet/pom.xml
+++ b/ruoyi-applet/pom.xml
@@ -95,13 +95,6 @@
 <!--            </exclusions>-->
         </dependency>
 
-        <!--二维码开发工具集-->
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>4.6.10</version>
-        </dependency>
-
         <!-- zxing生成二维码 -->
         <dependency>
             <groupId>com.google.zxing</groupId>
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index a9f2046..b239bd0 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -10,6 +10,7 @@
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.SmsUtil;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.service.ISysRoleService;
 import com.ruoyi.web.controller.tool.MsgUtils;
@@ -54,6 +55,8 @@
     private ISysRoleService roleService;
     @Autowired
     private MsgUtils msgUtils;
+    @Autowired
+    private SmsUtil smsUtil;
 
     /**
      * 账号密码登录
@@ -127,7 +130,7 @@
             String code = String.valueOf((int) (Math.random() * 1000000));
             redisCache.setCacheObject(phone, code,5*60,TimeUnit.SECONDS);
             try {
-                msgUtils.sendMsg(phone, code);
+                smsUtil.sendSms(phone, "", new String[]{code});
             } catch (Exception e) {
                 throw new RuntimeException(e);
             }
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 48aaf48..33e2a27 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -194,6 +194,13 @@
             <version>1.0.4</version>
         </dependency>
 
+        <!-- hutool-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.4</version>
+        </dependency>
+
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/StateProcessActionEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/StateProcessActionEnum.java
new file mode 100644
index 0000000..d61daea
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/StateProcessActionEnum.java
@@ -0,0 +1,26 @@
+package com.ruoyi.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 流程动作枚举
+ *
+ */
+@Getter
+@AllArgsConstructor
+public enum StateProcessActionEnum {
+
+    START(0), // "发起"
+    REJECTED(3), // "拒绝"
+    APPROVED(4), // "通过"
+    CANCELED(5), // "撤销"
+    BACK(7), // "回退"
+    COPY(12), // "抄送"
+    FORWARD(13), // "转发"
+    COMMENT(14), // "评论"
+    TRANSACT(15); // "办理"
+
+    private final int value;
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/state/StateErrorCode.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/state/StateErrorCode.java
new file mode 100644
index 0000000..9e38eef
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/state/StateErrorCode.java
@@ -0,0 +1,19 @@
+package com.ruoyi.common.exception.state;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum StateErrorCode {
+
+    PROCESS_TEMPLATE_KEY_EXISTS("已经存在此名称的模版了!"),
+    PROCESS_TEMPLATE_NOT_EXISTS("流程模版不存在!"),
+    PROCESS_NOT_DEPLOY("模版尚未部署成功"),
+    PROCESS_VERSION_ERROR("流程引擎版本不一致"),
+    ;
+
+    private final String value;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/DeployBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/DeployBO.java
new file mode 100644
index 0000000..7adf52f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/DeployBO.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.bo;
+
+import com.aizuda.bpm.engine.model.NodeModel;
+import lombok.Data;
+
+@Data
+public class DeployBO {
+    private String key;
+    private String name;
+    private String instanceUrl;
+    /**
+     * 流程定义
+     */
+    private NodeModel nodeConfig;
+}
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
new file mode 100644
index 0000000..7638f4d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java
@@ -0,0 +1,26 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+/**
+ * 流程审批请求参数 同意
+ *
+ * <p>
+ * 尊重知识产权,不允许非法使用,后果自负
+ * </p>
+ *
+ */
+@Data
+public class ProcessAgreeBO {
+
+    /**
+     * 任务id
+     */
+    private String taskId;
+
+    /**
+     * 理由
+     */
+    private String remark;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessCreateBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessCreateBO.java
new file mode 100644
index 0000000..ed40541
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessCreateBO.java
@@ -0,0 +1,21 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+@Data
+public class ProcessCreateBO {
+
+
+    /**
+     * 模版名称
+     */
+    private String templateName;
+
+    /**
+     * json流程模版
+     */
+    private String process;
+
+    private String remark;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessModuleUpdateBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessModuleUpdateBO.java
new file mode 100644
index 0000000..6510129
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessModuleUpdateBO.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+@Data
+public class ProcessModuleUpdateBO {
+
+    /**
+     * 模块id
+     */
+    private String id;
+
+    /**
+     * 流程id
+     */
+    private String templateId;
+    private String remark;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessRefuseBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessRefuseBO.java
new file mode 100644
index 0000000..8072394
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessRefuseBO.java
@@ -0,0 +1,27 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+/**
+ * 流程审批请求参数 拒绝
+ *
+ * <p>
+ * 尊重知识产权,不允许非法使用,后果自负
+ * </p>
+ *
+ */
+@Data
+public class ProcessRefuseBO {
+
+    /**
+     * 任务id
+     */
+    private String taskId;
+
+    /**
+     * 理由
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessStartBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessStartBO.java
new file mode 100644
index 0000000..6bd43bc
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessStartBO.java
@@ -0,0 +1,57 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class ProcessStartBO {
+
+    /**
+     * 阶段类型
+     * 1入户调查
+     * 2价格评估
+     * 3协议签订
+     * 4资金管理-预算资金
+     * 5住宅临时安置补助费
+     * 6停产停业经济损失补助费
+     * 7安置情况
+     */
+    private String category;
+
+    /**
+     * 任务中心-项目名称
+     */
+    private String name;
+
+    /**
+     * 模块名称
+     */
+    private String moduleName;
+
+    /**
+     * 系统摘要
+     * 入户调查摘要:【镇/街】【征收实施单位】【调查户数】
+     * 价格评估摘要:【镇/街】【征收实施单位】【价格评估合计】
+     * 协议签订摘要:【镇/街】【征收实施单位】【权利人】【协议类型】
+     * 预算资金摘要:【镇/街】【征收实施单位】【预算金额】
+     * 住宅临时安置补助费摘要:【镇/街】【征收实施单位】【开始时间-截止时间】【申请金额】
+     * 停产停业经济损失补助费摘要:【镇/街】【征收实施单位】【开始时间-截止时间】【申请金额】
+     * 安置情况摘要:【镇/街】【征收实施单位】【批次名称】【安置类型】
+     */
+    private String remark;
+
+
+    /**
+     * 类型 1集体 2国有
+     */
+    private Integer type = 2;
+
+    /**
+     * 变量:流程完成后需要修改状态的表id信息
+     * 例如:
+     * variable.put("objectId",12);
+     */
+    private Map<String, Object> variable;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java
new file mode 100644
index 0000000..cbfde78
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java
@@ -0,0 +1,27 @@
+package com.ruoyi.system.bo;
+
+import com.ruoyi.common.core.domain.BasePage;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ProcessTaskListBO extends BasePage {
+    /**
+     * 任务名称
+     */
+    private String name;
+
+    /**
+     * 任务名称
+     */
+    private String moduleName;
+//    /**
+//     * 流程实例状态( 0,审批中 1,审批通过 2,审批拒绝 3)
+//     */
+//    private Integer instanceState;
+    /**
+     * 创建人
+     */
+    private String createBy;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTemplatePageBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTemplatePageBO.java
new file mode 100644
index 0000000..9502e83
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTemplatePageBO.java
@@ -0,0 +1,12 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+@Data
+public class ProcessTemplatePageBO {
+
+    private Integer currentPage;
+    private Integer pageSize;
+    private String name;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessUpdateBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessUpdateBO.java
new file mode 100644
index 0000000..09ac837
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessUpdateBO.java
@@ -0,0 +1,22 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+@Data
+public class ProcessUpdateBO {
+
+    private String id;
+
+    /**
+     * 模版名称
+     */
+    private String templateName;
+
+    /**
+     * json流程模版
+     */
+    private String process;
+
+    private String remark;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessExtInstanceMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessExtInstanceMapper.java
new file mode 100644
index 0000000..5c81fcc
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessExtInstanceMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.StateProcessExtInstance;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface StateProcessExtInstanceMapper extends BaseMapper<StateProcessExtInstance> {
+}
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
new file mode 100644
index 0000000..81dcaa1
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java
@@ -0,0 +1,7 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.StateProcessInstanceAction;
+
+public interface StateProcessInstanceActionMapper extends BaseMapper<StateProcessInstanceAction> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessModuleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessModuleMapper.java
new file mode 100644
index 0000000..527a07b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessModuleMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.StateProcessModule;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface StateProcessModuleMapper extends BaseMapper<StateProcessModule> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessTemplateMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessTemplateMapper.java
new file mode 100644
index 0000000..a620b09
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessTemplateMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.system.bo.ProcessTemplatePageBO;
+import com.ruoyi.system.model.StateProcessTemplate;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface StateProcessTemplateMapper extends BaseMapper<StateProcessTemplate> {
+
+    Page<StateProcessTemplate> page(Page<StateProcessTemplate> page, @Param("request") ProcessTemplatePageBO request);
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java
new file mode 100644
index 0000000..804ad41
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.StateTaskCenter;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface StateTaskCenterMapper extends BaseMapper<StateTaskCenter> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessExtInstance.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessExtInstance.java
new file mode 100644
index 0000000..455df0d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessExtInstance.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BaseModel;
+import lombok.Data;
+
+@Data
+@TableName(value = "state_process_ext_instance")
+public class StateProcessExtInstance extends BaseModel {
+
+    @TableId(type = IdType.NONE)
+    private String id;
+    private String templateId;
+    private String processId;
+    private Integer processVersion;
+
+}
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
new file mode 100644
index 0000000..2ae643c
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java
@@ -0,0 +1,24 @@
+package com.ruoyi.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BaseModel;
+import lombok.Data;
+
+@Data
+@TableName(value = "state_process_instance_action")
+public class StateProcessInstanceAction extends BaseModel {
+
+    @TableId(type = IdType.NONE)
+    private String id;
+    private String instanceId;
+    private boolean robot;
+    private String auditorId;
+    private Integer actionType;
+    private String userIds;
+    private String assigneeId;
+    private String nodeId;
+    private String remark;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessModule.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessModule.java
new file mode 100644
index 0000000..8a92a80
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessModule.java
@@ -0,0 +1,25 @@
+package com.ruoyi.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BaseModel;
+import lombok.Data;
+
+@Data
+@TableName(value = "state_process_module")
+public class StateProcessModule extends BaseModel {
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+    /**
+     * 1=合同新增
+     * 2=合同签订
+     * 3=合同提前终止
+     */
+    private String category;
+    private String name;
+    private String templateName;
+    private String templateId;
+    private String remark;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessTemplate.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessTemplate.java
new file mode 100644
index 0000000..8c649b4
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessTemplate.java
@@ -0,0 +1,25 @@
+package com.ruoyi.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BaseModel;
+import lombok.Data;
+
+@Data
+@TableName(value = "state_process_template")
+public class StateProcessTemplate extends BaseModel {
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+    private String templateKey;
+    private Integer templateVersion;
+    private String templateName;
+    private String settings;
+    private String process;
+    private String remark;
+    private Integer status;
+    private Long workFlowId;
+    private Integer workflowVersion;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java
new file mode 100644
index 0000000..fe4e792
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java
@@ -0,0 +1,22 @@
+package com.ruoyi.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BaseModel;
+import lombok.Data;
+
+@Data
+@TableName(value = "state_task_center" )
+public class StateTaskCenter extends BaseModel {
+
+    @TableId(type = IdType.NONE)
+    private String id;
+    private String name;
+    private String moduleName;
+    private String remark;
+    private String category;
+    private String flowId;
+    private String variable;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessExtInstanceService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessExtInstanceService.java
new file mode 100644
index 0000000..902e39d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessExtInstanceService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.model.StateProcessExtInstance;
+
+public interface StateProcessExtInstanceService extends IService<StateProcessExtInstance> {
+}
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
new file mode 100644
index 0000000..85b5090
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.model.StateProcessInstanceAction;
+
+public interface StateProcessInstanceActionService extends IService<StateProcessInstanceAction> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessModuleService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessModuleService.java
new file mode 100644
index 0000000..3a010e1
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessModuleService.java
@@ -0,0 +1,8 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.model.StateProcessModule;
+
+public interface StateProcessModuleService extends IService<StateProcessModule> {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java
new file mode 100644
index 0000000..a127cd6
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java
@@ -0,0 +1,41 @@
+package com.ruoyi.system.service;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.bo.*;
+import com.ruoyi.system.model.StateProcessTemplate;
+import com.ruoyi.system.vo.ProcessTaskListVO;
+
+public interface StateProcessTemplateService extends IService<StateProcessTemplate> {
+
+    Page<StateProcessTemplate> page(ProcessTemplatePageBO request);
+
+    Boolean update(ProcessUpdateBO processUpdateBO);
+
+    //新增
+    Boolean create(ProcessCreateBO processCreateBO);
+
+    /**
+     * 启动流程
+     * @param processStartBO
+     * @return
+     */
+    Boolean start(ProcessStartBO processStartBO);
+
+    //待办
+    PageInfo<ProcessTaskListVO> waitTaskPage(ProcessTaskListBO processTaskListBO);
+
+    //已办
+    PageInfo<ProcessTaskListVO> dealTaskPage(ProcessTaskListBO processTaskListBO);
+
+    //抄送
+    PageInfo<ProcessTaskListVO> copyTaskPage(ProcessTaskListBO processTaskListBO);
+
+    //同意
+    void agree(ProcessAgreeBO  processAgreeBO);
+
+    //拒绝
+    void refuse(ProcessRefuseBO processRefuseBO);
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java
new file mode 100644
index 0000000..c4a80d5
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.model.StateTaskCenter;
+
+public interface StateTaskCenterService extends IService<StateTaskCenter> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessExtInstanceServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessExtInstanceServiceImpl.java
new file mode 100644
index 0000000..f79908a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessExtInstanceServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.mapper.StateProcessExtInstanceMapper;
+import com.ruoyi.system.model.StateProcessExtInstance;
+import com.ruoyi.system.service.StateProcessExtInstanceService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class StateProcessExtInstanceServiceImpl extends ServiceImpl<StateProcessExtInstanceMapper, StateProcessExtInstance> implements StateProcessExtInstanceService {
+}
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
new file mode 100644
index 0000000..45a3d5a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.mapper.StateProcessInstanceActionMapper;
+import com.ruoyi.system.model.StateProcessInstanceAction;
+import com.ruoyi.system.service.StateProcessInstanceActionService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class StateProcessInstanceActionServiceImpl extends ServiceImpl<StateProcessInstanceActionMapper, StateProcessInstanceAction> implements StateProcessInstanceActionService {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessModuleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessModuleServiceImpl.java
new file mode 100644
index 0000000..709e99f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessModuleServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.mapper.StateProcessModuleMapper;
+import com.ruoyi.system.model.StateProcessModule;
+import com.ruoyi.system.service.StateProcessModuleService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class StateProcessModuleServiceImpl extends ServiceImpl<StateProcessModuleMapper, StateProcessModule> implements StateProcessModuleService {
+}
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
new file mode 100644
index 0000000..cbb7588
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
@@ -0,0 +1,630 @@
+package com.ruoyi.system.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONUtil;
+import com.aizuda.bpm.engine.FlowLongEngine;
+import com.aizuda.bpm.engine.core.FlowCreator;
+import com.aizuda.bpm.engine.core.enums.TaskType;
+import com.aizuda.bpm.engine.entity.*;
+import com.aizuda.bpm.engine.model.NodeModel;
+import com.aizuda.bpm.mybatisplus.mapper.*;
+import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson2.JSONWriter;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+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.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.core.domain.BaseModel;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.enums.StateProcessActionEnum;
+import com.ruoyi.common.exception.GlobalException;
+import com.ruoyi.common.exception.state.StateErrorCode;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.system.bo.*;
+import com.ruoyi.system.mapper.StateProcessTemplateMapper;
+import com.ruoyi.system.model.*;
+import com.ruoyi.system.service.*;
+import com.ruoyi.system.vo.ProcessTaskListVO;
+import lombok.AllArgsConstructor;
+import org.apache.commons.io.IOUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class StateProcessTemplateServiceImpl extends ServiceImpl<StateProcessTemplateMapper, StateProcessTemplate> implements StateProcessTemplateService {
+
+    private final FlowLongEngine flowLongEngine;
+    private final StateProcessInstanceActionService stateProcessInstanceActionService;
+    private final StateProcessExtInstanceService stateProcessExtInstanceService;
+    private final FlwHisInstanceMapper flwHisInstanceMapper;
+    private final FlwTaskActorMapper flwTaskActorMapper;
+    private final FlwTaskMapper flwTaskMapper;
+    private final StateTaskCenterService stateTaskCenterService;
+    private final StateProcessModuleService stateProcessModuleService;
+    private final FlwHisTaskMapper flwHisTaskMapper;
+    private final FlwHisTaskActorMapper flwHisTaskActorMapper;
+    private final ISysUserService sysUserService;
+
+    /**
+     * 流程模版分页
+     * @param request
+     * @return
+     */
+    @Override
+    public Page<StateProcessTemplate> page(ProcessTemplatePageBO request) {
+        //查询流程模板列表
+        Page<StateProcessTemplate> templatePage = this.baseMapper.page(new Page<>(request.getCurrentPage(), request.getPageSize()), request);
+
+        //更新人id列表
+        List<String> updateUserNameList = templatePage.getRecords().stream().map(BaseModel::getUpdateBy).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(updateUserNameList)) {
+            //根据用户id列表查询用户信息
+            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserNameList);
+            Map<String, SysUser> sysUserMap;
+            if (!CollectionUtils.isEmpty(sysUsers)) {
+                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserName, Function.identity()));
+            } else {
+                sysUserMap = new HashMap<>();
+            }
+            //遍历列表,设置更新人名称
+            templatePage.getRecords().forEach(e -> {
+                SysUser sysUser = sysUserMap.get(e.getUpdateBy());
+                if (Objects.nonNull(sysUser)) {
+                    e.setUpdateBy(sysUser.getNickName());
+                }
+            });
+        }
+        return templatePage;
+    }
+
+    /**
+     * 修改并部署模版
+     * @param processUpdateBO
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean update(ProcessUpdateBO processUpdateBO) {
+        //查询流程模板
+        StateProcessTemplate temp = this.getById(processUpdateBO.getId());
+        //根据template_key查询最新版本的模板
+        StateProcessTemplate template = this.getOne(Wrappers.<StateProcessTemplate>lambdaQuery()
+                .eq(StateProcessTemplate::getTemplateKey, temp.getTemplateKey())
+                .apply("(template_key, template_version) in("
+                        + "SELECT template_key, MAX(template_version) "
+                        + "FROM state_process_template " + "GROUP BY template_key)"));
+
+        if (Objects.isNull(template)) {
+            throw new GlobalException(StateErrorCode.PROCESS_TEMPLATE_NOT_EXISTS.getValue());
+        }
+
+        // 部署流程
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+
+        FlowCreator creator = FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName());
+        DeployBO deployBO = new DeployBO();
+        deployBO.setKey(template.getTemplateKey());
+        deployBO.setName(processUpdateBO.getTemplateName());
+        deployBO.setNodeConfig(JSONObject.parseObject(processUpdateBO.getProcess(), NodeModel.class));
+
+        String deployResult = JSONObject.toJSONString(deployBO, JSONWriter.Feature.WriteMapNullValue);
+        InputStream inputStream = IOUtils.toInputStream(deployResult, StandardCharsets.UTF_8.name());
+        Long deployId = flowLongEngine.processService().deploy(inputStream, creator, true, null);
+        FlwProcess flwProcess = flowLongEngine.processService().getProcessById(deployId);
+
+        // 更新模板, version+1
+        StateProcessTemplate processTemplate = new StateProcessTemplate();
+        processTemplate.setId(IdUtils.simpleUUID());
+        processTemplate.setWorkFlowId(deployId);
+        processTemplate.setWorkflowVersion(flwProcess.getProcessVersion());
+        processTemplate.setTemplateName(processUpdateBO.getTemplateName());
+
+        processTemplate.setTemplateKey(template.getTemplateKey());
+        processTemplate.setProcess(processUpdateBO.getProcess());
+        processTemplate.setRemark(processUpdateBO.getRemark());
+        processTemplate.setUpdateBy(SecurityUtils.getLoginUser().getUsername());
+        processTemplate.setUpdateTime(LocalDateTime.now());
+        processTemplate.setTemplateVersion(temp.getTemplateVersion() + 1);
+        this.save(processTemplate);
+
+        //查询版本是否绑定流程,更新
+        LambdaQueryWrapper<StateProcessModule> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StateProcessModule::getTemplateId, processUpdateBO.getId());
+        List<StateProcessModule> stateProcessModules = stateProcessModuleService.list(queryWrapper);
+        if (Objects.isNull(stateProcessModules) || stateProcessModules.isEmpty()) {
+            return true;
+        }
+        for (StateProcessModule stateProcessModule : stateProcessModules) {
+            stateProcessModule.setTemplateId(processTemplate.getId());
+            stateProcessModule.setTemplateName(processTemplate.getTemplateName());
+        }
+        return stateProcessModuleService.updateBatchById(stateProcessModules);
+    }
+
+    /**
+     * 创建并部署模版
+     * @param processCreateBO
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean create(ProcessCreateBO processCreateBO) {
+        //查询模版是否存在
+        List<StateProcessTemplate> keys = this.list(Wrappers.<StateProcessTemplate>lambdaQuery().
+                eq(StateProcessTemplate::getTemplateName, processCreateBO.getTemplateName()));
+        if (!CollectionUtils.isEmpty(keys)) {
+            throw new GlobalException(StateErrorCode.PROCESS_TEMPLATE_KEY_EXISTS.getValue());
+        }
+
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        FlowCreator creator = FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName());
+
+        DeployBO deployBO = new DeployBO();
+        deployBO.setKey(IdUtil.simpleUUID());
+        deployBO.setName(processCreateBO.getTemplateName());
+        deployBO.setNodeConfig(JSONObject.parseObject(processCreateBO.getProcess(), NodeModel.class));
+
+        String deployResult = JSONObject.toJSONString(deployBO, JSONWriter.Feature.WriteMapNullValue);
+
+        InputStream inputStream = IOUtils.toInputStream(deployResult, StandardCharsets.UTF_8.name());
+        Long deployId = flowLongEngine.processService().deploy(inputStream, creator, false);
+        FlwProcess flwProcess = flowLongEngine.processService().getProcessById(deployId);
+
+        StateProcessTemplate processTemplate = new StateProcessTemplate();
+        processTemplate.setId(IdUtils.simpleUUID());
+        processTemplate.setWorkFlowId(deployId);
+        processTemplate.setWorkflowVersion(flwProcess.getProcessVersion());
+        processTemplate.setTemplateName(deployBO.getName());
+        processTemplate.setTemplateKey(deployBO.getKey());
+        processTemplate.setProcess(processCreateBO.getProcess());
+        processTemplate.setRemark(processCreateBO.getRemark());
+        processTemplate.setUpdateBy(loginUser.getUser().getUserName());
+        processTemplate.setUpdateTime(LocalDateTime.now());
+        return this.save(processTemplate);
+    }
+
+    /**
+     * 启动流程
+     * @param processStartBO
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean start(ProcessStartBO processStartBO) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        FlowCreator creator = FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName());
+        //查询流程绑定
+        StateProcessModule stateProcessModule = stateProcessModuleService.getOne(Wrappers.<StateProcessModule>lambdaQuery()
+                .eq(StateProcessModule::getCategory, processStartBO.getCategory()));
+        if (ObjectUtil.isNull(stateProcessModule) || ObjectUtil.isEmpty(stateProcessModule.getTemplateId())) {
+            throw new GlobalException("请先配置流程引擎模版!");
+        }
+        //查询模版,准备启动
+        StateProcessTemplate template = this.getById(stateProcessModule.getTemplateId());
+        StateProcessTemplate lastTemplate = this.getOne(Wrappers.<StateProcessTemplate>lambdaQuery()
+                .eq(StateProcessTemplate::getTemplateKey, template.getTemplateKey())
+                .apply("(template_key, template_version) in(" +
+                        "SELECT template_key, MAX(template_version) " +
+                        "FROM state_process_template " +
+                        "GROUP BY template_key)")
+        );
+
+        if (ObjectUtil.isNull(lastTemplate)) {
+            throw new GlobalException(StateErrorCode.PROCESS_TEMPLATE_NOT_EXISTS.getValue());
+        }
+        FlwProcess flwProcess = flowLongEngine.processService().getProcessById(lastTemplate.getWorkFlowId());
+        if (ObjectUtil.isNull(flwProcess)) {
+            throw new GlobalException(StateErrorCode.PROCESS_NOT_DEPLOY.getValue());
+        }
+        if (!Objects.equals(lastTemplate.getWorkflowVersion(), flwProcess.getProcessVersion())) {
+            throw new GlobalException(StateErrorCode.PROCESS_VERSION_ERROR.getValue());
+        }
+        //监听器参数补全
+        processStartBO.getVariable().put("category", processStartBO.getCategory());
+        // 开启流程
+        flowLongEngine.startInstanceById(flwProcess.getId(), creator, processStartBO.getVariable()).ifPresent(instance -> {
+            //存储任务中心信息
+            StateTaskCenter stateTaskCenter = new StateTaskCenter();
+            stateTaskCenter.setId(IdUtils.simpleUUID());
+            stateTaskCenter.setName(processStartBO.getName());
+            stateTaskCenter.setModuleName(processStartBO.getModuleName());
+            stateTaskCenter.setCategory(processStartBO.getCategory());
+            stateTaskCenter.setFlowId(instance.getId().toString());
+            stateTaskCenter.setRemark(processStartBO.getRemark());
+            stateTaskCenter.setCreateBy(loginUser.getUser().getNickName());
+            stateTaskCenter.setVariable(JSONUtil.toJsonStr(processStartBO.getVariable()));
+            stateTaskCenterService.save(stateTaskCenter);
+
+            // action记录
+            StateProcessInstanceAction stateProcessInstanceAction = new StateProcessInstanceAction();
+            stateProcessInstanceAction.setId(IdUtils.simpleUUID());
+            stateProcessInstanceAction.setInstanceId(instance.getId().toString());
+            stateProcessInstanceAction.setActionType(StateProcessActionEnum.START.getValue());
+            stateProcessInstanceAction.setAuditorId(creator.getCreateId());
+            stateProcessInstanceActionService.save(stateProcessInstanceAction);
+
+            // 添加拓展信息
+            StateProcessExtInstance stateProcessExtInstance = new StateProcessExtInstance();
+            stateProcessExtInstance.setId(instance.getId().toString());
+            stateProcessExtInstance.setTemplateId(lastTemplate.getId());
+            stateProcessExtInstance.setProcessId(flwProcess.getId().toString());
+
+            //保存version
+            stateProcessExtInstance.setProcessVersion(flwProcess.getProcessVersion());
+            stateProcessExtInstanceService.save(stateProcessExtInstance);
+        });
+        return true;
+    }
+
+    /**
+     * 待办
+     * @param processTaskListBO
+     * @return
+     */
+    @Override
+    public PageInfo<ProcessTaskListVO> waitTaskPage(ProcessTaskListBO processTaskListBO) {
+        //获取当前登录用户信息
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+
+        //或签时查询其他审批人是否通过(不能省略),比如 同一任务需要A,B审核,A通过了,B不用在审核了,在历史表查询A的审核记录
+        LambdaQueryWrapper<FlwHisInstance> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.orderByDesc(FlowEntity::getCreateTime);
+        //待审核
+        lambdaQueryWrapper.eq(FlwHisInstance::getInstanceState, 0);
+
+        List<Long> flwHisInstances = flwHisInstanceMapper.selectList(lambdaQueryWrapper).stream()
+                .map(FlwHisInstance::getId).collect(Collectors.toList());
+        if (ObjectUtil.isEmpty(flwHisInstances)) {
+            return new PageInfo<>();
+        }
+
+        //查询任务参与者
+        LambdaQueryWrapper<FlwTaskActor> query = new LambdaQueryWrapper<>();
+        query.and(qy -> qy.eq(FlwTaskActor::getActorId, userId)
+                //0指定用户
+                .eq(FlwTaskActor::getActorType, 0)
+                .or().in(FlwTaskActor::getActorId, userId)
+                //1指定角色
+                .eq(FlwTaskActor::getActorType, 1));
+        if (ObjectUtil.isNotNull(processTaskListBO) && ObjectUtil.isNotNull(flwHisInstances)) {
+            // 添加条件
+            query = query.in(FlwTaskActor::getInstanceId, flwHisInstances);
+        }
+        List<FlwTaskActor> flwTaskActorPage = flwTaskActorMapper.selectList(query);
+        if (ObjectUtil.isEmpty(flwTaskActorPage)) {
+            return new PageInfo<>();
+        }
+        //查询任务信息
+        List<FlwTask> flwTasks = flwTaskMapper.selectList(Wrappers.<FlwTask>lambdaQuery()
+                .orderByDesc(FlwTask::getCreateTime)
+                .in(FlwTask::getId, flwTaskActorPage.stream()
+                        .map(FlwTaskActor::getTaskId).collect(Collectors.toList())));
+
+        if (ObjectUtil.isNull(flwTasks)) {
+            return new PageInfo<>();
+        }
+        List<String> instanceIds = flwTasks.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());
+        }
+        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceIds);
+        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);
+        pageInfo.setRecords(processTaskListVOS);
+
+        List<String> updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
+        Map<Long, SysUser> sysUserMap;
+        if (!CollectionUtils.isEmpty(updateUserId)) {
+            //根据用户id查询更新人信息
+            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
+
+            if (!CollectionUtils.isEmpty(sysUsers)) {
+                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
+            } else {
+                sysUserMap = new HashMap<>();
+            }
+        } else {
+            sysUserMap = new HashMap<>();
+        }
+
+
+        Map<Long, List<FlwTask>> flwHisTaskMap = flwTasks.stream().collect(Collectors.groupingBy(FlwTask::getInstanceId));
+
+        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
+            List<FlwTask> flwTask = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId()));
+            if (!CollectionUtils.isEmpty(flwTask) && ObjectUtil.isNotEmpty(flwTask.get(0))) {
+                //待审核
+                processTaskListVO.setStatus("0");
+                processTaskListVO.setNodeName(flwTask.get(0).getTaskName());
+                processTaskListVO.setTaskId(flwTask.get(0).getId().toString());
+                processTaskListVO.setVariable(flwTask.get(0).getVariable());
+            }
+            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
+            if (Objects.nonNull(sysUser)) {
+                processTaskListVO.setCreateBy(sysUser.getNickName());
+            }
+        }
+        return pageInfo;
+    }
+
+    @Override
+    public PageInfo<ProcessTaskListVO> dealTaskPage(ProcessTaskListBO processTaskListBO) {
+        //获取当前登录用户信息
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        LambdaQueryWrapper<FlwHisTaskActor> query = Wrappers.<FlwHisTaskActor>lambdaQuery()
+                .and(qy -> qy.eq(FlwTaskActor::getActorId, userId)
+                        //0指定用户
+                        .eq(FlwTaskActor::getActorType, 0)
+                        //指定角色
+                        .or().in(FlwTaskActor::getActorId, userId)
+                        .eq(FlwTaskActor::getActorType, 1));
+        List<FlwHisTaskActor> flwHisTaskActors = flwHisTaskActorMapper.selectList(query);
+
+        List<Long> hisTaskIds = flwHisTaskActors.stream().map(FlwTaskActor::getTaskId).collect(Collectors.toList());
+
+        if (hisTaskIds.isEmpty()) {
+            return new PageInfo<>();
+        }
+
+        List<FlwHisTask> flwHisTaskList = flwHisTaskMapper.selectList(
+                Wrappers.<FlwHisTask>lambdaQuery()
+                        .notIn(FlwHisTask::getTaskType, TaskType.cc.getValue(), TaskType.major.getValue())
+                        .orderByDesc(FlwHisTask::getCreateTime)
+                        .in(FlwHisTask::getId, hisTaskIds));
+        if (ObjectUtil.isEmpty(flwHisTaskList)) {
+            new PageInfo<>();
+        }
+
+        List<String> instanceId = 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);
+        pageInfo.setRecords(processTaskListVOS);
+
+        if (ObjectUtil.isEmpty(processTaskListVOS)) {
+            return pageInfo;
+        }
+        Map<Long, List<FlwHisTask>> flwHisTaskMap = flwHisTaskList.stream().collect(Collectors.groupingBy(FlwHisTask::getInstanceId));
+        //查询原因
+        List<String> taskIds = flwHisTaskList.stream().map(FlowEntity::getId).map(String::valueOf).collect(Collectors.toList());
+        List<StateProcessInstanceAction> actions = stateProcessInstanceActionService.list(
+                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());
+        Map<Long, SysUser> sysUserMap;
+        if (!CollectionUtils.isEmpty(updateUserId)) {
+            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
+
+            if (!CollectionUtils.isEmpty(sysUsers)) {
+                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
+            } else {
+                sysUserMap = new HashMap<>();
+            }
+        } else {
+            sysUserMap = new HashMap<>();
+        }
+
+        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
+            List<FlwHisTask> flwHisTasks = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId()));
+            if (ObjectUtil.isNotEmpty(flwHisTaskMap)) {
+                //当某个用户在同一个模块审批流的多个节点都存在时,多次审核后,已审核列表页报错
+                for (FlwHisTask flwHisTask : flwHisTasks) {
+                    if (flwHisTask.getInstanceId().toString().equals(processTaskListVO.getFlowId())) {
+                        //10等于发起人与审批人一致自动审核完成
+                        processTaskListVO.setStatus(flwHisTask.getTaskState() == 10 ? "2" : flwHisTask.getTaskState().toString());
+                        processTaskListVO.setNodeName(flwHisTask.getTaskName());
+                        processTaskListVO.setTaskId(flwHisTask.getId().toString());
+                        processTaskListVO.setVariable(flwHisTask.getVariable());
+                    }
+                }
+            }
+            StateProcessInstanceAction action = actionMap.get(processTaskListVO.getTaskId());
+            if (ObjectUtil.isNotEmpty(action)) {
+                processTaskListVO.setReason(action.getRemark());
+            }
+            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
+            if (Objects.nonNull(sysUser)) {
+                processTaskListVO.setCreateBy(sysUser.getNickName());
+            }
+        }
+        return pageInfo;
+    }
+
+    @Override
+    public PageInfo<ProcessTaskListVO> copyTaskPage(ProcessTaskListBO processTaskListBO) {
+        Long userId = SecurityUtils.getUserId();
+        QueryWrapper<FlwHisInstance> queryWrapper = new QueryWrapper<>();
+        queryWrapper.orderByDesc("create_time");
+        List<Long> flwHisInstances = flwHisInstanceMapper.selectList(queryWrapper).stream()
+                .map(FlwHisInstance::getId).collect(Collectors.toList());
+
+        LambdaQueryWrapper<FlwHisTaskActor> query = Wrappers.<FlwHisTaskActor>lambdaQuery()
+                .and(qy -> qy.eq(FlwTaskActor::getActorId, userId)
+                        .eq(FlwTaskActor::getActorType, 0)
+                        .or().in(FlwTaskActor::getActorId, userId)
+                        .eq(FlwTaskActor::getActorType, 1));
+        query = query.in(FlwHisTaskActor::getInstanceId, flwHisInstances);
+        List<FlwHisTaskActor> flwHisTaskActors = flwHisTaskActorMapper.selectList(query);
+
+        List<Long> hisTaskIds = flwHisTaskActors.stream().map(FlwTaskActor::getTaskId).collect(Collectors.toList());
+        if (hisTaskIds.isEmpty()) {
+            return new PageInfo<>();
+        }
+        List<FlwHisTask> flwHisTaskList = flwHisTaskMapper.selectList(
+                Wrappers.<FlwHisTask>lambdaQuery()
+                        //2=抄送
+                        .eq(FlwHisTask::getTaskType, 2)
+                        .in(FlwHisTask::getId, hisTaskIds));
+
+        if(ObjectUtil.isEmpty(flwHisTaskList)){
+            return new PageInfo<>();
+        }
+        List<String> instanceId = 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 taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
+        //转换类
+        List<ProcessTaskListVO> processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class);
+        pageInfo.setRecords(processTaskListVOS);
+
+        if (ObjectUtil.isEmpty(processTaskListVOS)) {
+            return pageInfo;
+        }
+        Map<Long, List<FlwHisTask>> flwHisTaskMap = flwHisTaskList.stream().collect(Collectors.groupingBy(FlwHisTask::getInstanceId));
+
+        List<String> updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
+        Map<Long, SysUser> sysUserMap;
+        if (!CollectionUtils.isEmpty(updateUserId)) {
+            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
+
+            if (!CollectionUtils.isEmpty(sysUsers)) {
+                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
+            } else {
+                sysUserMap = new HashMap<>();
+            }
+        } else {
+            sysUserMap = new HashMap<>();
+        }
+
+        //查询原因
+        List<String> taskIds = flwHisTaskList.stream().map(FlwTask::getParentTaskId).filter(ObjectUtil::isNotEmpty).map(String::valueOf).collect(Collectors.toList());
+        List<StateProcessInstanceAction> actions = stateProcessInstanceActionService.list(
+                Wrappers.<StateProcessInstanceAction>lambdaQuery().in(StateProcessInstanceAction::getNodeId, taskIds));
+        Map<String, StateProcessInstanceAction> actionMap = actions.stream().collect(Collectors.toMap(StateProcessInstanceAction::getNodeId, Function.identity()));
+
+
+        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
+            List<FlwHisTask> flwHisTasks = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId()));
+            if (ObjectUtil.isNotEmpty(flwHisTaskMap)) {
+                //当某个用户在同一个模块审批流的多个节点都存在时,多次审核后,已审核列表页报错
+                for (FlwHisTask flwHisTask : flwHisTasks) {
+                    if (flwHisTask.getInstanceId().toString().equals(processTaskListVO.getFlowId())) {
+                        processTaskListVO.setStatus(flwHisTask.getTaskState().toString());
+                        processTaskListVO.setNodeName(flwHisTask.getTaskName());
+                        processTaskListVO.setParentTaskId(flwHisTask.getParentTaskId().toString());
+                        processTaskListVO.setTaskId(flwHisTask.getId().toString());
+                        processTaskListVO.setVariable(flwHisTask.getVariable());
+                    }
+                }
+            }
+            StateProcessInstanceAction action = actionMap.get(processTaskListVO.getParentTaskId());
+            if (ObjectUtil.isNotEmpty(action)) {
+                processTaskListVO.setReason(action.getRemark());
+            }
+            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
+            if (Objects.nonNull(sysUser)) {
+                processTaskListVO.setCreateBy(sysUser.getNickName());
+            }
+        }
+        return pageInfo;
+    }
+
+    @Override
+    public void agree(ProcessAgreeBO processAgreeBO) {
+        Long taskId = Long.valueOf(processAgreeBO.getTaskId());
+        FlwTask flwTask = flwTaskMapper.selectById(taskId);
+        if (ObjectUtil.isNull(flwTask)) {
+            throw new GlobalException("任务已处理或者不存在");
+        }
+        flowLongEngine.executeTask(taskId, currentFlowCreator());
+        // 动作执行记录
+        StateProcessInstanceAction stateProcessInstanceAction = new StateProcessInstanceAction();
+        stateProcessInstanceAction.setId(IdUtils.simpleUUID());
+        stateProcessInstanceAction.setInstanceId(flwTask.getInstanceId().toString());
+        stateProcessInstanceAction.setAuditorId(String.valueOf(SecurityUtils.getUserId()));
+        stateProcessInstanceAction.setActionType(StateProcessActionEnum.APPROVED.getValue());
+        stateProcessInstanceAction.setNodeId(processAgreeBO.getTaskId());
+        stateProcessInstanceAction.setRemark(processAgreeBO.getRemark());
+        stateProcessInstanceActionService.save(stateProcessInstanceAction);
+    }
+
+    @Override
+    public void refuse(ProcessRefuseBO processRefuseBO) {
+        Long taskId = Long.valueOf(processRefuseBO.getTaskId());
+        FlwTask flwTask = flwTaskMapper.selectById(taskId);
+        // 直接拒绝当前流程
+        flowLongEngine.runtimeService().reject(flwTask.getInstanceId(), currentFlowCreator());
+        // 动作执行记录
+        StateProcessInstanceAction record = new StateProcessInstanceAction();
+        record.setId(IdUtils.simpleUUID());
+        record.setInstanceId(flwTask.getInstanceId().toString());
+        record.setAuditorId(String.valueOf(SecurityUtils.getUserId()));
+        record.setActionType(StateProcessActionEnum.REJECTED.getValue());
+        record.setNodeId(processRefuseBO.getTaskId());
+        record.setRemark(processRefuseBO.getRemark());
+        stateProcessInstanceActionService.save(record);
+    }
+
+    private FlowCreator currentFlowCreator() {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if (null == loginUser || null == loginUser.getUser().getUserId()) {
+            throw new GlobalException("非法用户");
+        }
+        return FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName());
+    }
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java
new file mode 100644
index 0000000..c982a57
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.mapper.StateTaskCenterMapper;
+import com.ruoyi.system.model.StateTaskCenter;
+import com.ruoyi.system.service.StateTaskCenterService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class StateTaskCenterServiceImpl extends ServiceImpl<StateTaskCenterMapper, StateTaskCenter> implements StateTaskCenterService {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java
new file mode 100644
index 0000000..8b4fee1
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java
@@ -0,0 +1,42 @@
+package com.ruoyi.system.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+public class ProcessTaskListVO {
+
+    private String nodeName;
+
+    private String flowId;
+
+    private String name;
+
+    private String moduleName;
+
+    private String createBy;
+
+    private String remark;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    private String status;
+
+    private String taskId;
+
+    private String parentTaskId;
+
+
+    private String category;
+
+    private String variable;
+
+    private String reason;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TCheckAcceptRecordVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TCheckAcceptRecordVO.java
index 23de55e..eb9b904 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TCheckAcceptRecordVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TCheckAcceptRecordVO.java
@@ -17,4 +17,11 @@
     @ApiModelProperty(value = "房屋信息")
     private THouse house;
 
+    @ApiModelProperty(value = "房屋名称")
+    private String houseName;
+    @ApiModelProperty(value = "合同编号")
+    private String contractNumber;
+    @ApiModelProperty(value = "房屋地址")
+    private String houseAddress;
+
 }
diff --git a/ruoyi-system/src/main/resources/mapper/system/StateProcessTemplateMapper.xml b/ruoyi-system/src/main/resources/mapper/system/StateProcessTemplateMapper.xml
new file mode 100644
index 0000000..6ae2931
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/StateProcessTemplateMapper.xml
@@ -0,0 +1,15 @@
+<?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.StateProcessTemplateMapper">
+    
+
+    <select id="page" resultType="com.ruoyi.system.model.StateProcessTemplate">
+        SELECT * FROM state_process_template
+        WHERE (template_key, template_version) in (select template_key, MAX(template_version)from state_process_template group by template_key)
+        <if test="request.name != null and request.name != ''">
+            AND template_name::text LIKE CONCAT('%',#{request.name}, '%' )
+        </if>
+        and disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+    </select>
+    
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml
index 42b13b5..342f103 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml
@@ -53,8 +53,12 @@
         t.create_by,
         t.update_by,
         t.disabled,
+        t.code,
+        t.checkMoney,
+        t.status,
         c.contract_number,
-        h.house_name
+        h.house_name,
+        h.house_address
         from t_check_accept_record t
         left join t_contract c on t.contract_id = c.id
         left join t_house h on t.house_id = h.id

--
Gitblit v1.7.1