jason 3 жил өмнө
parent
commit
b784bf3e12
25 өөрчлөгдсөн 495 нэмэгдсэн , 872 устгасан
  1. 16 14
      sql/ruoyi-vue-pro.sql
  2. 8 12
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/OALeaveController.java
  3. 25 0
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveApplyMembersVO.java
  4. 10 0
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveCreateReqVO.java
  5. 29 0
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/FlowStatusEnum.java
  6. 6 0
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/oa/OAErrorCodeConstants.java
  7. 13 4
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/LeaveApplyEndProcessor.java
  8. 8 4
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/OALeaveService.java
  9. 89 14
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/OALeaveServiceImpl.java
  10. 31 3
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/TaskService.java
  11. 4 57
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/impl/TaskServiceImpl.java
  12. 12 0
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java
  13. 1 0
      yudao-admin-server/src/main/resources/mybatis-config/mybatis-config.xml
  14. 0 152
      yudao-admin-server/src/main/resources/processes/leave-formkey.bpmn
  15. 177 0
      yudao-admin-server/src/main/resources/processes/leave-update.bpmn
  16. 7 0
      yudao-admin-ui/src/api/oa/leave.js
  17. 6 48
      yudao-admin-ui/src/router/index.js
  18. 1 1
      yudao-admin-ui/src/utils/dict.js
  19. 7 7
      yudao-admin-ui/src/views/oa/flow/index.vue
  20. 14 9
      yudao-admin-ui/src/views/oa/leave/apply/index.vue
  21. 0 190
      yudao-admin-ui/src/views/oa/leave/approve-leader/index.vue
  22. 16 5
      yudao-admin-ui/src/views/oa/leave/approve/index.vue
  23. 0 137
      yudao-admin-ui/src/views/oa/leave/confirm/index.vue
  24. 15 4
      yudao-admin-ui/src/views/oa/leave/index.vue
  25. 0 211
      yudao-admin-ui/src/views/oa/leave/modify/index.vue

+ 16 - 14
sql/ruoyi-vue-pro.sql

