From 1e7ffe891a6e967653e42fc128636c906aa28000 Mon Sep 17 00:00:00 2001 From: zt Date: Thu, 18 Sep 2025 21:31:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E5=92=8C=E8=A7=92?= =?UTF-8?q?=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/dto/role/SysRoleProjectDto.java | 5 ++ .../service/impl/SysRoleServiceImpl.java | 17 ++++++- .../controller/FlwDefinitionController.java | 51 +++++++++++++++++++ .../controller/FlwTaskController.java | 6 +++ .../workflow/domain/bo/FlowTaskBo.java | 6 +++ .../workflow/domain/vo/FlowTaskVo.java | 4 ++ .../workflow/mapper/FlwTaskMapper.java | 5 ++ .../workflow/service/IFlwTaskService.java | 4 ++ .../service/impl/FlwTaskServiceImpl.java | 18 +++++++ .../mapper/workflow/FlwTaskMapper.xml | 10 +++- 10 files changed, 123 insertions(+), 3 deletions(-) diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/role/SysRoleProjectDto.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/role/SysRoleProjectDto.java index 313e25e8..8d2825f6 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/role/SysRoleProjectDto.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/role/SysRoleProjectDto.java @@ -34,4 +34,9 @@ public class SysRoleProjectDto { * 角色id列表 */ private List roleIds; + + /** + * 角色名称列表 + */ + private List appRoleIds; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index 2173d2bc..ccd20cf8 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -84,7 +84,8 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService { QueryWrapper wrapper = Wrappers.query(); wrapper.eq("r.del_flag", SystemConstants.NORMAL) .eq(StringUtils.isNotBlank(bo.getRoleSource()), "r.role_source", bo.getRoleSource()) - .eq(ObjectUtil.isNotNull(bo.getDeptId()), "r.dept_id", bo.getDeptId()) + .notIn("2".equals(bo.getRoleSource()), "r.role_id", Arrays.asList( 2L,3L,4L)) + //.eq(ObjectUtil.isNotNull(bo.getDeptId()), "r.dept_id", bo.getDeptId()) .eq(ObjectUtil.isNotNull(bo.getIsSpecial()), "r.is_special", bo.getIsSpecial()) .eq(ObjectUtil.isNotNull(bo.getRoleId()), "r.role_id", bo.getRoleId()) .like(StringUtils.isNotBlank(bo.getRoleName()), "r.role_name", bo.getRoleName()) @@ -93,6 +94,10 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService { .between(params.get("beginTime") != null && params.get("endTime") != null, "r.create_time", params.get("beginTime"), params.get("endTime")) .orderByAsc("r.role_sort").orderByAsc("r.create_time"); + // 添加部门ID或角色ID在2,3,4中的条件 + if (ObjectUtil.isNotNull(bo.getDeptId())) { + wrapper.and(w -> w.eq("r.dept_id", bo.getDeptId()).or().in("r.role_id", Arrays.asList(2L, 3L, 4L))); + } return wrapper; } @@ -208,8 +213,16 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService { for (Map.Entry> entry : map.entrySet()) { Long key = entry.getKey(); SysRoleProjectDto dto = new SysRoleProjectDto(); + List roleIds = StreamUtils.toList(entry.getValue(), SysUserRole::getRoleId); + + List sysRoles = baseMapper.selectList(Wrappers.lambdaQuery() + .in(SysRole::getRoleId, roleIds) + ); + List appRoleIds = sysRoles.stream().filter(vo -> "2".equals(vo.getRoleSource())).map(SysRole::getRoleId).distinct().toList(); + roleIds.removeAll(appRoleIds); dto.setProjectId(key); - dto.setRoleIds(StreamUtils.toList(entry.getValue(), SysUserRole::getRoleId)); + dto.setRoleIds(roleIds); + dto.setAppRoleIds(appRoleIds); if (projectMap.containsKey(key)) { BusProject project = projectMap.get(key).getFirst(); dto.setProjectName(project.getProjectName()); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index e21a1a58..8b9afe49 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -9,8 +9,12 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.warm.flow.core.FlowEngine; import org.dromara.warm.flow.core.entity.Definition; +import org.dromara.warm.flow.core.entity.Node; +import org.dromara.warm.flow.core.entity.Skip; import org.dromara.warm.flow.core.service.DefService; +import org.dromara.warm.flow.core.utils.AssertUtil; import org.dromara.warm.flow.orm.entity.FlowDefinition; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.domain.bo.FlowDefinitionBo; @@ -23,6 +27,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; +import java.util.stream.Collectors; /** * 流程定义管理 控制层 @@ -190,4 +195,50 @@ public class FlwDefinitionController extends BaseController { return R.ok(active ? defService.active(id) : defService.unActive(id)); } + /** + * 复制流程定义到另一项目 + * + * @param id 流程定义id + */ + @Log(title = "复制流程定义到另一项目", businessType = BusinessType.INSERT) + @PostMapping("/copyToProject/{id}/{projectId}") + @RepeatSubmit() + @Transactional(rollbackFor = Exception.class) + public R copyToProjectById(@PathVariable Long id, @PathVariable Long projectId) { + Definition definition = FlowEngine.defService().getById(id).copy(); + definition.setVersion("1"); + AssertUtil.isNull(definition, "流程定义不存在!"); + String[] split = definition.getFlowCode().split("_"); + definition.setFlowCode(projectId + "_" + split[1]); + List nodeList = (List) FlowEngine.nodeService().getByDefId(id).stream().map(Node::copy).collect(Collectors.toList()); + List skipList = (List)FlowEngine.skipService().getByDefId(id).stream().map(Skip::copy).collect(Collectors.toList()); + FlowEngine.dataFillHandler().idFill(definition); + nodeList.forEach((node) -> { + node.setDefinitionId(definition.getId()).setVersion(definition.getVersion()); + }); + FlowEngine.nodeService().saveBatch(nodeList); + skipList.forEach((skip) -> { + skip.setDefinitionId(definition.getId()); + }); + FlowEngine.skipService().saveBatch(skipList); + boolean save = FlowEngine.defService().save(definition); + return R.ok(save); + } + + + @PostMapping("/copyAllProject/{projectId}/{toProjectId}") + @Transactional(rollbackFor = Exception.class) + @RepeatSubmit() + public R copyToProject(@PathVariable Long projectId,@PathVariable Long toProjectId) { + FlowDefinitionBo flowDefinitionBo = new FlowDefinitionBo(); + flowDefinitionBo.setProjectId(projectId); + PageQuery pageQuery = new PageQuery(9999,1); + TableDataInfo flowDefinitionVoTableDataInfo = flwDefinitionService.queryList(flowDefinitionBo, pageQuery); + List list = flowDefinitionVoTableDataInfo.getRows(); + for (FlowDefinitionVo flowDefinitionVo : list) { + copyToProjectById(flowDefinitionVo.getId(),toProjectId); + } + return R.ok(); + } + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 5534b673..0d914936 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -209,4 +209,10 @@ public class FlwTaskController extends BaseController { return R.ok(flwTaskService.currentTaskAllUser(taskId)); } + + @PutMapping("/copyRead/{flowUserId}") + public R copyRead(@PathVariable Long flowUserId) { + flwTaskService.copyRead(flowUserId); + return R.ok(); + } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java index 86f94c2a..a60ef4c3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java @@ -54,4 +54,10 @@ public class FlowTaskBo implements Serializable { */ private List createByIds; + + /** + * 是否已读 + */ + private String isRead; + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 204be1c3..77e41014 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -187,4 +187,8 @@ public class FlowTaskVo implements Serializable { */ private List buttonList; + private Long flowUserId; + + private String isRead; + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java index 9679fd1e..4dc4e164 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java @@ -56,5 +56,10 @@ public interface FlwTaskMapper { * @return 结果 */ Page getTaskCopyByPage(@Param("page") Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); + Page getTaskCopyDefinitionIdsByPage(@Param("page") Page page,@Param("definitionIds") List definitionIds, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); + + void copyRead(@Param("flowUserId") Long flowUserId); + + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index e172c001..c83885f1 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -12,6 +12,7 @@ import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; +import org.springframework.web.bind.annotation.PathVariable; import java.util.List; import java.util.Map; @@ -215,4 +216,7 @@ public interface IFlwTaskService { * @return 节点 */ FlowNode getByNodeCode(String nodeCode, Long definitionId); + + + void copyRead(@PathVariable Long flowUserId); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 0854b887..22864fc2 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; @@ -24,6 +25,9 @@ import org.dromara.common.core.validate.EditGroup; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sse.dto.SeeMessageContentDto; +import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.warm.flow.core.FlowEngine; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.*; @@ -405,6 +409,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return null; } } + queryWrapper.eq(StringUtils.isNotBlank(flowTaskBo.getIsRead()),"t.is_read", flowTaskBo.getIsRead()); queryWrapper.in("t.processed_by", LoginHelper.getUserIdStr()); Page page = flwTaskMapper.getTaskCopyDefinitionIdsByPage(pageQuery.build(),definitionIds, queryWrapper); return TableDataInfo.build(page); @@ -808,4 +813,17 @@ public class FlwTaskServiceImpl implements IFlwTaskService { .eq(FlowNode::getDefinitionId, definitionId)); } + @Override + public void copyRead(Long flowUserId) { + Long userId = LoginHelper.getUserId(); + flwTaskMapper.copyRead(flowUserId); + SseMessageDto dto = new SseMessageDto(); + SeeMessageContentDto contentDto = new SeeMessageContentDto(); + contentDto.setType("count"); + contentDto.setContent("统计"); + dto.setMessage(JSONUtil.toJsonStr(contentDto)); + dto.setIsRecord(false); + dto.setUserIds(Collections.singletonList(userId)); + SseMessageUtils.publishMessage(dto); + } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 1e90ba73..cda67f91 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -219,7 +219,9 @@ d.flow_code, d.category, d.version, - bp.project_name + bp.project_name, + a.id as flowUserId, + a.is_read from flow_user a left join flow_his_task b on a.associated = b.task_id left join flow_instance c on b.instance_id = c.id @@ -238,4 +240,10 @@ ) t ${ew.getCustomSqlSegment} + + + update flow_user + set is_read = '1' + where id = #{flowUserId} +