Browse Source

[feat]

1、增加工作流权限按钮
master
杨威 2 months ago
parent
commit
f3018d48cb
  1. 4
      dk-api/api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java
  2. 4
      dk-api/api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java
  3. 8
      dk-api/api-system/src/main/java/org/dromara/system/api/RemoteDictService.java
  4. 2
      dk-auth/src/main/java/org/dromara/auth/controller/TokenController.java
  5. 2
      dk-common/common-mybatis/src/main/resources/spy.properties
  6. 6
      dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java
  7. 6
      dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml
  8. 4
      dk-modules/resource/src/main/java/org/dromara/resource/dubbo/RemoteMessageServiceImpl.java
  9. 8
      dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java
  10. 18
      dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java
  11. 23
      dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java
  12. 13
      dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java
  13. 59
      dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java
  14. 9
      dk-modules/workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java
  15. 5
      dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java
  16. 7
      dk-modules/workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java
  17. 43
      dk-modules/workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java
  18. 16
      dk-modules/workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java
  19. 8
      dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java
  20. 10
      dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java
  21. 23
      dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java
  22. 192
      dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java
  23. 206
      dk-modules/workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java
  24. 1
      dk-modules/workflow/src/main/resources/warm-flow-ui/css/index-Dcqqxojt.css
  25. BIN
      dk-modules/workflow/src/main/resources/warm-flow-ui/ico/favicon-FqvijpIH.ico
  26. 216
      dk-modules/workflow/src/main/resources/warm-flow-ui/index.html
  27. 212
      dk-modules/workflow/src/main/resources/warm-flow-ui/js/index-iDzH0SQw.js
  28. 2
      pom.xml

4
dk-api/api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java

