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

---
 ruoyi-system/src/main/java/com/ruoyi/system/dto/RevokeDTO.java                                |   19 ++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java               |   12 +-
 ruoyi-admin/pom.xml                                                                           |    6 
 ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml                             |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java |   16 +++
 ruoyi-common/src/main/java/com/ruoyi/common/enums/TaskEventType.java                          |  146 ++++++++++++++++++++++++++++++++++++
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java              |   20 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java          |    7 +
 8 files changed, 217 insertions(+), 11 deletions(-)

diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 97f4520..96e7388 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -140,17 +140,17 @@
         <dependency>
             <groupId>cn.afterturn</groupId>
             <artifactId>easypoi-base</artifactId>
-            <version>3.0.3</version>
+            <version>4.3.0</version>
         </dependency>
         <dependency>
             <groupId>cn.afterturn</groupId>
             <artifactId>easypoi-web</artifactId>
-            <version>3.0.3</version>
+            <version>4.3.0</version>
         </dependency>
         <dependency>
             <groupId>cn.afterturn</groupId>
             <artifactId>easypoi-annotation</artifactId>
-            <version>3.0.3</version>
+            <version>4.3.0</version>
         </dependency>
 
         <!-- 阿里云短信 -->
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 58982f4..f5c0bcb 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
@@ -4,6 +4,7 @@
 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.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
@@ -289,16 +290,17 @@
     @Log(title = "合同管理-撤销审批", businessType =  BusinessType.UPDATE)
     @ApiOperation(value = "撤销审批")
     @PreAuthorize("@ss.hasPermi('system:contract:revoke')")
