Przeglądaj źródła

优化审批记录

hubin 1 rok temu
rodzic
commit
07c09b7339

+ 1 - 1
src/main/java/com/aizuda/boot/BootApplication.java

@@ -14,7 +14,7 @@ import com.aizuda.service.Aizuda;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 /**
- * 爱组搭 http://aizuda.com
+ * <a href="http://aizuda.com">爱组搭</a>
  *
  * @author 青苗
  * @since 2021-10-28

+ 22 - 14
src/main/java/com/aizuda/boot/modules/flw/FlowTaskListener.java

@@ -1,15 +1,16 @@
 package com.aizuda.boot.modules.flw;
 
+import com.aizuda.boot.modules.flw.entity.ApprovalContent;
 import com.aizuda.boot.modules.flw.entity.FlwProcessApproval;
 import com.aizuda.boot.modules.flw.service.IFlwProcessApprovalService;
 import com.aizuda.common.toolkit.CollectionUtils;
-import com.aizuda.common.toolkit.JacksonUtils;
 import com.aizuda.common.toolkit.StringUtils;
 import com.flowlong.bpm.engine.FlowDataTransfer;
 import com.flowlong.bpm.engine.FlowLongEngine;
 import com.flowlong.bpm.engine.core.FlowCreator;
 import com.flowlong.bpm.engine.core.enums.EventType;
 import com.flowlong.bpm.engine.core.enums.PerformType;
+import com.flowlong.bpm.engine.core.enums.TaskType;
 import com.flowlong.bpm.engine.entity.FlwTask;
 import com.flowlong.bpm.engine.listener.TaskListener;
 import com.flowlong.bpm.engine.model.NodeModel;
@@ -17,8 +18,6 @@ import com.flowlong.bpm.engine.model.ProcessModel;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Component;
 
-import java.util.HashMap;
-import java.util.Map;
 import java.util.function.Supplier;
 
 @Component
@@ -38,33 +37,42 @@ public class FlowTaskListener implements TaskListener {
             fpa.setTaskId(flwTask.getId());
             fpa.setTaskName(flwTask.getTaskName());
             PerformType performType = PerformType.get(flwTask.getPerformType());
-            String content = null;
             if (performType == PerformType.start) {
                 // 发起
                 fpa.setType(1);
             } else {
+                if (eventType == EventType.assignment) {
+                    TaskType taskType = TaskType.get(flwTask.getTaskType());
+                    if (taskType == TaskType.transfer) {
+                        // 转办、代理人办理完任务直接进入下一个节点
+                        fpa.setType(6);
+                    } else if (taskType == TaskType.delegate) {
+                        // 委派、代理人办理完任务该任务重新归还给原处理人
+                        fpa.setType(7);
+                    } else if (taskType == TaskType.delegateReturn) {
+                        // 委派归还任务
+                        fpa.setType(18);
+                    }
+                }
                 ProcessModel processModel = flowLongEngine.runtimeService().getProcessModelByInstanceId(flwTask.getInstanceId());
                 NodeModel nodeModel = processModel.getNode(flwTask.getTaskName());
                 if (null != nodeModel) {
-                    Map<String, Object> objectMap = new HashMap<>();
+                    ApprovalContent content = new ApprovalContent();
                     if (eventType != EventType.cc) {
-                        String approvalContent = FlowDataTransfer.get("processApprovalContent");
-                        if (StringUtils.hasLength(approvalContent)) {
-                            objectMap.put("content", approvalContent);
+                        String opinion = FlowDataTransfer.get("processApprovalOpinion");
+                        if (StringUtils.hasLength(opinion)) {
+                            content.setOpinion(opinion);
                         }
                     }
                     if (CollectionUtils.isNotEmpty(nodeModel.getNodeUserList())) {
-                        objectMap.put("nodeUserList", nodeModel.getNodeUserList());
+                        content.setNodeUserList(nodeModel.getNodeUserList());
                     }
                     if (CollectionUtils.isNotEmpty(nodeModel.getNodeRoleList())) {
-                        objectMap.put("nodeRoleList", nodeModel.getNodeRoleList());
-                    }
-                    if (!objectMap.isEmpty()) {
-                        content = JacksonUtils.toJson(objectMap);
+                        content.setNodeRoleList(nodeModel.getNodeRoleList());
                     }
+                    fpa.setContent(content);
                 }
             }
-            fpa.setContent(content);
         }
         return flwProcessApprovalService.save(fpa);
     }

+ 23 - 0
src/main/java/com/aizuda/boot/modules/flw/entity/ApprovalContent.java

@@ -0,0 +1,23 @@
+package com.aizuda.boot.modules.flw.entity;
+
+import com.flowlong.bpm.engine.model.NodeAssignee;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class ApprovalContent {
+
+    @Schema(description = "审批评论或意见")
+    private String opinion;
+
+    @Schema(description = "节点分配处理用户")
+    private List<NodeAssignee> nodeUserList;
+
+    @Schema(description = "节点分配处理角色")
+    private List<NodeAssignee> nodeRoleList;
+
+}

+ 5 - 4
src/main/java/com/aizuda/boot/modules/flw/entity/FlwProcessApproval.java

@@ -5,6 +5,7 @@ import com.aizuda.core.validation.Create;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
@@ -23,7 +24,7 @@ import java.util.Date;
 @Getter
 @Setter
 @Schema(name = "FlwProcessApproval", description = "流程审批记录")
-@TableName("flw_process_approval")
+@TableName(value = "flw_process_approval", autoResultMap = true)
 public class FlwProcessApproval extends SuperEntity {
 
     @Schema(description = "租户ID")
@@ -53,14 +54,14 @@ public class FlwProcessApproval extends SuperEntity {
     @Schema(description = "任务名称")
     private String taskName;
 
-    @Schema(description = "审批类型 0,评论 1,提交 2,抄送 3,办理 4,驳回 5,认领 6,转办 7,委派 8,跳转 9,拿回 10,唤醒 11,前加签 12,并加签 13,后加签 14,减签 15,撤销 16,终止 17,超时")
+    @Schema(description = "审批类型 0,评论 1,提交 2,抄送 3,办理 4,驳回 5,认领 6,转办 7,委派 8,跳转 9,拿回 10,唤醒 11,前加签 12,并加签 13,后加签 14,减签 15,撤销 16,终止 17,超时 18,委派归还任务")
     @NotNull(groups = Create.class)
     @PositiveOrZero
     private Integer type;
 
     @Schema(description = "操作 json 内容")
-    @NotBlank(groups = Create.class)
-    private String content;
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private ApprovalContent content;
 
     @Schema(description = "附件 json 内容")
     private String attachments;

+ 6 - 2
src/main/java/com/aizuda/boot/modules/flw/service/impl/FlwProcessApprovalServiceImpl.java

@@ -1,5 +1,6 @@
 package com.aizuda.boot.modules.flw.service.impl;
 
+import com.aizuda.boot.modules.flw.entity.ApprovalContent;
 import com.aizuda.boot.modules.flw.entity.FlwProcessApproval;
 import com.aizuda.boot.modules.flw.entity.dto.ProcessApprovalDTO;
 import com.aizuda.boot.modules.flw.mapper.FlwProcessApprovalMapper;
@@ -8,6 +9,7 @@ import com.aizuda.service.service.BaseServiceImpl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -32,11 +34,13 @@ public class FlwProcessApprovalServiceImpl extends BaseServiceImpl<FlwProcessApp
         return lambdaQuery().eq(FlwProcessApproval::getInstanceId, instanceId).list();
     }
 
-    private FlwProcessApproval getFlwProcessApproval(Long instanceId, Integer type, String content) {
+    private FlwProcessApproval getFlwProcessApproval(Long instanceId, Integer type, String opinion) {
         FlwProcessApproval fpa = new FlwProcessApproval();
         fpa.setInstanceId(instanceId);
         fpa.setType(type);
-        fpa.setContent(content);
+        ApprovalContent approvalContent = new ApprovalContent();
+        approvalContent.setOpinion(opinion);
+        fpa.setContent(approvalContent);
         return fpa;
     }
 

+ 14 - 17
src/main/java/com/aizuda/boot/modules/flw/service/impl/ProcessTaskServiceImpl.java

@@ -1,6 +1,7 @@
 package com.aizuda.boot.modules.flw.service.impl;
 
 import com.aizuda.boot.modules.flw.FlowHelper;
+import com.aizuda.boot.modules.flw.entity.ApprovalContent;
 import com.aizuda.boot.modules.flw.entity.FlwProcessApproval;
 import com.aizuda.boot.modules.flw.entity.FlwProcessForm;
 import com.aizuda.boot.modules.flw.entity.dto.*;
@@ -9,7 +10,6 @@ import com.aizuda.boot.modules.flw.mapper.FlowlongMapper;
 import com.aizuda.boot.modules.flw.service.IFlwProcessApprovalService;
 import com.aizuda.boot.modules.flw.service.IFlwProcessFormService;
 import com.aizuda.boot.modules.flw.service.IProcessTaskService;
-import com.aizuda.common.toolkit.JacksonUtils;
 import com.aizuda.core.api.ApiAssert;
 import com.aizuda.core.api.PageParam;
 import com.aizuda.service.web.UserSession;
@@ -32,7 +32,6 @@ import org.apache.commons.collections.CollectionUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -132,10 +131,9 @@ public class ProcessTaskServiceImpl implements IProcessTaskService {
                 fpa.setTaskId(flwTask.getId());
                 fpa.setTaskName(flwTask.getTaskName());
                 fpa.setType(2);
-                String content = null;
+                ApprovalContent content = new ApprovalContent();
                 List<FlwTaskActor> flwTaskActors = flowLongEngine.queryService().getTaskActorsByTaskId(flwTask.getId());
                 if (CollectionUtils.isNotEmpty(flwTaskActors)) {
-                    Map<String, Object> objectMap = new HashMap<>();
                     List<NodeAssignee> nodeAssigneeList = flwTaskActors.stream().map(t -> {
                         NodeAssignee nodeAssignee = new NodeAssignee();
                         nodeAssignee.setTenantId(t.getTenantId());
@@ -147,11 +145,10 @@ public class ProcessTaskServiceImpl implements IProcessTaskService {
                     // 参与者类型 0,用户 1,角色 2,部门
                     FlwTaskActor flwTaskActor = flwTaskActors.get(0);
                     if (Objects.equals(0, flwTaskActor.getActorType())) {
-                        objectMap.put("nodeUserList", nodeAssigneeList);
+                        content.setNodeUserList(nodeAssigneeList);
                     } else {
-                        objectMap.put("nodeRoleList", nodeAssigneeList);
+                        content.setNodeRoleList(nodeAssigneeList);
                     }
-                    content = JacksonUtils.toJson(objectMap);
                 }
                 fpa.setContent(content);
                 processApprovals.add(fpa);
@@ -210,7 +207,7 @@ public class ProcessTaskServiceImpl implements IProcessTaskService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public boolean revoke(ProcessApprovalDTO dto, FlowCreator flowCreator) {
-        this.processApprovalContent(dto.getContent());
+        this.processApprovalOpinion(dto.getContent());
         flowLongEngine.runtimeService().revoke(dto.getInstanceId(), flowCreator);
         return true;
     }
@@ -218,15 +215,15 @@ public class ProcessTaskServiceImpl implements IProcessTaskService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public boolean execute(ExecuteTaskDTO dto) {
-        this.processApprovalContent(dto.getOpinion());
+        this.processApprovalOpinion(dto.getOpinion());
         return flowLongEngine.executeTask(dto.getTaskId(), FlowHelper.getFlowCreator(), dto.getArgs());
     }
 
     /**
      * 传递流程审批内容
      */