@ -1,5 +1,7 @@
package org.dromara.resource.api;
import java.util.List;
/**
* 消息服务
*
@ -13,7 +15,7 @@ public interface RemoteMessageService {
* @param sessionKey session主键 一般为用户id
* @param message 消息文本
*/
void publishMessage(Long sessionKey, String message);
void publishMessage(List<Long> sessionKey, String message);
/**
* 发布订阅的消息(群发)

4
dk-api/api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java

@ -3,6 +3,8 @@ package org.dromara.resource.api;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
/**
* 消息服务
*
@ -21,7 +23,7 @@ public class RemoteMessageServiceStub implements RemoteMessageService {
* @param message 消息文本
*/
@Override
public void publishMessage(Long sessionKey, String message) {
public void publishMessage(List<Long> sessionKey, String message) {
try {
remoteMessageService.publishMessage(sessionKey, message);
} catch (Exception e) {

8
dk-api/api-system/src/main/java/org/dromara/system/api/RemoteDictService.java

@ -1,6 +1,7 @@
package org.dromara.system.api;
import org.dromara.system.api.domain.vo.RemoteDictDataVo;
import org.dromara.system.api.domain.vo.RemoteDictTypeVo;
import java.util.List;
@ -19,4 +20,11 @@ public interface RemoteDictService {
*/
List<RemoteDictDataVo> selectDictDataByType(String dictType);
/**
* 根据字典类型查询信息
*
* @param dictType 字典类型
* @return 字典类型
*/
RemoteDictTypeVo selectDictTypeByType(String dictType);
}

2
dk-auth/src/main/java/org/dromara/auth/controller/TokenController.java

@ -106,7 +106,7 @@ public class TokenController {
Long userId = LoginHelper.getUserId();
scheduledExecutorService.schedule(() -> {
remoteMessageService.publishMessage(userId, "欢迎登录低空产业平台管理系统");
remoteMessageService.publishMessage(List.of(userId), "欢迎登录低空产业平台管理系统");
}, 3, TimeUnit.SECONDS);
return R.ok(loginVo);
}

2
dk-common/common-mybatis/src/main/resources/spy.properties

@ -3,7 +3,7 @@ modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
#appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 取消JDBC URL前缀

6
dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java

@ -237,4 +237,10 @@ public class BusinessAlert {
//1:图片比对预警 2:AI实时预警
private Integer businessType;
/**
* 按钮权限
*/
@TableField(exist = false)
private String buttonPermission;
}

6
dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml

@ -68,8 +68,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
uu.processed_by approver,
a.id flowTaskId,
b.id instanceId,
fnData.permissions,
a.node_type
a.node_type,
fnData.buttonPermission,
fnData.permissions
from dk_business.business_alert ba
inner join dk_workflow.flow_instance b on ba.id = b.business_id
left join dk_workflow.flow_task a on a.instance_id = b.id
@ -77,6 +78,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
left join dk_workflow.flow_definition c on a.definition_id = c.id
LEFT JOIN LATERAL (
SELECT
JSON_UNQUOTE(JSON_EXTRACT(fn.ext, '$[0].value')) AS buttonPermission,
fn.permissions
FROM dk_workflow.flow_node fn
WHERE

4
dk-modules/resource/src/main/java/org/dromara/resource/dubbo/RemoteMessageServiceImpl.java

@ -28,10 +28,10 @@ public class RemoteMessageServiceImpl implements RemoteMessageService {
* @param message 消息文本
*/
@Override
public void publishMessage(Long sessionKey, String message) {
public void publishMessage(List<Long> sessionKey, String message) {
SseMessageDto dto = new SseMessageDto();
dto.setMessage(message);
dto.setUserIds(List.of(sessionKey));
dto.setUserIds(sessionKey);
SseMessageUtils.publishMessage(dto);
}

8
dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java

@ -5,7 +5,9 @@ import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.system.api.RemoteDictService;
import org.dromara.system.api.domain.vo.RemoteDictDataVo;
import org.dromara.system.api.domain.vo.RemoteDictTypeVo;
import org.dromara.system.domain.vo.SysDictDataVo;
import org.dromara.system.domain.vo.SysDictTypeVo;
import org.dromara.system.service.ISysDictTypeService;
import org.springframework.stereotype.Service;
@ -35,4 +37,10 @@ public class RemoteDictServiceImpl implements RemoteDictService {
return MapstructUtils.convert(list, RemoteDictDataVo.class);
}
@Override
public RemoteDictTypeVo selectDictTypeByType(String dictType) {
SysDictTypeVo vo = sysDictTypeService.selectDictTypeByType(dictType);
return MapstructUtils.convert(vo, RemoteDictTypeVo.class);
}
}

18
dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java

@ -29,7 +29,6 @@ import java.util.List;
*
* @author may
*/
@Tag(name = "流程分类")
@ConditionalOnEnable
@Validated
@RequiredArgsConstructor
@ -42,7 +41,7 @@ public class FlwCategoryController extends BaseController {
/**
* 查询流程分类列表
*/
@Operation(summary = "查询流程分类列表",description ="查询流程分类列表")
@SaCheckPermission("workflow:category:list")
@GetMapping("/list")
public R<List<FlowCategoryVo>> list(FlowCategoryBo bo) {
List<FlowCategoryVo> list = flwCategoryService.queryList(bo);
@ -52,7 +51,8 @@ public class FlwCategoryController extends BaseController {
/**
* 导出流程分类列表
*/
@Operation(summary = "导出流程分类列表",description ="导出流程分类列表")
@SaCheckPermission("workflow:category:export")
@Log(title = "流程分类", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(FlowCategoryBo bo, HttpServletResponse response) {
List<FlowCategoryVo> list = flwCategoryService.queryList(bo);
@ -64,7 +64,7 @@ public class FlwCategoryController extends BaseController {
*
* @param categoryId 主键
*/
@Operation(summary = "获取流程分类详细信息",description ="获取流程分类详细信息")
@SaCheckPermission("workflow:category:query")
@GetMapping("/{categoryId}")
public R<FlowCategoryVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long categoryId) {
flwCategoryService.checkCategoryDataScope(categoryId);
@ -74,7 +74,8 @@ public class FlwCategoryController extends BaseController {
/**
* 新增流程分类
*/
@Operation(summary = "新增流程分类",description ="新增流程分类")
@SaCheckPermission("workflow:category:add")
@Log(title = "流程分类", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody FlowCategoryBo category) {
@ -87,7 +88,8 @@ public class FlwCategoryController extends BaseController {
/**
* 修改流程分类
*/
@Operation(summary = "修改流程分类",description ="修改流程分类")
@SaCheckPermission("workflow:category:edit")
@Log(title = "流程分类", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody FlowCategoryBo category) {
@ -106,7 +108,8 @@ public class FlwCategoryController extends BaseController {
*
* @param categoryId 主键
*/
@Operation(summary = "删除流程分类",description ="删除流程分类")
@SaCheckPermission("workflow:category:remove")
@Log(title = "流程分类", businessType = BusinessType.DELETE)
@DeleteMapping("/{categoryId}")
public R<Void> remove(@PathVariable Long categoryId) {
if (flwCategoryService.hasChildByCategoryId(categoryId)) {
@ -123,7 +126,6 @@ public class FlwCategoryController extends BaseController {
*
* @param categoryBo 流程分类
*/
@Operation(summary = "获取流程分类树列表",description ="获取流程分类树列表")
@GetMapping("/categoryTree")
public R<List<Tree<String>>> categoryTree(FlowCategoryBo categoryBo) {
return R.ok(flwCategoryService.selectCategoryTreeList(categoryBo));

23
dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java

@ -30,7 +30,6 @@ import java.util.List;
*
* @author may
*/
@Tag(name = "流程定义管理")
@ConditionalOnEnable
@Validated
@RequiredArgsConstructor
@ -47,7 +46,6 @@ public class FlwDefinitionController extends BaseController {
* @param flowDefinition 参数
* @param pageQuery 分页
*/
@Operation(summary = "查询流程定义列表",description = "查询流程定义列表")
@GetMapping("/list")
public TableDataInfo<FlowDefinitionVo> list(FlowDefinition flowDefinition, PageQuery pageQuery) {
return flwDefinitionService.queryList(flowDefinition, pageQuery);
@ -59,7 +57,6 @@ public class FlwDefinitionController extends BaseController {
* @param flowDefinition 参数
* @param pageQuery 分页
*/
@Operation(summary = "查询未发布的流程定义列表",description = "查询未发布的流程定义列表")
@GetMapping("/unPublishList")
public TableDataInfo<FlowDefinitionVo> unPublishList(FlowDefinition flowDefinition, PageQuery pageQuery) {
return flwDefinitionService.unPublishList(flowDefinition, pageQuery);
@ -70,7 +67,6 @@ public class FlwDefinitionController extends BaseController {
*
* @param id 流程定义id
*/
@Operation(summary = "获取流程定义详细信息",description = "获取流程定义详细信息")
@GetMapping(value = "/{id}")
public R<Definition> getInfo(@PathVariable Long id) {
return R.ok(defService.getById(id));
@ -81,7 +77,7 @@ public class FlwDefinitionController extends BaseController {
*
* @param flowDefinition 参数
*/
@Operation(summary = "新增流程定义",description = "新增流程定义")
@Log(title = "流程定义", businessType = BusinessType.INSERT)
@PostMapping
@RepeatSubmit()
@Transactional(rollbackFor = Exception.class)
@ -94,7 +90,7 @@ public class FlwDefinitionController extends BaseController {
*
* @param flowDefinition 参数
*/
@Operation(summary = "修改流程定义",description = "修改流程定义")
@Log(title = "流程定义", businessType = BusinessType.UPDATE)
@PutMapping
@RepeatSubmit()
@Transactional(rollbackFor = Exception.class)
@ -107,7 +103,7 @@ public class FlwDefinitionController extends BaseController {
*
* @param id 流程定义id
*/
@Operation(summary = "发布流程定义",description = "发布流程定义")
@Log(title = "流程定义", businessType = BusinessType.INSERT)
@PutMapping("/publish/{id}")
@RepeatSubmit()
public R<Boolean> publish(@PathVariable Long id) {
@ -119,7 +115,7 @@ public class FlwDefinitionController extends BaseController {
*
* @param id 流程定义id
*/
@Operation(summary = "取消发布流程定义",description = "取消发布流程定义")
@Log(title = "流程定义", businessType = BusinessType.INSERT)
@PutMapping("/unPublish/{id}")
@RepeatSubmit()
@Transactional(rollbackFor = Exception.class)
@ -130,7 +126,7 @@ public class FlwDefinitionController extends BaseController {
/**
* 删除流程定义
*/
@Operation(summary = "删除流程定义",description = "删除流程定义")
@Log(title = "流程定义", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@PathVariable List<Long> ids) {
return toAjax(flwDefinitionService.removeDef(ids));
@ -141,7 +137,7 @@ public class FlwDefinitionController extends BaseController {
*
* @param id 流程定义id
*/
@Operation(summary = "复制流程定义",description = "复制流程定义")
@Log(title = "流程定义", businessType = BusinessType.INSERT)
@PostMapping("/copy/{id}")
@RepeatSubmit()
@Transactional(rollbackFor = Exception.class)
@ -155,7 +151,7 @@ public class FlwDefinitionController extends BaseController {
* @param file 文件
* @param category 分类
*/
@Operation(summary = "导入流程定义",description = "导入流程定义")
@Log(title = "流程定义", businessType = BusinessType.IMPORT)
@PostMapping("/importDef")
public R<Boolean> importDef(MultipartFile file, String category) {
return R.ok(flwDefinitionService.importJson(file, category));
@ -168,7 +164,7 @@ public class FlwDefinitionController extends BaseController {
* @param response 响应
* @throws IOException 异常
*/
@Operation(summary = "导出流程定义",description = "导出流程定义")
@Log(title = "流程定义", businessType = BusinessType.EXPORT)
@PostMapping("/exportDef/{id}")
public void exportDef(@PathVariable Long id, HttpServletResponse response) throws IOException {
flwDefinitionService.exportDef(id, response);
@ -179,7 +175,6 @@ public class FlwDefinitionController extends BaseController {
*
* @param id 流程定义id
*/
@Operation(summary = "获取流程定义JSON字符串",description = "获取流程定义JSON字符串")
@GetMapping("/xmlString/{id}")
public R<String> xmlString(@PathVariable Long id) {
return R.ok("操作成功", defService.exportJson(id));
@ -191,11 +186,11 @@ public class FlwDefinitionController extends BaseController {
* @param id 流程定义id
* @param active 激活/挂起
*/
@Operation(summary = "激活/挂起流程定义",description = "激活/挂起流程定义")
@RepeatSubmit()
@PutMapping("/active/{id}")
@Transactional(rollbackFor = Exception.class)
public R<Boolean> active(@PathVariable Long id, @RequestParam boolean active) {
return R.ok(active ? defService.active(id) : defService.unActive(id));
}
}

13
dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java

@ -28,7 +28,6 @@ import java.util.Map;
*
* @author may
*/
@Tag(name = "流程实例管理")
@ConditionalOnEnable
@Validated
@RequiredArgsConstructor
@ -45,7 +44,6 @@ public class FlwInstanceController extends BaseController {
* @param flowInstanceBo 流程实例
* @param pageQuery 分页
*/
@Operation(summary = "查询正在运行的流程实例列表",description = "查询正在运行的流程实例列表")
@GetMapping("/pageByRunning")
public TableDataInfo<FlowInstanceVo> selectRunningInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) {
return flwInstanceService.selectRunningInstanceList(flowInstanceBo, pageQuery);
@ -57,7 +55,6 @@ public class FlwInstanceController extends BaseController {
* @param flowInstanceBo 流程实例
* @param pageQuery 分页
*/
@Operation(summary = "查询已结束的流程实例列表",description = "查询已结束的流程实例列表")
@GetMapping("/pageByFinish")
public TableDataInfo<FlowInstanceVo> selectFinishInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) {
return flwInstanceService.selectFinishInstanceList(flowInstanceBo, pageQuery);
@ -68,7 +65,6 @@ public class FlwInstanceController extends BaseController {
*
* @param businessId 业务id
*/
@Operation(summary = "根据业务id查询流程实例详细信息",description = "根据业务id查询流程实例详细信息")
@GetMapping("/getInfo/{businessId}")
public R<FlowInstanceVo> getInfo(@PathVariable Long businessId) {
return R.ok(flwInstanceService.queryByBusinessId(businessId));
@ -79,7 +75,6 @@ public class FlwInstanceController extends BaseController {
*
* @param businessIds 业务id
*/
@Operation(summary = "按照业务id删除流程实例",description = "按照业务id删除流程实例")
@DeleteMapping("/deleteByBusinessIds/{businessIds}")
public R<Void> deleteByBusinessIds(@PathVariable List<Long> businessIds) {
return toAjax(flwInstanceService.deleteByBusinessIds(businessIds));
@ -90,7 +85,6 @@ public class FlwInstanceController extends BaseController {
*
* @param instanceIds 实例id
*/
@Operation(summary = "按照实例id删除流程实例",description = "按照实例id删除流程实例")
@DeleteMapping("/deleteByInstanceIds/{instanceIds}")
public R<Void> deleteByInstanceIds(@PathVariable List<Long> instanceIds) {
return toAjax(flwInstanceService.deleteByInstanceIds(instanceIds));
@ -101,7 +95,6 @@ public class FlwInstanceController extends BaseController {
*
* @param bo 参数
*/
@Operation(summary = "撤销流程",description = "撤销流程")
@RepeatSubmit()
@PutMapping("/cancelProcessApply")
public R<Void> cancelProcessApply(@RequestBody FlowCancelBo bo) {
@ -114,7 +107,6 @@ public class FlwInstanceController extends BaseController {
* @param id 流程实例id
* @param active 激活/挂起
*/
@Operation(summary = "激活/挂起流程实例",description = "激活/挂起流程实例")
@RepeatSubmit()
@PutMapping("/active/{id}")
public R<Boolean> active(@PathVariable Long id, @RequestParam boolean active) {
@ -127,7 +119,6 @@ public class FlwInstanceController extends BaseController {
* @param flowInstanceBo 参数
* @param pageQuery 分页
*/
@Operation(summary = "获取当前登陆人发起的流程实例",description = "获取当前登陆人发起的流程实例")
@GetMapping("/pageByCurrent")
public TableDataInfo<FlowInstanceVo> selectCurrentInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) {
return flwInstanceService.selectCurrentInstanceList(flowInstanceBo, pageQuery);
@ -138,7 +129,6 @@ public class FlwInstanceController extends BaseController {
*
* @param businessId 业务id
*/
@Operation(summary = "获取流程图,流程记录",description = "获取流程图,流程记录")
@GetMapping("/flowImage/{businessId}")
public R<Map<String, Object>> flowImage(@PathVariable String businessId) {
return R.ok(flwInstanceService.flowImage(businessId));
@ -149,7 +139,6 @@ public class FlwInstanceController extends BaseController {
*
* @param instanceId 流程实例id
*/
@Operation(summary = "获取流程变量",description = "获取流程变量")
@GetMapping("/instanceVariable/{instanceId}")
public R<Map<String, Object>> instanceVariable(@PathVariable Long instanceId) {
return R.ok(flwInstanceService.instanceVariable(instanceId));
@ -160,7 +149,7 @@ public class FlwInstanceController extends BaseController {
*
* @param bo 参数
*/
@Operation(summary = "作废流程",description = "作废流程")
@Log(title = "流程实例管理", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/invalid")
public R<Boolean> invalid(@Validated @RequestBody FlowInvalidBo bo) {

59
dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java

@ -14,6 +14,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.warm.flow.core.entity.Node;
import org.dromara.warm.flow.orm.entity.FlowNode;
import org.dromara.workflow.api.domain.RemoteStartProcessReturn;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.domain.bo.*;
@ -30,7 +31,6 @@ import java.util.List;
*
* @author may
*/
@Tag(name = "任务管理")
@ConditionalOnEnable
@Validated
@RequiredArgsConstructor
@ -45,7 +45,7 @@ public class FlwTaskController extends BaseController {
*
* @param startProcessBo 启动流程参数
*/
@Operation(summary = "启动任务",description = "启动任务")
@Log(title = "任务管理", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/startWorkFlow")
public R<RemoteStartProcessReturn> startWorkFlow(@Validated(AddGroup.class) @RequestBody StartProcessBo startProcessBo) {
@ -58,35 +58,19 @@ public class FlwTaskController extends BaseController {
*
* @param completeTaskBo 办理任务参数
*/
@Operation(summary = "办理任务",description = "办理任务")
@Log(title = "任务管理", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/completeTask")
public R<Void> completeTask(@Validated(AddGroup.class) @RequestBody CompleteTaskBo completeTaskBo) {
return toAjax(flwTaskService.completeTask(completeTaskBo));
}
/**
* 任务操作
*
* @param bo 参数
* @param taskOperation 操作类型委派 delegateTask转办 transferTask加签 addSignature减签 reductionSignature
*/
@Operation(summary = "任务操作",description = "任务操作",parameters = {
@Parameter(name = "taskOperation", description = "操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature")
})
@RepeatSubmit
@PostMapping("/taskOperation/{taskOperation}")
public R<Void> taskOperation(@Validated @RequestBody TaskOperationBo bo, @PathVariable String taskOperation) {
return toAjax(flwTaskService.taskOperation(bo, taskOperation));
}
/**
* 查询当前用户的待办任务
*
* @param flowTaskBo 参数
* @param pageQuery 分页
*/
@Operation(summary = "查询当前用户的待办任务",description = "查询当前用户的待办任务")
@GetMapping("/pageByTaskWait")
public TableDataInfo<FlowTaskVo> pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
return flwTaskService.pageByTaskWait(flowTaskBo, pageQuery);
@ -98,7 +82,7 @@ public class FlwTaskController extends BaseController {
* @param flowTaskBo 参数
* @param pageQuery 分页
*/
@Operation(summary = "查询当前用户的已办任务",description = "查询当前用户的已办任务")
@GetMapping("/pageByTaskFinish")
public TableDataInfo<FlowHisTaskVo> pageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
return flwTaskService.pageByTaskFinish(flowTaskBo, pageQuery);
@ -110,7 +94,6 @@ public class FlwTaskController extends BaseController {
* @param flowTaskBo 参数
* @param pageQuery 分页
*/
@Operation(summary = "查询待办任务",description = "查询待办任务")
@GetMapping("/pageByAllTaskWait")
public TableDataInfo<FlowTaskVo> pageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
return flwTaskService.pageByAllTaskWait(flowTaskBo, pageQuery);
@ -122,7 +105,6 @@ public class FlwTaskController extends BaseController {
* @param flowTaskBo 参数
* @param pageQuery 分页
*/
@Operation(summary = "查询已办任务",description = "查询已办任务")
@GetMapping("/pageByAllTaskFinish")
public TableDataInfo<FlowHisTaskVo> pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
return flwTaskService.pageByAllTaskFinish(flowTaskBo, pageQuery);
@ -134,7 +116,6 @@ public class FlwTaskController extends BaseController {
* @param flowTaskBo 参数
* @param pageQuery 分页
*/
@Operation(summary = "查询当前用户的抄送",description = "查询当前用户的抄送")
@GetMapping("/pageByTaskCopy")
public TableDataInfo<FlowTaskVo> pageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
return flwTaskService.pageByTaskCopy(flowTaskBo, pageQuery);
@ -145,31 +126,53 @@ public class FlwTaskController extends BaseController {
*
* @param taskId 任务id
*/
@Operation(summary = "根据taskId查询任务",description = "根据taskId查询任务")
@GetMapping("/getTask/{taskId}")
public R<FlowTaskVo> getTask(@PathVariable Long taskId) {
return R.ok(flwTaskService.selectById(taskId));
}
/**
* 获取下一节点信息
*
* @param bo 参数
*/
@PostMapping("/getNextNodeList")
public R<List<FlowNode>> getNextNodeList(@RequestBody FlowNextNodeBo bo) {
return R.ok(flwTaskService.getNextNodeList(bo));
}
/**
* 终止任务
*
* @param bo 参数
*/
@Operation(summary = "终止任务",description = "终止任务")
@Log(title = "任务管理", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/terminationTask")
public R<Boolean> terminationTask(@RequestBody FlowTerminationBo bo) {
return R.ok(flwTaskService.terminationTask(bo));
}
/**
* 任务操作
*
* @param bo 参数
* @param taskOperation 操作类型委派 delegateTask转办 transferTask加签 addSignature减签 reductionSignature
*/
@Log(title = "任务管理", businessType = BusinessType.UPDATE)
@RepeatSubmit
@PostMapping("/taskOperation/{taskOperation}")
public R<Void> taskOperation(@Validated @RequestBody TaskOperationBo bo, @PathVariable String taskOperation) {
return toAjax(flwTaskService.taskOperation(bo, taskOperation));
}
/**
* 修改任务办理人
*
* @param taskIdList 任务id
* @param userId 办理人id
*/
@Operation(summary = "修改任务办理人",description = "修改任务办理人")
@Log(title = "任务管理", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("/updateAssignee/{userId}")
public R<Void> updateAssignee(@RequestBody List<Long> taskIdList, @PathVariable String userId) {
@ -181,7 +184,7 @@ public class FlwTaskController extends BaseController {
*
* @param bo 参数
*/
@Operation(summary = "驳回审批",description = "驳回审批")
@Log(title = "任务管理", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/backProcess")
public R<Void> backProcess(@Validated({AddGroup.class}) @RequestBody BackProcessBo bo) {
@ -194,7 +197,6 @@ public class FlwTaskController extends BaseController {
* @param definitionId 流程定义id
* @param nowNodeCode 当前节点
*/
@Operation(summary = "获取可驳回的前置节点",description = "获取可驳回的前置节点")
@GetMapping("/getBackTaskNode/{definitionId}/{nowNodeCode}")
public R<List<Node>> getBackTaskNode(@PathVariable Long definitionId, @PathVariable String nowNodeCode) {
return R.ok(flwTaskService.getBackTaskNode(definitionId, nowNodeCode));
@ -205,7 +207,6 @@ public class FlwTaskController extends BaseController {
*
* @param taskId 任务id
*/
@Operation(summary = "获取当前任务的所有办理人",description = "获取当前任务的所有办理人")
@GetMapping("/currentTaskAllUser/{taskId}")
public R<List<RemoteUserVo>> currentTaskAllUser(@PathVariable Long taskId) {
return R.ok(flwTaskService.currentTaskAllUser(taskId));

9
dk-modules/workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java

@ -1,5 +1,6 @@
package org.dromara.workflow.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
@ -8,6 +9,8 @@ import lombok.EqualsAndHashCode;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
/**
* 流程分类对象 wf_category
@ -55,4 +58,10 @@ public class FlowCategory extends TenantEntity {
@TableLogic
private String delFlag;
/**
* 子菜单
*/
@TableField(exist = false)
private List<FlowCategory> children = new ArrayList<>();
}

5
dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java

@ -58,6 +58,11 @@ public class CompleteTaskBo implements Serializable {
*/
private Map<String, Object> variables;
/**
* 弹窗选择的办理人
*/
private Map<String, Object> assigneeMap;
/**
* 扩展变量(此处为逗号分隔的ossId)
* @return

7
dk-modules/workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java

@ -8,7 +8,9 @@ import org.dromara.workflow.domain.FlowCategory;
import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
@ -64,4 +66,9 @@ public class FlowCategoryVo implements Serializable {
@ExcelProperty(value = "创建时间")
private Date createTime;
/**
* 子菜单
*/
private List<FlowCategoryVo> children = new ArrayList<>();
}

43
dk-modules/workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java

@ -1,16 +1,20 @@
package org.dromara.workflow.domain.vo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.warm.flow.core.entity.User;
import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.common.enums.ButtonPermissionEnum;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
* 任务视图
@ -173,4 +177,39 @@ public class FlowTaskVo implements Serializable {
*/
@Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy")
private String createByName;
/**
* 是否为申请人节点
*/
private boolean applyNode;
/**
* 按钮权限
*/
private List<ButtonPermission> buttonList;
public List<ButtonPermission> getButtonList(String ext) {
List<ButtonPermission> buttonPermissions = Arrays.stream(ButtonPermissionEnum.values())
.map(value -> {
ButtonPermission buttonPermission = new ButtonPermission();
buttonPermission.setCode(value.getValue());
buttonPermission.setShow(false);
return buttonPermission;
})
.collect(Collectors.toList());
if (StringUtils.isNotBlank(ext)) {
List<ButtonPermission> buttonCodeList = JSONUtil.toList(JSONUtil.parseArray(ext), ButtonPermission.class);
if (CollUtil.isNotEmpty(buttonCodeList)) {
Optional<ButtonPermission> firstPermission = buttonCodeList.stream().findFirst();
firstPermission.ifPresent(permission -> {
Set<String> codeSet = Arrays.stream(permission.getValue().split(","))
.map(String::trim)
.filter(code -> !code.isEmpty())
.collect(Collectors.toSet());
buttonPermissions.forEach(bp -> bp.setShow(codeSet.contains(bp.getCode())));
});
}
}
return buttonPermissions;
}
}

16
dk-modules/workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java

@ -5,6 +5,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.warm.flow.core.entity.Node;
import org.dromara.warm.flow.orm.entity.FlowHisTask;
import org.dromara.warm.flow.orm.entity.FlowNode;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.workflow.api.domain.FlowLabelVo;
import org.dromara.workflow.api.domain.RemoteStartProcessReturn;
@ -207,4 +208,19 @@ public interface IFlwTaskService {
*/
List<Node> getByNodeCodes(String nodeCode,Long definitionId);
/**
* 获取下一节点信息
*
* @param bo 参数
*/
List<FlowNode> getNextNodeList(FlowNextNodeBo bo);
/**
* 按照节点编码查询节点
*
* @param nodeCode 节点编码
* @param definitionId 流程定义id
* @return 节点
*/
FlowNode getByNodeCode(String nodeCode, Long definitionId);
}

8
dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java

@ -4,7 +4,6 @@ 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 cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -32,12 +31,10 @@ import org.dromara.warm.flow.orm.mapper.FlowSkipMapper;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.domain.FlowCategory;
import org.dromara.workflow.domain.FlowLabel;
import org.dromara.workflow.domain.vo.FlowDefinitionVo;
import org.dromara.workflow.mapper.FlwCategoryMapper;
import org.dromara.workflow.service.FlwLabelService;
import org.dromara.workflow.service.IFlwCommonService;
import org.dromara.workflow.service.IFlwDefinitionService;
import org.dromara.workflow.utils.WorkflowUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@ -67,6 +64,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService {
private final FlowNodeMapper flowNodeMapper;
private final FlowSkipMapper flowSkipMapper;
private final FlwCategoryMapper flwCategoryMapper;
private final IFlwCommonService flwCommonService;
/**
* 查询流程定义列表
@ -128,7 +126,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService {
List<String> errorMsg = new ArrayList<>();
if (CollUtil.isNotEmpty(flowNodes)) {
for (FlowNode flowNode : flowNodes) {
String applyNodeCode = WorkflowUtils.applyNodeCode(id);
String applyNodeCode = flwCommonService.applyNodeCode(id);
if (StringUtils.isBlank(flowNode.getPermissionFlag()) && !applyNodeCode.equals(flowNode.getNodeCode()) && NodeType.BETWEEN.getKey().equals(flowNode.getNodeType())) {
errorMsg.add(flowNode.getNodeName());
}

10
dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java

@ -52,11 +52,10 @@ import org.dromara.workflow.domain.vo.FlowVariableVo;
import org.dromara.workflow.handler.FlowProcessEventHandler;
import org.dromara.workflow.mapper.FlwCategoryMapper;
import org.dromara.workflow.mapper.FlwInstanceMapper;
import org.dromara.workflow.service.IFlwCommonService;
import org.dromara.workflow.service.IFlwInstanceService;
import org.dromara.workflow.service.IFlwTaskService;
import org.dromara.workflow.utils.MinioUntil;
import org.dromara.workflow.utils.WorkflowUtils;
import org.json.JSONObject;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -84,6 +83,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
private final IFlwTaskService flwTaskService;
private final FlwInstanceMapper flwInstanceMapper;
private final FlwCategoryMapper flwCategoryMapper;
private final IFlwCommonService flwCommonService;
@DubboReference
private RemoteFileService remoteFileService;
@ -255,15 +255,15 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
}
String message = bo.getMessage();
BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus());
String applyNodeCode = WorkflowUtils.applyNodeCode(definition.getId());
String applyNodeCode = flwCommonService.applyNodeCode(definition.getId());
//撤销
WorkflowUtils.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus());
flwCommonService.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus());
//判断或签节点是否有多个,只保留一个
List<Task> currentTaskList = taskService.list(FlowEngine.newTask().setInstanceId(instance.getId()));
if (CollUtil.isNotEmpty(currentTaskList)) {
if (currentTaskList.size() > 1) {
currentTaskList.remove(0);
WorkflowUtils.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId));
flwCommonService.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId));
}
}
//删除流程实例

23
dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java

@ -1,6 +1,7 @@
package org.dromara.workflow.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -26,9 +27,7 @@ import org.dromara.workflow.common.enums.TaskAssigneeEnum;
import org.dromara.workflow.service.IFlwTaskAssigneeService;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.*;
/**
* 流程设计器-获取办理人权限设置列表
@ -137,15 +136,26 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand
@Override
public List<RemoteUserVo> fetchUsersByStorageId(String storageId) {
List<RemoteUserVo> list = new ArrayList<>();
Map<TaskAssigneeEnum, List<Long>> typeIdMap = new EnumMap<>(TaskAssigneeEnum.class);
for (String str : storageId.split(StrUtil.COMMA)) {
String[] parts = str.split(StrUtil.COLON, 2);
TaskAssigneeEnum type;
Long id;
if (parts.length < 2) {
list.addAll(getUsersByType(TaskAssigneeEnum.USER, List.of(Long.valueOf(parts[0]))));
// 无前缀时默认是用户类型
type = TaskAssigneeEnum.USER;
id = Long.valueOf(parts[0]);
} else {
list.addAll(getUsersByType(TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON), List.of(Long.valueOf(parts[1]))));
// 根据前缀解析类型(如 "role:123" -> ROLE 类型)
type = TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON);
id = Long.valueOf(parts[1]);
}
typeIdMap.computeIfAbsent(type, k -> new ArrayList<>()).add(id);
}
return list;
typeIdMap.entrySet().stream()
.filter(entry -> CollUtil.isNotEmpty(entry.getValue()))
.forEach(entry -> list.addAll(getUsersByType(entry.getKey(), entry.getValue())));
return list.stream().distinct().toList();
}
/**
@ -166,5 +176,4 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand
case POST -> remoteUserService.selectUsersByPostIds(ids);
};
}
}

192
dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java

@ -31,17 +31,18 @@ import org.dromara.warm.flow.core.entity.*;
import org.dromara.warm.flow.core.enums.NodeType;
import org.dromara.warm.flow.core.enums.SkipType;
import org.dromara.warm.flow.core.service.*;
import org.dromara.warm.flow.core.utils.ExpressionUtil;
import org.dromara.warm.flow.core.utils.MapUtil;
import org.dromara.warm.flow.orm.entity.*;
import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper;
import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper;
import org.dromara.warm.flow.orm.mapper.FlowNodeMapper;
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
import org.dromara.workflow.api.domain.FlowLabelVo;
import org.dromara.workflow.api.domain.RemoteStartProcessReturn;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.enums.MessageTypeEnum;
import org.dromara.workflow.common.enums.TaskAssigneeType;
import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.FlowLabel;
import org.dromara.workflow.domain.bo.*;
import org.dromara.workflow.domain.vo.FlowHisTaskVo;
import org.dromara.workflow.domain.vo.FlowTaskVo;
@ -49,10 +50,9 @@ import org.dromara.workflow.handler.FlowProcessEventHandler;
import org.dromara.workflow.handler.WorkflowPermissionHandler;
import org.dromara.workflow.mapper.FlwCategoryMapper;
import org.dromara.workflow.mapper.FlwTaskMapper;
import org.dromara.workflow.service.FlwLabelService;
import org.dromara.workflow.service.IFlwCommonService;
import org.dromara.workflow.service.IFlwTaskAssigneeService;
import org.dromara.workflow.service.IFlwTaskService;
import org.dromara.workflow.utils.WorkflowUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
@ -87,9 +87,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
private final FlowProcessEventHandler flowProcessEventHandler;
private final FlwTaskMapper flwTaskMapper;
private final FlwCategoryMapper flwCategoryMapper;
private final FlwLabelService flwDepartService;
private final FlowNodeMapper flowNodeMapper;
@DubboReference
private RemoteUserService remoteUserService;
private final IFlwTaskAssigneeService flwTaskAssigneeService;
private final IFlwCommonService flwCommonService;
@Autowired
private ApplicationContext applicationContext;
@ -117,6 +119,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
if (ObjectUtil.isNotNull(flowInstance)) {
BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus());
List<Task> taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId()));
taskService.mergeVariable(flowInstance, variables);
insService.updateById(flowInstance);
RemoteStartProcessReturn dto = new RemoteStartProcessReturn();
dto.setProcessInstanceId(taskList.get(0).getInstanceId());
dto.setTaskId(taskList.get(0).getId());
@ -147,6 +151,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
return dto;
}
/**
* 办理任务
*
@ -173,6 +178,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) {
flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getFlowStatus(), null, true);
}
// 设置弹窗处理人
Map<String, Object> assigneeMap = setPopAssigneeMap(completeTaskBo.getAssigneeMap(), ins.getVariableMap());
if (CollUtil.isNotEmpty(assigneeMap)) {
completeTaskBo.getVariables().putAll(assigneeMap);
}
// 构建流程参数,包括变量、跳转类型、消息、处理人、权限等信息
FlowParams flowParams = new FlowParams();
@ -199,8 +209,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
// 执行任务跳转,并根据返回的处理人设置下一步处理人
Instance instance = taskService.skip(taskId, flowParams);
this.setHandler(instance, flowTask, flowCopyList);
// 待办消息通知
WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice);
// 消息通知
try {
flwCommonService.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
//设置下一环节处理人
setNextHandler(ins.getId());
return true;
} catch (Exception e) {
log.error(e.getMessage(), e);
@ -208,6 +224,61 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
}
}
/**
* 设置下一环节处理人
*
* @param instanceId 实例ID
*/
private void setNextHandler(Long instanceId) {
Instance inst = insService.getById(instanceId);
List<FlowTask> flowTaskList = selectByInstId(instanceId);
Map<String, Object> variableMap = inst.getVariableMap();
for (FlowTask task : flowTaskList) {
if (variableMap != null && variableMap.containsKey(task.getNodeCode())) {
String userIds = variableMap.get(task.getNodeCode()).toString();
// 批量删除现有任务的办理人记录
flwCommonService.getFlowUserService().deleteByTaskIds(List.of(task.getId()));
// 批量新增任务办理人记录
Set<User> users = flwCommonService.buildFlowUser(List.of(userIds.split(StringUtils.SEPARATOR)), task.getId());
flwCommonService.getFlowUserService().saveBatch(new ArrayList<>(users));
variableMap.remove(task.getNodeCode());
}
}
taskService.mergeVariable(inst, variableMap);
}
/**
* 设置弹窗处理人
*
* @param assigneeMap 处理人
* @param variablesMap 变量
*/
private Map<String, Object> setPopAssigneeMap(Map<String, Object> assigneeMap, Map<String, Object> variablesMap) {
Map<String, Object> map = new HashMap<>();
if (CollUtil.isEmpty(assigneeMap)) {
return map;
}
for (Map.Entry<String, Object> entry : assigneeMap.entrySet()) {
if (variablesMap.containsKey(entry.getKey())) {
String userIds = variablesMap.get(entry.getKey()).toString();
if (StringUtils.isNotBlank(userIds)) {
Set<String> hashSet = new HashSet<>();
//弹窗传入的选人
List<String> popUserIds = Arrays.asList(entry.getValue().toString().split(StringUtils.SEPARATOR));
//已有的选人
List<String> variableUserIds = Arrays.asList(userIds.split(StringUtils.SEPARATOR));
hashSet.addAll(popUserIds);
hashSet.addAll(variableUserIds);
map.put(entry.getKey(), String.join(StringUtils.SEPARATOR, hashSet));
}
} else {
map.put(entry.getKey(), entry.getValue());
}
}
return map;
}
/**
* 设置办理人
*
@ -228,7 +299,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
}
List<Long> taskIdList = StreamUtils.toList(flowTasks, FlowTask::getId);
// 获取与当前任务关联的用户列表
List<User> associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList);
List<User> associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList);
if (CollUtil.isEmpty(associatedUsers)) {
return;
}
@ -237,16 +308,16 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
for (FlowTask flowTask : flowTasks) {
List<User> users = StreamUtils.filter(associatedUsers, user -> Objects.equals(user.getAssociated(), flowTask.getId()));
if (CollUtil.isNotEmpty(users)) {
userList.addAll(WorkflowUtils.buildUser(users, flowTask.getId()));
userList.addAll(flwCommonService.buildUser(users, flowTask.getId()));
}
}
// 批量删除现有任务的办理人记录
WorkflowUtils.getFlowUserService().deleteByTaskIds(taskIdList);
flwCommonService.getFlowUserService().deleteByTaskIds(taskIdList);
// 确保要保存的 userList 不为空
if (CollUtil.isEmpty(userList)) {
return;
}
WorkflowUtils.getFlowUserService().saveBatch(userList);
flwCommonService.getFlowUserService().saveBatch(userList);
}
/**
@ -286,7 +357,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
return flowUser;
}).collect(Collectors.toList());
// 批量保存抄送人员
WorkflowUtils.getFlowUserService().saveBatch(userList);
flwCommonService.getFlowUserService().saveBatch(userList);
}
/**
@ -435,7 +506,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
BusinessStatusEnum.checkBackStatus(inst.getFlowStatus());
Long definitionId = task.getDefinitionId();
Definition definition = defService.getById(definitionId);
String applyNodeCode = WorkflowUtils.applyNodeCode(definitionId);
String applyNodeCode = flwCommonService.applyNodeCode(definitionId);
FlowParams flowParams = FlowParams.build();
flowParams.nodeCode(bo.getNodeCode());
flowParams.message(message);
@ -448,7 +519,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
Instance instance = insService.getById(inst.getId());
this.setHandler(instance, task, null);
// 消息通知
WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
try {
flwCommonService.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return true;
} catch (Exception e) {
log.error(e.getMessage(), e);
@ -541,11 +617,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
flowTaskVo.setFlowCode(definition.getFlowCode());
flowTaskVo.setFlowName(definition.getFlowName());
flowTaskVo.setBusinessId(instance.getBusinessId());
List<Node> nodeList = nodeService.getByNodeCodes(Collections.singletonList(flowTaskVo.getNodeCode()), instance.getDefinitionId());
if (CollUtil.isNotEmpty(nodeList)) {
Node node = nodeList.get(0);
flowTaskVo.setNodeRatio(node.getNodeRatio());
}
//设置按钮权限
FlowNode flowNode = getByNodeCode(flowTaskVo.getNodeCode(), instance.getDefinitionId());
if (ObjectUtil.isNull(flowNode)) {
throw new NullPointerException("当前【" + flowTaskVo.getNodeCode() + "】节点编码不存在");
}
flowTaskVo.setButtonList(flowTaskVo.getButtonList(flowNode.getExt()));
flowTaskVo.setNodeRatio(flowNode.getNodeRatio());
flowTaskVo.setApplyNode(flowNode.getNodeCode().equals(flwCommonService.applyNodeCode(task.getDefinitionId())));
return flowTaskVo;
}
@ -605,15 +684,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
@Transactional(rollbackFor = Exception.class)
public boolean taskOperation(TaskOperationBo bo, String taskOperation) {
FlowParams flowParams = new FlowParams();
// 构建 JSON 对象
JSONObject extJson = new JSONObject();
extJson.put("isIllegal", ObjectUtil.isNotEmpty(bo.getIsIllegal())?bo.getIsIllegal():false);
extJson.put("alertType", bo.getAlertType());
extJson.put("alertTypeContent", bo.getAlertTypeContent());
flowParams.ext(extJson.toJSONString());
flowParams.message(bo.getMessage());
if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) {
flowParams.ignore(true);
@ -640,10 +710,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
}
Long taskId = bo.getTaskId();
FlowTaskVo flowTaskVo = selectById(taskId);
Task task = taskService.getById(taskId);
FlowNode flowNode = getByNodeCode(task.getNodeCode(), task.getDefinitionId());
if ("addSignature".equals(taskOperation) || "reductionSignature".equals(taskOperation)) {
if (flowTaskVo.getNodeRatio().compareTo(BigDecimal.ZERO) == 0) {
throw new ServiceException(flowTaskVo.getNodeName() + "不是会签节点!");
if (flowNode.getNodeRatio().compareTo(BigDecimal.ZERO) == 0) {
throw new ServiceException(task.getNodeName() + "不是会签节点!");
}
}
// 设置任务状态并执行对应的任务操作
@ -675,6 +746,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
}
}
/**
* 修改任务办理人此方法将会批量修改所有任务的办理人
*
@ -691,7 +763,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
List<FlowTask> flowTasks = this.selectByIdList(taskIdList);
// 批量删除现有任务的办理人记录
if (CollUtil.isNotEmpty(flowTasks)) {
WorkflowUtils.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId));
flwCommonService.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId));
List<User> userList = flowTasks.stream()
.map(flowTask -> {
FlowUser flowUser = new FlowUser();
@ -702,7 +774,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
})
.collect(Collectors.toList());
if (CollUtil.isNotEmpty(userList)) {
WorkflowUtils.getFlowUserService().saveBatch(userList);
flwCommonService.getFlowUserService().saveBatch(userList);
}
}
} catch (Exception e) {
@ -721,7 +793,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
public Map<Long, List<RemoteUserVo>> currentTaskAllUser(List<Long> taskIdList) {
Map<Long, List<RemoteUserVo>> map = new HashMap<>();
// 获取与当前任务关联的用户列表
List<User> associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList);
List<User> associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList);
Map<Long, List<User>> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated);
for (Map.Entry<Long, List<User>> entry : listMap.entrySet()) {
List<User> value = entry.getValue();
@ -741,13 +813,48 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
@Override
public List<RemoteUserVo> currentTaskAllUser(Long taskId) {
// 获取与当前任务关联的用户列表
List<User> userList = WorkflowUtils.getFlowUserService().getByAssociateds(Collections.singletonList(taskId));
List<User> userList = flwCommonService.getFlowUserService().getByAssociateds(Collections.singletonList(taskId));
if (CollUtil.isEmpty(userList)) {
return Collections.emptyList();
}
return remoteUserService.selectListByIds(StreamUtils.toList(userList, e -> Long.valueOf(e.getProcessedBy())));
}
/**
* 获取下一节点信息
*
* @param bo 参数
*/
@Override
public List<FlowNode> getNextNodeList(FlowNextNodeBo bo) {
Long taskId = bo.getTaskId();
Map<String, Object> variables = bo.getVariables();
Task task = taskService.getById(taskId);
Instance instance = insService.getById(task.getInstanceId());
Definition definition = defService.getById(task.getDefinitionId());
Map<String, Object> mergeVariable = MapUtil.mergeAll(instance.getVariableMap(), variables);
//获取下一节点列表
List<Node> nextNodeList = nodeService.getNextNodeList(task.getDefinitionId(), task.getNodeCode(), null, SkipType.PASS.getKey(), mergeVariable);
List<FlowNode> nextFlowNodes = BeanUtil.copyToList(nextNodeList, FlowNode.class);
if (CollUtil.isNotEmpty(nextNodeList)) {
//构建以下节点数据
List<Task> buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, null));
//办理人变量替换
ExpressionUtil.evalVariable(buildNextTaskList, mergeVariable);
for (FlowNode flowNode : nextFlowNodes) {
buildNextTaskList.stream().filter(t -> t.getNodeCode().equals(flowNode.getNodeCode())).findFirst().ifPresent(t -> {
if (CollUtil.isNotEmpty(t.getPermissionList())) {
List<RemoteUserVo> users = flwTaskAssigneeService.fetchUsersByStorageId(String.join(StringUtils.SEPARATOR, t.getPermissionList()));
if (CollUtil.isNotEmpty(users)) {
flowNode.setPermissionFlag(StreamUtils.join(users, e -> String.valueOf(e.getUserId())));
}
}
});
}
}
return nextFlowNodes;
}
/**
* 初始化流程任务
* @param taskId
@ -760,4 +867,17 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
return service.completeTask(completeTaskBo);
}
/**
* 按照节点编码查询节点
*
* @param nodeCode 节点编码
* @param definitionId 流程定义id
*/
@Override
public FlowNode getByNodeCode(String nodeCode, Long definitionId) {
return flowNodeMapper.selectOne(new LambdaQueryWrapper<FlowNode>()
.eq(FlowNode::getNodeCode, nodeCode)
.eq(FlowNode::getDefinitionId, definitionId));
}
}

206
dk-modules/workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java

@ -1,206 +0,0 @@
package org.dromara.workflow.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mail.utils.MailUtils;
import org.dromara.common.sse.dto.SseMessageDto;
import org.dromara.common.sse.utils.SseMessageUtils;
import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.warm.flow.core.constant.ExceptionCons;
import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.entity.Node;
import org.dromara.warm.flow.core.entity.Task;
import org.dromara.warm.flow.core.entity.User;
import org.dromara.warm.flow.core.enums.NodeType;
import org.dromara.warm.flow.core.enums.SkipType;
import org.dromara.warm.flow.core.service.NodeService;
import org.dromara.warm.flow.core.service.TaskService;
import org.dromara.warm.flow.core.service.UserService;
import org.dromara.warm.flow.core.utils.AssertUtil;
import org.dromara.warm.flow.orm.entity.FlowNode;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.warm.flow.orm.entity.FlowUser;
import org.dromara.warm.flow.orm.mapper.FlowNodeMapper;
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
import org.dromara.workflow.common.enums.MessageTypeEnum;
import org.dromara.workflow.service.IFlwTaskAssigneeService;
import org.dromara.workflow.service.IFlwTaskService;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 工作流工具
*
* @author may
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class WorkflowUtils {
private static final IFlwTaskAssigneeService TASK_ASSIGNEE_SERVICE = SpringUtils.getBean(IFlwTaskAssigneeService.class);
private static final IFlwTaskService FLW_TASK_SERVICE = SpringUtils.getBean(IFlwTaskService.class);
private static final FlowNodeMapper FLOW_NODE_MAPPER = SpringUtils.getBean(FlowNodeMapper.class);
private static final FlowTaskMapper FLOW_TASK_MAPPER = SpringUtils.getBean(FlowTaskMapper.class);
private static final UserService USER_SERVICE = SpringUtils.getBean(UserService.class);
private static final TaskService TASK_SERVICE = SpringUtils.getBean(TaskService.class);
private static final NodeService NODE_SERVICE = SpringUtils.getBean(NodeService.class);
/**
* 获取工作流用户service
*/
public static UserService getFlowUserService() {
return USER_SERVICE;
}
/**
* 构建工作流用户
*
* @param userList 办理用户
* @param taskId 任务ID
* @return 用户
*/
public static Set<User> buildUser(List<User> userList, Long taskId) {
if (CollUtil.isEmpty(userList)) {
return Set.of();
}
Set<User> list = new HashSet<>();
Set<String> processedBySet = new HashSet<>();
for (User user : userList) {
// 根据 processedBy 前缀判断处理人类型,分别获取用户列表
List<RemoteUserVo> users = TASK_ASSIGNEE_SERVICE.fetchUsersByStorageId(user.getProcessedBy());
// 转换为 FlowUser 并添加到结果集合
if (CollUtil.isNotEmpty(users)) {
users.forEach(dto -> {
String processedBy = String.valueOf(dto.getUserId());
if (!processedBySet.contains(processedBy)) {
FlowUser flowUser = new FlowUser();
flowUser.setType(user.getType());
flowUser.setProcessedBy(processedBy);
flowUser.setAssociated(taskId);
list.add(flowUser);
processedBySet.add(processedBy);
}
});
}
}
return list;
}
/**
* 发送消息
*
* @param flowName 流程定义名称
* @param messageType 消息类型
* @param message 消息内容为空则发送默认配置的消息内容
*/
public static void sendMessage(String flowName, Long instId, List<String> messageType, String message) {
List<RemoteUserVo> userList = new ArrayList<>();
List<FlowTask> list = FLW_TASK_SERVICE.selectByInstId(instId);
if (StringUtils.isBlank(message)) {
message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。";
}
for (Task task : list) {
List<RemoteUserVo> users = FLW_TASK_SERVICE.currentTaskAllUser(task.getId());
if (CollUtil.isNotEmpty(users)) {
userList.addAll(users);
}
}
if (CollUtil.isNotEmpty(userList)) {
for (String code : messageType) {
MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code);
if (ObjectUtil.isNotEmpty(messageTypeEnum)) {
switch (messageTypeEnum) {
case SYSTEM_MESSAGE:
SseMessageDto dto = new SseMessageDto();
dto.setUserIds(StreamUtils.toList(userList, RemoteUserVo::getUserId).stream().distinct().collect(Collectors.toList()));
dto.setMessage(message);
SseMessageUtils.publishMessage(dto);
break;
case EMAIL_MESSAGE:
MailUtils.sendText(StreamUtils.join(userList, RemoteUserVo::getEmail), "单据审批提醒", message);
break;
case SMS_MESSAGE:
//todo 短信发送
break;
default:
throw new IllegalStateException("Unexpected value: " + messageTypeEnum);
}
}
}
}
}
/**
* 驳回
*
* @param message 审批意见
* @param instanceId 流程实例id
* @param targetNodeCode 目标节点
* @param flowStatus 流程状态
* @param flowHisStatus 节点操作状态
*/
public static void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) {
List<FlowTask> list = FLW_TASK_SERVICE.selectByInstId(instanceId);
if (CollUtil.isNotEmpty(list)) {
List<FlowTask> tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(targetNodeCode));
if (list.size() == tasks.size()) {
return;
}
}
for (FlowTask task : list) {
List<RemoteUserVo> userList = FLW_TASK_SERVICE.currentTaskAllUser(task.getId());
FlowParams flowParams = FlowParams.build();
flowParams.nodeCode(targetNodeCode);
flowParams.message(message);
flowParams.skipType(SkipType.PASS.getKey());
flowParams.flowStatus(flowStatus).hisStatus(flowHisStatus);
flowParams.ignore(true);
//解决会签没权限问题
if (CollUtil.isNotEmpty(userList)) {
flowParams.handler(userList.get(0).getUserId().toString());
}
TASK_SERVICE.skip(task.getId(), flowParams);
}
//解决会签多人审批问题
backTask(message, instanceId, targetNodeCode, flowStatus, flowHisStatus);
}
/**
* 申请人节点编码
*
* @param definitionId 流程定义id
* @return 申请人节点编码
*/
public static String applyNodeCode(Long definitionId) {
//获取已发布的流程节点
List<FlowNode> flowNodes = FLOW_NODE_MAPPER.selectList(new LambdaQueryWrapper<FlowNode>().eq(FlowNode::getDefinitionId, definitionId));
AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE);
Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null);
AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE);
Node nextNode = NODE_SERVICE.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey());
return nextNode.getNodeCode();
}
/**
* 删除运行中的任务
*
* @param taskIds 任务id
*/
public static void deleteRunTask(List<Long> taskIds) {
if (CollUtil.isEmpty(taskIds)) {
return;
}
USER_SERVICE.deleteByTaskIds(taskIds);
FLOW_TASK_MAPPER.deleteByIds(taskIds);
}
}

1
dk-modules/workflow/src/main/resources/warm-flow-ui/css/index-Dcqqxojt.css

File diff suppressed because one or more lines are too long

BIN
dk-modules/workflow/src/main/resources/warm-flow-ui/ico/favicon-FqvijpIH.ico

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

216
dk-modules/workflow/src/main/resources/warm-flow-ui/index.html

@ -1,216 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="./ico/favicon-FqvijpIH.ico">
<title>Warm-Flow设计器</title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style>
html,
body,
#app {
height: 100%;
margin: 0px;
padding: 0px;
}
.chromeframe {
margin: 0.2em 0;
background: #ccc;
color: #000;
padding: 0.2em 0;
}
#loader-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 999999;
}
#loader {
display: block;
position: relative;
left: 50%;
top: 50%;
width: 150px;
height: 150px;
margin: -75px 0 0 -75px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #FFF;
-webkit-animation: spin 2s linear infinite;
-ms-animation: spin 2s linear infinite;
-moz-animation: spin 2s linear infinite;
-o-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
z-index: 1001;
}
#loader:before {
content: "";
position: absolute;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #FFF;
-webkit-animation: spin 3s linear infinite;
-moz-animation: spin 3s linear infinite;
-o-animation: spin 3s linear infinite;
-ms-animation: spin 3s linear infinite;
animation: spin 3s linear infinite;
}
#loader:after {
content: "";
position: absolute;
top: 15px;
left: 15px;
right: 15px;
bottom: 15px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #FFF;
-moz-animation: spin 1.5s linear infinite;
-o-animation: spin 1.5s linear infinite;
-ms-animation: spin 1.5s linear infinite;
-webkit-animation: spin 1.5s linear infinite;
animation: spin 1.5s linear infinite;
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
#loader-wrapper .loader-section {
position: fixed;
top: 0;
width: 51%;
height: 100%;
background: #7171C6;
z-index: 1000;
-webkit-transform: translateX(0);
-ms-transform: translateX(0);
transform: translateX(0);
}
#loader-wrapper .loader-section.section-left {
left: 0;
}
#loader-wrapper .loader-section.section-right {
right: 0;
}
.loaded #loader-wrapper .loader-section.section-left {
-webkit-transform: translateX(-100%);
-ms-transform: translateX(-100%);
transform: translateX(-100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
}
.loaded #loader-wrapper .loader-section.section-right {
-webkit-transform: translateX(100%);
-ms-transform: translateX(100%);
transform: translateX(100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
}
.loaded #loader {
opacity: 0;
-webkit-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
}
.loaded #loader-wrapper {
visibility: hidden;
-webkit-transform: translateY(-100%);
-ms-transform: translateY(-100%);
transform: translateY(-100%);
-webkit-transition: all 0.3s 1s ease-out;
transition: all 0.3s 1s ease-out;
}
.no-js #loader-wrapper {
display: none;
}
.no-js h1 {
color: #222222;
}
#loader-wrapper .load_title {
font-family: 'Open Sans';
color: #FFF;
font-size: 19px;
width: 100%;
text-align: center;
z-index: 9999999999999;
position: absolute;
top: 60%;
opacity: 1;
line-height: 30px;
}
#loader-wrapper .load_title span {
font-weight: normal;
font-style: italic;
font-size: 13px;
color: #FFF;
opacity: 0.5;
}
</style>
<script type="module" crossorigin src="./js/index-iDzH0SQw.js"></script>
<link rel="stylesheet" crossorigin href="./css/index-Dcqqxojt.css">
</head>
<body>
<div id="app">
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
<div class="load_title">正在加载系统资源,请耐心等待</div>
</div>
</div>
</body>
</html>

212
dk-modules/workflow/src/main/resources/warm-flow-ui/js/index-iDzH0SQw.js

File diff suppressed because one or more lines are too long

2
pom.xml

@ -74,7 +74,7 @@
<aliyun-oss.version>3.12.0</aliyun-oss.version>
<!--工作流配置-->
<warm-flow.version>1.6.6</warm-flow.version>
<warm-flow.version>1.6.8</warm-flow.version>
<geotools.version>23.2</geotools.version>
<!--PostgreSQL配置-->
<postgresql.version>42.6.2</postgresql.version>

Loading…
Cancel
Save