-
-    @GetMapping(value = "/updateContractStatus")
-    public R<Boolean> updateContractStatus(String id) {
-        TContract contract = contractService.getById(id);
+    @PostMapping(value = "/updateContractStatus")
+    public R<Boolean> updateContractStatus(@RequestBody RevokeDTO dto) {
+        TContract contract = contractService.getById(dto.getContractId());
         contract.setStatus("1");
         contractService.updateById(contract);
+        // 撤销审批实例
+        stateProcessTemplateService.revoke(dto.getInstanceId());
+
         return R.ok();
     }
     @PreAuthorize("@ss.hasPermi('system:contract:confirm')")
-
     @Log(title = "合同管理-确认结算", businessType =  BusinessType.UPDATE)
     @ApiOperation(value = "确认结算")
     @PostMapping(value = "/confirmSettlement")
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java
index 0731a2e..5062df4 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java
@@ -2,13 +2,16 @@
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.constant.DictConstants;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.domain.model.LoginUserApplet;
+import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.DictUtils;
 import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.system.dto.RevokeDTO;
 import com.ruoyi.system.dto.SignContractDTO;
 import com.ruoyi.system.model.TContract;
 import com.ruoyi.system.model.TContractRentType;
@@ -23,6 +26,7 @@
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
@@ -52,6 +56,8 @@
     private TokenService tokenService;
     @Autowired
     private TTenantService tTenantService;
+    @Autowired
+    private StateProcessTemplateService stateProcessTemplateService;
     @ApiOperation(value = " 签订合同")
     @PostMapping(value = "/signContract")
     public R signContract(@RequestBody SignContractDTO dto) {
@@ -67,6 +73,20 @@
         query.setTenantId(loginUserApplet.getUserId());
         return R.ok(contractService.contractAppletList(query));
     }
+
+    @Log(title = "合同管理-撤销审批", businessType =  BusinessType.UPDATE)
+    @ApiOperation(value = "撤销审批")
+    @PreAuthorize("@ss.hasPermi('system:contract:revoke')")
+    @PostMapping(value = "/updateContractStatus")
+    public R<Boolean> updateContractStatus(@RequestBody RevokeDTO dto) {
+        TContract contract = contractService.getById(dto.getContractId());
+        contract.setStatus("1");
+        contractService.updateById(contract);
+        // 撤销审批实例
+        stateProcessTemplateService.revoke(dto.getInstanceId());
+
+        return R.ok();
+    }
     @ApiOperation(value = "查询合同信息信息")
     @GetMapping(value = "/getContractById")
     public R<TContractAppletVO> getContractById(@RequestParam String id) {
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/TaskEventType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/TaskEventType.java
new file mode 100644
index 0000000..f96fc9c
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/TaskEventType.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2023-2025 Licensed under the Dual Licensing
+ * website: https://aizuda.com
+ */
+package com.ruoyi.common.enums;
+
+/**
+ * 流程引擎监听类型
+ *
+ * <p>
+ * <a href="https://aizuda.com">官网</a>尊重知识产权,不允许非法使用,后果自负
+ * </p>
+ *
+ * @author lizhongyuan
+ * @since 1.0
+ */
+public enum TaskEventType {
+    /**
+     * 发起
+     */
+    start,
+    /**
+     * 创建
+     */
+    create,
+    /**
+     * 再创建,仅用于流程回退
+     */
+    recreate,
+    /**
+     * 抄送
+     */
+    cc,
+    /**
+     * 分配
+     */
+    assignment,
+    /**
+     * 委派任务解决
+     */
+    delegateResolve,
+    /**
+     * 任务加签
+     */
+    addTaskActor,
+    /**
+     * 任务减签
+     */
+    removeTaskActor,
+    /**
+     * 驳回至上一步处理
+     */
+    reject,
+    /**
+     * 角色认领
+     */
+    claimRole,
+    /**
+     * 部门认领
+     */
+    claimDepartment,
+    /**
+     * 拿回未执行任务
+     */
+    reclaim,
+    /**
+     * 撤回指定任务
+     */
+    withdraw,
+    /**
+     * 唤醒历史任务
+     */
+    resume,
+    /**
+     * 完成
+     */
+    complete,
+    /**
+     * 撤销
+     */
+    revoke,
+    /**
+     * 终止
+     */
+    terminate,
+    /**
+     * 更新
+     */
+    update,
+    /**
+     * 删除
+     */
+    delete,
+    /**
+     * 调用外部流程任务【办理子流程】
+     */
+    callProcess,
+    /**
+     * 超时
+     */
+    timeout,
+    /**
+     * 跳转
+     */
+    jump,
+    /**
+     * 自动跳转
+     */
+    autoJump,
+    /**
+     * 驳回跳转
+     */
+    rejectJump,
+    /**
+     * 路由跳转
+     */
+    routeJump,
+    /**
+     * 驳回重新审批跳转
+     */
+    reApproveJump,
+    /**
+     * 自动审批完成
+     */
+    autoComplete,
+    /**
+     * 自动审批拒绝
+     */
+    autoReject,
+    /**
+     * 触发器任务
+     */
+    trigger,
+    /**
+     * 结束
+     */
+    end;
+
+    public boolean eq(TaskEventType eventType) {
+        return this == eventType;
+    }
+
+    public boolean ne(TaskEventType eventType) {
+        return this != eventType;
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/RevokeDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/RevokeDTO.java
new file mode 100644
index 0000000..324f9ce
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/RevokeDTO.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "撤销DTO")
+public class RevokeDTO implements Serializable {
+
+    @ApiModelProperty(value = "审批流实例id")
+    private Long instanceId;
+
+    @ApiModelProperty(value = "合同id")
+    private String contractId;
+
+}
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
index a20f50d..3511a69 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.service;
 
 
+import com.aizuda.bpm.engine.core.FlowCreator;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.basic.PageInfo;
@@ -41,6 +42,12 @@
 
     //拒绝
     void refuse(ProcessRefuseBO processRefuseBO);
+    /**
+     * 流程实例撤销(用于错误发起审批申请,发起人主动撤销)
+     *
+     * @param instanceId  流程实例ID
+     */
+    void revoke(Long instanceId);
 
     PageInfo<ProcessTaskListVO> dealAndWaitTaskPage(ProcessTaskListBO processTemplatePageBO);
 
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 fdf87e5..afbd802 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
@@ -7,8 +7,11 @@
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.aizuda.bpm.engine.FlowLongEngine;
+import com.aizuda.bpm.engine.TaskService;
 import com.aizuda.bpm.engine.core.FlowCreator;
+import com.aizuda.bpm.engine.core.enums.InstanceState;
 import com.aizuda.bpm.engine.core.enums.TaskType;
+import com.aizuda.bpm.engine.dao.FlwInstanceDao;
 import com.aizuda.bpm.engine.entity.*;
 import com.aizuda.bpm.engine.model.NodeModel;
 import com.aizuda.bpm.mybatisplus.mapper.*;
@@ -24,6 +27,7 @@
 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.enums.TaskEventType;
 import com.ruoyi.common.exception.GlobalException;
 import com.ruoyi.common.exception.state.StateErrorCode;
 import com.ruoyi.common.utils.SecurityUtils;
@@ -47,6 +51,7 @@
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.function.Function;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 @Service
@@ -64,6 +69,8 @@
     private FlwTaskActorMapper flwTaskActorMapper;
     @Autowired
     private FlwTaskMapper flwTaskMapper;
+    @Autowired
+    private TaskService taskService;
     @Autowired
     private StateTaskCenterService stateTaskCenterService;
     @Autowired
@@ -935,6 +942,11 @@
         record.setPictures(processRefuseBO.getPictures());
         stateProcessInstanceActionService.save(record);
     }
+    @Override
+    public void revoke(Long instanceId) {
+        FlowCreator flowCreator = FlowCreator.of(String.valueOf(SecurityUtils.getUserId()), SecurityUtils.getLoginUser().getUser().getNickName());
+        flowLongEngine.runtimeService().revoke(instanceId, flowCreator);
+    }
 
     @Override
     public PageInfo<ProcessTaskListVO> dealAndWaitTaskPage(ProcessTaskListBO processTaskListBO) {
@@ -1198,8 +1210,8 @@
         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, flwTask.getInstanceId())
-                .orderByDesc(StateProcessInstanceAction::getCreateTime));
+        List<StateProcessInstanceAction> list = stateProcessInstanceActionService.list(Wrappers.<StateProcessInstanceAction>lambdaQuery().eq(StateProcessInstanceAction::getInstanceId, instanceId)
+                .orderByAsc(StateProcessInstanceAction::getCreateTime));
         for (StateProcessInstanceAction stateProcessInstanceAction : list) {
             SysUser sysUser = sysUserService.selectUserById(Long.valueOf(stateProcessInstanceAction.getAuditorId()));
             if(Objects.nonNull(sysUser)){
diff --git a/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
index e8e7dfe..fa366f5 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
@@ -99,7 +99,7 @@
                     #{item}
                 </foreach>
             </if>
-            <if test="query.ids != null and query.ids.size()=0">
+            <if test="query.ids == null or query.ids.size()==0">
                 <if test="query.partyTwoName != null and query.partyTwoName != ''">
                     and t1.party_two_name like concat('%',#{query.partyTwoName},'%')
                 </if>

--
Gitblit v1.7.1