-    private void processApprovalContent(String content) {
-        FlowDataTransfer.put("processApprovalContent", content);
+    private void processApprovalOpinion(String content) {
+        FlowDataTransfer.put("processApprovalOpinion", content);
     }
 
     @Override
@@ -248,14 +245,14 @@ public class ProcessTaskServiceImpl implements IProcessTaskService {
         FlwTask flwTask = flowLongEngine.queryService().getTask(dto.getTaskId());
         ApiAssert.isEmpty(flwTask, "当前ID执行任务不存在");
         TaskService taskService = flowLongEngine.taskService();
-        this.processApprovalContent(dto.getReason());
+        this.processApprovalOpinion(dto.getReason());
         return taskService.rejectTask(flwTask, FlowHelper.getFlowCreator(), dto.getArgs()).isPresent();
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public boolean transfer(TaskAssigneeDTO dto) {
-        this.processApprovalContent(dto.getContent());
+        this.processApprovalOpinion(dto.getContent());
         if (Objects.equals(0, dto.getType())) {
             // 转办
             TaskService taskService = flowLongEngine.taskService();
@@ -283,7 +280,7 @@ public class ProcessTaskServiceImpl implements IProcessTaskService {
     @Override
     public boolean consent(TaskApprovalDTO dto) {
         FlwTask flwTask = this.getFlwTask(dto.getTaskId());
-        this.processApprovalContent(dto.getContent());
+        this.processApprovalOpinion(dto.getContent());
         ApiAssert.fail(!flwProcessFormService.saveForm(flwTask.getInstanceId(), dto.getProcessForm()), "保存保单内容失败");
         return flowLongEngine.executeTask(dto.getTaskId(), FlowHelper.getFlowCreator());
     }
@@ -292,7 +289,7 @@ public class ProcessTaskServiceImpl implements IProcessTaskService {
     @Override
     public boolean rejection(TaskApprovalDTO dto) {
         FlwTask flwTask = this.getFlwTask(dto.getTaskId());
-        this.processApprovalContent(dto.getContent());
+        this.processApprovalOpinion(dto.getContent());
         return flowLongEngine.taskService().rejectTask(flwTask, FlowHelper.getFlowCreator()).isEmpty();
     }
 
@@ -300,7 +297,7 @@ public class ProcessTaskServiceImpl implements IProcessTaskService {
     @Override
     public boolean appendNode(TaskAppendNodeDTO dto) {
         FlwTask flwTask = this.getFlwTask(dto.getTaskId());
-        this.processApprovalContent(dto.getContent());
+        this.processApprovalOpinion(dto.getContent());
         return flowLongEngine.executeAppendNodeModel(flwTask.getId(), dto.toNodeModel("前置加签"),
                 FlowHelper.getFlowCreator(), dto.getType() == 9);
     }
@@ -308,7 +305,7 @@ public class ProcessTaskServiceImpl implements IProcessTaskService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public boolean jump(TaskJumpDTO dto) {
-        this.processApprovalContent(dto.getContent());
+        this.processApprovalOpinion(dto.getContent());
         return flowLongEngine.executeJumpTask(dto.getTaskId(), dto.getNodeName(), FlowHelper.getFlowCreator());
     }
 }

+ 1 - 1
src/main/resources/mapper/FlowlongMapper.xml

@@ -32,7 +32,7 @@
         <if test="dto.endTime != null">
             AND i.create_time &lt;= #{dto.endTime}
         </if>
-        ORDER BY i.instance_state ASC, i.create_time DESC
+        ORDER BY i.create_time DESC
     </sql>
 
     <select id="selectPagePendingClaim" resultType="com.aizuda.boot.modules.flw.entity.vo.PendingClaimTaskVO">