@@ -269,12 +269,6 @@ CREATE TABLE `oa_leave` (
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='请假申请表';
 
--- ----------------------------
--- Records of oa_leave
--- ----------------------------
-BEGIN;
-INSERT INTO `oa_leave` VALUES (1, '659d1c4f-3943-11ec-854f-3e6e3d9df205', 2, 'admin', '2021-10-01 00:00:00', '2021-10-30 00:00:00', '1', NULL, '2021-10-12 00:00:00', '1', '2021-10-30 13:36:57', '1', '2021-10-30 13:41:53', b'0');
-COMMIT;
 
 -- ----------------------------
 -- Table structure for pay_app
@@ -842,9 +836,10 @@ INSERT INTO `sys_dict_data` VALUES (85, 202, '强制登出', '202', 'sys_login_t
 INSERT INTO `sys_dict_data` VALUES (86, 0, '病假', '1', 'oa_leave_type', 0, NULL, '1', '2021-09-21 22:35:28', '1', '2021-09-21 14:59:27', b'0');
 INSERT INTO `sys_dict_data` VALUES (87, 1, '事假', '2', 'oa_leave_type', 0, NULL, '1', '2021-09-21 22:36:11', '1', '2021-09-21 14:59:27', b'0');
 INSERT INTO `sys_dict_data` VALUES (88, 2, '婚假', '3', 'oa_leave_type', 0, NULL, '1', '2021-09-21 22:36:38', '1', '2021-09-21 14:59:27', b'0');
-INSERT INTO `sys_dict_data` VALUES (89, 0, '处理中', '1', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:46:46', '1', '2021-10-12 22:12:20', b'0');
-INSERT INTO `sys_dict_data` VALUES (90, 1, '流程结束', '2', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:47:03', '1', '2021-10-12 22:12:58', b'0');
-INSERT INTO `sys_dict_data` VALUES (91, 2, '完成', '3', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:47:25', '1', '2021-10-12 14:13:06', b'1');
+INSERT INTO `sys_dict_data` VALUES (89, 0, '处理中', '1', 'flow_status', 0, NULL, '1', '2021-09-21 22:46:46', '1', '2021-10-12 22:12:20', b'0');
+INSERT INTO `sys_dict_data` VALUES (90, 1, '审批通过', '2', 'flow_status', 0, NULL, '1', '2021-09-21 22:47:03', '1', '2021-10-12 22:12:58', b'0');
+INSERT INTO `sys_dict_data` VALUES (91, 2, '完成', '3', 'flow_status', 0, NULL, '1', '2021-09-21 22:47:25', '1', '2021-10-12 14:13:06', b'1');
+INSERT INTO `sys_dict_data` VALUES (92, 2, '审批未通过', '3', 'flow_status', 0, NULL, '1', '2021-09-21 22:47:25', '1', '2021-10-12 14:13:06', b'0');
 COMMIT;
 
 -- ----------------------------
@@ -894,7 +889,7 @@ INSERT INTO `sys_dict_type` VALUES (114, '短信接收状态', 'sys_sms_receive_
 INSERT INTO `sys_dict_type` VALUES (115, '错误码的类型', 'sys_error_code_type', 0, NULL, '1', '2021-04-21 00:06:30', '1', '2021-04-13 22:07:12', b'0');
 INSERT INTO `sys_dict_type` VALUES (116, '登陆日志的类型', 'sys_login_type', 0, '登陆日志的类型', '1', '2021-10-06 00:50:46', '1', '2021-10-06 00:50:46', b'0');
 INSERT INTO `sys_dict_type` VALUES (117, '请假类型', 'oa_leave_type', 0, NULL, '1', '2021-09-21 22:34:33', '1', '2021-09-21 15:00:38', b'0');
-INSERT INTO `sys_dict_type` VALUES (118, '请假流程状态', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:46:04', '1', '2021-09-21 15:00:38', b'0');
+INSERT INTO `sys_dict_type` VALUES (118, '流程状态', 'flow_status', 0, NULL, '1', '2021-09-21 22:46:04', '1', '2021-09-21 15:00:38', b'0');
 COMMIT;
 
 -- ----------------------------
@@ -1191,14 +1186,14 @@ INSERT INTO `sys_menu` VALUES (1113, '错误码更新', 'system:error-code:updat
 INSERT INTO `sys_menu` VALUES (1114, '错误码删除', 'system:error-code:delete', 3, 4, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:51', b'0');
 INSERT INTO `sys_menu` VALUES (1115, '错误码导出', 'system:error-code:export', 3, 5, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:55', b'0');
 INSERT INTO `sys_menu` VALUES (1116, '日志中心', '', 2, 8, 2, 'log-center', 'log', 'infra/skywalking/log', 0, '1', '2021-04-26 22:35:45', '1', '2021-04-26 22:37:25', b'0');
-INSERT INTO `sys_menu` VALUES (1118, '请假查询', '', 2, 0, 5, 'oa/leave', 'user', 'oa/leave/index', 0, '', '2021-09-20 08:51:03', '1', '2021-10-12 22:19:02', b'0');
+INSERT INTO `sys_menu` VALUES (1118, '我的请假', '', 2, 0, 5, 'oa/leave', 'user', 'oa/leave/index', 0, '', '2021-09-20 08:51:03', '1', '2021-10-12 22:19:02', b'0');
 INSERT INTO `sys_menu` VALUES (1119, '请假申请查询', 'oa:leave:query', 3, 1, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2021-09-20 08:51:03', b'0');
 INSERT INTO `sys_menu` VALUES (1120, '请假申请创建', 'oa:leave:create', 3, 2, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2021-09-20 08:51:03', b'0');
 INSERT INTO `sys_menu` VALUES (1121, '请假申请更新', 'oa:leave:update', 3, 3, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2021-09-20 08:51:03', b'0');
 INSERT INTO `sys_menu` VALUES (1122, '请假申请删除', 'oa:leave:delete', 3, 4, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2021-09-20 08:51:03', b'0');
 INSERT INTO `sys_menu` VALUES (1123, '请假申请导出', 'oa:leave:export', 3, 5, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2021-09-20 08:51:03', b'0');
-INSERT INTO `sys_menu` VALUES (1124, '待办任务', '', 2, 2, 5, 'todo', 'edit', 'oa/todo/index', 0, '1', '2021-09-20 22:10:09', '1', '2021-09-21 23:17:12', b'0');
-INSERT INTO `sys_menu` VALUES (1125, '流程申请', '', 2, 3, 5, 'flow', 'form', 'oa/flow/index', 0, '1', '2021-10-23 22:10:09', '1', '2021-10-23 23:17:12', b'0');
+INSERT INTO `sys_menu` VALUES (1124, '待办请假', '', 2, 2, 5, 'todo', 'edit', 'oa/todo/index', 0, '1', '2021-09-20 22:10:09', '1', '2021-09-21 23:17:12', b'0');
+INSERT INTO `sys_menu` VALUES (1125, '已办请假', '', 2, 3, 5, 'flow', 'form', 'oa/flow/index', 0, '1', '2021-10-23 22:10:09', '1', '2021-10-23 23:17:12', b'0');
 COMMIT;
 
 -- ----------------------------
@@ -1290,10 +1285,11 @@ CREATE TABLE `sys_post` (
 -- ----------------------------
 BEGIN;
 INSERT INTO `sys_post` VALUES (1, 'ceo', '董事长', 1, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:39:03', b'0');
-INSERT INTO `sys_post` VALUES (2, 'se', '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:39:05', b'0');
+INSERT INTO `sys_post` VALUES (2, 'pm', '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:39:05', b'0');
 INSERT INTO `sys_post` VALUES (3, 'hr', '人力资源', 3, 0, '', 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0');
 INSERT INTO `sys_post` VALUES (4, 'user', '普通员工', 4, 0, '', 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0');
 INSERT INTO `sys_post` VALUES (5, 'test', '测试岗位', 0, 1, '132', '', '2021-01-07 15:07:44', '', '2021-01-07 15:10:35', b'1');
+INSERT INTO `sys_post` VALUES (6, 'bm', '部门经理', 0, 1, '部门经理', '', '2021-01-07 15:07:44', '', '2021-01-07 15:10:35', b'0');
 COMMIT;
 
 -- ----------------------------
@@ -1721,6 +1717,9 @@ INSERT INTO `sys_user` VALUES (103, 'yuanma', '', '源码', NULL, 100, NULL, 'yu
 INSERT INTO `sys_user` VALUES (104, 'test', '$2a$10$.TOFpaIiI3PzEwkGrNq0Eu6Cc3rOqJMxTb1DqeSEM8StxaGPBRKoi', '测试号', NULL, 100, '[]', '', '15601691200', 1, '', 0, '', NULL, '', '2021-01-21 02:13:53', '1', '2021-03-14 22:36:38', b'0');
 INSERT INTO `sys_user` VALUES (105, 'hradmin', '$2a$10$JEhJOL25X1eMnFfR3PILo.MoAljf29YukpL2w6H9GvVGjmqOCuh.O', 'hr-mgr', 'hr 管理员', 100, '[3]', '', '', 1, '', 0, '127.0.0.1', '2021-10-30 13:41:04', '1', '2021-09-25 16:50:41', NULL, '2021-10-30 13:41:04', b'0');
 INSERT INTO `sys_user` VALUES (106, 'zhijiantianya', '$2a$10$Y0hSfV2udA8quqMeWukhTuHEoKpQ5tDhclG8WUWSOH7o/MGw185Ti', '芋道源码', '', NULL, NULL, '', '', 3, 'https://portrait.gitee.com/uploads/avatars/user/0/176_zhijiantianya_1578913741.png', 0, '', NULL, NULL, '2021-09-28 09:40:59', NULL, '2021-09-28 09:40:59', b'0');
+INSERT INTO `sys_user` VALUES (107, 'projectmgr', '$2a$10$Ky9dvdSU9xWCJYzPL8/pk.Tyx2WkDlxVFTSJWOYGCYqT6x1cTsIU2', 'project-mgr', '项目经理', 100, '[2]', '', '', 1, '', 0, '127.0.0.1', '2021-10-30 13:41:04', '1', '2021-09-25 16:50:41', NULL, '2021-10-30 13:41:04', b'0');
+INSERT INTO `sys_user` VALUES (108, 'depmgr', '$2a$10$q/w2v.3pnjjERehoOvHCYOl0I0MvAEw54Bt5ch09IUuwPVsIr3.oa', 'bm', '部门经理', 100, '[6]', '', '', 1, '', 0, '127.0.0.1', '2021-10-30 13:41:04', '1', '2021-09-25 16:50:41', NULL, '2021-10-30 13:41:04', b'0');
+INSERT INTO `sys_user` VALUES (109, 'normal', '$2a$10$q3lIAjzzaNWuTGN2kIURfOzTkc2iPXvAM1n425sNcE5w3asymw2hK', 'general', '普通用户', 100, '[4]', '', '', 1, '', 0, '127.0.0.1', '2021-10-30 13:41:04', '1', '2021-09-25 16:50:41', NULL, '2021-10-30 13:41:04', b'0');
 COMMIT;
 
 -- ----------------------------
@@ -1752,6 +1751,9 @@ INSERT INTO `sys_user_role` VALUES (6, 100, 2, '', NULL, '', NULL, b'0');
 INSERT INTO `sys_user_role` VALUES (7, 104, 101, '', NULL, '', NULL, b'0');
 INSERT INTO `sys_user_role` VALUES (8, 106, 1, NULL, '2021-09-28 09:40:59', NULL, '2021-09-28 09:40:59', b'0');
 INSERT INTO `sys_user_role` VALUES (9, 105, 1, '1', '2021-10-30 13:40:48', '1', '2021-10-30 13:40:48', b'0');
+INSERT INTO `sys_user_role` VALUES (10, 107, 1, '1', '2021-10-30 13:40:48', '1', '2021-10-30 13:40:48', b'0');
+INSERT INTO `sys_user_role` VALUES (11, 108, 1, '1', '2021-10-30 13:40:48', '1', '2021-10-30 13:40:48', b'0');
+INSERT INTO `sys_user_role` VALUES (12, 109, 1, '1', '2021-10-30 13:40:48', '1', '2021-10-30 13:40:48', b'0');
 COMMIT;
 
 -- ----------------------------

+ 8 - 12
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/OALeaveController.java

@@ -36,25 +36,21 @@ public class OALeaveController {
     @Resource
     private OALeaveService leaveService;
 
-    @PostMapping("/create")
-    @ApiOperation("创建请假申请")
-    @PreAuthorize("@ss.hasPermission('oa:leave:create')")
-    public CommonResult<Long> createLeave(@Valid @RequestBody OALeaveCreateReqVO createReqVO) {
-        // TODO @芋艿:processKey 自己去理解下。不过得把 leave 变成枚举
-        // TODO @芋艿 该方法没有用到, 是前一个版本的, 可以删掉。
-        createReqVO.setProcessKey("leave");
-        return success(leaveService.createLeave(createReqVO));
-    }
+
 
     @PostMapping("/form-key/create")
     @ApiOperation("创建外置请假申请")
     public CommonResult<Long> createFormKeyLeave(@Valid @RequestBody OALeaveCreateReqVO createReqVO) {
-        // TODO @芋艿:processKey 自己去理解下。不过得把 formkey 变成枚举
-        // TODO @芋艿 : processKey 是 bpmn  <process> 中定义的id, 提交业务表单时候, 需要启动流程, 或许从前台传更合适
-        createReqVO.setProcessKey("leave-formkey");
+        // processKey 前台传入
         return success(leaveService.createLeave(createReqVO));
     }
 
+    @GetMapping("/getLeaveApplyMembers")
+    @ApiOperation("获取本人请假申请流程中审批人员,可先检查这些人员是否存在")
+    public CommonResult<OALeaveApplyMembersVO> getLeaveApplyMembers() {
+        return success(leaveService.getLeaveApplyMembers());
+    }
+
     @PutMapping("/update")
     @ApiOperation("更新请假申请")
     @PreAuthorize("@ss.hasPermission('oa:leave:update')")

+ 25 - 0
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveApplyMembersVO.java

@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@ApiModel("请假申请审批人员 Response VO")
+@Data
+@Builder
+@EqualsAndHashCode
+@ToString
+public class OALeaveApplyMembersVO {
+
+    @ApiModelProperty(value = "部门的hr")
+    private String hr;
+
+    @ApiModelProperty(value = "部门的项目经理")
+    private String pm;
+
+    @ApiModelProperty(value = "部门的部门经理")
+    private String bm;
+}

+ 10 - 0
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveCreateReqVO.java

@@ -3,11 +3,21 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo;
 import lombok.*;
 import io.swagger.annotations.*;
 
+import java.util.Map;
+
 @ApiModel("请假申请创建 Request VO")
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 public class OALeaveCreateReqVO extends OALeaveBaseVO {
 
+    /**
+     * 对应 bpmn 文件 <process> 的 id
+     */
+    @ApiModelProperty(value = "流程key")
     private String processKey;
+
+
+    @ApiModelProperty(value = "流程用户任务的变量")
+    private Map<String,Object> taskVariables;
 }

+ 29 - 0
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/FlowStatusEnum.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.adminserver.modules.bpm.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 流程状态
+ */
+@Getter
+@AllArgsConstructor
+public enum FlowStatusEnum {
+
+    HANDLE(1, "处理中"),
+
+    PASS(2, "审批通过"),
+
+    REJECTED(3, "审批不通过");
+
+    /**
+     * 状态
+     */
+    private final Integer status;
+
+
+    /**
+     * 描述
+     */
+    private final String desc;
+}

+ 6 - 0
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/oa/OAErrorCodeConstants.java

@@ -10,4 +10,10 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
  */
 public interface OAErrorCodeConstants {
     ErrorCode LEAVE_NOT_EXISTS = new ErrorCode(1003001001, "请假申请不存在");
+    ErrorCode PM_POST_NOT_EXISTS = new ErrorCode(1003001002, "项目经理岗位未设置");
+    ErrorCode DEPART_PM_POST_NOT_EXISTS = new ErrorCode(1003001003, "部门的项目经理不存在");
+    ErrorCode BM_POST_NOT_EXISTS = new ErrorCode(1003001004, "部门经理岗位未设置");
+    ErrorCode DEPART_BM_POST_NOT_EXISTS = new ErrorCode(1003001005, "部门的部门经理不存在");
+    ErrorCode HR_POST_NOT_EXISTS = new ErrorCode(1003001006, "HR岗位未设置");
+    ErrorCode DAY_LEAVE_ERROR = new ErrorCode(1003001007, "请假天数必须大于0");
 }

+ 13 - 4
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/ReportBackEndProcessor.java → yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/LeaveApplyEndProcessor.java

@@ -2,16 +2,21 @@ 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 cn.iocoder.yudao.adminserver.modules.bpm.enums.FlowStatusEnum;
 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;
+import java.util.Objects;
 
-// TODO @jason:类注释
+
+/**
+ * 请假流程结束流程监听处理服务, 根据请假申请审批通过,还是未通过, 更新请假表单
+ */
 @Component
-public class ReportBackEndProcessor implements ExecutionListener {
+public class LeaveApplyEndProcessor implements ExecutionListener {
 
     @Resource
     private OALeaveMapper leaveMapper;
@@ -20,10 +25,14 @@ public class ReportBackEndProcessor implements ExecutionListener {
     @Transactional(rollbackFor = Exception.class)
     public void notify(DelegateExecution delegateExecution) {
         final String businessKey = delegateExecution.getProcessInstanceBusinessKey();
+        final Object approved = delegateExecution.getVariable("approved");
         OALeaveDO updateDo = new OALeaveDO();
         updateDo.setId(Long.valueOf(businessKey));
-        // TODO @json:status 要枚举起来,不要出现 magic number
-        updateDo.setStatus(2);
+        if (Objects.equals(approved, true)) {
+            updateDo.setStatus(FlowStatusEnum.PASS.getStatus());
+        }else{
+            updateDo.setStatus(FlowStatusEnum.REJECTED.getStatus());
+        }
         leaveMapper.updateById(updateDo);
     }
 

+ 8 - 4
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/OALeaveService.java

@@ -1,10 +1,7 @@
 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.controller.oa.vo.*;
 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 
@@ -73,4 +70,11 @@ public interface OALeaveService {
      */
     List<OALeaveDO> getLeaveList(OALeaveExportReqVO exportReqVO);
 
+
+
+    /**
+     * 获取本人请假申请流程中审批人员
+     * @return  包括,本人部门的项目经理, 部门经理,  HR
+     */
+    OALeaveApplyMembersVO getLeaveApplyMembers();
 }

+ 89 - 14
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/OALeaveServiceImpl.java

@@ -1,13 +1,19 @@
 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.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.*;
 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.enums.FlowStatusEnum;
 import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.OALeaveService;
+import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserBaseVO;
+import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
+import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysPostMapper;
+import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import org.activiti.api.task.model.Task;
@@ -20,9 +26,11 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.NotNull;
 import java.util.*;
 
-import static cn.iocoder.yudao.adminserver.modules.bpm.enums.oa.OAErrorCodeConstants.LEAVE_NOT_EXISTS;
+import static cn.iocoder.yudao.adminserver.modules.bpm.enums.oa.OAErrorCodeConstants.*;
+import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.POST_CODE_DUPLICATE;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 
 /**
@@ -46,23 +54,33 @@ public class OALeaveServiceImpl implements OALeaveService {
     @Resource
     private TaskRuntime taskRuntime;
 
+    @Resource
+    private SysPostMapper sysPostMapper;
+
+    @Resource
+    private SysUserMapper sysUserMapper;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createLeave(OALeaveCreateReqVO createReqVO) {
         // 插入 OA 请假单
         OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO);
-        leave.setStatus(1);
+        leave.setStatus(FlowStatusEnum.HANDLE.getStatus());
         // TODO @jason:应该是存储 userId??
         leave.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername());
         leaveMapper.insert(leave);
-
+        Date startTime = createReqVO.getStartTime();
+        Date endTime = createReqVO.getEndTime();
+        long day = DateUtil.betweenDay(startTime, endTime, false);
+        if (day <= 0) {
+            throw ServiceExceptionUtil.exception(DAY_LEAVE_ERROR);
+        }
+        Map<String, Object> taskVariables = createReqVO.getTaskVariables();
+        taskVariables.put("day", day);
         // 创建工作流
-        Map<String, Object> 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);
+        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(createReqVO.getProcessKey(), businessKey, taskVariables);
         String processInstanceId = processInstance.getProcessInstanceId();
 
         // 将工作流的编号,更新到 OA 请假单中
@@ -104,9 +122,6 @@ public class OALeaveServiceImpl implements OALeaveService {
         this.validateLeaveExists(id);
         // 删除
         leaveMapper.deleteById(id);
-        // TODO @jason:需要调用 runtimeService 的 delete 方法,删除???
-        // TOTO @芋道源码 目前页面暂时没有实现基于业务表单的删除, 该代码自动生成的。
-        // TODO @芋道源码  我理解提交流程后,是不允许删除的? , 只能在流程处理中作废流程
     }
 
     private void validateLeaveExists(Long id) {
@@ -135,4 +150,64 @@ public class OALeaveServiceImpl implements OALeaveService {
         return leaveMapper.selectList(exportReqVO);
     }
 
+
+    /**
+     * 获取本人请假申请流程中审批人员
+     * @return 包括,本人部门的项目经理, 部门经理,  hr
+     */
+    @Override
+    public OALeaveApplyMembersVO getLeaveApplyMembers() {
+        final Long id = SecurityFrameworkUtils.getLoginUser().getId();
+        //项目经理
+        //TODO jason 定义enum
+        SysPostDO pmPostDO = sysPostMapper.selectByCode("pm");
+        if (Objects.isNull(pmPostDO)) {
+            throw ServiceExceptionUtil.exception(PM_POST_NOT_EXISTS);
+        }
+        SysUserDO userDO = sysUserMapper.selectById(id);
+        Set<Long>  postIds  = new HashSet<>(8);
+        postIds.add( pmPostDO.getId());
+        SysUserBaseVO baseVO = new SysUserBaseVO();
+        baseVO.setDeptId(userDO.getDeptId())
+                .setPostIds(postIds);
+        final List<SysUserDO> pmUsers = sysUserMapper.selectListByBaseVO(baseVO);
+        if (CollUtil.isEmpty(pmUsers)) {
+            throw ServiceExceptionUtil.exception(DEPART_PM_POST_NOT_EXISTS);
+        }
+
+        //部门经理
+        SysPostDO bmPostDO = sysPostMapper.selectByCode("bm");
+        if (Objects.isNull(bmPostDO)) {
+            throw ServiceExceptionUtil.exception(BM_POST_NOT_EXISTS);
+        }
+        userDO = sysUserMapper.selectById(id);
+        postIds  = new HashSet<>(8);
+        postIds.add( bmPostDO.getId());
+        baseVO = new SysUserBaseVO();
+        baseVO.setDeptId(userDO.getDeptId())
+                .setPostIds(postIds);
+        final List<SysUserDO> bmUsers = sysUserMapper.selectListByBaseVO(baseVO);
+        if (CollUtil.isEmpty(bmUsers)) {
+            throw ServiceExceptionUtil.exception(DEPART_BM_POST_NOT_EXISTS);
+        }
+        //人事
+        SysPostDO hrPostDO = sysPostMapper.selectByCode("hr");
+        if (Objects.isNull(hrPostDO)) {
+            throw ServiceExceptionUtil.exception(HR_POST_NOT_EXISTS);
+        }
+        userDO = sysUserMapper.selectById(id);
+        postIds  = new HashSet<>(8);
+        postIds.add( hrPostDO.getId());
+        baseVO = new SysUserBaseVO();
+        baseVO.setDeptId(userDO.getDeptId())
+                .setPostIds(postIds);
+        final List<SysUserDO> hrUsers = sysUserMapper.selectListByBaseVO(baseVO);
+        if (CollUtil.isEmpty(hrUsers)) {
+            throw ServiceExceptionUtil.exception(DEPART_BM_POST_NOT_EXISTS);
+        }
+        return OALeaveApplyMembersVO.builder().pm(pmUsers.get(0).getUsername())
+                .bm(bmUsers.get(0).getUsername())
+                .hr(hrUsers.get(0).getUsername()).build();
+    }
+
 }

+ 31 - 3
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/TaskService.java

@@ -6,22 +6,50 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
-// TODO @芋艿:前缀,注释
-// TODO @json:类和方法的注释。咱是开源项目,有注释,大家才能更容易读懂
+
+/**
+ * 用户任务服务接口
+ */
 public interface TaskService {
 
+
+    /**
+     * 获取当前用户的待办任务, 分页
+     */
     PageResult<TodoTaskRespVO> getTodoTaskPage(TodoTaskPageReqVO pageReqVO);
 
+
+    /**
+     * 签收任务
+     * @param taskId  用户任务id
+     */
     void claimTask(String taskId);
 
 
+    /**
+     * 办理完成用户任务
+     * @param taskReq 任务参数, 包含任务的参数,和 评论
+     */
     void completeTask(TaskReqVO taskReq);
 
-//    void flowImage(String taskId, HttpServletResponse response);
+
+    /**
+     * 根据任务id, 查询已经完成的用户任务,未完成的用户任务
+     * @param taskQuery 查询参数  一般 taskId
+     */
     TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery);
 
+    /**
+     * 根据流程实例id, 查询历史用户任务,包括已完成,未完成
+     * @param processInstanceId 流程实例id
+     */
     List<TaskStepVO> getHistorySteps(String processInstanceId);
 
+
+    /**
+     * 获取用户任务的 formKey, 对应外置表单, 需要根据formKey 对应业务表单
+     * @param taskQuery 查询参数 ,一般taskId
+     */
     TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery);
 
 

+ 4 - 57
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/impl/TaskServiceImpl.java

@@ -89,7 +89,7 @@ public class TaskServiceImpl implements TaskService {
     /**
      * 工作流,完成 userTask, 完成用户任务 一般传入参数 1。是否同意(variables).  2. 评论(comment)
      * variables 变量名 和 评论 由前台传入
-     * @param taskReq
+     * @param taskReq 任务参数
      */
     @Override
     @Transactional
@@ -103,25 +103,7 @@ public class TaskServiceImpl implements TaskService {
                 .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<String> activeActivityIds = runtimeService.getActiveActivityIds(executionId);
-//        List<String> 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) {
@@ -148,8 +130,7 @@ public class TaskServiceImpl implements TaskService {
             // TODO @jason:可以考虑把 comments 读取后,在统一调用 convert 拼接。另外 Comment 是废弃的类,有没其它可以使用的哈?
             List<Comment> 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(""));
+                stepVO.setComment(Optional.ofNullable(comments.get(0)).map(Comment::getFullMessage).orElse(""));
             }
             steps.add(stepVO);
         });
@@ -188,45 +169,11 @@ public class TaskServiceImpl implements TaskService {
         return respVO;
     }
 
-//    private List<String> getHighLightedFlows(ProcessDefinitionEntity processDefinition, String processInstanceId) {
-//
-//        List<String> highLightedFlows = new ArrayList<String>();
-//        List<HistoricActivityInstance> historicActivityInstances = historyService
-//                .createHistoricActivityInstanceQuery()
-//                .processInstanceId(processInstanceId)
-//                .orderByHistoricActivityInstanceStartTime().asc().list();
-//
-//        List<String> historicActivityInstanceList = new ArrayList<String>();
-//        for (HistoricActivityInstance hai : historicActivityInstances) {
-//            historicActivityInstanceList.add(hai.getActivityId());
-//        }
-
-//        // add current activities to list
-//        List<String> 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<PvmTransition> 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) {
         // 查询历史
+        //TODO 云扬四海 貌似流程结束后,点击审批进度会报错
        HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
         // 如果有结束时间
         if (hpi == null) {

+ 12 - 0
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java

@@ -1,6 +1,8 @@
 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user;
 
+import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserBaseVO;
 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
@@ -8,9 +10,11 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUs
 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserPageReqVO;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.logging.log4j.util.Strings;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 
 @Mapper
 public interface SysUserMapper extends BaseMapperX<SysUserDO> {
@@ -52,5 +56,13 @@ public interface SysUserMapper extends BaseMapperX<SysUserDO> {
         return selectList(new QueryWrapperX<SysUserDO>().like("username", username));
     }
 
+    default List<SysUserDO> selectListByBaseVO(SysUserBaseVO reqVO) {
+        return selectList(new QueryWrapperX<SysUserDO>().likeIfPresent("username", reqVO.getUsername())
+                .likeIfPresent("nickname", reqVO.getNickname())
+                .eq("status", CommonStatusEnum.ENABLE.getStatus())
+                .eq("dept_id", reqVO.getDeptId())
+                .likeIfPresent("post_ids", Optional.ofNullable(reqVO.getPostIds()).map(t -> Strings.join(t, ',')).orElse("")));
+    }
+
 }
 

+ 1 - 0
yudao-admin-server/src/main/resources/mybatis-config/mybatis-config.xml

@@ -6,6 +6,7 @@
     <settings>
         <setting name="lazyLoadingEnabled" value="false" />
         <setting name="mapUnderscoreToCamelCase" value="true"/>
+<!--        <setting name="logImpl" value="STDOUT_LOGGING"/>-->
     </settings>
     <typeAliases>
         <typeAlias type="org.activiti.engine.impl.persistence.ByteArrayRefTypeHandler" alias="ByteArrayRefTypeHandler"/>

+ 0 - 152
yudao-admin-server/src/main/resources/processes/leave-formkey.bpmn

@@ -1,152 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://bpmn.io/schema/bpmn">
-  <process id="leave-formkey" name="请假流程-外置表单" isExecutable="true">
-    <documentation>外置表单</documentation>
-    <startEvent id="startevent1" name="Start" activiti:initiator="applyUserId" activiti:formKey="/flow/leave/apply"></startEvent>
-    <userTask id="deptLeaderVerify" name="部门经理审批" activiti:assignee="${deptLeader}" activiti:formKey="/flow/leave/approve-leader"></userTask>
-    <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
-    <userTask id="hrVerify" name="人事经理审批" activiti:candidateGroups="hr" activiti:formKey="/flow/leave/approve-hr"></userTask>
-    <exclusiveGateway id="exclusivegateway2" name="Exclusive Gateway"></exclusiveGateway>
-    <userTask id="reportBack" name="申请人确认" activiti:assignee="${applyUserId}" activiti:formKey="/flow/leave/confirm">
-    </userTask>
-    <endEvent id="endevent1" name="End"></endEvent>
-    <userTask id="modifyApply" name="调整申请内容" activiti:assignee="${applyUserId}" activiti:formKey="/flow/leave/modify"></userTask>
-    <exclusiveGateway id="exclusivegateway3" name="Exclusive Gateway"></exclusiveGateway>
-    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="deptLeaderVerify"></sequenceFlow>
-    <sequenceFlow id="flow2" sourceRef="deptLeaderVerify" targetRef="exclusivegateway1"></sequenceFlow>
-    <sequenceFlow id="flow3" name="同意" sourceRef="exclusivegateway1" targetRef="hrVerify">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${deptLeaderApproved == 'true'}]]></conditionExpression>
-    </sequenceFlow>
-    <sequenceFlow id="flow4" sourceRef="hrVerify" targetRef="exclusivegateway2"></sequenceFlow>
-    <sequenceFlow id="flow5" name="同意" sourceRef="exclusivegateway2" targetRef="reportBack">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${hrApproved == 'true'}]]></conditionExpression>
-    </sequenceFlow>
-    <sequenceFlow id="flow6" sourceRef="reportBack" targetRef="endevent1">
-      <extensionElements>
-        <activiti:executionListener event="take"  delegateExpression="${reportBackEndProcessor}"></activiti:executionListener>
-      </extensionElements>
-    </sequenceFlow>
-    <sequenceFlow id="flow7" name="不同意" sourceRef="exclusivegateway2" targetRef="modifyApply">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${hrApproved == 'false'}]]></conditionExpression>
-    </sequenceFlow>
-    <sequenceFlow id="flow8" name="不同意" sourceRef="exclusivegateway1" targetRef="modifyApply">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${deptLeaderApproved == 'false'}]]></conditionExpression>
-    </sequenceFlow>
-    <sequenceFlow id="flow9" sourceRef="modifyApply" targetRef="exclusivegateway3"></sequenceFlow>
-    <sequenceFlow id="flow10" name="调整后继续申请" sourceRef="exclusivegateway3" targetRef="deptLeaderVerify">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${reApply == 'true'}]]></conditionExpression>
-    </sequenceFlow>
-    <sequenceFlow id="flow11" name="取消申请,并设置取消标志" sourceRef="exclusivegateway3" targetRef="endevent1">
-      <extensionElements>
-        <activiti:executionListener event="take"  delegateExpression="${reportBackEndProcessor}"></activiti:executionListener>
-      </extensionElements>
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${reApply == 'false'}]]></conditionExpression>
-    </sequenceFlow>
-    <textAnnotation id="textannotation1" textFormat="text/plain">
-      <text>请求被驳回后员工可以选择继续申请,或者取消本次申请</text>
-    </textAnnotation>
-    <association id="association1" sourceRef="modifyApply" targetRef="textannotation1"></association>
-  </process>
-  <bpmndi:BPMNDiagram id="BPMNDiagram_leave-formkey">
-    <bpmndi:BPMNPlane bpmnElement="leave-formkey" id="BPMNPlane_leave-formkey">
-      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
-        <omgdc:Bounds height="35.0" width="35.0" x="10.0" y="50.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="deptLeaderVerify" id="BPMNShape_deptLeaderVerify">
-        <omgdc:Bounds height="55.0" width="105.0" x="90.0" y="40.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
-        <omgdc:Bounds height="40.0" width="40.0" x="230.0" y="47.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="hrVerify" id="BPMNShape_hrVerify">
-        <omgdc:Bounds height="55.0" width="105.0" x="310.0" y="40.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="exclusivegateway2" id="BPMNShape_exclusivegateway2">
-        <omgdc:Bounds height="40.0" width="40.0" x="470.0" y="47.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="reportBack" id="BPMNShape_reportBack">
-        <omgdc:Bounds height="55.0" width="105.0" x="580.0" y="40.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
-        <omgdc:Bounds height="35.0" width="35.0" x="615.0" y="213.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="modifyApply" id="BPMNShape_modifyApply">
-        <omgdc:Bounds height="55.0" width="105.0" x="198.0" y="120.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="exclusivegateway3" id="BPMNShape_exclusivegateway3">
-        <omgdc:Bounds height="40.0" width="40.0" x="230.0" y="210.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="textannotation1" id="BPMNShape_textannotation1">
-        <omgdc:Bounds height="57.0" width="112.0" x="340.0" y="168.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
-        <omgdi:waypoint x="45.0" y="67.0"></omgdi:waypoint>
-        <omgdi:waypoint x="90.0" y="67.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
-        <omgdi:waypoint x="195.0" y="67.0"></omgdi:waypoint>
-        <omgdi:waypoint x="230.0" y="67.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
-        <omgdi:waypoint x="270.0" y="67.0"></omgdi:waypoint>
-        <omgdi:waypoint x="310.0" y="67.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="11.0" width="22.0" x="269.0" y="50.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
-        <omgdi:waypoint x="415.0" y="67.0"></omgdi:waypoint>
-        <omgdi:waypoint x="470.0" y="67.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
-        <omgdi:waypoint x="510.0" y="67.0"></omgdi:waypoint>
-        <omgdi:waypoint x="580.0" y="67.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="11.0" width="22.0" x="529.0" y="50.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
-        <omgdi:waypoint x="632.0" y="95.0"></omgdi:waypoint>
-        <omgdi:waypoint x="632.0" y="213.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">
-        <omgdi:waypoint x="490.0" y="87.0"></omgdi:waypoint>
-        <omgdi:waypoint x="490.0" y="147.0"></omgdi:waypoint>
-        <omgdi:waypoint x="303.0" y="147.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="11.0" width="33.0" x="438.0" y="119.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">
-        <omgdi:waypoint x="250.0" y="87.0"></omgdi:waypoint>
-        <omgdi:waypoint x="250.0" y="120.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="11.0" width="33.0" x="260.0" y="87.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9">
-        <omgdi:waypoint x="250.0" y="175.0"></omgdi:waypoint>
-        <omgdi:waypoint x="250.0" y="210.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow10" id="BPMNEdge_flow10">
-        <omgdi:waypoint x="230.0" y="230.0"></omgdi:waypoint>
-        <omgdi:waypoint x="142.0" y="230.0"></omgdi:waypoint>
-        <omgdi:waypoint x="142.0" y="95.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="11.0" width="77.0" x="159.0" y="210.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow11" id="BPMNEdge_flow11">
-        <omgdi:waypoint x="270.0" y="230.0"></omgdi:waypoint>
-        <omgdi:waypoint x="615.0" y="230.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="33.0" width="100.0" x="58.0" y="-37.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="association1" id="BPMNEdge_association1">
-        <omgdi:waypoint x="303.0" y="147.0"></omgdi:waypoint>
-        <omgdi:waypoint x="396.0" y="168.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-    </bpmndi:BPMNPlane>
-  </bpmndi:BPMNDiagram>
-</definitions>

+ 177 - 0
yudao-admin-server/src/main/resources/processes/leave-update.bpmn

@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.activiti.org/processdef">
+  <process id="leave-update" name="leave-update" isExecutable="true">
+    <startEvent id="start" name="开始" activiti:initiator="applyUserId" activiti:formKey="/flow/leave/apply" />
+    <exclusiveGateway id="sid-AA8342FE-0C98-4CDC-B90F-B09B1AFB8F18" name="请假天数" />
+    <sequenceFlow id="sid-8022586B-8169-44C2-84FA-46E8278EB2EC" sourceRef="start" targetRef="sid-AA8342FE-0C98-4CDC-B90F-B09B1AFB8F18" />
+    <userTask id="pmVerify" name="项目经理审批" activiti:assignee="${pm}" activiti:formKey="/flow/leave/approve"/>
+    <userTask id="bmVerify" name="部门经理审批" activiti:assignee="${bm}" activiti:formKey="/flow/leave/approve" />
+    <sequenceFlow id="sid-DE7C5477-8C20-42C5-ADE5-AB4A9A13D58D" name="大于3天" sourceRef="sid-AA8342FE-0C98-4CDC-B90F-B09B1AFB8F18" targetRef="bmVerify">
+      <conditionExpression xsi:type="tFormalExpression">${day&gt;3}</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="sid-B8A78811-23EE-47FA-9913-F04F056EBF99" name="小于等于3天" sourceRef="sid-AA8342FE-0C98-4CDC-B90F-B09B1AFB8F18" targetRef="pmVerify">
+      <conditionExpression xsi:type="tFormalExpression">${day&lt;=3}</conditionExpression>
+    </sequenceFlow>
+    <exclusiveGateway id="sid-57610114-27FA-4024-94BF-B0FFE4A02E90" name="" />
+    <exclusiveGateway id="sid-287EF265-9109-4233-AEF1-14DF6FEF4B24" name="" />
+    <userTask id="hrVerify" name="人事审批" activiti:assignee="${hr}" activiti:formKey="/flow/leave/approve"/>
+    <endEvent id="end" />
+    <sequenceFlow id="sid-3BDD734B-CF1F-4ECA-A234-92BB81132A1E" name="不同意" sourceRef="sid-57610114-27FA-4024-94BF-B0FFE4A02E90" targetRef="end">
+      <extensionElements>
+        <activiti:executionListener event="take"  delegateExpression="${leaveApplyEndProcessor}"></activiti:executionListener>
+      </extensionElements>
+      <conditionExpression xsi:type="tFormalExpression">${approved =='false'}</conditionExpression>
+    </sequenceFlow>
+    <exclusiveGateway id="sid-76B28F95-2D0C-4364-B898-AB1EC8182879" name="" />
+    <sequenceFlow id="sid-31C8FAA6-11F1-4744-99F6-D7DB98AB1B10" name="不同意" sourceRef="sid-76B28F95-2D0C-4364-B898-AB1EC8182879" targetRef="end">
+      <extensionElements>
+        <activiti:executionListener event="take"  delegateExpression="${leaveApplyEndProcessor}"></activiti:executionListener>
+      </extensionElements>
+      <conditionExpression xsi:type="tFormalExpression">${approved =='false'}</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="sid-63703246-F9C8-4C23-966B-DBC627A81C96" sourceRef="bmVerify" targetRef="sid-287EF265-9109-4233-AEF1-14DF6FEF4B24" />
+    <sequenceFlow id="sid-F94C3FB1-CD76-4ED1-BDEC-57B9FCA97E16" name="同意" sourceRef="sid-287EF265-9109-4233-AEF1-14DF6FEF4B24" targetRef="hrVerify">
+      <conditionExpression xsi:type="tFormalExpression">${approved =='true'}</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="sid-FA244B53-B5C2-41AB-85C6-CB2F40879779" name="同意" sourceRef="sid-57610114-27FA-4024-94BF-B0FFE4A02E90" targetRef="hrVerify">
+      <conditionExpression xsi:type="tFormalExpression">${approved =='true'}</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="sid-924D40AA-1A8E-4EC9-B73C-41D2A7DEFCCD" sourceRef="pmVerify" targetRef="sid-57610114-27FA-4024-94BF-B0FFE4A02E90" />
+    <sequenceFlow id="sid-ED1242F0-B0A6-4677-A02C-D0D06715DEBD" sourceRef="hrVerify" targetRef="sid-76B28F95-2D0C-4364-B898-AB1EC8182879" />
+    <sequenceFlow id="sid-B82F41EA-B147-4A19-AD93-A4EC3C40C92E" name="不同意" sourceRef="sid-287EF265-9109-4233-AEF1-14DF6FEF4B24" targetRef="end">
+      <extensionElements>
+        <activiti:executionListener event="take"  delegateExpression="${leaveApplyEndProcessor}"></activiti:executionListener>
+      </extensionElements>
+      <conditionExpression xsi:type="tFormalExpression">${approved =='false'}</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="sid-028073A9-C8C6-4B60-B0AC-6B61B79C17C4" name="同意" sourceRef="sid-76B28F95-2D0C-4364-B898-AB1EC8182879" targetRef="end">
+      <extensionElements>
+        <activiti:executionListener event="take"  delegateExpression="${leaveApplyEndProcessor}"></activiti:executionListener>
+      </extensionElements>
+      <conditionExpression xsi:type="tFormalExpression">${approved =='true'}</conditionExpression>
+    </sequenceFlow>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_leave-update">
+    <bpmndi:BPMNPlane id="BPMNPlane_leave-update" bpmnElement="leave-update">
+      <bpmndi:BPMNEdge id="BPMNEdge_sid-8022586B-8169-44C2-84FA-46E8278EB2EC" bpmnElement="sid-8022586B-8169-44C2-84FA-46E8278EB2EC">
+        <omgdi:waypoint x="112.75714598551785" y="126.17405584019453" />
+        <omgdi:waypoint x="143.71121010641568" y="126.40818009529674" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="BPMNEdge_sid-DE7C5477-8C20-42C5-ADE5-AB4A9A13D58D" bpmnElement="sid-DE7C5477-8C20-42C5-ADE5-AB4A9A13D58D">
+        <omgdi:waypoint x="163.86363505003538" y="106.56060503891644" />
+        <omgdi:waypoint x="163.86363505003538" y="53.13651552996619" />
+        <omgdi:waypoint x="234.27272508339232" y="53.13651552996619" />
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds x="159" y="77" width="40" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="BPMNEdge_sid-B8A78811-23EE-47FA-9913-F04F056EBF99" bpmnElement="sid-B8A78811-23EE-47FA-9913-F04F056EBF99">
+        <omgdi:waypoint x="163.36363505003538" y="146.06060503891644" />
+        <omgdi:waypoint x="163.36363505003538" y="189.4949990648568" />
+        <omgdi:waypoint x="234.27272508339232" y="189.4949990648568" />
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds x="148" y="165" width="62" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="BPMNEdge_sid-924D40AA-1A8E-4EC9-B73C-41D2A7DEFCCD" bpmnElement="sid-924D40AA-1A8E-4EC9-B73C-41D2A7DEFCCD">
+        <omgdi:waypoint x="331.23231804130836" y="189.49499906485684" />
+        <omgdi:waypoint x="385.7878751389872" y="189.49499906485684" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="BPMNEdge_sid-63703246-F9C8-4C23-966B-DBC627A81C96" bpmnElement="sid-63703246-F9C8-4C23-966B-DBC627A81C96">
+        <omgdi:waypoint x="326.19171605111364" y="53.34371922706731" />
+        <omgdi:waypoint x="371.04578381953866" y="53.54593921607711" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="BPMNEdge_sid-3BDD734B-CF1F-4ECA-A234-92BB81132A1E" bpmnElement="sid-3BDD734B-CF1F-4ECA-A234-92BB81132A1E">
+        <omgdi:waypoint x="425.32578782529805" y="189.957086378546" />
+        <omgdi:waypoint x="643.3636579939932" y="189.52287904122937" />
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds x="518" y="172" width="33" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="BPMNEdge_sid-FA244B53-B5C2-41AB-85C6-CB2F40879779" bpmnElement="sid-FA244B53-B5C2-41AB-85C6-CB2F40879779">
+        <omgdi:waypoint x="410.4195073141635" y="174.12663124003316" />
+        <omgdi:waypoint x="446.39393516122516" y="123.49474452854777" />
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds x="417" y="131" width="23" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="BPMNEdge_sid-F94C3FB1-CD76-4ED1-BDEC-57B9FCA97E16" bpmnElement="sid-F94C3FB1-CD76-4ED1-BDEC-57B9FCA97E16">
+        <omgdi:waypoint x="396.41667858914667" y="67.35619707424723" />
+        <omgdi:waypoint x="446.39393516122516" y="100.69330097746277" />
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds x="410" y="66" width="23" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="BPMNEdge_sid-B82F41EA-B147-4A19-AD93-A4EC3C40C92E" bpmnElement="sid-B82F41EA-B147-4A19-AD93-A4EC3C40C92E">
+        <omgdi:waypoint x="410.23752422668827" y="53.53535143670566" />
+        <omgdi:waypoint x="704.9797941833938" y="53.53535143670566" />
+        <omgdi:waypoint x="704.9797941833938" y="190.5669944706311" />
+        <omgdi:waypoint x="671.3600836513306" y="189.81010495572275" />
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds x="703" y="119" width="33" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="BPMNEdge_sid-ED1242F0-B0A6-4677-A02C-D0D06715DEBD" bpmnElement="sid-ED1242F0-B0A6-4677-A02C-D0D06715DEBD">
+        <omgdi:waypoint x="542.3536331797492" y="111.73247557218357" />
+        <omgdi:waypoint x="567.6060552057011" y="111.73247557218357" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="BPMNEdge_sid-31C8FAA6-11F1-4744-99F6-D7DB98AB1B10" bpmnElement="sid-31C8FAA6-11F1-4744-99F6-D7DB98AB1B10">
+        <omgdi:waypoint x="589.3360756732812" y="130.00245510460337" />
+        <omgdi:waypoint x="646.8251334621888" y="180.27870448400202" />
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds x="602" y="137" width="33" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="BPMNEdge_sid-028073A9-C8C6-4B60-B0AC-6B61B79C17C4" bpmnElement="sid-028073A9-C8C6-4B60-B0AC-6B61B79C17C4">
+        <omgdi:waypoint x="607.1060552057011" y="112.23247557218357" />
+        <omgdi:waypoint x="657.3636302334985" y="112.23247557218357" />
+        <omgdi:waypoint x="657.3636302334985" y="175.49499906485684" />
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds x="621" y="94" width="23" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="BPMNShape_startEvent1" bpmnElement="start">
+        <omgdc:Bounds x="83" y="111" width="30" height="30" />
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds x="87" y="148" width="22" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="BPMNShape_sid-AA8342FE-0C98-4CDC-B90F-B09B1AFB8F18" bpmnElement="sid-AA8342FE-0C98-4CDC-B90F-B09B1AFB8F18" isMarkerVisible="true">
+        <omgdc:Bounds x="143" y="106" width="40" height="40" />
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds x="217" y="116" width="44" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="BPMNShape_sid-815754A6-1E86-43E5-8287-6D2A1DF59121" bpmnElement="pmVerify">
+        <omgdc:Bounds x="234" y="167" width="97" height="46" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="BPMNShape_sid-1E8B3F37-4DF8-459A-921C-74F2C210E3E2" bpmnElement="bmVerify">
+        <omgdc:Bounds x="234" y="30" width="92" height="46" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="BPMNShape_sid-57610114-27FA-4024-94BF-B0FFE4A02E90" bpmnElement="sid-57610114-27FA-4024-94BF-B0FFE4A02E90" isMarkerVisible="true">
+        <omgdc:Bounds x="386" y="169" width="40" height="40" />
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds x="384" y="216" width="44" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="BPMNShape_sid-287EF265-9109-4233-AEF1-14DF6FEF4B24" bpmnElement="sid-287EF265-9109-4233-AEF1-14DF6FEF4B24" isMarkerVisible="true">
+        <omgdc:Bounds x="371" y="33" width="40" height="40" />
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds x="369" y="80" width="44" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="BPMNShape_sid-A9CA50A0-1773-4341-B123-85FD1F360277" bpmnElement="hrVerify">
+        <omgdc:Bounds x="446" y="91" width="96" height="42" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="BPMNShape_sid-1B06331A-52FE-4D1B-A62B-80E71ABB7D0E" bpmnElement="end">
+        <omgdc:Bounds x="643" y="175" width="28" height="28" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="BPMNShape_sid-76B28F95-2D0C-4364-B898-AB1EC8182879" bpmnElement="sid-76B28F95-2D0C-4364-B898-AB1EC8182879" isMarkerVisible="true">
+        <omgdc:Bounds x="568" y="92" width="40" height="40" />
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds x="566" y="139" width="44" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>

+ 7 - 0
yudao-admin-ui/src/api/oa/leave.js

@@ -51,6 +51,13 @@ export function createFormKeyLeave(data) {
   })
 }
 
+export function getLeaveApplyMembers() {
+  return request({
+    url: '/oa/leave/getLeaveApplyMembers',
+    method: 'get'
+  })
+}
+
 // 导出请假申请 Excel
 export function exportLeaveExcel(query) {
   return request({

+ 6 - 48
yudao-admin-ui/src/router/index.js

@@ -133,8 +133,8 @@ export const constantRoutes = [
       {
         path: 'leave/apply',
         component: (resolve) => require(['@/views/oa/leave/apply/index'], resolve),
-        name: '请假表单',
-        meta: { title: '请假表单', icon: 'form' }
+        name: '请假表单-申请',
+        meta: { title: '请假表单-申请', icon: 'form' }
       }
     ]
   },
@@ -145,52 +145,10 @@ export const constantRoutes = [
     redirect: 'noredirect',
     children: [
       {
-        path: 'leave/approve-leader',
-        component: (resolve) => require(['@/views/oa/leave/approve-leader/index'], resolve),
-        name: '请假表单-部门领导审批',
-        meta: { title: '请假表单-部门领导审批', icon: 'form' }
-      }
-    ]
-  },
-  {
-    path: '/flow',
-    component: Layout,
-    hidden: true,
-    redirect: 'noredirect',
-    children: [
-      {
-        path: 'leave/approve-hr',
-        component: (resolve) => require(['@/views/oa/leave/approve-hr/index'], resolve),
-        name: '请假表单-人事审批',
-        meta: { title: '请假表单-人事审批', icon: 'form' }
-      }
-    ]
-  },
-  {
-    path: '/flow',
-    component: Layout,
-    hidden: true,
-    redirect: 'noredirect',
-    children: [
-      {
-        path: 'leave/confirm',
-        component: (resolve) => require(['@/views/oa/leave/confirm/index'], resolve),
-        name: '请假表单-确认',
-        meta: { title: '请假表单-确认', icon: 'form' }
-      }
-    ]
-  },
-  {
-    path: '/flow',
-    component: Layout,
-    hidden: true,
-    redirect: 'noredirect',
-    children: [
-      {
-        path: 'leave/modify',
-        component: (resolve) => require(['@/views/oa/leave/modify/index'], resolve),
-        name: '请假表单-修改',
-        meta: { title: '请假表单-修改', icon: 'form' }
+        path: 'leave/approve',
+        component: (resolve) => require(['@/views/oa/leave/approve/index'], resolve),
+        name: '请假表单-审批',
+        meta: { title: '请假表单-审批', icon: 'form' }
       }
     ]
   }

+ 1 - 1
yudao-admin-ui/src/utils/dict.js

@@ -31,7 +31,7 @@ export const DICT_TYPE = {
 
   TOOL_CODEGEN_TEMPLATE_TYPE: 'tool_codegen_template_type',
 
-  OA_LEAVE_STATUS: 'oa_leave_status',
+  OA_LEAVE_STATUS: 'flow_status',
   OA_LEAVE_TYPE: 'oa_leave_type'
 }
 

+ 7 - 7
yudao-admin-ui/src/views/oa/flow/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <el-row>
-      <el-button type="primary" v-on:click="leave">请假申请</el-button>
+      <div>TODO @芋艿, 待办请假和 已办请假,感觉可以做成通用,不同的业务表单对应的待办任务和已办任务可以通用,或许可以想个更通用的名字 </div>
     </el-row>
   </div>
 </template>
@@ -25,12 +25,12 @@ export default {
 
   },
   methods: {
-    leave() {
-      getStartForm('leave-formkey').then(response => {
-        const route = response.data;
-        this.$router.replace(route);
-      });
-    }
+    // leave() {
+    //   getStartForm('leave-formkey').then(response => {
+    //     const route = response.data;
+    //     this.$router.replace(route);
+    //   });
+    // }
   }
 };
 </script>

+ 14 - 9
yudao-admin-ui/src/views/oa/leave/apply/index.vue

@@ -38,7 +38,7 @@
 </template>
 
 <script>
-import { createFormKeyLeave } from "@/api/oa/leave"
+import { createFormKeyLeave} from "@/api/oa/leave"
 import { getDictDataLabel, getDictDatas, DICT_TYPE } from '@/utils/dict'
 export default {
   name: "ApplyLeave",
@@ -47,13 +47,21 @@ export default {
   data() {
     return {
       // 表单参数
-      form: {},
+      form: {
+        processKey: 'leave-update',
+        taskVariables:{
+          hr: "",
+          pm: "",
+          bm: ""
+        }
+      },
       // 表单校验
       rules: {
         startTime: [{ required: true, message: "开始时间不能为空", trigger: "blur" }],
         endTime: [{ required: true, message: "结束时间不能为空", trigger: "blur" }],
         applyTime: [{ required: true, message: "申请时间不能为空", trigger: "blur" }],
       },
+
       statusFormat(row, column) {
         return getDictDataLabel(DICT_TYPE.OA_LEAVE_STATUS, row.status)
       },
@@ -62,6 +70,9 @@ export default {
     };
   },
   created() {
+    this.form.taskVariables.hr = this.$route.query.hr;
+    this.form.taskVariables.pm = this.$route.query.pm;
+    this.form.taskVariables.bm = this.$route.query.bm;
   },
   methods: {
     /** 提交按钮 */
@@ -70,13 +81,7 @@ export default {
         if (!valid) {
           return;
         }
-        // 修改的提交
-        // if (this.form.id != null) {
-        //   updateLeave(this.form).then(response => {
-        //     this.msgSuccess("修改成功");
-        //   });
-        //   return;
-        // }
+
         // 添加的提交
         createFormKeyLeave(this.form).then(response => {
           this.msgSuccess("新增成功");

+ 0 - 190
yudao-admin-ui/src/views/oa/leave/approve-leader/index.vue

@@ -1,190 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-tabs type="border-card">
-      <el-tab-pane label="任务处理">
-        <el-form ref="form" :model="form"  label-width="80px">
-          <el-row :gutter="20">
-            <el-col :span="6"><el-form-item label="申请人" >{{form.userId}}</el-form-item></el-col>
-            <el-col :span="6">
-              <el-form-item label="请假类型" prop="leaveType">
-                {{ getDictDataLabel(DICT_TYPE.OA_LEAVE_TYPE, form.leaveType) }}
-              </el-form-item>
-            </el-col>
-            <el-col :span="6"><el-form-item label="原因" prop="reason">{{form.reason}}</el-form-item></el-col>
-          </el-row>
-          <el-row :gutter="20">
-            <el-col :span="6"><el-form-item label="开始时间" >{{ parseTime(form.startTime) }}</el-form-item></el-col>
-            <el-col :span="6"><el-form-item label="结束时间" prop="endTime">{{ parseTime(form.endTime) }}</el-form-item></el-col>
-            <el-form-item label="申请时间" prop="applyTime">{{ parseTime(form.applyTime) }}</el-form-item>
-          </el-row>
-        </el-form>
-        <el-divider></el-divider>
-        <el-form ref="taskForm" :model="leaveApprove" :rules="rules"  label-width="80px">
-          <el-form-item label="是否同意" prop="approved">
-            <el-select v-model="leaveApprove.approved" placeholder="是否同意" v-on:change="approveChange">
-              <el-option
-                v-for="dict in approvedData"
-                :key="parseInt(dict.value)"
-                :label="dict.label"
-                :value="parseInt(dict.value)"
-              />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="处理意见" prop="comment">
-            <el-col :span="11">
-              <el-input
-                type="textarea"
-                :rows="3"
-                v-model="leaveApprove.comment">
-              </el-input>
-            </el-col>
-          </el-form-item>
-          <el-form-item>
-            <el-button type="primary" @click="submitForm">确 定</el-button>
-          </el-form-item>
-        </el-form>
-      </el-tab-pane>
-      <el-tab-pane label="历史跟踪">
-        <el-steps :active="stepActive" simple finish-status="success">
-          <el-step :title="stepTitle(item)" icon="el-icon-edit" v-for="(item) in handleTask.historyTask" ></el-step>
-        </el-steps>
-        <br/>
-        <el-steps direction="vertical" :active="stepActive"  space="65px">
-          <el-step :title="stepTitle(item)" :description="stepDes(item)" v-for="(item) in handleTask.historyTask" ></el-step>
-        </el-steps>
-      </el-tab-pane>
-      <el-tab-pane label="流程图">流程图-TODO</el-tab-pane>
-    </el-tabs>
-  </div>
-</template>
-
-<script>
-import { getLeave } from "@/api/oa/leave"
-import { completeTask,taskSteps } from "@/api/oa/todo";
-import { getDictDataLabel, getDictDatas, DICT_TYPE } from '@/utils/dict'
-export default {
-  name: "ApproveLeaderLeave",
-  components: {
-  },
-  data() {
-    return {
-      // 表单参数
-      form: {},
-      // 表单校验
-      rules: {
-        comment: [{ required: true, message: "意见不能为空", trigger: "blur" }]
-      },
-      handleTask: {
-        historyTask:[]
-      },
-      leaveApprove: {
-        approved : 1,
-        variables: {},
-        taskId: "",
-        comment: "同意"
-      },
-      approvedData: [
-        {
-          value: 1,
-          label: '同意'
-        },
-        {
-          value: 0,
-          label: '不同意'
-        }
-      ],
-      statusFormat(row, column) {
-        return getDictDataLabel(DICT_TYPE.OA_LEAVE_STATUS, row.status)
-      },
-      leaveTypeDictData: getDictDatas(DICT_TYPE.OA_LEAVE_TYPE),
-      leaveStatusData: getDictDatas(DICT_TYPE.OA_LEAVE_STATUS)
-    };
-  },
-  created() {
-    const businessKey = this.$route.query.businessKey;
-    const taskId = this.$route.query.taskId;
-    this.leaveApprove.taskId = taskId;
-    this.getForm(businessKey);
-  },
-  computed:{
-    stepActive: function () {
-      let idx = 0;
-      for(let i=0; i<this.handleTask.historyTask.length; i++){
-        if(this.handleTask.historyTask[i].status === 1){
-          idx= idx+1;
-        }else{
-          break;
-        }
-      }
-      return idx;
-    },
-    stepTitle() {
-      return function (item) {
-        let name = item.stepName;
-        if (item.status === 1) {
-          name += '(已完成)'
-        }
-        if (item.status === 0) {
-          name += '(进行中)'
-        }
-        return name;
-      }
-    },
-    stepDes(){
-      return function (item) {
-        let desc = "";
-        if (item.status === 1) {
-          desc+="审批人:["+ item.assignee +"]    审批意见: [" + item.comment + "]   审批时间: " + this.parseTime(item.endTime);
-        }
-        return desc;
-      }
-    }
-  },
-  methods: {
-    /** 提交按钮 */
-    submitForm() {
-      this.$refs["taskForm"].validate(valid => {
-        if (!valid) {
-          return;
-        }
-        if (this.leaveApprove.approved == 1) {
-          this.leaveApprove.variables["deptLeaderApproved"] = true;
-        }
-        if (this.leaveApprove.approved == 0) {
-          this.leaveApprove.variables["deptLeaderApproved"] = false;
-        }
-        completeTask(this.leaveApprove).then(response => {
-          this.msgSuccess("执行任务成功");
-          this.$store.dispatch('tagsView/delView', this.$route).then(({ visitedViews }) => {
-            //if (this.isActive(this.$route)) {
-            this.$router.push({path: '/oa/todo'})
-            //}
-          })
-        });
-      });
-
-    },
-    getForm(id){
-      getLeave(id).then(response => {
-        this.form = response.data;
-      });
-      const data = {
-        taskId : this.leaveApprove.taskId,
-        businessKey: id,
-      }
-      taskSteps(data).then(response => {
-        this.handleTask = response.data;
-
-      });
-    },
-    approveChange(){
-      if (this.leaveApprove.approved === 1) {
-        this.leaveApprove.comment = "同意"
-      }
-      if(this.leaveApprove.approved === 0){
-        this.leaveApprove.comment = "不同意"
-      }
-    }
-  }
-};
-</script>

+ 16 - 5
yudao-admin-ui/src/views/oa/leave/approve-hr/index.vue → yudao-admin-ui/src/views/oa/leave/approve/index.vue

@@ -62,11 +62,11 @@
 </template>
 
 <script>
-import { getLeave } from "@/api/oa/leave"
+import { getLeave,getLeaveApplyMembers } from "@/api/oa/leave"
 import { completeTask,taskSteps, getHighlightImg } from "@/api/oa/todo";
 import { getDictDataLabel, getDictDatas, DICT_TYPE } from '@/utils/dict'
 export default {
-  name: "HrApproveLeave",
+  name: "ApproveLeave",
   components: {
   },
   data() {
@@ -82,7 +82,11 @@ export default {
       },
       leaveApprove: {
         approved : 1,
-        variables: {},
+        variables: {
+          hr: "",
+          pm: "",
+          bm: ""
+        },
         taskId: "",
         processInstanceId: "",
         comment: "同意"
@@ -161,12 +165,13 @@ export default {
           return;
         }
         if (this.leaveApprove.approved == 1) {
-          this.leaveApprove.variables["hrApproved"] = true;
+          this.leaveApprove.variables["approved"] = true;
         }
         if (this.leaveApprove.approved == 0) {
-          this.leaveApprove.variables["hrApproved"] = false;
+          this.leaveApprove.variables["approved"] = false;
         }
         completeTask(this.leaveApprove).then(response => {
+
           this.msgSuccess("执行任务成功");
           this.$store.dispatch('tagsView/delView', this.$route).then(({ visitedViews }) => {
             //if (this.isActive(this.$route)) {
@@ -187,6 +192,12 @@ export default {
       taskSteps(data).then(response => {
         this.handleTask = response.data;
       });
+
+      getLeaveApplyMembers().then(response => {
+        this.leaveApprove.variables.hr = response.data.hr;
+        this.leaveApprove.variables.bm = response.data.bm;
+        this.leaveApprove.variables.pm = response.data.pm;
+      });
     },
     approveChange(){
       if (this.leaveApprove.approved === 1) {

+ 0 - 137
yudao-admin-ui/src/views/oa/leave/confirm/index.vue

@@ -1,137 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-tabs type="border-card">
-      <el-tab-pane label="任务处理">
-        <el-form ref="form" :model="form"  label-width="80px">
-          <el-row :gutter="20">
-            <el-col :span="6"><el-form-item label="申请人" >{{form.userId}}</el-form-item></el-col>
-            <el-col :span="6">
-              <el-form-item label="请假类型" prop="leaveType">
-                {{ getDictDataLabel(DICT_TYPE.OA_LEAVE_TYPE, form.leaveType) }}
-              </el-form-item>
-            </el-col>
-            <el-col :span="6"><el-form-item label="原因" prop="reason">{{form.reason}}</el-form-item></el-col>
-          </el-row>
-          <el-row :gutter="20">
-            <el-col :span="6"><el-form-item label="开始时间" >{{ parseTime(form.startTime) }}</el-form-item></el-col>
-            <el-col :span="6"><el-form-item label="结束时间" prop="endTime">{{ parseTime(form.endTime) }}</el-form-item></el-col>
-            <el-form-item label="申请时间" prop="applyTime">{{ parseTime(form.applyTime) }}</el-form-item>
-          </el-row>
-          <el-row :gutter="20">
-            <el-col :span="6"><el-button type="primary" @click="submitForm">确 定</el-button></el-col>
-          </el-row>
-        </el-form>
-      </el-tab-pane>
-      <el-tab-pane label="历史跟踪">
-        <el-steps :active="stepActive" simple finish-status="success">
-          <el-step :title="stepTitle(item)" icon="el-icon-edit" v-for="(item) in handleTask.historyTask" ></el-step>
-        </el-steps>
-        <br/>
-        <el-steps direction="vertical" :active="stepActive"  space="65px">
-          <el-step :title="stepTitle(item)" :description="stepDes(item)" v-for="(item) in handleTask.historyTask" ></el-step>
-        </el-steps>
-      </el-tab-pane>
-      <el-tab-pane label="流程图">流程图-TODO</el-tab-pane>
-    </el-tabs>
-  </div>
-</template>
-
-<script>
-import { getLeave } from "@/api/oa/leave"
-import { completeTask,taskSteps } from "@/api/oa/todo";
-import { getDictDataLabel, getDictDatas, DICT_TYPE } from '@/utils/dict'
-export default {
-  name: "ConfirmLeave",
-  components: {
-  },
-  data() {
-    return {
-      // 表单参数
-      form: {},
-      // 表单校验
-      rules: {
-      },
-      handleTask: {
-        historyTask:[]
-      },
-      leaveApprove: {
-        variables: {},
-        taskId: "",
-        comment: ""
-      },
-      statusFormat(row, column) {
-        return getDictDataLabel(DICT_TYPE.OA_LEAVE_STATUS, row.status)
-      },
-      leaveTypeDictData: getDictDatas(DICT_TYPE.OA_LEAVE_TYPE),
-      leaveStatusData: getDictDatas(DICT_TYPE.OA_LEAVE_STATUS)
-    };
-  },
-  created() {
-    const businessKey = this.$route.query.businessKey;
-    const taskId = this.$route.query.taskId;
-    this.leaveApprove.taskId = taskId;
-    this.getForm(businessKey);
-  },
-  computed:{
-    stepActive: function () {
-      let idx = 0;
-      for(let i=0; i<this.handleTask.historyTask.length; i++){
-        if(this.handleTask.historyTask[i].status === 1){
-          idx= idx+1;
-        }else{
-          break;
-        }
-      }
-      return idx;
-    },
-    stepTitle() {
-      return function (item) {
-        let name = item.stepName;
-        if (item.status === 1) {
-          name += '(已完成)'
-        }
-        if (item.status === 0) {
-          name += '(进行中)'
-        }
-        return name;
-      }
-    },
-    stepDes(){
-      return function (item) {
-        let desc = "";
-        if (item.status === 1) {
-          desc+="审批人:["+ item.assignee +"]    审批意见: [" + item.comment + "]   审批时间: " + this.parseTime(item.endTime);
-        }
-        return desc;
-      }
-    }
-  },
-  methods: {
-    /** 提交按钮 */
-    submitForm() {
-      completeTask(this.leaveApprove).then(response => {
-        this.msgSuccess("执行任务成功");
-        this.$store.dispatch('tagsView/delView', this.$route).then(({ visitedViews }) => {
-          //if (this.isActive(this.$route)) {
-          this.$router.push({path: '/oa/todo'})
-          //}
-        })
-      })
-    },
-    getForm(id){
-      getLeave(id).then(response => {
-        this.form = response.data;
-      });
-      const data = {
-        taskId : this.leaveApprove.taskId,
-        businessKey: id,
-      }
-      taskSteps(data).then(response => {
-        this.handleTask = response.data;
-
-      });
-
-    }
-  }
-};
-</script>

+ 15 - 4
yudao-admin-ui/src/views/oa/leave/index.vue

@@ -49,6 +49,9 @@
 
     <!-- 操作工具栏 -->
     <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd">新增</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -155,7 +158,7 @@
 </template>
 
 <script>
-import { createLeave, updateLeave, deleteLeave, getLeave, getLeavePage, exportLeaveExcel } from "@/api/oa/leave"
+import { createLeave, updateLeave, getLeaveApplyMembers, getLeave, getLeavePage, exportLeaveExcel } from "@/api/oa/leave"
 import { getDictDataLabel, getDictDatas, DICT_TYPE } from '@/utils/dict'
 import { processHistorySteps,getHighlightImg } from '@/api/oa/todo'
 export default {
@@ -319,9 +322,17 @@ export default {
     },
     /** 新增按钮操作 */
     handleAdd() {
-      this.reset();
-      this.open = true;
-      this.title = "添加请假申请";
+      getLeaveApplyMembers().then(response => {
+        const route = {
+          path: '/flow/leave/apply',
+          query: {
+            hr:  response.data.hr,
+            pm:  response.data.pm,
+            bm : response.data.bm
+          }
+        }
+        this.$router.replace(route);
+      });
     },
     /** 详情按钮操作 */
     handleDetail(row) {

+ 0 - 211
yudao-admin-ui/src/views/oa/leave/modify/index.vue

@@ -1,211 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-tabs type="border-card">
-      <el-tab-pane label="任务处理">
-        <el-form ref="form" :model="form"  :rules="rules" label-width="100px">
-          <el-row>
-            <el-col :span="15">
-              <el-form-item label="是否调整申请" prop="reApply">
-                <el-select v-model="reApplySelect"  placeholder="是否调整申请" v-on:change="reApplyChange">
-                  <el-option
-                    v-for="dict in reApplyData"
-                    :key="parseInt(dict.value)"
-                    :label="dict.label"
-                    :value="parseInt(dict.value)"
-                  />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row :gutter="20" v-show="modifyShow">
-            <el-col :span="8"><el-form-item label="申请人" >{{form.userId}}</el-form-item></el-col>
-            <el-col :span="8">
-              <el-form-item label="申请时间" prop="applyTime">{{ parseTime(form.applyTime) }}</el-form-item>
-            </el-col>
-          </el-row>
-          <el-row :gutter="20" v-show="modifyShow">
-            <el-col :span="8">
-              <el-form-item label="开始时间" prop="startTime">
-                <el-date-picker clearable size="small" v-model="form.startTime" type="date" value-format="timestamp" placeholder="选择开始时间" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="结束时间" prop="endTime">
-                <el-date-picker clearable size="small" v-model="form.endTime" type="date" value-format="timestamp" placeholder="选择结束时间" />
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row v-show="modifyShow" >
-            <el-col :span="8">
-              <el-form-item label="请假类型" prop="leaveType">
-                <el-select v-model="form.leaveType" placeholder="请选择">
-                  <el-option
-                    v-for="dict in leaveTypeDictData"
-                    :key="dict.value"
-                    :label="dict.label"
-                    :value="dict.value"
-                  />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row v-show="modifyShow">
-            <el-col :span="15">
-              <el-form-item label="原因" prop="reason">
-                <el-input
-                  type="textarea"
-                  :rows="3"
-                  v-model="form.reason"
-                  placeholder="请输入原因" />
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-form-item>
-            <el-button type="primary" @click="submitForm">确 定</el-button>
-          </el-form-item>
-        </el-form>
-      </el-tab-pane>
-      <el-tab-pane label="历史跟踪">
-        <el-steps :active="stepActive" simple finish-status="success">
-          <el-step :title="stepTitle(item)" icon="el-icon-edit" v-for="(item) in handleTask.historyTask" ></el-step>
-        </el-steps>
-        <br/>
-        <el-steps direction="vertical" :active="stepActive"  space="65px">
-          <el-step :title="stepTitle(item)" :description="stepDes(item)" v-for="(item) in handleTask.historyTask" ></el-step>
-        </el-steps>
-      </el-tab-pane>
-      <el-tab-pane label="流程图">流程图-TODO</el-tab-pane>
-    </el-tabs>
-
-  </div>
-</template>
-
-<script>
-import { getLeave,updateLeave } from "@/api/oa/leave"
-import { taskSteps } from "@/api/oa/todo"
-import { getDictDataLabel, getDictDatas, DICT_TYPE } from '@/utils/dict'
-export default {
-  name: "HrApproveLeave",
-  components: {
-  },
-  data() {
-    return {
-      // 表单参数
-      form: {},
-      // 表单校验
-      rules: {
-      },
-      handleTask: {
-        historyTask:[]
-      },
-      modifyShow: true,
-      reApplySelect: 1,
-      reApplyData: [
-        {
-          value: 0,
-          label: '取消申请'
-        },
-        {
-          value: 1,
-          label: '继续申请'
-        }
-      ],
-      statusFormat(row, column) {
-        return getDictDataLabel(DICT_TYPE.OA_LEAVE_STATUS, row.status)
-      },
-      leaveTypeDictData: getDictDatas(DICT_TYPE.OA_LEAVE_TYPE),
-      leaveStatusData: getDictDatas(DICT_TYPE.OA_LEAVE_STATUS)
-    };
-  },
-  mounted() {
-    const businessKey = this.$route.query.businessKey;
-    const taskId = this.$route.query.taskId;
-
-    this.getForm(businessKey,taskId);
-  },
-  computed:{
-    stepActive: function () {
-      let idx = 0;
-      for(let i=0; i<this.handleTask.historyTask.length; i++){
-        if(this.handleTask.historyTask[i].status === 1){
-          idx= idx+1;
-        }else{
-          break;
-        }
-      }
-      return idx;
-    },
-    stepTitle() {
-      return function (item) {
-        let name = item.stepName;
-        if (item.status === 1) {
-          name += '(已完成)'
-        }
-        if (item.status === 0) {
-          name += '(进行中)'
-        }
-        return name;
-      }
-    },
-    stepDes(){
-      return function (item) {
-        let desc = "";
-        if (item.status === 1) {
-          desc+="审批人:["+ item.assignee +"]    审批意见: [" + item.comment + "]   审批时间: " + this.parseTime(item.endTime);
-        }
-        return desc;
-      }
-    }
-  },
-  methods: {
-    /** 提交按钮 */
-    submitForm() {
-      this.$refs["form"].validate(valid => {
-        if (!valid) {
-          return;
-        }
-        if (this.reApplySelect === 1) {
-          this.form.variables["reApply"] = true;
-          this.form.comment = '调整请假申请';
-        }
-        if (this.reApplySelect === 0) {
-          this.form.variables["reApply"] = false;
-          this.form.comment = '取消请假申请';
-        }
-        updateLeave(this.form).then(response => {
-          this.msgSuccess("修改成功");
-          this.$store.dispatch('tagsView/delView', this.$route).then(({ visitedViews }) => {
-            //if (this.isActive(this.$route)) {
-            this.$router.push({path: '/oa/todo'})
-            //}
-          })
-        });
-      });
-    },
-    getForm(id, taskId){
-      getLeave(id).then(response => {
-        this.form = response.data;
-        this.form.taskId = taskId;
-        this.form.variables = {};
-      });
-      const data = {
-        taskId : taskId,
-        businessKey: id,
-      }
-      taskSteps(data).then(response => {
-        this.handleTask = response.data;
-
-      });
-    },
-    reApplyChange(){
-      if (this.reApplySelect === 1) {
-        this.modifyShow = true;
-      }
-      if (this.reApplySelect === 0) {
-        this.modifyShow = false;
-      }
-    }
-
-  }
-};
-</script>