Browse Source

修复发起角色权限控制

hubin 11 months ago
parent
commit
27711d90b4

+ 0 - 10
src/main/java/com/aizuda/boot/modules/flw/controller/ProcessController.java

@@ -127,16 +127,6 @@ public class ProcessController extends ApiController {
         return flwProcessService.saveDto(dto);
     }
 
-    @Operation(summary = "发布流程")
-    @Parameters({
-            @Parameter(name = "id", description = "流程ID")
-    })
-    @Permission("flw:process:release")
-    @PostMapping("/release")
-    public boolean release(@RequestParam Long id) {
-        return flwProcessService.releaseById(id);
-    }
-
     @Operation(summary = "根据流程定义ID删除流程定义相关信息")
     @Parameters({
             @Parameter(name = "id", description = "主键ID")

+ 5 - 0
src/main/java/com/aizuda/boot/modules/flw/mapper/FlowlongMapper.java

@@ -52,4 +52,9 @@ public interface FlowlongMapper {
      * 待办数量
      */
     Integer selectCountPendingApproval(@Param("actorId") String actorId);
+
+    /**
+     * 不存在角色权限的流程ID列表
+     */
+    List<Long> selectNotExistProcessIds(@Param("userId") Long userId);
 }

+ 1 - 2
src/main/java/com/aizuda/boot/modules/flw/service/IFlwProcessActorService.java

@@ -26,9 +26,8 @@ public interface IFlwProcessActorService extends IBaseService<FlwProcessActor> {
      * 根据流程定义ID删除流程定义参与者
      *
      * @param processId 流程定义ID
-     * @return true 成功 false 失败
      */
-    boolean removeByProcessId(Long processId);
+    void removeByProcessId(Long processId);
 
     /**
      * 根据流程定义ID查询程定义参与者列表

+ 0 - 7
src/main/java/com/aizuda/boot/modules/flw/service/IFlwProcessService.java

@@ -113,13 +113,6 @@ public interface IFlwProcessService extends IBaseService<FlwProcess> {
      */
     boolean cloneById(Long id);
 
-    /**
-     * 发布指定ID流程
-     *
-     * @param id 流程定义ID
-     */
-    boolean releaseById(Long id);
-
     /**
      * 根据指定ID签出历史流程
      * <p>

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

@@ -28,8 +28,8 @@ public class FlwProcessActorServiceImpl extends BaseServiceImpl<FlwProcessActorM
     }
 
     @Override
-    public boolean removeByProcessId(Long processId) {
-        return super.remove(this.getWrappers(processId));
+    public void removeByProcessId(Long processId) {
+        super.remove(this.getWrappers(processId));
     }
 
     private LambdaQueryWrapper<FlwProcessActor> getWrappers(Long processId) {

+ 26 - 35
src/main/java/com/aizuda/boot/modules/flw/service/impl/FlwProcessServiceImpl.java

@@ -87,12 +87,24 @@ public class FlwProcessServiceImpl extends ServiceImpl<FlwProcessMapper, FlwProc
         } else {
             flwProcessVOList = flowlongMapper.selectFlwProcessList();
         }
+
         boolean voIsNotEmpty = CollectionUtils.isNotEmpty(flwProcessVOList);
+        if (voIsNotEmpty) {
+            // 过滤不存在角色权限的流程
+            UserSession userSession = UserSession.getLoginInfo();
+            List<Long> notExistProcessIds = flowlongMapper.selectNotExistProcessIds(userSession.getId());
+            if (CollectionUtils.isNotEmpty(notExistProcessIds)) {
+                flwProcessVOList = flwProcessVOList.stream().sorted(Comparator.comparing(FlwProcessVO::getProcessSort))
+                        .filter(t -> !notExistProcessIds.contains(t.getProcessId())).toList();
+            } else {
+                flwProcessVOList.sort(Comparator.comparing(FlwProcessVO::getProcessSort));
+            }
+        }
+
         if (null == keyword) {
             // 不存在关键词查询
             for (FlwProcessCategory fpc : categoryList) {
                 if (voIsNotEmpty) {
-                    flwProcessVOList.sort(Comparator.comparing(FlwProcessVO::getProcessSort));
                     List<FlwProcessVO> processList = flwProcessVOList.stream().filter(f -> Objects.equals(fpc.getId(), f.getCategoryId())).toList();
                     boolean isEmpty = CollectionUtils.isEmpty(processList);
                     if (isEmpty && launch) {
@@ -110,7 +122,6 @@ public class FlwProcessServiceImpl extends ServiceImpl<FlwProcessMapper, FlwProc
             // 关键词查询
             for (FlwProcessCategory fpc : categoryList) {
                 if (voIsNotEmpty) {
-                    flwProcessVOList.sort(Comparator.comparing(FlwProcessVO::getProcessSort));
                     List<FlwProcessVO> processList = flwProcessVOList.stream().filter(t -> Objects.equals(t.getCategoryId(), fpc.getId())
                             && t.getProcessName().contains(keyword)).toList();
                     if (fpc.getName().contains(keyword)) {
@@ -277,6 +288,19 @@ public class FlwProcessServiceImpl extends ServiceImpl<FlwProcessMapper, FlwProc
                     "流程定义管理权限保存失败");
         }
 
+        // 设置流程定义参与者,限制发起人角色
+        List<NodeAssignee> nodeAssigneeList = rootNode.getNodeAssigneeList();
+        if (CollectionUtils.isNotEmpty(nodeAssigneeList)) {
+            ApiAssert.fail(!flwProcessActorService.saveProcessActors(processId, nodeAssigneeList.stream().map(t -> {
+                FlwProcessActor fpa = new FlwProcessActor();
+                fpa.setProcessId(processId);
+                fpa.setActorType(null == rootNode.getSetType() ? 3 : rootNode.getSetType());
+                fpa.setActorId(Long.valueOf(t.getId()));
+                fpa.setActorName(t.getName());
+                return fpa;
+            }).toList()), "流程发起人参与者信息保持失败");
+        }
+
         // 保存流程定义配置
         if (null != dto.getCategoryId()) {
             ApiAssert.fail(!flwProcessConfigureService.saveByDto(processId, dto), "流程定义配置保存失败");
@@ -399,39 +423,6 @@ public class FlwProcessServiceImpl extends ServiceImpl<FlwProcessMapper, FlwProc
         return null != this.saveDto(dto);
     }
 
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public boolean releaseById(Long id) {
-        FlwProcess flwProcess = super.getById(id);
-        ApiAssert.isEmpty(flwProcess, "指定ID流程实例不存在");
-        if (1 == flwProcess.getProcessState()) {
-            // 可用状态直接返回结果
-            return true;
-        }
-
-        // 读取流程发起权限
-        ProcessModel processModel = flwProcess.model();
-        NodeModel nodeModel = processModel.getNodeConfig();
-        ApiAssert.isEmpty(nodeModel, "流程定义配置有误");
-        List<NodeAssignee> nodeAssigneeList = nodeModel.getNodeAssigneeList();
-        if (CollectionUtils.isNotEmpty(nodeAssigneeList)) {
-            flwProcessActorService.saveProcessActors(id, nodeAssigneeList.stream().map(t -> {
-                FlwProcessActor fpa = new FlwProcessActor();
-                fpa.setProcessId(id);
-                fpa.setActorType(0);
-                fpa.setActorId(Long.valueOf(t.getId()));
-                fpa.setActorName(t.getName());
-                return fpa;
-            }).toList());
-        }
-
-        // 设置流程为可用状态
-        FlwProcess temp = new FlwProcess();
-        temp.setId(id);
-        temp.setProcessState(1);
-        return super.updateById(temp);
-    }
-
     @Transactional(rollbackFor = Exception.class)
     @Override
     public boolean checkoutById(Long id) {

+ 6 - 4
src/main/resources/mapper/FlowlongMapper.xml

@@ -9,11 +9,9 @@
     </select>
 
     <select id="selectLaunchProcessList" resultType="com.aizuda.boot.modules.flw.entity.vo.FlwProcessVO">
-        WITH tb AS (SELECT t2.category_id,t2.process_id,t1.process_key,t1.process_name,t1.process_icon,t1.process_type,t1.process_version,t1.instance_url,
+        SELECT t2.category_id,t2.process_id,t1.process_key,t1.process_name,t1.process_icon,t1.process_type,t1.process_version,t1.instance_url,
         t1.remark,t1.use_scope,t1.process_state,t1.sort AS process_sort,t1.create_time
-        FROM flw_process t1 JOIN flw_process_configure t2 ON t1.ID = t2.process_id WHERE t1.process_state=1 AND t1.process_type='main')
-        SELECT tb.* FROM tb WHERE NOT EXISTS (SELECT 1 FROM flw_process_actor a WHERE tb.process_id=a.process_id) UNION ALL
-        SELECT tb.* FROM tb WHERE EXISTS (SELECT 1 FROM flw_process_actor a JOIN sys_user_role r ON a.actor_id=r.role_id WHERE a.actor_type=0 AND r.user_id=0 AND tb.process_id=a.process_id)
+        FROM flw_process t1 JOIN flw_process_configure t2 ON t1.ID = t2.process_id WHERE t1.process_state=1 AND t1.process_type='main'
     </select>
 
     <sql id="sqlConditionProcessTask">
@@ -86,4 +84,8 @@
         SELECT count(1) AS num FROM flw_task t JOIN flw_task_actor a ON t.id=a.task_id WHERE a.actor_type=0 AND a.actor_id=#{actorId}
     </select>
 
+    <select id="selectNotExistProcessIds" resultType="java.lang.Long">
+        SELECT DISTINCT p.process_id FROM flw_process_actor p WHERE NOT EXISTS (SELECT 1 FROM sys_user_role u WHERE p.actor_id=u.role_id AND u.user_id=#{userId})
+    </select>
+
 </mapper>