diff --git a/pom.xml b/pom.xml index 2993af438..82ed3a855 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 8.7.2-20241022 - 1.3.7 + 1.6.0-m4 3.2.2 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java index 8bae9515f..08f1808d1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java @@ -1,12 +1,6 @@ package org.dromara.workflow.config; - -import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; -import org.dromara.warm.flow.core.config.WarmFlow; -import org.dromara.warm.flow.core.utils.IdUtils; -import org.dromara.warm.plugin.modes.sb.config.BeanConfig; import org.dromara.workflow.common.ConditionalOnEnable; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; /** @@ -16,16 +10,7 @@ import org.springframework.context.annotation.Configuration; */ @ConditionalOnEnable @Configuration -public class WarmFlowConfig extends BeanConfig { - - @Autowired - private IdentifierGenerator identifierGenerator; - - @Override - public void after(WarmFlow flowConfig) { - // 设置Mybatis-Plus默认主键生成器 - IdUtils.setInstanceNative(() -> identifierGenerator.nextId(null).longValue()); - } +public class WarmFlowConfig { } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 1310da3f6..10d9de838 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -104,7 +104,6 @@ public class FlwDefinitionController extends BaseController { @Log(title = "流程定义", businessType = BusinessType.INSERT) @PutMapping("/publish/{id}") @RepeatSubmit() - @Transactional(rollbackFor = Exception.class) public R publish(@PathVariable Long id) { return R.ok(flwDefinitionService.publish(id)); } @@ -127,7 +126,6 @@ public class FlwDefinitionController extends BaseController { */ @Log(title = "流程定义", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") - @Transactional(rollbackFor = Exception.class) public R remove(@PathVariable List ids) { return toAjax(flwDefinitionService.removeDef(ids)); } @@ -153,9 +151,8 @@ public class FlwDefinitionController extends BaseController { */ @Log(title = "流程定义", businessType = BusinessType.IMPORT) @PostMapping("/importDef") - @Transactional(rollbackFor = Exception.class) public R importDef(MultipartFile file, String category) { - return R.ok(flwDefinitionService.importXml(file, category)); + return R.ok(flwDefinitionService.importJson(file, category)); } /** @@ -172,13 +169,13 @@ public class FlwDefinitionController extends BaseController { } /** - * 获取流程定义xml字符串 + * 获取流程定义JSON字符串 * * @param id 流程定义id */ @GetMapping("/xmlString/{id}") public R xmlString(@PathVariable Long id) { - return R.ok("操作成功", defService.xmlString(id)); + return R.ok("操作成功", defService.exportJson(id)); } /** @@ -189,6 +186,7 @@ public class FlwDefinitionController extends BaseController { */ @RepeatSubmit() @PutMapping("/active/{id}") + @Transactional(rollbackFor = Exception.class) public R active(@PathVariable Long id, @RequestParam boolean active) { return R.ok(active ? defService.active(id) : defService.unActive(id)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java index 6b5ca594a..1a2d29f77 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -60,7 +60,7 @@ public interface IFlwDefinitionService { * @param category 分类 * @return 结果 */ - boolean importXml(MultipartFile file, String category); + boolean importJson(MultipartFile file, String category); /** * 删除流程定义 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index 4e72371a6..da547ef95 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -3,22 +3,21 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.IoUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dom4j.Document; -import org.dom4j.io.OutputFormat; -import org.dom4j.io.XMLWriter; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.warm.flow.core.dto.FlowCombine; -import org.dromara.warm.flow.core.entity.Definition; +import org.dromara.warm.flow.core.dto.DefJson; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.PublishStatus; import org.dromara.warm.flow.core.service.DefService; @@ -42,6 +41,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -120,6 +121,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { * @param id 流程定义id */ @Override + @Transactional(rollbackFor = Exception.class) public boolean publish(Long id) { List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().eq(FlowNode::getDefinitionId, id)); List errorMsg = new ArrayList<>(); @@ -143,16 +145,20 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { * @param file 文件 */ @Override - public boolean importXml(MultipartFile file, String category) { - try { - FlowCombine combine = defService.readXml(file.getInputStream()); - // 流程定义 - Definition definition = combine.getDefinition(); - definition.setCategory(category); - defService.importFlow(combine); + @Transactional(rollbackFor = Exception.class) + public boolean importJson(MultipartFile file, String category) { + try (InputStream inputStream = file.getInputStream()) { + byte[] fileBytes = inputStream.readAllBytes(); + String fileContent = new String(fileBytes, StandardCharsets.UTF_8); + DefJson defJson = JsonUtils.parseObject(fileContent, DefJson.class); + defJson.setCategory(category); + defService.importDef(defJson); + } catch (IOException e) { + log.error("读取文件流错误: {}", e.getMessage(), e); + throw new IllegalStateException("文件读取失败,请检查文件内容", e); } catch (Exception e) { log.error("导入流程定义错误: {}", e.getMessage(), e); - throw new RuntimeException(e); + throw new IllegalStateException("导入流程定义失败", e); } return true; } @@ -166,24 +172,15 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { */ @Override public void exportDef(Long id, HttpServletResponse response) throws IOException { - Document document = defService.exportXml(id); - // 设置生成xml的格式 - OutputFormat of = OutputFormat.createPrettyPrint(); - // 设置编码格式 - of.setEncoding("UTF-8"); - of.setIndent(true); - of.setIndent(" "); - of.setNewlines(true); - - // 创建一个xml文档编辑器 - XMLWriter writer = new XMLWriter(response.getOutputStream(), of); - writer.setEscapeText(false); + byte[] data = defService.exportJson(id).getBytes(StandardCharsets.UTF_8); + String filename = "workflow_export_" + DateUtils.dateTimeNow() + ".json"; + // 设置响应头和内容类型 response.reset(); - response.setCharacterEncoding("UTF-8"); - response.setContentType("application/x-msdownload"); - response.setHeader("Content-Disposition", "attachment;"); - writer.write(document); - writer.close(); + response.setCharacterEncoding(StandardCharsets.UTF_8.name()); + response.setContentType("application/json"); + response.setHeader("Content-Disposition", "attachment; filename=" + filename); + response.addHeader("Content-Length", "" + data.length); + IoUtil.write(response.getOutputStream(), false, data); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 7f09a4596..f5153c8db 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -19,13 +19,14 @@ import org.dromara.common.core.utils.StringUtils; 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.warm.flow.core.FlowFactory; +import org.dromara.warm.flow.core.FlowEngine; import org.dromara.warm.flow.core.constant.ExceptionCons; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.core.service.ChartService; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.core.service.InsService; import org.dromara.warm.flow.core.service.TaskService; @@ -51,7 +52,6 @@ import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @@ -68,6 +68,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { private final InsService insService; private final DefService defService; + private final ChartService chartService; private final TaskService taskService; private final FlowHisTaskMapper flowHisTaskMapper; private final FlowInstanceMapper flowInstanceMapper; @@ -248,7 +249,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { //撤销 WorkflowUtils.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus()); //判断或签节点是否有多个,只保留一个 - List currentTaskList = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); + List currentTaskList = taskService.list(FlowEngine.newTask().setInstanceId(instance.getId())); if (CollUtil.isNotEmpty(currentTaskList)) { if (currentTaskList.size() > 1) { currentTaskList.remove(0); @@ -284,14 +285,14 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { */ @Override public Map flowImage(String businessId) { - Map map = new HashMap<>(16); FlowInstance flowInstance = this.selectInstByBusinessId(businessId); - if (flowInstance == null) { + if (ObjectUtil.isNull(flowInstance)) { throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); } + Long instanceId = flowInstance.getId(); //运行中的任务 List list = new ArrayList<>(); - List flowTaskList = flwTaskService.selectByInstId(flowInstance.getId()); + List flowTaskList = flwTaskService.selectByInstId(instanceId); if (CollUtil.isNotEmpty(flowTaskList)) { List flowHisTaskVos = BeanUtil.copyToList(flowTaskList, FlowHisTaskVo.class); for (FlowHisTaskVo flowHisTaskVo : flowHisTaskVos) { @@ -312,22 +313,15 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { } //历史任务 LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(FlowHisTask::getInstanceId, flowInstance.getId()); + wrapper.eq(FlowHisTask::getInstanceId, instanceId); wrapper.eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()); wrapper.orderByDesc(FlowHisTask::getCreateTime).orderByDesc(FlowHisTask::getUpdateTime); List flowHisTasks = flowHisTaskMapper.selectList(wrapper); if (CollUtil.isNotEmpty(flowHisTasks)) { list.addAll(BeanUtil.copyToList(flowHisTasks, FlowHisTaskVo.class)); } - - map.put("list", list); - try { - String flowChart = defService.flowChart(flowInstance.getId()); - map.put("image", flowChart); - } catch (IOException e) { - throw new RuntimeException(e); - } - return map; + String flowChart = chartService.chartIns(instanceId); + return Map.of("list", list, "image", flowChart); } /**