From f0b758340483392d66ebc802a9c09d4506c5885c Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sat, 6 Nov 2021 10:22:45 +0800 Subject: [PATCH] 包名从activiti 改成 bpm --- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/OALeaveController.java | 116 -------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveBaseVO.java | 48 ------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveCreateReqVO.java | 13 ------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveExcelVO.java | 44 -------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveExportReqVO.java | 54 ------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeavePageReqVO.java | 56 -------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveRespVO.java | 15 --------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveUpdateReqVO.java | 32 -------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/ProcessDefinitionController.java | 34 ---------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/TaskController.java | 72 ------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskHandleVO.java | 19 ------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskQueryReqVO.java | 15 --------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskReqVO.java | 17 ----------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskStepVO.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TodoTaskPageReqVO.java | 16 ---------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TodoTaskRespVO.java | 34 ---------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/oa/OALeaveConvert.java | 34 ---------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/workflow/TaskConvert.java | 39 --------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/oa/OALeaveDO.java | 60 ------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/process/ProcessDefinitionDO.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/mysql/oa/OALeaveMapper.java | 46 ---------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/enums/OAErrorCodeConstants.java | 13 ------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/config/UserGroupManagerService.java | 62 -------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/config/UserGroupsProvider.java | 31 ------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/OALeaveService.java | 76 ---------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/ReportBackEndProcessor.java | 30 ------------------------------ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/impl/OALeaveServiceImpl.java | 138 ------------------------------------------------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/process/ProcessService.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/process/impl/ProcessServiceImpl.java | 109 ------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/TaskService.java | 34 ---------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/impl/TaskServiceImpl.java | 356 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/OALeaveController.java | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveBaseVO.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveCreateReqVO.java | 13 +++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveExcelVO.java | 44 ++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveExportReqVO.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeavePageReqVO.java | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveRespVO.java | 15 +++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveUpdateReqVO.java | 32 ++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/ProcessDefinitionController.java | 34 ++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/TaskController.java | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskHandleVO.java | 19 +++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskQueryReqVO.java | 15 +++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskReqVO.java | 17 +++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskStepVO.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TodoTaskPageReqVO.java | 16 ++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TodoTaskRespVO.java | 37 +++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/OALeaveConvert.java | 37 +++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/workflow/TaskConvert.java | 40 ++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/OALeaveDO.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/process/ProcessDefinitionDO.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/OALeaveMapper.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/oa/OAErrorCodeConstants.java | 13 +++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/config/UserGroupManagerService.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/config/UserGroupsProvider.java | 31 +++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/OALeaveService.java | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/ReportBackEndProcessor.java | 30 ++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/OALeaveServiceImpl.java | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/process/ProcessService.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/process/impl/ProcessServiceImpl.java | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/TaskService.java | 34 ++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/impl/TaskServiceImpl.java | 353 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-ui/src/views/oa/leave/approve-hr/index.vue | 11 ++++++++--- yudao-admin-ui/src/views/oa/todo/index.vue | 21 ++------------------- 64 files changed, 1710 insertions(+), 1717 deletions(-) delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/OALeaveController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeavePageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/ProcessDefinitionController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/TaskController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskHandleVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskQueryReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskStepVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TodoTaskPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TodoTaskRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/oa/OALeaveConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/workflow/TaskConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/oa/OALeaveDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/process/ProcessDefinitionDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/mysql/oa/OALeaveMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/enums/OAErrorCodeConstants.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/config/UserGroupManagerService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/config/UserGroupsProvider.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/OALeaveService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/ReportBackEndProcessor.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/impl/OALeaveServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/process/ProcessService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/process/impl/ProcessServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/TaskService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/impl/TaskServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/OALeaveController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeavePageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/ProcessDefinitionController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/TaskController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskHandleVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskQueryReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskStepVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TodoTaskPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TodoTaskRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/OALeaveConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/workflow/TaskConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/OALeaveDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/process/ProcessDefinitionDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/OALeaveMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/oa/OAErrorCodeConstants.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/config/UserGroupManagerService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/config/UserGroupsProvider.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/OALeaveService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/ReportBackEndProcessor.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/OALeaveServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/process/ProcessService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/process/impl/ProcessServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/TaskService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/impl/TaskServiceImpl.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/OALeaveController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/OALeaveController.java deleted file mode 100644 index 2980bc1..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/OALeaveController.java +++ /dev/null @@ -1,116 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa; - -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*; -import cn.iocoder.yudao.adminserver.modules.activiti.convert.oa.OALeaveConvert; -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OALeaveDO; -import cn.iocoder.yudao.adminserver.modules.activiti.service.oa.OALeaveService; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.Collection; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - - -@Api(tags = "请假申请") -@RestController -@RequestMapping("/oa/leave") -@Validated -public class OALeaveController { - - @Resource - private OALeaveService leaveService; - - @PostMapping("/create") - @ApiOperation("创建请假申请") - @PreAuthorize("@ss.hasPermission('oa:leave:create')") - public CommonResult createLeave(@Valid @RequestBody OALeaveCreateReqVO createReqVO) { - // TODO @芋艿:processKey 自己去理解下。不过得把 leave 变成枚举 - // TODO @芋艿 该方法没有用到, 是前一个版本的, 可以删掉。 - createReqVO.setProcessKey("leave"); - return success(leaveService.createLeave(createReqVO)); - } - - @PostMapping("/form-key/create") - @ApiOperation("创建外置请假申请") - public CommonResult createFormKeyLeave(@Valid @RequestBody OALeaveCreateReqVO createReqVO) { - // TODO @芋艿:processKey 自己去理解下。不过得把 formkey 变成枚举 - // TODO @芋艿 : processKey 是 bpmn 中定义的id, 提交业务表单时候, 需要启动流程, 或许从前台传更合适 - createReqVO.setProcessKey("leave-formkey"); - return success(leaveService.createLeave(createReqVO)); - } - - @PutMapping("/update") - @ApiOperation("更新请假申请") - @PreAuthorize("@ss.hasPermission('oa:leave:update')") - public CommonResult updateLeave(@Valid @RequestBody OALeaveUpdateReqVO updateReqVO) { - leaveService.updateLeave(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除请假申请") - @ApiImplicitParam(name = "id", value = "编号", required = true) - @PreAuthorize("@ss.hasPermission('oa:leave:delete')") - public CommonResult deleteLeave(@RequestParam("id") Long id) { - leaveService.deleteLeave(id); - return success(true); - } - - @GetMapping("/get") - @ApiOperation("获得请假申请") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('oa:leave:query')") - public CommonResult getLeave(@RequestParam("id") Long id) { - OALeaveDO leave = leaveService.getLeave(id); - return success(OALeaveConvert.INSTANCE.convert(leave)); - } - - @GetMapping("/list") - @ApiOperation("获得请假申请列表") - @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) - @PreAuthorize("@ss.hasPermission('oa:leave:query')") - public CommonResult> getLeaveList(@RequestParam("ids") Collection ids) { - List list = leaveService.getLeaveList(ids); - return success(OALeaveConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/page") - @ApiOperation("获得请假申请分页") - @PreAuthorize("@ss.hasPermission('oa:leave:query')") - public CommonResult> getLeavePage(@Valid OALeavePageReqVO pageVO) { - //值查询自己申请请假 - // TODO @芋艿:这里的传值,到底前端搞,还是后端搞。 - pageVO.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername()); - PageResult pageResult = leaveService.getLeavePage(pageVO); - return success(OALeaveConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/export-excel") - @ApiOperation("导出请假申请 Excel") - @PreAuthorize("@ss.hasPermission('oa:leave:export')") - @OperateLog(type = EXPORT) - public void exportLeaveExcel(@Valid OALeaveExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = leaveService.getLeaveList(exportReqVO); - // 导出 Excel - List datas = OALeaveConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "请假申请.xls", "数据", OALeaveExcelVO.class, datas); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveBaseVO.java deleted file mode 100644 index bf88ec7..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveBaseVO.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; - -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; -import javax.validation.constraints.*; -import org.springframework.format.annotation.DateTimeFormat; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** -* 请假申请 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class OALeaveBaseVO { - - @ApiModelProperty(value = "流程id") - private String processInstanceId; - - @ApiModelProperty(value = "状态", required = true) - private Integer status; - - @ApiModelProperty(value = "申请人id", required = true) - private String userId; - - @ApiModelProperty(value = "开始时间", required = true) - @NotNull(message = "开始时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date startTime; - - @ApiModelProperty(value = "结束时间", required = true) - @NotNull(message = "结束时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - - @ApiModelProperty(value = "请假类型") - private String leaveType; - - @ApiModelProperty(value = "原因") - private String reason; - - @ApiModelProperty(value = "申请时间", required = true) - @NotNull(message = "申请时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date applyTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveCreateReqVO.java deleted file mode 100644 index 956100f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveCreateReqVO.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; - -import lombok.*; -import io.swagger.annotations.*; - -@ApiModel("请假申请创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class OALeaveCreateReqVO extends OALeaveBaseVO { - - private String processKey; -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveExcelVO.java deleted file mode 100644 index d305ef6..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveExcelVO.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; - -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; - -import com.alibaba.excel.annotation.ExcelProperty; - -/** - * 请假申请 Excel VO - * - * @author 芋艿 - */ -@Data -public class OALeaveExcelVO { - - @ExcelProperty("请假表单主键") - private Long id; - - @ExcelProperty("流程id") - private String processInstanceId; - - @ExcelProperty("状态") - private Integer status; - - @ExcelProperty("申请人id") - private String userId; - - @ExcelProperty("开始时间") - private Date startTime; - - @ExcelProperty("结束时间") - private Date endTime; - - @ExcelProperty("请假类型") - private String leaveType; - - @ExcelProperty("原因") - private String reason; - - @ExcelProperty("申请时间") - private Date applyTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveExportReqVO.java deleted file mode 100644 index 92d0f43..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveExportReqVO.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; - -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import org.springframework.format.annotation.DateTimeFormat; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel(value = "请假申请 Excel 导出 Request VO", description = "参数和 OaLeavePageReqVO 是一致的") -@Data -public class OALeaveExportReqVO { - - @ApiModelProperty(value = "流程id") - private String processInstanceId; - - @ApiModelProperty(value = "状态") - private Integer status; - - @ApiModelProperty(value = "申请人id") - private String userId; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始开始时间") - private Date beginStartTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束开始时间") - private Date endStartTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始结束时间") - private Date beginEndTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束结束时间") - private Date endEndTime; - - @ApiModelProperty(value = "请假类型") - private String leaveType; - - @ApiModelProperty(value = "原因") - private String reason; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始申请时间") - private Date beginApplyTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束申请时间") - private Date endApplyTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeavePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeavePageReqVO.java deleted file mode 100644 index 5c3306d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeavePageReqVO.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; - -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import org.springframework.format.annotation.DateTimeFormat; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("请假申请分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class OALeavePageReqVO extends PageParam { - - @ApiModelProperty(value = "流程id") - private String processInstanceId; - - @ApiModelProperty(value = "状态") - private Integer status; - - @ApiModelProperty(value = "申请人id") - private String userId; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始开始时间") - private Date beginStartTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束开始时间") - private Date endStartTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始结束时间") - private Date beginEndTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束结束时间") - private Date endEndTime; - - @ApiModelProperty(value = "请假类型") - private String leaveType; - - @ApiModelProperty(value = "原因") - private String reason; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始申请时间") - private Date beginApplyTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束申请时间") - private Date endApplyTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveRespVO.java deleted file mode 100644 index fe9c8d3..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveRespVO.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; - -import lombok.*; -import io.swagger.annotations.*; - -@ApiModel("请假申请 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class OALeaveRespVO extends OALeaveBaseVO { - - @ApiModelProperty(value = "请假表单主键", required = true) - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveUpdateReqVO.java deleted file mode 100644 index 649e56d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveUpdateReqVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; -import java.util.Map; - -@ApiModel("请假申请更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class OALeaveUpdateReqVO extends OALeaveBaseVO { - - @ApiModelProperty(value = "请假表单主键", required = true) - @NotNull(message = "请假表单主键不能为空") - private Long id; - - // TODO @json:swagger 和 validator 的注解要加哈。 - - private String taskId; - - private String comment; - - private Map variables; - - // TODO @芋艿:variables 的作用是啥。 - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/ProcessDefinitionController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/ProcessDefinitionController.java deleted file mode 100644 index a47867c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/ProcessDefinitionController.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import org.activiti.api.process.runtime.ProcessRuntime; -import org.activiti.engine.RepositoryService; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - -// TODO @json:swagger 和 validation 的注解,后续要补全下哈。可以等 workflow 基本写的差不多之后 -@RestController -@RequestMapping("/workflow/process/definition") -public class ProcessDefinitionController { - - @Resource - private RepositoryService repositoryService; - - @Resource - private ProcessRuntime processRuntime; - - - @GetMapping(value = "/getStartForm") - public CommonResult getStartForm(@RequestParam("processKey") String processKey){ - //这样查似乎有问题??, 暂时写死 -// final ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery(). -// processDefinitionKey(processKey).latestVersion().singleResult(); -// processRuntime.processDefinition(processDefinition.getId()).getFormKey(); - return CommonResult.success("/flow/leave/apply"); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/TaskController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/TaskController.java deleted file mode 100644 index e28a9c8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/TaskController.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow; - -import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.*; -import cn.iocoder.yudao.adminserver.modules.activiti.service.workflow.TaskService; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -// TODO @json:swagger 和 validation 的注解,后续要补全下哈。可以等 workflow 基本写的差不多之后 -@Api(tags = "工作流待办任务") -@RestController -@RequestMapping("/workflow/task") -public class TaskController { - - @Resource - private TaskService taskService; - - @GetMapping("/todo/page") - @ApiOperation("获取待办任务分页") - public CommonResult> getTodoTaskPage(@Valid TodoTaskPageReqVO pageVO) { - return success(taskService.getTodoTaskPage(pageVO)); - } - - @GetMapping("/claim") - @ApiOperation("签收任务") - public CommonResult claimTask(@RequestParam("id") String taskId) { - taskService.claimTask(taskId); - return success(true); - } - - @PostMapping("/task-steps") - public CommonResult getTaskSteps(@RequestBody TaskQueryReqVO taskQuery) { - return success(taskService.getTaskSteps(taskQuery)); - } - - @PostMapping("/formKey") - public CommonResult getTaskFormKey(@RequestBody TaskQueryReqVO taskQuery) { - return success(taskService.getTaskFormKey(taskQuery)); - } - - @PostMapping("/complete") - public CommonResult complete(@RequestBody TaskReqVO taskReq) { - taskService.completeTask(taskReq); - return success(true); - } - - @GetMapping("/process/history-steps") - public CommonResult> getHistorySteps(@RequestParam("id") String processInstanceId) { - return success(taskService.getHistorySteps(processInstanceId)); - } - - /** - * 返回高亮的流转图SVG - * @param processInstanceId - */ - @GetMapping("/process/highlight-img/{id}") - public void getHighlightImg(@PathVariable("id") String processInstanceId, HttpServletResponse response) { - taskService.getHighlightImg(processInstanceId, response); - } - - - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskHandleVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskHandleVO.java deleted file mode 100644 index 3ef40fa..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskHandleVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo; - -import lombok.Data; -import lombok.ToString; - -import java.util.List; - -@Data -@ToString -public class TaskHandleVO { - - private Object formObject; - - - private List historyTask; - - - private String taskVariable; -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskQueryReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskQueryReqVO.java deleted file mode 100644 index fab24a9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskQueryReqVO.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString -public class TaskQueryReqVO { - - private String processKey; - - private String taskId; - - private String businessKey; -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskReqVO.java deleted file mode 100644 index 8e3eb60..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskReqVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo; - -import lombok.Data; -import lombok.ToString; - -import java.util.Map; - -@Data -@ToString -public class TaskReqVO { - - private String taskId; - - private Map variables; - - private String comment; -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskStepVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskStepVO.java deleted file mode 100644 index b1bb93a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskStepVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo; - -import lombok.Data; -import lombok.ToString; - -import java.util.Date; - -@Data -@ToString -public class TaskStepVO { - - private String stepName; - - private Date startTime; - - private Date endTime; - - private String assignee; - - private String comment; - - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TodoTaskPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TodoTaskPageReqVO.java deleted file mode 100644 index b5dddbc..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TodoTaskPageReqVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel("待办任务申请分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class TodoTaskPageReqVO extends PageParam { - - private String assignee; -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TodoTaskRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TodoTaskRespVO.java deleted file mode 100644 index 11af4e8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TodoTaskRespVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.ToString; - -@ApiModel("待办任务 Response VO") -@Data -@ToString -public class TodoTaskRespVO { - - // TODO @jason:swagger 注解。这样接口文档才完整哈 - - private String id; - - /** - * 1:未签收 - * 2:已签收 - */ - private Integer status; - - - private String processName; - - - private String processKey; - - - private String businessKey; - - - private String formKey; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/oa/OALeaveConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/oa/OALeaveConvert.java deleted file mode 100644 index 4815138..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/oa/OALeaveConvert.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.convert.oa; - -import java.util.*; - -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OALeaveDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; - -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*; - -/** - * 请假申请 Convert - * - * @author 芋艿 - */ -@Mapper -public interface OALeaveConvert { - - OALeaveConvert INSTANCE = Mappers.getMapper(OALeaveConvert.class); - - OALeaveDO convert(OALeaveCreateReqVO bean); - - OALeaveDO convert(OALeaveUpdateReqVO bean); - - OALeaveRespVO convert(OALeaveDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/workflow/TaskConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/workflow/TaskConvert.java deleted file mode 100644 index d461eb9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/workflow/TaskConvert.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.convert.workflow; - -import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.TaskStepVO; -import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.TodoTaskRespVO; -import org.activiti.api.task.model.Task; -import org.activiti.engine.history.HistoricActivityInstance; -import org.activiti.engine.repository.ProcessDefinition; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.Named; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface TaskConvert { - TaskConvert INSTANCE = Mappers.getMapper(TaskConvert.class); - - @Mappings(value = { - @Mapping(source = "task.id", target = "id"), - @Mapping(source = "task.businessKey", target = "businessKey"), - @Mapping(source = "task.assignee", target = "status",qualifiedByName = "convertAssigneeToStatus"), - @Mapping(source = "definition.name", target = "processName"), - @Mapping(source = "definition.key", target = "processKey") - }) - TodoTaskRespVO convert(Task task, ProcessDefinition definition); - - - @Named("convertAssigneeToStatus") - default Integer convertAssigneeToStatus(String assignee) { - //TODO 不应该通过 assignee 定义状态 需要定义更多的状态 - return assignee == null ? 1 : 2; - } - - @Mappings(value = { - @Mapping(source = "activityName", target = "stepName"), - @Mapping(source = "assignee", target = "assignee") - }) - TaskStepVO convert(HistoricActivityInstance instance); -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/oa/OALeaveDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/oa/OALeaveDO.java deleted file mode 100644 index c3d760c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/oa/OALeaveDO.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa; - -import lombok.*; -import java.util.*; -import com.baomidou.mybatisplus.annotation.*; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; - -/** - * 请假申请 DO - * - * @author 芋艿 - */ -@TableName("oa_leave") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class OALeaveDO extends BaseDO { - - /** - * 请假表单主键 - */ - @TableId - private Long id; - /** - * 流程id - */ - private String processInstanceId; - /** - * 状态 - */ - private Integer status; - /** - * 申请人id - */ - private String userId; - /** - * 开始时间 - */ - private Date startTime; - /** - * 结束时间 - */ - private Date endTime; - /** - * 请假类型 - */ - private String leaveType; - /** - * 原因 - */ - private String reason; - /** - * 申请时间 - */ - private Date applyTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/process/ProcessDefinitionDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/process/ProcessDefinitionDO.java deleted file mode 100644 index 7913d1e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/process/ProcessDefinitionDO.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.process; - -/** - * 流程模型实体类 映射 activiti ProcessDefinition接口 - * - * @author ZJQ - * @date 2021/9/7 23:23 - */ -public class ProcessDefinitionDO { - - private String id; - - private String category; - - private String key; - - private String name; - - private String version; - - private String resourceName; - - private String deploymentId; - - private String diagramResourceName; - - private boolean suspended; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/mysql/oa/OALeaveMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/mysql/oa/OALeaveMapper.java deleted file mode 100644 index adf1a25..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/mysql/oa/OALeaveMapper.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa; - -import java.util.*; - -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OALeaveDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*; - -/** - * 请假申请 Mapper - * - * @author 芋艿 - */ -@Mapper -public interface OALeaveMapper extends BaseMapperX { - - default PageResult selectPage(OALeavePageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .eqIfPresent("process_instance_id", reqVO.getProcessInstanceId()) - .eqIfPresent("status", reqVO.getStatus()) - .eqIfPresent("user_id", reqVO.getUserId()) - .betweenIfPresent("start_time", reqVO.getBeginStartTime(), reqVO.getEndStartTime()) - .betweenIfPresent("end_time", reqVO.getBeginEndTime(), reqVO.getEndEndTime()) - .eqIfPresent("leave_type", reqVO.getLeaveType()) - .eqIfPresent("reason", reqVO.getReason()) - .betweenIfPresent("apply_time", reqVO.getBeginApplyTime(), reqVO.getEndApplyTime()) - .orderByDesc("id") ); - } - - default List selectList(OALeaveExportReqVO reqVO) { - return selectList(new QueryWrapperX() - .eqIfPresent("process_instance_id", reqVO.getProcessInstanceId()) - .eqIfPresent("status", reqVO.getStatus()) - .eqIfPresent("user_id", reqVO.getUserId()) - .betweenIfPresent("start_time", reqVO.getBeginStartTime(), reqVO.getEndStartTime()) - .betweenIfPresent("end_time", reqVO.getBeginEndTime(), reqVO.getEndEndTime()) - .eqIfPresent("leave_type", reqVO.getLeaveType()) - .eqIfPresent("reason", reqVO.getReason()) - .betweenIfPresent("apply_time", reqVO.getBeginApplyTime(), reqVO.getEndApplyTime()) - .orderByDesc("id") ); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/enums/OAErrorCodeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/enums/OAErrorCodeConstants.java deleted file mode 100644 index 9a042fc..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/enums/OAErrorCodeConstants.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.enums; - -import cn.iocoder.yudao.framework.common.exception.ErrorCode; -/** - * activiti 系统 错误码枚举类 - * - * 003 activiti - * 001 oa - * activiti 系统,使用 1-003-000-000 段 - */ -public interface OAErrorCodeConstants { - ErrorCode LEAVE_NOT_EXISTS = new ErrorCode(1003001001, "请假申请不存在"); -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/config/UserGroupManagerService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/config/UserGroupManagerService.java deleted file mode 100644 index 14450e3..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/config/UserGroupManagerService.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.service.config; - - -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; -import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import org.activiti.api.runtime.shared.identity.UserGroupManager; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.stereotype.Service; - - -import javax.annotation.Resource; -import java.util.*; -import java.util.stream.Collectors; - -import static java.util.Collections.singleton; - -@Service -public class UserGroupManagerService implements UserGroupManager { - - @Resource - private UserDetailsService userDetailsService; - - @Resource - private SysUserService userService; - - @Resource - private SysPostService sysPostService; - - /** - * 暂时使用岗位来代替 - * @param userId - * @return - */ - @Override - public List getUserGroups(String userId) { -// final LoginUser loginUser = (LoginUser) userDetailsService.loadUserByUsername(userId); -// final Long id = loginUser.getId(); - final SysUserDO user = userService.getUserByUsername(userId); - return sysPostService.getPosts(user.getPostIds()).stream().map(post -> post.getCode()).collect(Collectors.toList()); - - } - - @Override - public List getUserRoles(String userId) { - return Arrays.asList("ROLE_ACTIVITI_USER"); - } - - @Override - public List getGroups() { - throw new UnsupportedOperationException("getGroups is now un supported"); - } - - @Override - public List getUsers() { - throw new UnsupportedOperationException("getGroups is now un supported"); - } -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/config/UserGroupsProvider.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/config/UserGroupsProvider.java deleted file mode 100644 index 3f8b552..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/config/UserGroupsProvider.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.service.config; - -import cn.iocoder.yudao.framework.security.core.LoginUser; -import org.activiti.api.runtime.shared.security.PrincipalGroupsProvider; -import org.springframework.security.core.Authentication; -import org.springframework.stereotype.Service; - -import java.security.Principal; -import java.util.Collections; -import java.util.List; - -@Service -public class UserGroupsProvider implements PrincipalGroupsProvider { - - @Override - public List getGroups(Principal principal) { - - if(principal instanceof Authentication){ - Authentication authentication = (Authentication) principal; - final Object user = authentication.getPrincipal(); - if( user instanceof LoginUser){ - return ((LoginUser) user).getGroups(); - }else{ - return Collections.emptyList(); - } - }else{ - return Collections.emptyList(); - } - - } -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/OALeaveService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/OALeaveService.java deleted file mode 100644 index 6d3ae36..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/OALeaveService.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.service.oa; - - -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeaveCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeaveUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeaveExportReqVO; -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeavePageReqVO; -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OALeaveDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 请假申请 Service 接口 - * - * @author 芋艿 - */ -public interface OALeaveService { - - /** - * 创建请假申请 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createLeave(@Valid OALeaveCreateReqVO createReqVO); - - /** - * 更新请假申请 - * - * @param updateReqVO 更新信息 - */ - void updateLeave(@Valid OALeaveUpdateReqVO updateReqVO); - - /** - * 删除请假申请 - * - * @param id 编号 - */ - void deleteLeave(Long id); - - /** - * 获得请假申请 - * - * @param id 编号 - * @return 请假申请 - */ - OALeaveDO getLeave(Long id); - - /** - * 获得请假申请列表 - * - * @param ids 编号 - * @return 请假申请列表 - */ - List getLeaveList(Collection ids); - - /** - * 获得请假申请分页 - * - * @param pageReqVO 分页查询 - * @return 请假申请分页 - */ - PageResult getLeavePage(OALeavePageReqVO pageReqVO); - - /** - * 获得请假申请列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 请假申请列表 - */ - List getLeaveList(OALeaveExportReqVO exportReqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/ReportBackEndProcessor.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/ReportBackEndProcessor.java deleted file mode 100644 index 4da877d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/ReportBackEndProcessor.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.service.oa; - -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OALeaveDO; -import cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa.OALeaveMapper; -import org.activiti.engine.delegate.DelegateExecution; -import org.activiti.engine.delegate.ExecutionListener; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; - -// TODO @jason:类注释 -@Component -public class ReportBackEndProcessor implements ExecutionListener { - - @Resource - private OALeaveMapper leaveMapper; - - @Override - @Transactional(rollbackFor = Exception.class) - public void notify(DelegateExecution delegateExecution) { - final String businessKey = delegateExecution.getProcessInstanceBusinessKey(); - OALeaveDO updateDo = new OALeaveDO(); - updateDo.setId(Long.valueOf(businessKey)); - // TODO @json:status 要枚举起来,不要出现 magic number - updateDo.setStatus(2); - leaveMapper.updateById(updateDo); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/impl/OALeaveServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/impl/OALeaveServiceImpl.java deleted file mode 100644 index 8d113c2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/impl/OALeaveServiceImpl.java +++ /dev/null @@ -1,138 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.service.oa.impl; - -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeaveCreateReqVO; -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeaveUpdateReqVO; -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeaveExportReqVO; -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeavePageReqVO; -import cn.iocoder.yudao.adminserver.modules.activiti.convert.oa.OALeaveConvert; -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OALeaveDO; -import cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa.OALeaveMapper; -import cn.iocoder.yudao.adminserver.modules.activiti.service.oa.OALeaveService; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; -import org.activiti.api.task.model.Task; -import org.activiti.api.task.model.builders.TaskPayloadBuilder; -import org.activiti.api.task.runtime.TaskRuntime; -import org.activiti.engine.RuntimeService; -import org.activiti.engine.runtime.ProcessInstance; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.*; - -import static cn.iocoder.yudao.adminserver.modules.activiti.enums.OAErrorCodeConstants.LEAVE_NOT_EXISTS; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - -/** - * 请假申请 Service 实现类 - * - * @author 芋艿 - */ -@Service -@Validated -public class OALeaveServiceImpl implements OALeaveService { - - @Resource - private OALeaveMapper leaveMapper; - - @Resource - private RuntimeService runtimeService; - - @Resource - private org.activiti.engine.TaskService activitiTaskService; - - @Resource - private TaskRuntime taskRuntime; - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createLeave(OALeaveCreateReqVO createReqVO) { - // 插入 OA 请假单 - OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO); - leave.setStatus(1); - // TODO @jason:应该是存储 userId?? - leave.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername()); - leaveMapper.insert(leave); - - // 创建工作流 - Map variables = new HashMap<>(); - // 如何得到部门领导人,暂时写死 - variables.put("deptLeader", "admin"); // TODO @芋艿:需要部门的负责人 - Long id = leave.getId(); - String businessKey = String.valueOf(id); - ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(createReqVO.getProcessKey(), businessKey, variables); - String processInstanceId = processInstance.getProcessInstanceId(); - - // 将工作流的编号,更新到 OA 请假单中 - OALeaveDO updateDo = new OALeaveDO(); - updateDo.setProcessInstanceId(processInstanceId); - updateDo.setId(id); - leaveMapper.updateById(updateDo); - return id; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateLeave(OALeaveUpdateReqVO updateReqVO) { - // 校验存在 - this.validateLeaveExists(updateReqVO.getId()); - - final Task task = taskRuntime.task(updateReqVO.getTaskId()); - activitiTaskService.addComment(task.getId(), task.getProcessInstanceId(), updateReqVO.getComment()); - Map variables = updateReqVO.getVariables(); - - //如何得到部门领导人, 暂时写死 - variables.put("deptLeader", "admin"); - taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId()) - .withVariables(variables) - .build()); - - // TOTO @芋道源码 貌似 IDEA 会自动加上final(不需要加 final 哈。虽然是不变,但是代码比较少这么去写) - Object reApply = variables.get("reApply"); - if(Objects.equals(reApply, true)){ - // 更新 表单 - OALeaveDO updateObj = OALeaveConvert.INSTANCE.convert(updateReqVO); - leaveMapper.updateById(updateObj); - } - } - - @Override - public void deleteLeave(Long id) { - // 校验存在 - this.validateLeaveExists(id); - // 删除 - leaveMapper.deleteById(id); - // TODO @jason:需要调用 runtimeService 的 delete 方法,删除??? - // TOTO @芋道源码 目前页面暂时没有实现基于业务表单的删除, 该代码自动生成的。 - // TODO @芋道源码 我理解提交流程后,是不允许删除的? , 只能在流程处理中作废流程 - } - - private void validateLeaveExists(Long id) { - if (leaveMapper.selectById(id) == null) { - throw exception(LEAVE_NOT_EXISTS); - } - } - - @Override - public OALeaveDO getLeave(Long id) { - return leaveMapper.selectById(id); - } - - @Override - public List getLeaveList(Collection ids) { - return leaveMapper.selectBatchIds(ids); - } - - @Override - public PageResult getLeavePage(OALeavePageReqVO pageReqVO) { - return leaveMapper.selectPage(pageReqVO); - } - - @Override - public List getLeaveList(OALeaveExportReqVO exportReqVO) { - return leaveMapper.selectList(exportReqVO); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/process/ProcessService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/process/ProcessService.java deleted file mode 100644 index bd82935..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/process/ProcessService.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.service.process; - -import org.springframework.web.multipart.MultipartFile; - -/** - * 流程基础管理 - * - * @author ZJQ - * @date 2021/9/5 21:00 - */ -public interface ProcessService { - - /** - * 上传流程文件,进行流程模型部署 - * @param multipartFile 上传文件 - */ - void deployProcess(MultipartFile multipartFile); - - - /** - * 激活或者挂起流程模型实体 - * @param processDefinitionId 流程模型实体id - * @param type 类型 - * @return 状态 - */ - String setActivOrHang(String processDefinitionId,String type); - - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/process/impl/ProcessServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/process/impl/ProcessServiceImpl.java deleted file mode 100644 index 2e3d04b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/process/impl/ProcessServiceImpl.java +++ /dev/null @@ -1,109 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.service.process.impl; - -import cn.iocoder.yudao.adminserver.modules.activiti.service.process.ProcessService; -import lombok.extern.slf4j.Slf4j; -import org.activiti.engine.RepositoryService; -import org.activiti.engine.repository.Deployment; -import org.activiti.engine.repository.ProcessDefinition; -import org.apache.commons.io.FilenameUtils; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import javax.annotation.Resource; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; -import java.util.zip.ZipInputStream; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_UPLOAD_FAILED; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; - -/** - * 流程基础管理 - * - * @author ZJQ - * @date 2021/9/5 21:04 - */ -@Service -@Slf4j -public class ProcessServiceImpl implements ProcessService { - - private static final String BPMN20_XML = "bpmn20.xml"; - - @Resource - private RepositoryService repositoryService; - - /** - * 上传流程文件,进行流程部署 - * @param multipartFile 上传文件 - */ - @Override - public void deployProcess(MultipartFile multipartFile) { - String fileName = multipartFile.getOriginalFilename(); - try (InputStream inputStream = multipartFile.getInputStream()){ - Deployment deployment = getDeplymentByType(inputStream,fileName); - //获取部署成功的流程模型 - List processDefinitions = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).list(); - processDefinitions.forEach((processDefinition)->{ - //设置线上部署流程模型名字 - String proDefId = processDefinition.getId(); - repositoryService.setProcessDefinitionCategory(proDefId,fileName); - log.info("流程文件部署成功,流程ID="+proDefId); - }); - } catch (IOException e) { - log.error("流程部署出现异常"+e); - } - } - - /** - * 激活或者挂起流程模型实体 - * @param processDefinitionId 流程模型实体id - * @param type 类型 - * @return 提示 - */ - @Override - public String setActivOrHang(String processDefinitionId, String type) { - String result = "无操作"; - switch (type){ - case "active": - repositoryService.activateProcessDefinitionById(processDefinitionId,true,null); - result = "已激活ID为【"+processDefinitionId+"】的流程模型实例"; - break; - case "suspend": - repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null); - result = "已挂起ID为【"+processDefinitionId+"】的流程模型实例"; - break; - default: - break; - } - return result; - } - - - /** - * 根据上传文件类型对应实现不同方式的流程部署 - * @param inputStream 文件输入流 - * @param fileName 文件名 - * @return 文件部署流程 - */ - public Deployment getDeplymentByType(InputStream inputStream,String fileName){ - Deployment deployment; - String type = FilenameUtils.getExtension(fileName); - switch (type){ - case "bpmn": - String baseName = FilenameUtils.getBaseName(fileName); - deployment = repositoryService.createDeployment().addInputStream(baseName+"."+BPMN20_XML,inputStream).deploy(); - break; - case "png": - deployment = repositoryService.createDeployment().addInputStream(fileName,inputStream).deploy(); - break; - case "zip": - case "bar": - ZipInputStream zipInputStream = new ZipInputStream(inputStream); - deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy(); - break; - default: - throw exception(FILE_UPLOAD_FAILED); - } - return deployment; - } -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/TaskService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/TaskService.java deleted file mode 100644 index c5b020e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/TaskService.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.service.workflow; - -import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.*; -import cn.iocoder.yudao.framework.common.pojo.PageResult; - -import javax.servlet.http.HttpServletResponse; -import java.util.List; - -// TODO @芋艿:前缀,注释 -// TODO @json:类和方法的注释。咱是开源项目,有注释,大家才能更容易读懂 -public interface TaskService { - - PageResult getTodoTaskPage(TodoTaskPageReqVO pageReqVO); - - void claimTask(String taskId); - - - void completeTask(TaskReqVO taskReq); - -// void flowImage(String taskId, HttpServletResponse response); - TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery); - - List getHistorySteps(String processInstanceId); - - TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery); - - - /** - * 返回高亮的流转进程 - * @param processInstanceId 实例Id - * @param response 响应 - */ - void getHighlightImg(String processInstanceId, HttpServletResponse response); -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/impl/TaskServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/impl/TaskServiceImpl.java deleted file mode 100644 index c4e8823..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/impl/TaskServiceImpl.java +++ /dev/null @@ -1,356 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.activiti.service.workflow.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.*; -import cn.iocoder.yudao.adminserver.modules.activiti.convert.workflow.TaskConvert; -import cn.iocoder.yudao.adminserver.modules.activiti.service.workflow.TaskService; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; -import com.google.common.collect.ImmutableMap; -import lombok.extern.slf4j.Slf4j; -import org.activiti.api.runtime.shared.query.Page; -import org.activiti.api.runtime.shared.query.Pageable; -import org.activiti.api.task.model.Task; -import org.activiti.api.task.model.builders.ClaimTaskPayloadBuilder; -import org.activiti.api.task.model.builders.TaskPayloadBuilder; -import org.activiti.api.task.runtime.TaskRuntime; -import org.activiti.bpmn.model.BpmnModel; -import org.activiti.bpmn.model.FlowNode; -import org.activiti.bpmn.model.SequenceFlow; -import org.activiti.engine.HistoryService; -import org.activiti.engine.RepositoryService; -import org.activiti.engine.RuntimeService; -import org.activiti.engine.history.HistoricActivityInstance; -import org.activiti.engine.history.HistoricProcessInstance; -import org.activiti.engine.history.HistoricTaskInstance; -import org.activiti.engine.repository.ProcessDefinition; -import org.activiti.engine.runtime.ProcessInstance; -import org.activiti.engine.task.Comment; -import org.activiti.image.ProcessDiagramGenerator; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; - - -import javax.annotation.Resource; -import javax.imageio.ImageIO; -import javax.servlet.http.HttpServletResponse; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.io.InputStream; -import java.net.URLEncoder; -import java.util.*; -import java.util.stream.Collectors; - -@Slf4j -@Service -public class TaskServiceImpl implements TaskService { - - @Resource - private TaskRuntime taskRuntime; - - @Resource - private org.activiti.engine.TaskService activitiTaskService; - - @Resource - private HistoryService historyService; - - @Resource - private RepositoryService repositoryService; - - @Resource - private RuntimeService runtimeService; - - @Resource - private ProcessDiagramGenerator processDiagramGenerator; - - @Override - public PageResult getTodoTaskPage(TodoTaskPageReqVO pageReqVO) { - // TODO @jason:封装一个方法,用于转换成 activiti 的分页对象 - final Pageable pageable = Pageable.of((pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize(), pageReqVO.getPageSize()); - Page pageTasks = taskRuntime.tasks(pageable); - int totalItems = pageTasks.getTotalItems(); - List tasks = pageTasks.getContent(); - final List respVOList = tasks.stream().map(task -> { - ProcessDefinition definition = repositoryService.getProcessDefinition(task.getProcessDefinitionId()); - return TaskConvert.INSTANCE.convert(task, definition); - }).collect(Collectors.toList()); - return new PageResult<>(respVOList, (long)totalItems); - } - - - @Override - public void claimTask(String taskId) { - taskRuntime.claim(new ClaimTaskPayloadBuilder() - .withTaskId(taskId) - .withAssignee(SecurityFrameworkUtils.getLoginUser().getUsername()) - .build()); - } - - - /** - * 工作流,完成 userTask, 完成用户任务 一般传入参数 1。是否同意(variables). 2. 评论(comment) - * variables 变量名 和 评论 由前台传入 - * @param taskReq - */ - @Override - @Transactional - public void completeTask(TaskReqVO taskReq) { - final Task task = taskRuntime.task(taskReq.getTaskId()); - - activitiTaskService.addComment(taskReq.getTaskId(), task.getProcessInstanceId(), taskReq.getComment()); - - taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskReq.getTaskId()) - .withVariables(taskReq.getVariables()) - .build()); - } - -// @Override -// public void flowImage(String taskId, HttpServletResponse response) { -// -// final Task task = taskRuntime.task(taskId); -// BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); -// final Process process = bpmnModel.getMainProcess(); -// ProcessDefinitionEntity processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); -// List activeActivityIds = runtimeService.getActiveActivityIds(executionId); -// List highLightedFlows = getHighLightedFlows(processDefinition, processInstance.getId()); -// ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator(); -// InputStream imageStream =diagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds, highLightedFlows); -// -// // 输出资源内容到相应对象 -// byte[] b = new byte[1024]; -// int len; -// while ((len = imageStream.read(b, 0, 1024)) != -1) { -// response.getOutputStream().write(b, 0, len); -// } -// } - - @Override - public TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery) { - TaskHandleVO handleVO = new TaskHandleVO(); - final Task task = taskRuntime.task(taskQuery.getTaskId()); - List steps = getTaskSteps(task.getProcessInstanceId()); - handleVO.setHistoryTask(steps); - return handleVO; - } - - - private List getTaskSteps(String processInstanceId) { - // 获得已完成的活动 - List finished = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(processInstanceId) - .activityType("userTask") - .finished() - .orderByHistoricActivityInstanceStartTime().asc().list(); - // 获得对应的步骤 - List steps = new ArrayList<>(); - finished.forEach(instance -> { - TaskStepVO stepVO = TaskConvert.INSTANCE.convert(instance); - stepVO.setStatus(1); // TODO @jason:1 这个 magic number 要枚举起来。 - // TODO @jason:可以考虑把 comments 读取后,在统一调用 convert 拼接。另外 Comment 是废弃的类,有没其它可以使用的哈? - List comments = activitiTaskService.getTaskComments(instance.getTaskId()); - if (!CollUtil.isEmpty(comments)) { - // TODO @jason:IDEA 在 t.getFullMessage() 有提示告警,可以解决下。 - stepVO.setComment(Optional.ofNullable(comments.get(0)).map(t->t.getFullMessage()).orElse("")); - } - steps.add(stepVO); - }); - - // 获得未完成的活动 - List unfinished = historyService - .createHistoricActivityInstanceQuery() - .processInstanceId(processInstanceId) - .activityType("userTask") - .unfinished().list(); - // 获得对应的步骤 - for (HistoricActivityInstance instance : unfinished) { - TaskStepVO stepVO = TaskConvert.INSTANCE.convert(instance); - stepVO.setComment(""); - stepVO.setStatus(0); - steps.add(stepVO); - } - return steps; - } - - - @Override - public List getHistorySteps(String processInstanceId) { - return getTaskSteps(processInstanceId); - } - - @Override - public TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery) { - final Task task = taskRuntime.task(taskQuery.getTaskId()); - // 转换结果 - TodoTaskRespVO respVO = new TodoTaskRespVO(); - respVO.setFormKey(task.getFormKey()); - respVO.setBusinessKey(task.getBusinessKey()); - respVO.setId(task.getId()); - return respVO; - } - -// private List getHighLightedFlows(ProcessDefinitionEntity processDefinition, String processInstanceId) { -// -// List highLightedFlows = new ArrayList(); -// List historicActivityInstances = historyService -// .createHistoricActivityInstanceQuery() -// .processInstanceId(processInstanceId) -// .orderByHistoricActivityInstanceStartTime().asc().list(); -// -// List historicActivityInstanceList = new ArrayList(); -// for (HistoricActivityInstance hai : historicActivityInstances) { -// historicActivityInstanceList.add(hai.getActivityId()); -// } - -// // add current activities to list -// List highLightedActivities = runtimeService.getActiveActivityIds(processInstanceId); -// historicActivityInstanceList.addAll(highLightedActivities); - - // activities and their sequence-flows -// for (ActivityImpl activity : processDefinition.getActivities()) { -// int index = historicActivityInstanceList.indexOf(activity.getId()); -// -// if (index >= 0 && index + 1 < historicActivityInstanceList.size()) { -// List pvmTransitionList = activity -// .getOutgoingTransitions(); -// for (PvmTransition pvmTransition : pvmTransitionList) { -// String destinationFlowId = pvmTransition.getDestination().getId(); -// if (destinationFlowId.equals(historicActivityInstanceList.get(index + 1))) { -// highLightedFlows.add(pvmTransition.getId()); -// } -// } -// } -// } -// return highLightedFlows; -// } - - - @Override - public void getHighlightImg(String processInstanceId, HttpServletResponse response) { - // 查询历史 - HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); - // 如果有结束时间 - if (hpi == null) { - return; - } - // 没有结束时间。说明流程在执行过程中 - ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); - BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId()); - List highLightedActivities = new ArrayList<>(); - - List historicActivityInstances = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId) - .orderByHistoricActivityInstanceId().asc().list(); - // 获取所有活动节点 - List finishedInstances = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(processInstanceId).finished().list(); - for (HistoricActivityInstance hai : finishedInstances) { - highLightedActivities.add(hai.getActivityId()); - } - // 已完成的节点+当前节点 - highLightedActivities.addAll(runtimeService.getActiveActivityIds(processInstanceId)); - - // 经过的流 - List highLightedFlowIds = getHighLightedFlows(bpmnModel, historicActivityInstances); - - //设置"宋体" - try (InputStream inputStream = processDiagramGenerator.generateDiagram(bpmnModel, highLightedActivities, highLightedFlowIds, - "宋体", "宋体", "宋体")){ - String picName = hpi.getProcessDefinitionName()+".svg"; - // 输出到浏览器 - responseImage(response, inputStream, picName); - } catch (IOException e) { - log.error(ExceptionUtils.getStackTrace(e)); - } - - } - - private void responseImage(HttpServletResponse response, InputStream inputStream, String picName) throws IOException { - response.setContentType("application/octet-stream;charset=UTF-8"); - response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(picName, "UTF-8")); - byte[] b = new byte[1024]; - int len = -1; - while ((len = inputStream.read(b, 0, 1024)) != -1) { - response.getOutputStream().write(b, 0, len); - } - response.flushBuffer(); - } - /** - * 获取已经流转的线 - * @see https://blog.csdn.net/qiuxinfa123/article/details/119579863 - * @param bpmnModel model - * @param historicActivityInstances 高亮线条 - * @return - */ - private List getHighLightedFlows(BpmnModel bpmnModel, List historicActivityInstances) { - // 高亮流程已发生流转的线id集合 - List highLightedFlowIds = new ArrayList<>(); - // 全部活动节点 - List historicActivityNodes = new ArrayList<>(); - // 已完成的历史活动节点 - List finishedActivityInstances = new ArrayList<>(); - - for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) { - FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true); - historicActivityNodes.add(flowNode); - // 结束时间不为空,则是已完成节点 - if (historicActivityInstance.getEndTime() != null) { - finishedActivityInstances.add(historicActivityInstance); - } - } - - FlowNode currentFlowNode; - FlowNode targetFlowNode; - // 遍历已完成的活动实例,从每个实例的outgoingFlows中找到已执行的 - for (HistoricActivityInstance currentActivityInstance : finishedActivityInstances) { - // 获得当前活动对应的节点信息及outgoingFlows信息 - currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true); - List sequenceFlows = currentFlowNode.getOutgoingFlows(); - - /** - * 遍历outgoingFlows并找到已流转的 满足如下条件认为已已流转: - * 1.当前节点是并行网关或兼容网关,则通过outgoingFlows能够在历史活动中找到的全部节点均为已流转 - * 2.当前节点是以上两种类型之外的,通过outgoingFlows查找到的时间最早的流转节点视为有效流转 - */ - if ("parallelGateway".equals(currentActivityInstance.getActivityType()) || "inclusiveGateway".equals(currentActivityInstance.getActivityType())) { - // 遍历历史活动节点,找到匹配流程目标节点的 - for (SequenceFlow sequenceFlow : sequenceFlows) { - targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sequenceFlow.getTargetRef(), true); - if (historicActivityNodes.contains(targetFlowNode)) { - highLightedFlowIds.add(targetFlowNode.getId()); - } - } - } else { - List> tempMapList = new ArrayList<>(); - for (SequenceFlow sequenceFlow : sequenceFlows) { - for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) { - if (historicActivityInstance.getActivityId().equals(sequenceFlow.getTargetRef())) { - Map map = new HashMap<>(); - map.put("highLightedFlowId", sequenceFlow.getId()); - map.put("highLightedFlowStartTime", historicActivityInstance.getStartTime().getTime()); - tempMapList.add(map); - } - } - } - - if (!CollectionUtils.isEmpty(tempMapList)) { - // 遍历匹配的集合,取得开始时间最早的一个 - long earliestStamp = 0L; - String highLightedFlowId = null; - for (Map map : tempMapList) { - long highLightedFlowStartTime = Long.valueOf(map.get("highLightedFlowStartTime").toString()); - if (earliestStamp == 0 || earliestStamp >= highLightedFlowStartTime) { - highLightedFlowId = map.get("highLightedFlowId").toString(); - earliestStamp = highLightedFlowStartTime; - } - } - highLightedFlowIds.add(highLightedFlowId); - } - - } - - } - return highLightedFlowIds; - } -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/OALeaveController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/OALeaveController.java new file mode 100644 index 0000000..0b74138 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/OALeaveController.java @@ -0,0 +1,116 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa; + +import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.OALeaveConvert; +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO; +import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.OALeaveService; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.*; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + + +@Api(tags = "请假申请") +@RestController +@RequestMapping("/oa/leave") +@Validated +public class OALeaveController { + + @Resource + private OALeaveService leaveService; + + @PostMapping("/create") + @ApiOperation("创建请假申请") + @PreAuthorize("@ss.hasPermission('oa:leave:create')") + public CommonResult createLeave(@Valid @RequestBody OALeaveCreateReqVO createReqVO) { + // TODO @芋艿:processKey 自己去理解下。不过得把 leave 变成枚举 + // TODO @芋艿 该方法没有用到, 是前一个版本的, 可以删掉。 + createReqVO.setProcessKey("leave"); + return success(leaveService.createLeave(createReqVO)); + } + + @PostMapping("/form-key/create") + @ApiOperation("创建外置请假申请") + public CommonResult createFormKeyLeave(@Valid @RequestBody OALeaveCreateReqVO createReqVO) { + // TODO @芋艿:processKey 自己去理解下。不过得把 formkey 变成枚举 + // TODO @芋艿 : processKey 是 bpmn 中定义的id, 提交业务表单时候, 需要启动流程, 或许从前台传更合适 + createReqVO.setProcessKey("leave-formkey"); + return success(leaveService.createLeave(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新请假申请") + @PreAuthorize("@ss.hasPermission('oa:leave:update')") + public CommonResult updateLeave(@Valid @RequestBody OALeaveUpdateReqVO updateReqVO) { + leaveService.updateLeave(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除请假申请") + @ApiImplicitParam(name = "id", value = "编号", required = true) + @PreAuthorize("@ss.hasPermission('oa:leave:delete')") + public CommonResult deleteLeave(@RequestParam("id") Long id) { + leaveService.deleteLeave(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得请假申请") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('oa:leave:query')") + public CommonResult getLeave(@RequestParam("id") Long id) { + OALeaveDO leave = leaveService.getLeave(id); + return success(OALeaveConvert.INSTANCE.convert(leave)); + } + + @GetMapping("/list") + @ApiOperation("获得请假申请列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('oa:leave:query')") + public CommonResult> getLeaveList(@RequestParam("ids") Collection ids) { + List list = leaveService.getLeaveList(ids); + return success(OALeaveConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得请假申请分页") + @PreAuthorize("@ss.hasPermission('oa:leave:query')") + public CommonResult> getLeavePage(@Valid OALeavePageReqVO pageVO) { + //值查询自己申请请假 + // TODO @芋艿:这里的传值,到底前端搞,还是后端搞。 + pageVO.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername()); + PageResult pageResult = leaveService.getLeavePage(pageVO); + return success(OALeaveConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出请假申请 Excel") + @PreAuthorize("@ss.hasPermission('oa:leave:export')") + @OperateLog(type = EXPORT) + public void exportLeaveExcel(@Valid OALeaveExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = leaveService.getLeaveList(exportReqVO); + // 导出 Excel + List datas = OALeaveConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "请假申请.xls", "数据", OALeaveExcelVO.class, datas); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveBaseVO.java new file mode 100644 index 0000000..72d1a5e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveBaseVO.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 请假申请 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class OALeaveBaseVO { + + @ApiModelProperty(value = "流程id") + private String processInstanceId; + + @ApiModelProperty(value = "状态", required = true) + private Integer status; + + @ApiModelProperty(value = "申请人id", required = true) + private String userId; + + @ApiModelProperty(value = "开始时间", required = true) + @NotNull(message = "开始时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date startTime; + + @ApiModelProperty(value = "结束时间", required = true) + @NotNull(message = "结束时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + + @ApiModelProperty(value = "请假类型") + private String leaveType; + + @ApiModelProperty(value = "原因") + private String reason; + + @ApiModelProperty(value = "申请时间", required = true) + @NotNull(message = "申请时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date applyTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveCreateReqVO.java new file mode 100644 index 0000000..28df334 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveCreateReqVO.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; + +import lombok.*; +import io.swagger.annotations.*; + +@ApiModel("请假申请创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OALeaveCreateReqVO extends OALeaveBaseVO { + + private String processKey; +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveExcelVO.java new file mode 100644 index 0000000..9280529 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveExcelVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 请假申请 Excel VO + * + * @author 芋艿 + */ +@Data +public class OALeaveExcelVO { + + @ExcelProperty("请假表单主键") + private Long id; + + @ExcelProperty("流程id") + private String processInstanceId; + + @ExcelProperty("状态") + private Integer status; + + @ExcelProperty("申请人id") + private String userId; + + @ExcelProperty("开始时间") + private Date startTime; + + @ExcelProperty("结束时间") + private Date endTime; + + @ExcelProperty("请假类型") + private String leaveType; + + @ExcelProperty("原因") + private String reason; + + @ExcelProperty("申请时间") + private Date applyTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveExportReqVO.java new file mode 100644 index 0000000..e07d66f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveExportReqVO.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "请假申请 Excel 导出 Request VO", description = "参数和 OaLeavePageReqVO 是一致的") +@Data +public class OALeaveExportReqVO { + + @ApiModelProperty(value = "流程id") + private String processInstanceId; + + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty(value = "申请人id") + private String userId; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始开始时间") + private Date beginStartTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束开始时间") + private Date endStartTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始结束时间") + private Date beginEndTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束结束时间") + private Date endEndTime; + + @ApiModelProperty(value = "请假类型") + private String leaveType; + + @ApiModelProperty(value = "原因") + private String reason; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始申请时间") + private Date beginApplyTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束申请时间") + private Date endApplyTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeavePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeavePageReqVO.java new file mode 100644 index 0000000..ea73715 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeavePageReqVO.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("请假申请分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OALeavePageReqVO extends PageParam { + + @ApiModelProperty(value = "流程id") + private String processInstanceId; + + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty(value = "申请人id") + private String userId; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始开始时间") + private Date beginStartTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束开始时间") + private Date endStartTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始结束时间") + private Date beginEndTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束结束时间") + private Date endEndTime; + + @ApiModelProperty(value = "请假类型") + private String leaveType; + + @ApiModelProperty(value = "原因") + private String reason; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始申请时间") + private Date beginApplyTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束申请时间") + private Date endApplyTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveRespVO.java new file mode 100644 index 0000000..161879c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveRespVO.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; + +import lombok.*; +import io.swagger.annotations.*; + +@ApiModel("请假申请 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OALeaveRespVO extends OALeaveBaseVO { + + @ApiModelProperty(value = "请假表单主键", required = true) + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveUpdateReqVO.java new file mode 100644 index 0000000..a9264c9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveUpdateReqVO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.util.Map; + +@ApiModel("请假申请更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OALeaveUpdateReqVO extends OALeaveBaseVO { + + @ApiModelProperty(value = "请假表单主键", required = true) + @NotNull(message = "请假表单主键不能为空") + private Long id; + + // TODO @json:swagger 和 validator 的注解要加哈。 + + private String taskId; + + private String comment; + + private Map variables; + + // TODO @芋艿:variables 的作用是啥。 + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/ProcessDefinitionController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/ProcessDefinitionController.java new file mode 100644 index 0000000..cb1010f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/ProcessDefinitionController.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import org.activiti.api.process.runtime.ProcessRuntime; +import org.activiti.engine.RepositoryService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +// TODO @json:swagger 和 validation 的注解,后续要补全下哈。可以等 workflow 基本写的差不多之后 +@RestController +@RequestMapping("/workflow/process/definition") +public class ProcessDefinitionController { + + @Resource + private RepositoryService repositoryService; + + @Resource + private ProcessRuntime processRuntime; + + + @GetMapping(value = "/getStartForm") + public CommonResult getStartForm(@RequestParam("processKey") String processKey){ + //这样查似乎有问题??, 暂时写死 +// final ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery(). +// processDefinitionKey(processKey).latestVersion().singleResult(); +// processRuntime.processDefinition(processDefinition.getId()).getFormKey(); + return CommonResult.success("/flow/leave/apply"); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/TaskController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/TaskController.java new file mode 100644 index 0000000..9aa0500 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/TaskController.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow; + +import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*; +import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.TaskService; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +// TODO @json:swagger 和 validation 的注解,后续要补全下哈。可以等 workflow 基本写的差不多之后 +@Api(tags = "工作流待办任务") +@RestController +@RequestMapping("/workflow/task") +public class TaskController { + + @Resource + private TaskService taskService; + + @GetMapping("/todo/page") + @ApiOperation("获取待办任务分页") + public CommonResult> getTodoTaskPage(@Valid TodoTaskPageReqVO pageVO) { + return success(taskService.getTodoTaskPage(pageVO)); + } + + @GetMapping("/claim") + @ApiOperation("签收任务") + public CommonResult claimTask(@RequestParam("id") String taskId) { + taskService.claimTask(taskId); + return success(true); + } + + @PostMapping("/task-steps") + public CommonResult getTaskSteps(@RequestBody TaskQueryReqVO taskQuery) { + return success(taskService.getTaskSteps(taskQuery)); + } + + @PostMapping("/formKey") + public CommonResult getTaskFormKey(@RequestBody TaskQueryReqVO taskQuery) { + return success(taskService.getTaskFormKey(taskQuery)); + } + + @PostMapping("/complete") + public CommonResult complete(@RequestBody TaskReqVO taskReq) { + taskService.completeTask(taskReq); + return success(true); + } + + @GetMapping("/process/history-steps") + public CommonResult> getHistorySteps(@RequestParam("id") String processInstanceId) { + return success(taskService.getHistorySteps(processInstanceId)); + } + + /** + * 返回高亮的流转图SVG + * @param processInstanceId + */ + @GetMapping("/process/highlight-img/{id}") + public void getHighlightImg(@PathVariable("id") String processInstanceId, HttpServletResponse response) { + taskService.getHighlightImg(processInstanceId, response); + } + + + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskHandleVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskHandleVO.java new file mode 100644 index 0000000..fff775a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskHandleVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo; + +import lombok.Data; +import lombok.ToString; + +import java.util.List; + +@Data +@ToString +public class TaskHandleVO { + + private Object formObject; + + + private List historyTask; + + + private String taskVariable; +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskQueryReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskQueryReqVO.java new file mode 100644 index 0000000..d67fad0 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskQueryReqVO.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class TaskQueryReqVO { + + private String processKey; + + private String taskId; + + private String businessKey; +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskReqVO.java new file mode 100644 index 0000000..0657ae7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskReqVO.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo; + +import lombok.Data; +import lombok.ToString; + +import java.util.Map; + +@Data +@ToString +public class TaskReqVO { + + private String taskId; + + private Map variables; + + private String comment; +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskStepVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskStepVO.java new file mode 100644 index 0000000..5d8433e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskStepVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo; + +import lombok.Data; +import lombok.ToString; + +import java.util.Date; + +@Data +@ToString +public class TaskStepVO { + + private String stepName; + + private Date startTime; + + private Date endTime; + + private String assignee; + + private String comment; + + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TodoTaskPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TodoTaskPageReqVO.java new file mode 100644 index 0000000..411b23d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TodoTaskPageReqVO.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("待办任务申请分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TodoTaskPageReqVO extends PageParam { + + private String assignee; +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TodoTaskRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TodoTaskRespVO.java new file mode 100644 index 0000000..93184a2 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TodoTaskRespVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.ToString; + +@ApiModel("待办任务 Response VO") +@Data +@ToString +public class TodoTaskRespVO { + + // TODO @jason:swagger 注解。这样接口文档才完整哈 + + private String id; + + + private String processInstanceId; + + /** + * 1:未签收 + * 2:已签收 + */ + private Integer status; + + + private String processName; + + + private String processKey; + + + private String businessKey; + + + private String formKey; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/OALeaveConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/OALeaveConvert.java new file mode 100644 index 0000000..4da3d56 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/OALeaveConvert.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.convert.oa; + +import java.util.*; + +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveExcelVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveRespVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveUpdateReqVO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 请假申请 Convert + * + * @author 芋艿 + */ +@Mapper +public interface OALeaveConvert { + + OALeaveConvert INSTANCE = Mappers.getMapper(OALeaveConvert.class); + + OALeaveDO convert(OALeaveCreateReqVO bean); + + OALeaveDO convert(OALeaveUpdateReqVO bean); + + OALeaveRespVO convert(OALeaveDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/workflow/TaskConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/workflow/TaskConvert.java new file mode 100644 index 0000000..8d2bd63 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/workflow/TaskConvert.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.convert.workflow; + +import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.TaskStepVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.TodoTaskRespVO; +import org.activiti.api.task.model.Task; +import org.activiti.engine.history.HistoricActivityInstance; +import org.activiti.engine.repository.ProcessDefinition; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.Named; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface TaskConvert { + TaskConvert INSTANCE = Mappers.getMapper(TaskConvert.class); + + @Mappings(value = { + @Mapping(source = "task.id", target = "id"), + @Mapping(source = "task.businessKey", target = "businessKey"), + @Mapping(source = "task.assignee", target = "status",qualifiedByName = "convertAssigneeToStatus"), + @Mapping(source = "definition.name", target = "processName"), + @Mapping(source = "definition.key", target = "processKey"), + @Mapping(source = "definition.id", target = "processInstanceId") + }) + TodoTaskRespVO convert(Task task, ProcessDefinition definition); + + + @Named("convertAssigneeToStatus") + default Integer convertAssigneeToStatus(String assignee) { + //TODO 不应该通过 assignee 定义状态 需要定义更多的状态 + return assignee == null ? 1 : 2; + } + + @Mappings(value = { + @Mapping(source = "activityName", target = "stepName"), + @Mapping(source = "assignee", target = "assignee") + }) + TaskStepVO convert(HistoricActivityInstance instance); +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/OALeaveDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/OALeaveDO.java new file mode 100644 index 0000000..b088b7b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/OALeaveDO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 请假申请 DO + * + * @author 芋艿 + */ +@TableName("oa_leave") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OALeaveDO extends BaseDO { + + /** + * 请假表单主键 + */ + @TableId + private Long id; + /** + * 流程id + */ + private String processInstanceId; + /** + * 状态 + */ + private Integer status; + /** + * 申请人id + */ + private String userId; + /** + * 开始时间 + */ + private Date startTime; + /** + * 结束时间 + */ + private Date endTime; + /** + * 请假类型 + */ + private String leaveType; + /** + * 原因 + */ + private String reason; + /** + * 申请时间 + */ + private Date applyTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/process/ProcessDefinitionDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/process/ProcessDefinitionDO.java new file mode 100644 index 0000000..d023c91 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/process/ProcessDefinitionDO.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.process; + +/** + * 流程模型实体类 映射 activiti ProcessDefinition接口 + * + * @author ZJQ + * @date 2021/9/7 23:23 + */ +public class ProcessDefinitionDO { + + private String id; + + private String category; + + private String key; + + private String name; + + private String version; + + private String resourceName; + + private String deploymentId; + + private String diagramResourceName; + + private boolean suspended; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/OALeaveMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/OALeaveMapper.java new file mode 100644 index 0000000..7da1e54 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/OALeaveMapper.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa; + +import java.util.*; + +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveExportReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeavePageReqVO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Mapper; + +/** + * 请假申请 Mapper + * + * @author 芋艿 + */ +@Mapper +public interface OALeaveMapper extends BaseMapperX { + + default PageResult selectPage(OALeavePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .eqIfPresent("process_instance_id", reqVO.getProcessInstanceId()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("user_id", reqVO.getUserId()) + .betweenIfPresent("start_time", reqVO.getBeginStartTime(), reqVO.getEndStartTime()) + .betweenIfPresent("end_time", reqVO.getBeginEndTime(), reqVO.getEndEndTime()) + .eqIfPresent("leave_type", reqVO.getLeaveType()) + .eqIfPresent("reason", reqVO.getReason()) + .betweenIfPresent("apply_time", reqVO.getBeginApplyTime(), reqVO.getEndApplyTime()) + .orderByDesc("id") ); + } + + default List selectList(OALeaveExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .eqIfPresent("process_instance_id", reqVO.getProcessInstanceId()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("user_id", reqVO.getUserId()) + .betweenIfPresent("start_time", reqVO.getBeginStartTime(), reqVO.getEndStartTime()) + .betweenIfPresent("end_time", reqVO.getBeginEndTime(), reqVO.getEndEndTime()) + .eqIfPresent("leave_type", reqVO.getLeaveType()) + .eqIfPresent("reason", reqVO.getReason()) + .betweenIfPresent("apply_time", reqVO.getBeginApplyTime(), reqVO.getEndApplyTime()) + .orderByDesc("id") ); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/oa/OAErrorCodeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/oa/OAErrorCodeConstants.java new file mode 100644 index 0000000..33495c1 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/oa/OAErrorCodeConstants.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.enums.oa; + +import cn.iocoder.yudao.framework.common.exception.ErrorCode; +/** + * activiti 系统 错误码枚举类 + * + * 003 activiti + * 001 oa + * activiti 系统,使用 1-003-000-000 段 + */ +public interface OAErrorCodeConstants { + ErrorCode LEAVE_NOT_EXISTS = new ErrorCode(1003001001, "请假申请不存在"); +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/config/UserGroupManagerService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/config/UserGroupManagerService.java new file mode 100644 index 0000000..7ca957c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/config/UserGroupManagerService.java @@ -0,0 +1,62 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.service.config; + + +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import org.activiti.api.runtime.shared.identity.UserGroupManager; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.stereotype.Service; + + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +import static java.util.Collections.singleton; + +@Service +public class UserGroupManagerService implements UserGroupManager { + + @Resource + private UserDetailsService userDetailsService; + + @Resource + private SysUserService userService; + + @Resource + private SysPostService sysPostService; + + /** + * 暂时使用岗位来代替 + * @param userId + * @return + */ + @Override + public List getUserGroups(String userId) { +// final LoginUser loginUser = (LoginUser) userDetailsService.loadUserByUsername(userId); +// final Long id = loginUser.getId(); + final SysUserDO user = userService.getUserByUsername(userId); + return sysPostService.getPosts(user.getPostIds()).stream().map(post -> post.getCode()).collect(Collectors.toList()); + + } + + @Override + public List getUserRoles(String userId) { + return Arrays.asList("ROLE_ACTIVITI_USER"); + } + + @Override + public List getGroups() { + throw new UnsupportedOperationException("getGroups is now un supported"); + } + + @Override + public List getUsers() { + throw new UnsupportedOperationException("getGroups is now un supported"); + } +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/config/UserGroupsProvider.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/config/UserGroupsProvider.java new file mode 100644 index 0000000..dc81449 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/config/UserGroupsProvider.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.service.config; + +import cn.iocoder.yudao.framework.security.core.LoginUser; +import org.activiti.api.runtime.shared.security.PrincipalGroupsProvider; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Service; + +import java.security.Principal; +import java.util.Collections; +import java.util.List; + +@Service +public class UserGroupsProvider implements PrincipalGroupsProvider { + + @Override + public List getGroups(Principal principal) { + + if(principal instanceof Authentication){ + Authentication authentication = (Authentication) principal; + final Object user = authentication.getPrincipal(); + if( user instanceof LoginUser){ + return ((LoginUser) user).getGroups(); + }else{ + return Collections.emptyList(); + } + }else{ + return Collections.emptyList(); + } + + } +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/OALeaveService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/OALeaveService.java new file mode 100644 index 0000000..21c75ea --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/OALeaveService.java @@ -0,0 +1,76 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.service.oa; + + +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveExportReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeavePageReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 请假申请 Service 接口 + * + * @author 芋艿 + */ +public interface OALeaveService { + + /** + * 创建请假申请 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createLeave(@Valid OALeaveCreateReqVO createReqVO); + + /** + * 更新请假申请 + * + * @param updateReqVO 更新信息 + */ + void updateLeave(@Valid OALeaveUpdateReqVO updateReqVO); + + /** + * 删除请假申请 + * + * @param id 编号 + */ + void deleteLeave(Long id); + + /** + * 获得请假申请 + * + * @param id 编号 + * @return 请假申请 + */ + OALeaveDO getLeave(Long id); + + /** + * 获得请假申请列表 + * + * @param ids 编号 + * @return 请假申请列表 + */ + List getLeaveList(Collection ids); + + /** + * 获得请假申请分页 + * + * @param pageReqVO 分页查询 + * @return 请假申请分页 + */ + PageResult getLeavePage(OALeavePageReqVO pageReqVO); + + /** + * 获得请假申请列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 请假申请列表 + */ + List getLeaveList(OALeaveExportReqVO exportReqVO); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/ReportBackEndProcessor.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/ReportBackEndProcessor.java new file mode 100644 index 0000000..2966c5e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/ReportBackEndProcessor.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.service.oa; + +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO; +import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.OALeaveMapper; +import org.activiti.engine.delegate.DelegateExecution; +import org.activiti.engine.delegate.ExecutionListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +// TODO @jason:类注释 +@Component +public class ReportBackEndProcessor implements ExecutionListener { + + @Resource + private OALeaveMapper leaveMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void notify(DelegateExecution delegateExecution) { + final String businessKey = delegateExecution.getProcessInstanceBusinessKey(); + OALeaveDO updateDo = new OALeaveDO(); + updateDo.setId(Long.valueOf(businessKey)); + // TODO @json:status 要枚举起来,不要出现 magic number + updateDo.setStatus(2); + leaveMapper.updateById(updateDo); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/OALeaveServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/OALeaveServiceImpl.java new file mode 100644 index 0000000..7627f9d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/OALeaveServiceImpl.java @@ -0,0 +1,138 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.service.oa.impl; + +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveExportReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeavePageReqVO; +import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.OALeaveConvert; +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO; +import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.OALeaveMapper; +import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.OALeaveService; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import org.activiti.api.task.model.Task; +import org.activiti.api.task.model.builders.TaskPayloadBuilder; +import org.activiti.api.task.runtime.TaskRuntime; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.runtime.ProcessInstance; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.*; + +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.oa.OAErrorCodeConstants.LEAVE_NOT_EXISTS; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 请假申请 Service 实现类 + * + * @author 芋艿 + */ +@Service +@Validated +public class OALeaveServiceImpl implements OALeaveService { + + @Resource + private OALeaveMapper leaveMapper; + + @Resource + private RuntimeService runtimeService; + + @Resource + private org.activiti.engine.TaskService activitiTaskService; + + @Resource + private TaskRuntime taskRuntime; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createLeave(OALeaveCreateReqVO createReqVO) { + // 插入 OA 请假单 + OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO); + leave.setStatus(1); + // TODO @jason:应该是存储 userId?? + leave.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername()); + leaveMapper.insert(leave); + + // 创建工作流 + Map variables = new HashMap<>(); + // 如何得到部门领导人,暂时写死 + variables.put("deptLeader", "admin"); // TODO @芋艿:需要部门的负责人 + Long id = leave.getId(); + String businessKey = String.valueOf(id); + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(createReqVO.getProcessKey(), businessKey, variables); + String processInstanceId = processInstance.getProcessInstanceId(); + + // 将工作流的编号,更新到 OA 请假单中 + OALeaveDO updateDo = new OALeaveDO(); + updateDo.setProcessInstanceId(processInstanceId); + updateDo.setId(id); + leaveMapper.updateById(updateDo); + return id; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateLeave(OALeaveUpdateReqVO updateReqVO) { + // 校验存在 + this.validateLeaveExists(updateReqVO.getId()); + + final Task task = taskRuntime.task(updateReqVO.getTaskId()); + activitiTaskService.addComment(task.getId(), task.getProcessInstanceId(), updateReqVO.getComment()); + Map variables = updateReqVO.getVariables(); + + //如何得到部门领导人, 暂时写死 + variables.put("deptLeader", "admin"); + taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId()) + .withVariables(variables) + .build()); + + // TOTO @芋道源码 貌似 IDEA 会自动加上final(不需要加 final 哈。虽然是不变,但是代码比较少这么去写) + Object reApply = variables.get("reApply"); + if(Objects.equals(reApply, true)){ + // 更新 表单 + OALeaveDO updateObj = OALeaveConvert.INSTANCE.convert(updateReqVO); + leaveMapper.updateById(updateObj); + } + } + + @Override + public void deleteLeave(Long id) { + // 校验存在 + this.validateLeaveExists(id); + // 删除 + leaveMapper.deleteById(id); + // TODO @jason:需要调用 runtimeService 的 delete 方法,删除??? + // TOTO @芋道源码 目前页面暂时没有实现基于业务表单的删除, 该代码自动生成的。 + // TODO @芋道源码 我理解提交流程后,是不允许删除的? , 只能在流程处理中作废流程 + } + + private void validateLeaveExists(Long id) { + if (leaveMapper.selectById(id) == null) { + throw exception(LEAVE_NOT_EXISTS); + } + } + + @Override + public OALeaveDO getLeave(Long id) { + return leaveMapper.selectById(id); + } + + @Override + public List getLeaveList(Collection ids) { + return leaveMapper.selectBatchIds(ids); + } + + @Override + public PageResult getLeavePage(OALeavePageReqVO pageReqVO) { + return leaveMapper.selectPage(pageReqVO); + } + + @Override + public List getLeaveList(OALeaveExportReqVO exportReqVO) { + return leaveMapper.selectList(exportReqVO); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/process/ProcessService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/process/ProcessService.java new file mode 100644 index 0000000..6a0d636 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/process/ProcessService.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.service.process; + +import org.springframework.web.multipart.MultipartFile; + +/** + * 流程基础管理 + * + * @author ZJQ + * @date 2021/9/5 21:00 + */ +public interface ProcessService { + + /** + * 上传流程文件,进行流程模型部署 + * @param multipartFile 上传文件 + */ + void deployProcess(MultipartFile multipartFile); + + + /** + * 激活或者挂起流程模型实体 + * @param processDefinitionId 流程模型实体id + * @param type 类型 + * @return 状态 + */ + String setActivOrHang(String processDefinitionId,String type); + + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/process/impl/ProcessServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/process/impl/ProcessServiceImpl.java new file mode 100644 index 0000000..a084cbe --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/process/impl/ProcessServiceImpl.java @@ -0,0 +1,109 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.service.process.impl; + +import cn.iocoder.yudao.adminserver.modules.bpm.service.process.ProcessService; +import lombok.extern.slf4j.Slf4j; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.repository.Deployment; +import org.activiti.engine.repository.ProcessDefinition; +import org.apache.commons.io.FilenameUtils; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.zip.ZipInputStream; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_UPLOAD_FAILED; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 流程基础管理 + * + * @author ZJQ + * @date 2021/9/5 21:04 + */ +@Service +@Slf4j +public class ProcessServiceImpl implements ProcessService { + + private static final String BPMN20_XML = "bpmn20.xml"; + + @Resource + private RepositoryService repositoryService; + + /** + * 上传流程文件,进行流程部署 + * @param multipartFile 上传文件 + */ + @Override + public void deployProcess(MultipartFile multipartFile) { + String fileName = multipartFile.getOriginalFilename(); + try (InputStream inputStream = multipartFile.getInputStream()){ + Deployment deployment = getDeplymentByType(inputStream,fileName); + //获取部署成功的流程模型 + List processDefinitions = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).list(); + processDefinitions.forEach((processDefinition)->{ + //设置线上部署流程模型名字 + String proDefId = processDefinition.getId(); + repositoryService.setProcessDefinitionCategory(proDefId,fileName); + log.info("流程文件部署成功,流程ID="+proDefId); + }); + } catch (IOException e) { + log.error("流程部署出现异常"+e); + } + } + + /** + * 激活或者挂起流程模型实体 + * @param processDefinitionId 流程模型实体id + * @param type 类型 + * @return 提示 + */ + @Override + public String setActivOrHang(String processDefinitionId, String type) { + String result = "无操作"; + switch (type){ + case "active": + repositoryService.activateProcessDefinitionById(processDefinitionId,true,null); + result = "已激活ID为【"+processDefinitionId+"】的流程模型实例"; + break; + case "suspend": + repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null); + result = "已挂起ID为【"+processDefinitionId+"】的流程模型实例"; + break; + default: + break; + } + return result; + } + + + /** + * 根据上传文件类型对应实现不同方式的流程部署 + * @param inputStream 文件输入流 + * @param fileName 文件名 + * @return 文件部署流程 + */ + public Deployment getDeplymentByType(InputStream inputStream,String fileName){ + Deployment deployment; + String type = FilenameUtils.getExtension(fileName); + switch (type){ + case "bpmn": + String baseName = FilenameUtils.getBaseName(fileName); + deployment = repositoryService.createDeployment().addInputStream(baseName+"."+BPMN20_XML,inputStream).deploy(); + break; + case "png": + deployment = repositoryService.createDeployment().addInputStream(fileName,inputStream).deploy(); + break; + case "zip": + case "bar": + ZipInputStream zipInputStream = new ZipInputStream(inputStream); + deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy(); + break; + default: + throw exception(FILE_UPLOAD_FAILED); + } + return deployment; + } +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/TaskService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/TaskService.java new file mode 100644 index 0000000..5fb06e9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/TaskService.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.service.workflow; + +import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +// TODO @芋艿:前缀,注释 +// TODO @json:类和方法的注释。咱是开源项目,有注释,大家才能更容易读懂 +public interface TaskService { + + PageResult getTodoTaskPage(TodoTaskPageReqVO pageReqVO); + + void claimTask(String taskId); + + + void completeTask(TaskReqVO taskReq); + +// void flowImage(String taskId, HttpServletResponse response); + TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery); + + List getHistorySteps(String processInstanceId); + + TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery); + + + /** + * 返回高亮的流转进程 + * @param processInstanceId 实例Id + * @param response 响应 + */ + void getHighlightImg(String processInstanceId, HttpServletResponse response); +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/impl/TaskServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/impl/TaskServiceImpl.java new file mode 100644 index 0000000..3990330 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/impl/TaskServiceImpl.java @@ -0,0 +1,353 @@ +package cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*; +import cn.iocoder.yudao.adminserver.modules.bpm.convert.workflow.TaskConvert; +import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.TaskService; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import lombok.extern.slf4j.Slf4j; +import org.activiti.api.runtime.shared.query.Page; +import org.activiti.api.runtime.shared.query.Pageable; +import org.activiti.api.task.model.Task; +import org.activiti.api.task.model.builders.ClaimTaskPayloadBuilder; +import org.activiti.api.task.model.builders.TaskPayloadBuilder; +import org.activiti.api.task.runtime.TaskRuntime; +import org.activiti.bpmn.model.BpmnModel; +import org.activiti.bpmn.model.FlowNode; +import org.activiti.bpmn.model.SequenceFlow; +import org.activiti.engine.HistoryService; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.history.HistoricActivityInstance; +import org.activiti.engine.history.HistoricProcessInstance; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.Comment; +import org.activiti.image.ProcessDiagramGenerator; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class TaskServiceImpl implements TaskService { + + @Resource + private TaskRuntime taskRuntime; + + @Resource + private org.activiti.engine.TaskService activitiTaskService; + + @Resource + private HistoryService historyService; + + @Resource + private RepositoryService repositoryService; + + @Resource + private RuntimeService runtimeService; + + @Resource + private ProcessDiagramGenerator processDiagramGenerator; + + @Override + public PageResult getTodoTaskPage(TodoTaskPageReqVO pageReqVO) { + // TODO @jason:封装一个方法,用于转换成 activiti 的分页对象 + final Pageable pageable = Pageable.of((pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize(), pageReqVO.getPageSize()); + Page pageTasks = taskRuntime.tasks(pageable); + int totalItems = pageTasks.getTotalItems(); + List tasks = pageTasks.getContent(); + final List respVOList = tasks.stream().map(task -> { + ProcessDefinition definition = repositoryService.getProcessDefinition(task.getProcessDefinitionId()); + definition.getId(); + return TaskConvert.INSTANCE.convert(task, definition); + }).collect(Collectors.toList()); + return new PageResult<>(respVOList, (long)totalItems); + } + + + @Override + public void claimTask(String taskId) { + taskRuntime.claim(new ClaimTaskPayloadBuilder() + .withTaskId(taskId) + .withAssignee(SecurityFrameworkUtils.getLoginUser().getUsername()) + .build()); + } + + + /** + * 工作流,完成 userTask, 完成用户任务 一般传入参数 1。是否同意(variables). 2. 评论(comment) + * variables 变量名 和 评论 由前台传入 + * @param taskReq + */ + @Override + @Transactional + public void completeTask(TaskReqVO taskReq) { + final Task task = taskRuntime.task(taskReq.getTaskId()); + + activitiTaskService.addComment(taskReq.getTaskId(), task.getProcessInstanceId(), taskReq.getComment()); + + taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskReq.getTaskId()) + .withVariables(taskReq.getVariables()) + .build()); + } + +// @Override +// public void flowImage(String taskId, HttpServletResponse response) { +// +// final Task task = taskRuntime.task(taskId); +// BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); +// final Process process = bpmnModel.getMainProcess(); +// ProcessDefinitionEntity processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); +// List activeActivityIds = runtimeService.getActiveActivityIds(executionId); +// List highLightedFlows = getHighLightedFlows(processDefinition, processInstance.getId()); +// ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator(); +// InputStream imageStream =diagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds, highLightedFlows); +// +// // 输出资源内容到相应对象 +// byte[] b = new byte[1024]; +// int len; +// while ((len = imageStream.read(b, 0, 1024)) != -1) { +// response.getOutputStream().write(b, 0, len); +// } +// } + + @Override + public TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery) { + TaskHandleVO handleVO = new TaskHandleVO(); + final Task task = taskRuntime.task(taskQuery.getTaskId()); + List steps = getTaskSteps(task.getProcessInstanceId()); + handleVO.setHistoryTask(steps); + return handleVO; + } + + + private List getTaskSteps(String processInstanceId) { + // 获得已完成的活动 + List finished = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(processInstanceId) + .activityType("userTask") + .finished() + .orderByHistoricActivityInstanceStartTime().asc().list(); + // 获得对应的步骤 + List steps = new ArrayList<>(); + finished.forEach(instance -> { + TaskStepVO stepVO = TaskConvert.INSTANCE.convert(instance); + stepVO.setStatus(1); // TODO @jason:1 这个 magic number 要枚举起来。 + // TODO @jason:可以考虑把 comments 读取后,在统一调用 convert 拼接。另外 Comment 是废弃的类,有没其它可以使用的哈? + List comments = activitiTaskService.getTaskComments(instance.getTaskId()); + if (!CollUtil.isEmpty(comments)) { + // TODO @jason:IDEA 在 t.getFullMessage() 有提示告警,可以解决下。 + stepVO.setComment(Optional.ofNullable(comments.get(0)).map(t->t.getFullMessage()).orElse("")); + } + steps.add(stepVO); + }); + + // 获得未完成的活动 + List unfinished = historyService + .createHistoricActivityInstanceQuery() + .processInstanceId(processInstanceId) + .activityType("userTask") + .unfinished().list(); + // 获得对应的步骤 + for (HistoricActivityInstance instance : unfinished) { + TaskStepVO stepVO = TaskConvert.INSTANCE.convert(instance); + stepVO.setComment(""); + stepVO.setStatus(0); + steps.add(stepVO); + } + return steps; + } + + + @Override + public List getHistorySteps(String processInstanceId) { + return getTaskSteps(processInstanceId); + } + + @Override + public TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery) { + final Task task = taskRuntime.task(taskQuery.getTaskId()); + // 转换结果 + TodoTaskRespVO respVO = new TodoTaskRespVO(); + respVO.setFormKey(task.getFormKey()); + respVO.setBusinessKey(task.getBusinessKey()); + respVO.setId(task.getId()); + respVO.setProcessInstanceId(task.getProcessInstanceId()); + return respVO; + } + +// private List getHighLightedFlows(ProcessDefinitionEntity processDefinition, String processInstanceId) { +// +// List highLightedFlows = new ArrayList(); +// List historicActivityInstances = historyService +// .createHistoricActivityInstanceQuery() +// .processInstanceId(processInstanceId) +// .orderByHistoricActivityInstanceStartTime().asc().list(); +// +// List historicActivityInstanceList = new ArrayList(); +// for (HistoricActivityInstance hai : historicActivityInstances) { +// historicActivityInstanceList.add(hai.getActivityId()); +// } + +// // add current activities to list +// List highLightedActivities = runtimeService.getActiveActivityIds(processInstanceId); +// historicActivityInstanceList.addAll(highLightedActivities); + + // activities and their sequence-flows +// for (ActivityImpl activity : processDefinition.getActivities()) { +// int index = historicActivityInstanceList.indexOf(activity.getId()); +// +// if (index >= 0 && index + 1 < historicActivityInstanceList.size()) { +// List pvmTransitionList = activity +// .getOutgoingTransitions(); +// for (PvmTransition pvmTransition : pvmTransitionList) { +// String destinationFlowId = pvmTransition.getDestination().getId(); +// if (destinationFlowId.equals(historicActivityInstanceList.get(index + 1))) { +// highLightedFlows.add(pvmTransition.getId()); +// } +// } +// } +// } +// return highLightedFlows; +// } + + + @Override + public void getHighlightImg(String processInstanceId, HttpServletResponse response) { + // 查询历史 + HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + // 如果有结束时间 + if (hpi == null) { + return; + } + // 没有结束时间。说明流程在执行过程中 + ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId()); + List highLightedActivities = new ArrayList<>(); + + List historicActivityInstances = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId) + .orderByHistoricActivityInstanceId().asc().list(); + // 获取所有活动节点 + List finishedInstances = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(processInstanceId).finished().list(); + for (HistoricActivityInstance hai : finishedInstances) { + highLightedActivities.add(hai.getActivityId()); + } + // 已完成的节点+当前节点 + highLightedActivities.addAll(runtimeService.getActiveActivityIds(processInstanceId)); + + // 经过的流 + List highLightedFlowIds = getHighLightedFlows(bpmnModel, historicActivityInstances); + + //设置"宋体" + try (InputStream inputStream = processDiagramGenerator.generateDiagram(bpmnModel, highLightedActivities, highLightedFlowIds, + "宋体", "宋体", "宋体")){ + String picName = hpi.getProcessDefinitionName()+".svg"; + // 输出到浏览器 + responseImage(response, inputStream, picName); + } catch (IOException e) { + log.error(ExceptionUtils.getStackTrace(e)); + } + + } + + private void responseImage(HttpServletResponse response, InputStream inputStream, String picName) throws IOException { + response.setContentType("application/octet-stream;charset=UTF-8"); + response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(picName, "UTF-8")); + byte[] b = new byte[1024]; + int len = -1; + while ((len = inputStream.read(b, 0, 1024)) != -1) { + response.getOutputStream().write(b, 0, len); + } + response.flushBuffer(); + } + /** + * 获取已经流转的线 https://blog.csdn.net/qiuxinfa123/article/details/119579863 + * @see + * @param bpmnModel model + * @param historicActivityInstances 高亮线条 + * @return + */ + private List getHighLightedFlows(BpmnModel bpmnModel, List historicActivityInstances) { + // 高亮流程已发生流转的线id集合 + List highLightedFlowIds = new ArrayList<>(); + // 全部活动节点 + List historicActivityNodes = new ArrayList<>(); + // 已完成的历史活动节点 + List finishedActivityInstances = new ArrayList<>(); + + for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) { + FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true); + historicActivityNodes.add(flowNode); + // 结束时间不为空,则是已完成节点 + if (historicActivityInstance.getEndTime() != null) { + finishedActivityInstances.add(historicActivityInstance); + } + } + + FlowNode currentFlowNode; + FlowNode targetFlowNode; + // 遍历已完成的活动实例,从每个实例的outgoingFlows中找到已执行的 + for (HistoricActivityInstance currentActivityInstance : finishedActivityInstances) { + // 获得当前活动对应的节点信息及outgoingFlows信息 + currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true); + List sequenceFlows = currentFlowNode.getOutgoingFlows(); + + /** + * 遍历outgoingFlows并找到已流转的 满足如下条件认为已已流转: + * 1.当前节点是并行网关或兼容网关,则通过outgoingFlows能够在历史活动中找到的全部节点均为已流转 + * 2.当前节点是以上两种类型之外的,通过outgoingFlows查找到的时间最早的流转节点视为有效流转 + */ + if ("parallelGateway".equals(currentActivityInstance.getActivityType()) || "inclusiveGateway".equals(currentActivityInstance.getActivityType())) { + // 遍历历史活动节点,找到匹配流程目标节点的 + for (SequenceFlow sequenceFlow : sequenceFlows) { + targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sequenceFlow.getTargetRef(), true); + if (historicActivityNodes.contains(targetFlowNode)) { + highLightedFlowIds.add(targetFlowNode.getId()); + } + } + } else { + List> tempMapList = new ArrayList<>(); + for (SequenceFlow sequenceFlow : sequenceFlows) { + for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) { + if (historicActivityInstance.getActivityId().equals(sequenceFlow.getTargetRef())) { + Map map = new HashMap<>(); + map.put("highLightedFlowId", sequenceFlow.getId()); + map.put("highLightedFlowStartTime", historicActivityInstance.getStartTime().getTime()); + tempMapList.add(map); + } + } + } + + if (!CollectionUtils.isEmpty(tempMapList)) { + // 遍历匹配的集合,取得开始时间最早的一个 + long earliestStamp = 0L; + String highLightedFlowId = null; + for (Map map : tempMapList) { + long highLightedFlowStartTime = Long.valueOf(map.get("highLightedFlowStartTime").toString()); + if (earliestStamp == 0 || earliestStamp >= highLightedFlowStartTime) { + highLightedFlowId = map.get("highLightedFlowId").toString(); + earliestStamp = highLightedFlowStartTime; + } + } + highLightedFlowIds.add(highLightedFlowId); + } + + } + + } + return highLightedFlowIds; + } +} diff --git a/yudao-admin-ui/src/views/oa/leave/approve-hr/index.vue b/yudao-admin-ui/src/views/oa/leave/approve-hr/index.vue index 3016c96..5e1468c 100644 --- a/yudao-admin-ui/src/views/oa/leave/approve-hr/index.vue +++ b/yudao-admin-ui/src/views/oa/leave/approve-hr/index.vue @@ -53,7 +53,10 @@ - 流程图-TODO + + + 流程图-TODO + @@ -61,7 +64,7 @@