diff --git a/pom.xml b/pom.xml index 5d5fe84ca..81fc51c4d 100644 --- a/pom.xml +++ b/pom.xml @@ -48,7 +48,7 @@ 8.7.2-20250603 - 1.7.4 + 1.7.5-m2 3.4.2 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java index db1b7b7f0..6870a80c9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java @@ -13,6 +13,7 @@ import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.warm.flow.ui.service.CategoryService; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.domain.FlowCategory; @@ -35,7 +36,7 @@ import java.util.List; @ConditionalOnEnable @RequiredArgsConstructor @Service -public class FlwCategoryServiceImpl implements IFlwCategoryService { +public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryService { private final DefService defService; private final FlwCategoryMapper baseMapper; @@ -102,22 +103,37 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService { } // 获取当前列表中每一个节点的parentId,然后在列表中查找是否有id与其parentId对应,若无对应,则表明此时节点列表中,该节点在当前列表中属于顶级节点 List> treeList = CollUtil.newArrayList(); - for (FlowCategoryVo d : categorys) { - String parentId = d.getParentId().toString(); + for (FlowCategoryVo current : categorys) { + String parentId = current.getParentId().toString(); FlowCategoryVo categoryVo = StreamUtils.findFirst(categorys, it -> it.getCategoryId().toString().equals(parentId)); if (ObjectUtil.isNull(categoryVo)) { - List> trees = TreeBuildUtils.build(categorys, parentId, (dept, tree) -> - tree.setId(dept.getCategoryId().toString()) - .setParentId(dept.getParentId().toString()) - .setName(dept.getCategoryName()) - .setWeight(dept.getOrderNum())); - Tree tree = StreamUtils.findFirst(trees, it -> it.getId().equals(d.getCategoryId().toString())); + List> trees = TreeBuildUtils.build(categorys, parentId, (node, tree) -> + tree.setId(node.getCategoryId().toString()) + .setParentId(node.getParentId().toString()) + .setName(node.getCategoryName()) + .setWeight(node.getOrderNum())); + Tree tree = StreamUtils.findFirst(trees, it -> it.getId().equals(current.getCategoryId().toString())); treeList.add(tree); } } return treeList; } + /** + * 工作流查询分类 + * + * @return 分类树结构列表 + */ + @Override + public List queryCategory() { + List list = this.queryList(new FlowCategoryBo()); + return StreamUtils.toList(list, category -> new org.dromara.warm.flow.core.dto.Tree() + .setId(String.valueOf(category.getCategoryId())) + .setName(category.getCategoryName()) + .setParentId(String.valueOf(category.getParentId())) + ); + } + /** * 校验流程分类是否有数据权限 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java index d7c6f77eb..0f5a2c764 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java @@ -12,7 +12,6 @@ import org.dromara.common.core.service.DeptService; import org.dromara.common.core.service.DictService; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; -import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.core.dto.DefJson; @@ -53,12 +52,8 @@ public class FlwChartExtServiceImpl implements ChartExtService { */ @Override public void execute(DefJson defJson) { - // 临时修复 后续版本将通过defjson获取流程实例ID - String[] parts = ServletUtils.getRequest().getRequestURI().split("/"); - Long instanceId = Convert.toLong(parts[parts.length - 1]); - // 根据流程实例ID查询所有相关的历史任务列表 - List flowHisTasks = this.getHisTaskGroupedByNode(instanceId); + List flowHisTasks = this.getHisTaskGroupedByNode(defJson.getInstance().getId()); if (CollUtil.isEmpty(flowHisTasks)) { return; } @@ -74,14 +69,12 @@ public class FlwChartExtServiceImpl implements ChartExtService { Map dictType = dictService.getAllDictByDictType(FlowConstant.WF_TASK_STATUS); - // 遍历流程定义中的每个节点,调用处理方法,将对应节点的任务列表及用户信息传入,生成扩展提示内容 for (NodeJson nodeJson : defJson.getNodeList()) { - // 获取当前节点对应的历史任务列表,如果没有则返回空列表避免空指针 List taskList = groupedByNode.get(nodeJson.getNodeCode()); if (CollUtil.isEmpty(taskList)) { continue; } - // 处理当前节点的扩展信息,包括构建审批人提示内容等 + // 处理当前节点的扩展信息 this.processNodeExtInfo(nodeJson, taskList, userMap, dictType); } } @@ -96,44 +89,44 @@ public class FlwChartExtServiceImpl implements ChartExtService { defJson.setTopText("流程名称: " + defJson.getFlowName()); defJson.getNodeList().forEach(nodeJson -> { nodeJson.setPromptContent( - new PromptContent() - // 提示信息 - .setInfo( - CollUtil.newArrayList( - new PromptContent.InfoItem() - .setPrefix("任务名称: ") - .setContent(nodeJson.getNodeName()) - .setContentStyle(Map.of( - "border", "1px solid #d1e9ff", - "backgroundColor", "#e8f4ff", - "padding", "4px 8px", - "borderRadius", "4px" - )) - .setRowStyle(Map.of( - "fontWeight", "bold", - "margin", "0 0 6px 0", - "padding", "0 0 8px 0", - "borderBottom", "1px solid #ccc" - )) - ) - ) - // 弹窗样式 - .setDialogStyle(MapUtil.mergeAll( - "position", "absolute", - "backgroundColor", "#fff", - "border", "1px solid #ccc", - "borderRadius", "4px", - "boxShadow", "0 2px 8px rgba(0, 0, 0, 0.15)", - "padding", "8px 12px", - "fontSize", "14px", - "zIndex", "1000", - "maxWidth", "500px", - "overflowY", "visible", - "overflowX", "hidden", - "color", "#333", - "pointerEvents", "auto", - "scrollbarWidth", "thin" - )) + new PromptContent() + // 提示信息主体内容样式 + .setInfo( + CollUtil.newArrayList( + new PromptContent.InfoItem() + .setPrefix("任务名称: ") + .setContent(nodeJson.getNodeName()) + .setContentStyle(Map.of( + "border", "1px solid #d1e9ff", + "backgroundColor", "#e8f4ff", + "padding", "4px 8px", + "borderRadius", "4px" + )) + .setRowStyle(Map.of( + "fontWeight", "bold", + "margin", "0 0 6px 0", + "padding", "0 0 8px 0", + "borderBottom", "1px solid #ccc" + )) + )) + // 弹窗容器样式(包含滚动条设置) + .setDialogStyle(MapUtil.mergeAll( + "position", "absolute", + "backgroundColor", "#fff", + "border", "1px solid #ccc", + "borderRadius", "4px", + "boxShadow", "0 2px 8px rgba(0, 0, 0, 0.15)", + "padding", "8px 12px", + "fontSize", "14px", + "zIndex", "1000", + "maxWidth", "500px", + "maxHeight", "300px", // 设置最大高度,超过触发滚动 + "overflowY", "auto", // 允许垂直滚动 + "overflowX", "hidden", // 禁止横向滚动 + "color", "#333", + "pointerEvents", "auto", + "scrollbarWidth", "thin" // 滚动条宽度细化(部分浏览器支持) + )) ); }); } diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index bb3d76e68..8c2e12cd1 100644 --- a/script/sql/ry_workflow.sql +++ b/script/sql/ry_workflow.sql @@ -6,6 +6,7 @@ CREATE TABLE `flow_definition` `id` bigint NOT NULL COMMENT '主键id', `flow_code` varchar(40) NOT NULL COMMENT '流程编码', `flow_name` varchar(100) NOT NULL COMMENT '流程名称', + `mode` varchar(40) NOT NULL DEFAULT 'CLASSICS' COMMENT '设计器模式(CLASSICS经典模式 MIMIC仿钉钉模式)', `category` varchar(100) DEFAULT NULL COMMENT '流程类别', `version` varchar(20) NOT NULL COMMENT '流程版本', `is_publish` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否发布(0未发布 1已发布 9失效)', diff --git a/script/sql/update/update_5.3.1-5.4.0.sql b/script/sql/update/update_5.3.1-5.4.0.sql index 058f6fcba..b0e02af69 100644 --- a/script/sql/update/update_5.3.1-5.4.0.sql +++ b/script/sql/update/update_5.3.1-5.4.0.sql @@ -7,6 +7,9 @@ ALTER TABLE `flow_instance` ALTER TABLE `flow_his_task` MODIFY COLUMN `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)' AFTER `skip_type`; +ALTER TABLE `flow_definition` + ADD COLUMN `mode` varchar(40) NOT NULL DEFAULT 'CLASSICS' COMMENT '设计器模式(CLASSICS经典模式 MIMIC仿钉钉模式)' AFTER `flow_name`; + ALTER TABLE `sys_social` MODIFY COLUMN `access_token` varchar(2000) NOT NULL COMMENT '用户的授权令牌' AFTER `avatar`; ALTER TABLE `sys_social`