commit
e82c37f2c5
File diff suppressed because one or more lines are too long
@ -0,0 +1,15 @@
|
|||||||
|
package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
import java.util.*;
|
||||||
|
import io.swagger.annotations.*;
|
||||||
|
import javax.validation.constraints.*;
|
||||||
|
|
||||||
|
@ApiModel("请假申请创建 Request VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class OaLeaveCreateReqVO extends OaLeaveBaseVO {
|
||||||
|
|
||||||
|
private String processKey;
|
||||||
|
}
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,56 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
import java.util.*;
|
||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
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<TaskStepVO> historyTask;
|
||||||
|
|
||||||
|
|
||||||
|
private String taskVariable;
|
||||||
|
}
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
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<String,Object> variables;
|
||||||
|
|
||||||
|
private String comment;
|
||||||
|
}
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
@ -0,0 +1,33 @@
|
|||||||
|
package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
@ApiModel("待办任务 Response VO")
|
||||||
|
@Data
|
||||||
|
@ToString
|
||||||
|
public class TodoTaskRespVO {
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1:未签收
|
||||||
|
* 2:已签收
|
||||||
|
*/
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
|
||||||
|
private String processName;
|
||||||
|
|
||||||
|
|
||||||
|
private String processKey;
|
||||||
|
|
||||||
|
|
||||||
|
private String businessKey;
|
||||||
|
|
||||||
|
|
||||||
|
private String formKey;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
package cn.iocoder.yudao.adminserver.modules.activiti.convert.oa;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
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.*;
|
||||||
|
import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请假申请 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<OaLeaveRespVO> convertList(List<OaLeaveDO> list);
|
||||||
|
|
||||||
|
PageResult<OaLeaveRespVO> convertPage(PageResult<OaLeaveDO> page);
|
||||||
|
|
||||||
|
List<OaLeaveExcelVO> convertList02(List<OaLeaveDO> list);
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
package cn.iocoder.yudao.adminserver.modules.activiti.convert.workflow;
|
||||||
|
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface TodoTaskConvert {
|
||||||
|
TodoTaskConvert INSTANCE = Mappers.getMapper(TodoTaskConvert.class);
|
||||||
|
}
|
||||||
@ -0,0 +1,60 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
package cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
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 cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请假申请 Mapper
|
||||||
|
*
|
||||||
|
* @author 芋艿
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface OaLeaveMapper extends BaseMapperX<OaLeaveDO> {
|
||||||
|
|
||||||
|
default PageResult<OaLeaveDO> selectPage(OaLeavePageReqVO reqVO) {
|
||||||
|
return selectPage(reqVO, new QueryWrapperX<OaLeaveDO>()
|
||||||
|
.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<OaLeaveDO> selectList(OaLeaveExportReqVO reqVO) {
|
||||||
|
return selectList(new QueryWrapperX<OaLeaveDO>()
|
||||||
|
.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") );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,2 @@
|
|||||||
|
// TODO @芋艿:思考下 activiti、oa 的定位,边界,模块的拆分
|
||||||
|
package cn.iocoder.yudao.adminserver.modules.activiti;
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
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<String> 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<String> getUserRoles(String userId) {
|
||||||
|
return Arrays.asList("ROLE_ACTIVITI_USER");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getGroups() {
|
||||||
|
throw new UnsupportedOperationException("getGroups is now un supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getUsers() {
|
||||||
|
throw new UnsupportedOperationException("getGroups is now un supported");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
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<String> 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,76 @@
|
|||||||
|
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.OaLeaveExportReqVO;
|
||||||
|
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeavePageReqVO;
|
||||||
|
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeaveUpdateReqVO;
|
||||||
|
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<OaLeaveDO> getLeaveList(Collection<Long> ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得请假申请分页
|
||||||
|
*
|
||||||
|
* @param pageReqVO 分页查询
|
||||||
|
* @return 请假申请分页
|
||||||
|
*/
|
||||||
|
PageResult<OaLeaveDO> getLeavePage(OaLeavePageReqVO pageReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得请假申请列表, 用于 Excel 导出
|
||||||
|
*
|
||||||
|
* @param exportReqVO 查询条件
|
||||||
|
* @return 请假申请列表
|
||||||
|
*/
|
||||||
|
List<OaLeaveDO> getLeaveList(OaLeaveExportReqVO exportReqVO);
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
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 java.util.List;
|
||||||
|
|
||||||
|
// TODO @芋艿:前缀,注释
|
||||||
|
public interface TaskService {
|
||||||
|
|
||||||
|
PageResult<TodoTaskRespVO> getTodoTaskPage(TodoTaskPageReqVO pageReqVO);
|
||||||
|
|
||||||
|
void claimTask(String taskId);
|
||||||
|
|
||||||
|
void getTaskHistory(String taskId);
|
||||||
|
|
||||||
|
void completeTask(TaskReqVO taskReq);
|
||||||
|
|
||||||
|
// void flowImage(String taskId, HttpServletResponse response);
|
||||||
|
TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery);
|
||||||
|
|
||||||
|
List<TaskStepVO> getHistorySteps(String processInstanceId);
|
||||||
|
|
||||||
|
TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery);
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,52 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
<settings>
|
||||||
|
<setting name="lazyLoadingEnabled" value="false" />
|
||||||
|
<setting name="mapUnderscoreToCamelCase" value="true"/>
|
||||||
|
</settings>
|
||||||
|
<typeAliases>
|
||||||
|
<typeAlias type="org.activiti.engine.impl.persistence.ByteArrayRefTypeHandler" alias="ByteArrayRefTypeHandler"/>
|
||||||
|
<typeAlias type="org.activiti.engine.impl.db.IbatisVariableTypeHandler" alias="IbatisVariableTypeHandler"/>
|
||||||
|
</typeAliases>
|
||||||
|
<typeHandlers>
|
||||||
|
<typeHandler handler="ByteArrayRefTypeHandler"
|
||||||
|
javaType="org.activiti.engine.impl.persistence.entity.ByteArrayRef"
|
||||||
|
jdbcType="VARCHAR"/>
|
||||||
|
<typeHandler handler="IbatisVariableTypeHandler"
|
||||||
|
javaType="org.activiti.engine.impl.variable.VariableType"
|
||||||
|
jdbcType="VARCHAR"/>
|
||||||
|
</typeHandlers>
|
||||||
|
<mappers>
|
||||||
|
<mapper resource="org/activiti/db/mapping/common.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/Attachment.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/ByteArray.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/Comment.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/DeadLetterJob.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/Deployment.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/Execution.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/HistoricActivityInstance.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/HistoricDetail.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/HistoricProcessInstance.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/HistoricVariableInstance.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/HistoricTaskInstance.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/HistoricIdentityLink.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/IdentityLink.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/Job.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/Model.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/ProcessDefinition.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/ProcessDefinitionInfo.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/Property.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/Resource.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/SuspendedJob.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/TableData.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/Task.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/TimerJob.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/VariableInstance.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/EventSubscription.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/EventLogEntry.xml" />
|
||||||
|
<mapper resource="org/activiti/db/mapping/entity/IntegrationContext.xml" />
|
||||||
|
</mappers>
|
||||||
|
</configuration>
|
||||||
@ -0,0 +1,152 @@
|
|||||||
|
<?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>
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
|
||||||
|
export function getStartForm(processKey) {
|
||||||
|
return request({
|
||||||
|
url: '/workflow/process/definition/getStartForm?processKey='+processKey,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 创建请假申请
|
||||||
|
export function createLeave(data) {
|
||||||
|
return request({
|
||||||
|
url: '/oa/leave/create',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新请假申请
|
||||||
|
export function updateLeave(data) {
|
||||||
|
return request({
|
||||||
|
url: '/oa/leave/update',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除请假申请
|
||||||
|
export function deleteLeave(id) {
|
||||||
|
return request({
|
||||||
|
url: '/oa/leave/delete?id=' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得请假申请
|
||||||
|
export function getLeave(id) {
|
||||||
|
return request({
|
||||||
|
url: '/oa/leave/get?id=' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得请假申请分页
|
||||||
|
export function getLeavePage(query) {
|
||||||
|
return request({
|
||||||
|
url: '/oa/leave/page',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createFormKeyLeave(data) {
|
||||||
|
return request({
|
||||||
|
url: '/oa/leave/form-key/create',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出请假申请 Excel
|
||||||
|
export function exportLeaveExcel(query) {
|
||||||
|
return request({
|
||||||
|
url: '/oa/leave/export-excel',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
responseType: 'blob'
|
||||||
|
})
|
||||||
|
}
|
||||||
@ -0,0 +1,83 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 创建请假申请
|
||||||
|
export function createLeave(data) {
|
||||||
|
return request({
|
||||||
|
url: '/oa/leave/create',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新请假申请
|
||||||
|
export function updateLeave(data) {
|
||||||
|
return request({
|
||||||
|
url: '/oa/leave/update',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除请假申请
|
||||||
|
export function deleteLeave(id) {
|
||||||
|
return request({
|
||||||
|
url: '/oa/leave/delete?id=' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得请假申请
|
||||||
|
export function getLeave(id) {
|
||||||
|
return request({
|
||||||
|
url: '/oa/leave/get?id=' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得待办任务分页
|
||||||
|
export function getTodoTaskPage(query) {
|
||||||
|
return request({
|
||||||
|
url: '/workflow/task/todo/page',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 签收任务
|
||||||
|
export function claimTask(id) {
|
||||||
|
return request({
|
||||||
|
url: '/workflow/task/claim?id=' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function completeTask(data) {
|
||||||
|
return request({
|
||||||
|
url: '/workflow/task/complete',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function taskSteps(data) {
|
||||||
|
return request({
|
||||||
|
url: '/workflow/task/task-steps',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getTaskFormKey(data) {
|
||||||
|
return request({
|
||||||
|
url: '/workflow/task/formKey',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function processHistorySteps(id) {
|
||||||
|
return request({
|
||||||
|
url: '/workflow/task/process/history-steps?id='+id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<el-row>
|
||||||
|
<el-button type="primary" v-on:click="leave">请假申请</el-button>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getStartForm } from "@/api/oa/flow";
|
||||||
|
export default {
|
||||||
|
name: "Flow",
|
||||||
|
components: {
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 表单参数
|
||||||
|
form: {},
|
||||||
|
|
||||||
|
rules: {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
leave() {
|
||||||
|
getStartForm('leave-formkey').then(response => {
|
||||||
|
const route = response.data;
|
||||||
|
this.$router.replace(route);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@ -0,0 +1,93 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<!-- 对话框(添加 / 修改) -->
|
||||||
|
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||||
|
<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-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-form-item label="请假类型" prop="leaveType">
|
||||||
|
<el-select v-model="form.leaveType" placeholder="请选择">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in leaveTypeDictData"
|
||||||
|
:key="parseInt(dict.value)"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="parseInt(dict.value)"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="原因" prop="reason">
|
||||||
|
<el-col :span="10">
|
||||||
|
<el-input
|
||||||
|
type="textarea"
|
||||||
|
:rows="3"
|
||||||
|
v-model="form.reason"
|
||||||
|
placeholder="请输入原因" />
|
||||||
|
</el-col>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="申请时间" prop="applyTime">
|
||||||
|
<el-date-picker clearable size="small" v-model="form.applyTime" type="date" value-format="timestamp" placeholder="选择申请时间" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { createFormKeyLeave } from "@/api/oa/leave"
|
||||||
|
import { getDictDataLabel, getDictDatas, DICT_TYPE } from '@/utils/dict'
|
||||||
|
export default {
|
||||||
|
name: "ApplyLeave",
|
||||||
|
components: {
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 表单参数
|
||||||
|
form: {},
|
||||||
|
// 表单校验
|
||||||
|
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)
|
||||||
|
},
|
||||||
|
leaveTypeDictData: getDictDatas(DICT_TYPE.OA_LEAVE_TYPE),
|
||||||
|
leaveStatusData: getDictDatas(DICT_TYPE.OA_LEAVE_STATUS)
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
/** 提交按钮 */
|
||||||
|
submitForm() {
|
||||||
|
this.$refs["form"].validate(valid => {
|
||||||
|
if (!valid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 修改的提交
|
||||||
|
// if (this.form.id != null) {
|
||||||
|
// updateLeave(this.form).then(response => {
|
||||||
|
// this.msgSuccess("修改成功");
|
||||||
|
// });
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// 添加的提交
|
||||||
|
createFormKeyLeave(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'})
|
||||||
|
//}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@ -0,0 +1,190 @@
|
|||||||
|
<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: "HrApproveLeave",
|
||||||
|
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)
|
||||||
|
};
|
||||||
|
},
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
const businessKey = this.$route.query.businessKey;
|
||||||
|
const taskId = this.$route.query.taskId;
|
||||||
|
this.leaveApprove.taskId = taskId;
|
||||||
|
this.getForm(businessKey);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
/** 提交按钮 */
|
||||||
|
submitForm() {
|
||||||
|
this.$refs["taskForm"].validate(valid => {
|
||||||
|
if (!valid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.leaveApprove.approved == 1) {
|
||||||
|
this.leaveApprove.variables["hrApproved"] = true;
|
||||||
|
}
|
||||||
|
if (this.leaveApprove.approved == 0) {
|
||||||
|
this.leaveApprove.variables["hrApproved"] = 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>
|
||||||
@ -0,0 +1,190 @@
|
|||||||
|
<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>
|
||||||
@ -0,0 +1,137 @@
|
|||||||
|
<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>
|
||||||
@ -0,0 +1,377 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
|
||||||
|
<!-- 搜索工作栏 -->
|
||||||
|
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
|
<el-form-item label="流程id" prop="processInstanceId">
|
||||||
|
<el-input v-model="queryParams.processInstanceId" placeholder="请输入流程id" clearable size="small" @keyup.enter.native="handleQuery"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="状态" prop="status">
|
||||||
|
<el-select v-model="queryParams.status" placeholder="请选择状态">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in leaveStatusData"
|
||||||
|
:key="parseInt(dict.value)"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="parseInt(dict.value)"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="开始时间">
|
||||||
|
<el-date-picker v-model="dateRangeStartTime" size="small" style="width: 240px" value-format="yyyy-MM-dd"
|
||||||
|
type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="结束时间">
|
||||||
|
<el-date-picker v-model="dateRangeEndTime" size="small" style="width: 240px" value-format="yyyy-MM-dd"
|
||||||
|
type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="请假类型" prop="leaveType">
|
||||||
|
<el-select v-model="queryParams.leaveType" placeholder="请选择请假类型">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in leaveTypeDictData"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="原因" prop="reason">
|
||||||
|
<el-input v-model="queryParams.reason" placeholder="请输入原因" clearable size="small" @keyup.enter.native="handleQuery"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="申请时间">
|
||||||
|
<el-date-picker v-model="dateRangeApplyTime" size="small" style="width: 240px" value-format="yyyy-MM-dd"
|
||||||
|
type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||||
|
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
<!-- 操作工具栏 -->
|
||||||
|
<el-row :gutter="10" class="mb8">
|
||||||
|
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<!-- 列表 -->
|
||||||
|
<el-table v-loading="loading" :data="list">
|
||||||
|
<el-table-column label="请假表单主键" align="center" prop="id" />
|
||||||
|
<el-table-column label="状态" align="center" prop="status" :formatter="statusFormat" />
|
||||||
|
<el-table-column label="申请人id" align="center" prop="userId" />
|
||||||
|
<el-table-column label="开始时间" align="center" prop="startTime" width="180">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ parseTime(scope.row.startTime) }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="结束时间" align="center" prop="endTime" width="180">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ parseTime(scope.row.endTime) }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="请假类型" align="center" prop="leaveType" :formatter="leaveTypeFormat" />
|
||||||
|
<el-table-column label="原因" align="center" prop="reason" />
|
||||||
|
<el-table-column label="申请时间" align="center" prop="applyTime" width="180">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ parseTime(scope.row.applyTime) }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleStep(scope.row)">审批进度</el-button>
|
||||||
|
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleDetail(scope.row)">详情</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页组件 -->
|
||||||
|
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
|
||||||
|
@pagination="getList"/>
|
||||||
|
|
||||||
|
<!-- 对话框(添加 / 修改) -->
|
||||||
|
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||||
|
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||||
|
<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-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-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-form-item label="原因" prop="reason">
|
||||||
|
<el-input v-model="form.reason" placeholder="请输入原因" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="申请时间" prop="applyTime">
|
||||||
|
<el-date-picker clearable size="small" v-model="form.applyTime" type="date" value-format="timestamp" placeholder="选择申请时间" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||||
|
<el-button @click="cancel">取 消</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<el-dialog :title="title" :visible.sync="dialogDetailVisible" width="500px" append-to-body>
|
||||||
|
<el-form ref="form" :model="form" label-width="80px">
|
||||||
|
<el-form-item label="状态" >
|
||||||
|
{{ getDictDataLabel(DICT_TYPE.OA_LEAVE_STATUS, form.status) }}
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="申请人id" >{{form.userId}}</el-form-item>
|
||||||
|
<el-form-item label="开始时间" >{{ parseTime(form.startTime) }}</el-form-item>
|
||||||
|
<el-form-item label="结束时间" prop="endTime">{{ parseTime(form.endTime) }}</el-form-item>
|
||||||
|
<el-form-item label="请假类型" prop="leaveType">
|
||||||
|
{{ getDictDataLabel(DICT_TYPE.OA_LEAVE_TYPE, form.leaveType) }}
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="原因" prop="reason">{{form.reason}}</el-form-item>
|
||||||
|
<el-form-item label="申请时间" prop="applyTime">{{ parseTime(form.applyTime) }}</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button type="primary" @click="dialogDetailVisible = false">确 定</el-button>
|
||||||
|
<el-button @click="dialogDetailVisible = false">取 消</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<el-dialog :title="title" :visible.sync="dialogStepsVisible" width="600px" append-to-body>
|
||||||
|
<el-steps :active="stepActive" finish-status="success" >
|
||||||
|
<el-step :title="stepTitle(item)" :description="' 办理人:' + item.assignee " icon="el-icon-edit" v-for="(item) in handleTask.historyTask"></el-step>
|
||||||
|
</el-steps>
|
||||||
|
<br/>
|
||||||
|
<el-steps direction="vertical" :active="stepActive">
|
||||||
|
<el-step :title="stepTitle(item)" :description="stepDes(item)" v-for="(item) in handleTask.historyTask"></el-step>
|
||||||
|
</el-steps>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button type="primary" @click="dialogStepsVisible = false">确 定</el-button>
|
||||||
|
<el-button @click="dialogStepsVisible = false">取 消</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { createLeave, updateLeave, deleteLeave, getLeave, getLeavePage, exportLeaveExcel } from "@/api/oa/leave"
|
||||||
|
import { getDictDataLabel, getDictDatas, DICT_TYPE } from '@/utils/dict'
|
||||||
|
import { processHistorySteps } from '@/api/oa/todo'
|
||||||
|
export default {
|
||||||
|
name: "Leave",
|
||||||
|
components: {
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 遮罩层
|
||||||
|
loading: true,
|
||||||
|
// 显示搜索条件
|
||||||
|
showSearch: true,
|
||||||
|
// 总条数
|
||||||
|
total: 0,
|
||||||
|
// 请假申请列表
|
||||||
|
list: [],
|
||||||
|
// 弹出层标题
|
||||||
|
title: "",
|
||||||
|
// 是否显示弹出层
|
||||||
|
open: false,
|
||||||
|
//进度弹出层
|
||||||
|
dialogDetailVisible: false,
|
||||||
|
//审批进度弹出层
|
||||||
|
dialogStepsVisible: false,
|
||||||
|
dateRangeStartTime: [],
|
||||||
|
dateRangeEndTime: [],
|
||||||
|
dateRangeApplyTime: [],
|
||||||
|
// 查询参数
|
||||||
|
queryParams: {
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
processInstanceId: null,
|
||||||
|
status: null,
|
||||||
|
userId: null,
|
||||||
|
leaveType: null,
|
||||||
|
reason: null,
|
||||||
|
},
|
||||||
|
// 表单参数
|
||||||
|
form: {},
|
||||||
|
handleTask: {
|
||||||
|
historyTask:[],
|
||||||
|
taskVariable: "",
|
||||||
|
formObject: {}
|
||||||
|
},
|
||||||
|
steps:[{
|
||||||
|
stepName:"步骤一"
|
||||||
|
}],
|
||||||
|
// 表单校验
|
||||||
|
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)
|
||||||
|
},
|
||||||
|
leaveTypeFormat(row, column) {
|
||||||
|
return getDictDataLabel(DICT_TYPE.OA_LEAVE_TYPE, row.leaveType)
|
||||||
|
},
|
||||||
|
leaveTypeDictData: getDictDatas(DICT_TYPE.OA_LEAVE_TYPE),
|
||||||
|
leaveStatusData: getDictDatas(DICT_TYPE.OA_LEAVE_STATUS)
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
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: {
|
||||||
|
/** 查询列表 */
|
||||||
|
getList() {
|
||||||
|
this.loading = true;
|
||||||
|
// 处理查询参数
|
||||||
|
let params = {...this.queryParams};
|
||||||
|
this.addBeginAndEndTime(params, this.dateRangeStartTime, 'startTime');
|
||||||
|
this.addBeginAndEndTime(params, this.dateRangeEndTime, 'endTime');
|
||||||
|
this.addBeginAndEndTime(params, this.dateRangeApplyTime, 'applyTime');
|
||||||
|
// 执行查询
|
||||||
|
getLeavePage(params).then(response => {
|
||||||
|
this.list = response.data.list;
|
||||||
|
this.total = response.data.total;
|
||||||
|
this.loading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 取消按钮 */
|
||||||
|
cancel() {
|
||||||
|
this.open = false;
|
||||||
|
this.reset();
|
||||||
|
},
|
||||||
|
/** 表单重置 */
|
||||||
|
reset() {
|
||||||
|
this.form = {
|
||||||
|
id: undefined,
|
||||||
|
processInstanceId: undefined,
|
||||||
|
status: undefined,
|
||||||
|
userId: undefined,
|
||||||
|
startTime: undefined,
|
||||||
|
endTime: undefined,
|
||||||
|
leaveType: undefined,
|
||||||
|
reason: undefined,
|
||||||
|
applyTime: undefined,
|
||||||
|
};
|
||||||
|
this.resetForm("form");
|
||||||
|
},
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
handleQuery() {
|
||||||
|
this.queryParams.pageNo = 1;
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
resetQuery() {
|
||||||
|
this.dateRangeStartTime = [];
|
||||||
|
this.dateRangeEndTime = [];
|
||||||
|
this.dateRangeApplyTime = [];
|
||||||
|
this.resetForm("queryForm");
|
||||||
|
this.handleQuery();
|
||||||
|
},
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
handleAdd() {
|
||||||
|
this.reset();
|
||||||
|
this.open = true;
|
||||||
|
this.title = "添加请假申请";
|
||||||
|
},
|
||||||
|
/** 详情按钮操作 */
|
||||||
|
handleDetail(row) {
|
||||||
|
this.reset();
|
||||||
|
const id = row.id;
|
||||||
|
getLeave(id).then(response => {
|
||||||
|
this.form = response.data;
|
||||||
|
this.dialogDetailVisible = true
|
||||||
|
this.title = "请假详情";
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 提交按钮 */
|
||||||
|
submitForm() {
|
||||||
|
this.$refs["form"].validate(valid => {
|
||||||
|
if (!valid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 修改的提交
|
||||||
|
if (this.form.id != null) {
|
||||||
|
updateLeave(this.form).then(response => {
|
||||||
|
this.msgSuccess("修改成功");
|
||||||
|
this.open = false;
|
||||||
|
this.getList();
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 添加的提交
|
||||||
|
createLeave(this.form).then(response => {
|
||||||
|
this.msgSuccess("新增成功");
|
||||||
|
this.open = false;
|
||||||
|
this.getList();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 审批进度 */
|
||||||
|
handleStep(row) {
|
||||||
|
const id = row.processInstanceId;
|
||||||
|
processHistorySteps(id).then(response => {
|
||||||
|
this.handleTask.historyTask = response.data;
|
||||||
|
this.dialogStepsVisible = true
|
||||||
|
this.title = "审批进度";
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 导出按钮操作 */
|
||||||
|
handleExport() {
|
||||||
|
// 处理查询参数
|
||||||
|
let params = {...this.queryParams};
|
||||||
|
params.pageNo = undefined;
|
||||||
|
params.pageSize = undefined;
|
||||||
|
this.addBeginAndEndTime(params, this.dateRangeStartTime, 'startTime');
|
||||||
|
this.addBeginAndEndTime(params, this.dateRangeEndTime, 'endTime');
|
||||||
|
this.addBeginAndEndTime(params, this.dateRangeApplyTime, 'applyTime');
|
||||||
|
// 执行导出
|
||||||
|
this.$confirm('是否确认导出所有请假申请数据项?', "警告", {
|
||||||
|
confirmButtonText: "确定",
|
||||||
|
cancelButtonText: "取消",
|
||||||
|
type: "warning"
|
||||||
|
}).then(function() {
|
||||||
|
return exportLeaveExcel(params);
|
||||||
|
}).then(response => {
|
||||||
|
this.downloadExcel(response, '请假申请.xls');
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@ -0,0 +1,211 @@
|
|||||||
|
<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>
|
||||||
@ -0,0 +1,303 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
|
||||||
|
<!-- 搜索工作栏 -->
|
||||||
|
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
|
<el-form-item label="状态" prop="status">
|
||||||
|
<el-select v-model="queryParams.status" placeholder="请选择状态">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in leaveStatusData"
|
||||||
|
:key="parseInt(dict.value)"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="parseInt(dict.value)"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||||
|
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 列表 -->
|
||||||
|
<el-table v-loading="loading" :data="list">
|
||||||
|
<el-table-column label="任务Id" align="center" prop="id" />
|
||||||
|
<el-table-column label="流程名称" align="center" prop="processName" />
|
||||||
|
<el-table-column label="任务状态" align="center" :formatter="statusFormat" prop="status" />
|
||||||
|
<!-- <el-table-column label="申请人id" align="center" prop="userId" />-->
|
||||||
|
<!-- <el-table-column label="开始时间" align="center" prop="startTime" width="180">-->
|
||||||
|
<!-- <template slot-scope="scope">-->
|
||||||
|
<!-- <span>{{ parseTime(scope.row.startTime) }}</span>-->
|
||||||
|
<!-- </template>-->
|
||||||
|
<!-- </el-table-column>-->
|
||||||
|
<!-- <el-table-column label="结束时间" align="center" prop="endTime" width="180">-->
|
||||||
|
<!-- <template slot-scope="scope">-->
|
||||||
|
<!-- <span>{{ parseTime(scope.row.endTime) }}</span>-->
|
||||||
|
<!-- </template>-->
|
||||||
|
<!-- </el-table-column>-->
|
||||||
|
<!-- <el-table-column label="请假类型" align="center" prop="leaveType" />-->
|
||||||
|
<!-- <el-table-column label="原因" align="center" prop="reason" />-->
|
||||||
|
<!-- <el-table-column label="申请时间" align="center" prop="applyTime" width="180">-->
|
||||||
|
<!-- <template slot-scope="scope">-->
|
||||||
|
<!-- <span>{{ parseTime(scope.row.applyTime) }}</span>-->
|
||||||
|
<!-- </template>-->
|
||||||
|
<!-- </el-table-column>-->
|
||||||
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button size="mini" type="text" icon="el-icon-edit" v-if="scope.row.status == 1" @click="handleClaim(scope.row)">签收</el-button>
|
||||||
|
<el-button size="mini" type="text" icon="el-icon-edit" v-if="scope.row.status == 2" @click="getTaskFormKey(scope.row)">办理</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页组件 -->
|
||||||
|
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
|
||||||
|
@pagination="getList"/>
|
||||||
|
|
||||||
|
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
|
||||||
|
<el-tabs tab-position="left" style="height: 500px;">
|
||||||
|
<el-tab-pane label="详情">
|
||||||
|
<el-form ref="form" :model="handleTask.formObject" label-width="80px">
|
||||||
|
<el-form-item label="状态" >
|
||||||
|
{{ getDictDataLabel(DICT_TYPE.OA_LEAVE_STATUS, handleTask.formObject.status) }}
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="申请人id" >{{handleTask.formObject.userId}}</el-form-item>
|
||||||
|
<el-form-item label="开始时间" >{{ parseTime(handleTask.formObject.startTime) }}</el-form-item>
|
||||||
|
<el-form-item label="结束时间" prop="endTime">{{ parseTime(handleTask.formObject.endTime) }}</el-form-item>
|
||||||
|
<el-form-item label="请假类型" prop="leaveType">
|
||||||
|
{{ getDictDataLabel(DICT_TYPE.OA_LEAVE_TYPE, handleTask.formObject.leaveType) }}
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="原因" prop="reason">{{handleTask.formObject.reason}}</el-form-item>
|
||||||
|
<el-form-item label="申请时间" prop="applyTime">{{ parseTime(handleTask.formObject.applyTime) }}</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="任务处理">
|
||||||
|
<el-steps :active="handleTask.historyTask.length-1" simple finish-status="success">
|
||||||
|
<el-step :title="item.stepName" icon="el-icon-edit" v-for="(item) in handleTask.historyTask" ></el-step>
|
||||||
|
</el-steps>
|
||||||
|
<br/>
|
||||||
|
<el-steps direction="vertical" :active="handleTask.historyTask.length-1" finish-status="success" space="60px">
|
||||||
|
<el-step :title="item.stepName" :description="item.comment" v-for="(item) in handleTask.historyTask" ></el-step>
|
||||||
|
</el-steps>
|
||||||
|
<br/>
|
||||||
|
<el-form ref="taskForm" :model="task" label-width="80px" v-show="handleTask.taskVariable !=''">
|
||||||
|
<el-form-item label="处理意见" prop="approved">
|
||||||
|
<el-select v-model="task.approved" placeholder="处理意见">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in approvedData"
|
||||||
|
:key="parseInt(dict.value)"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="parseInt(dict.value)"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-input
|
||||||
|
type="textarea"
|
||||||
|
:rows="2"
|
||||||
|
v-model="task.comment">
|
||||||
|
</el-input>
|
||||||
|
</el-form>
|
||||||
|
<br/>
|
||||||
|
<el-button type="primary" @click="submitTask">提交</el-button>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { completeTask, taskSteps, getTaskFormKey,deleteLeave, getLeave, getTodoTaskPage, claimTask } from "@/api/oa/todo";
|
||||||
|
import { getDictDataLabel, getDictDatas, DICT_TYPE } from '@/utils/dict'
|
||||||
|
export default {
|
||||||
|
name: "Todo",
|
||||||
|
components: {
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 遮罩层
|
||||||
|
loading: true,
|
||||||
|
// 显示搜索条件
|
||||||
|
showSearch: true,
|
||||||
|
// 总条数
|
||||||
|
total: 0,
|
||||||
|
// 请假申请列表
|
||||||
|
list: [],
|
||||||
|
// 弹出层标题
|
||||||
|
title: "",
|
||||||
|
// 是否显示弹出层
|
||||||
|
open: false,
|
||||||
|
// 查询参数
|
||||||
|
queryParams: {
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10
|
||||||
|
},
|
||||||
|
// 表单参数
|
||||||
|
form: {},
|
||||||
|
handleTask: {
|
||||||
|
historyTask:[{
|
||||||
|
stepName:"步骤一"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
taskVariable: "",
|
||||||
|
formObject: {}
|
||||||
|
},
|
||||||
|
steps:[{
|
||||||
|
stepName:"步骤一"
|
||||||
|
}],
|
||||||
|
task: {
|
||||||
|
approved : 1,
|
||||||
|
variables: {},
|
||||||
|
taskId: undefined,
|
||||||
|
comment: ""
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
},
|
||||||
|
leaveTypeDictData: getDictDatas(DICT_TYPE.OA_LEAVE_TYPE),
|
||||||
|
leaveStatusData: getDictDatas(DICT_TYPE.OA_LEAVE_STATUS),
|
||||||
|
approvedData: [
|
||||||
|
{
|
||||||
|
value: 1,
|
||||||
|
label: '同意'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 0,
|
||||||
|
label: '不同意'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
/** 查询列表 */
|
||||||
|
getList() {
|
||||||
|
this.loading = true;
|
||||||
|
// 处理查询参数
|
||||||
|
let params = {...this.queryParams};
|
||||||
|
// 执行查询
|
||||||
|
getTodoTaskPage(params).then(response => {
|
||||||
|
this.list = response.data.list;
|
||||||
|
this.total = response.data.total;
|
||||||
|
this.loading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 取消按钮 */
|
||||||
|
cancel() {
|
||||||
|
this.open = false;
|
||||||
|
this.reset();
|
||||||
|
},
|
||||||
|
/** 表单重置 */
|
||||||
|
reset() {
|
||||||
|
this.form = {
|
||||||
|
id: undefined,
|
||||||
|
processInstanceId: undefined,
|
||||||
|
status: undefined,
|
||||||
|
userId: undefined,
|
||||||
|
startTime: undefined,
|
||||||
|
endTime: undefined,
|
||||||
|
leaveType: undefined,
|
||||||
|
reason: undefined,
|
||||||
|
applyTime: undefined,
|
||||||
|
};
|
||||||
|
this.resetForm("form");
|
||||||
|
},
|
||||||
|
|
||||||
|
statusFormat(row, column) {
|
||||||
|
return row.status == 1 ? "未签收" : "已签收";
|
||||||
|
},
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
handleQuery() {
|
||||||
|
this.queryParams.pageNo = 1;
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
resetQuery() {
|
||||||
|
this.dateRangeStartTime = [];
|
||||||
|
this.dateRangeEndTime = [];
|
||||||
|
this.dateRangeApplyTime = [];
|
||||||
|
this.resetForm("queryForm");
|
||||||
|
this.handleQuery();
|
||||||
|
},
|
||||||
|
getTaskFormKey(row) {
|
||||||
|
const taskId = row.id;
|
||||||
|
const data = {
|
||||||
|
taskId : taskId
|
||||||
|
}
|
||||||
|
getTaskFormKey(data).then(response => {
|
||||||
|
const resp = response.data;
|
||||||
|
const path = resp.formKey;
|
||||||
|
const taskId = resp.id;
|
||||||
|
const businessKey = resp.businessKey;
|
||||||
|
const route = {
|
||||||
|
path: path,
|
||||||
|
query: {
|
||||||
|
businessKey: businessKey,
|
||||||
|
taskId:taskId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.$router.replace(route);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handleLeaveApprove(row) {
|
||||||
|
this.reset();
|
||||||
|
const businessKey = row.businessKey;
|
||||||
|
const taskId = row.id;
|
||||||
|
const processKey = row.processKey;
|
||||||
|
const data = {
|
||||||
|
taskId : taskId,
|
||||||
|
businessKey: businessKey,
|
||||||
|
processKey: processKey
|
||||||
|
}
|
||||||
|
taskSteps(data).then(response => {
|
||||||
|
this.form = {};
|
||||||
|
this.handleTask = response.data;
|
||||||
|
this.task.taskId = taskId;
|
||||||
|
this.open = true;
|
||||||
|
this.title = "任务办理";
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 任务签收操作 */
|
||||||
|
handleClaim(row) {
|
||||||
|
this.reset();
|
||||||
|
const id = row.id;
|
||||||
|
claimTask(id).then(() => {
|
||||||
|
this.getList();
|
||||||
|
this.msgSuccess("签收成功");
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 提交任务 */
|
||||||
|
submitTask() {
|
||||||
|
const taskVariableName = this.handleTask.taskVariable;
|
||||||
|
if (taskVariableName != "") {
|
||||||
|
if (this.task.approved == 1) {
|
||||||
|
this.task.variables[taskVariableName] = true;
|
||||||
|
}
|
||||||
|
if (this.task.approved == 0) {
|
||||||
|
this.task.variables[taskVariableName] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
completeTask(this.task).then(response => {
|
||||||
|
this.msgSuccess("执行任务成功");
|
||||||
|
this.open = false;
|
||||||
|
this.getList();
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
handleDelete(row) {
|
||||||
|
const id = row.id;
|
||||||
|
this.$confirm('是否确认删除请假申请编号为"' + id + '"的数据项?', "警告", {
|
||||||
|
confirmButtonText: "确定",
|
||||||
|
cancelButtonText: "取消",
|
||||||
|
type: "warning"
|
||||||
|
}).then(function() {
|
||||||
|
return deleteLeave(id);
|
||||||
|
}).then(() => {
|
||||||
|
this.getList();
|
||||||
|
this.msgSuccess("删除成功");
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@ -0,0 +1,71 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>cn.iocoder.boot</groupId>
|
||||||
|
<artifactId>yudao-framework</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>yudao-spring-boot-starter-activiti</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<name>${artifactId}</name>
|
||||||
|
<description>Activiti 拓展</description>
|
||||||
|
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
|
||||||
|
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<activiti.version>7.1.0.M6</activiti.version>
|
||||||
|
</properties>
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.activiti.dependencies</groupId>
|
||||||
|
<artifactId>activiti-dependencies</artifactId>
|
||||||
|
<version>${activiti.version}</version>
|
||||||
|
<scope>import</scope>
|
||||||
|
<type>pom</type>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.iocoder.boot</groupId>
|
||||||
|
<artifactId>yudao-common</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mybatis</groupId>
|
||||||
|
<artifactId>mybatis</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--使用mybatis plus需排除掉mybatis-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.activiti</groupId>
|
||||||
|
<artifactId>activiti-spring-boot-starter</artifactId>
|
||||||
|
<version>${activiti.version}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>de.odysseus.juel</groupId>
|
||||||
|
<artifactId>juel-api</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>de.odysseus.juel</groupId>
|
||||||
|
<artifactId>juel-spi</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.mybatis</groupId>
|
||||||
|
<artifactId>mybatis</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>el-api</artifactId>
|
||||||
|
<groupId>javax.el</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
package cn.iocoder.yudao.framework.activiti.config;
|
||||||
|
|
||||||
|
import org.activiti.api.runtime.shared.identity.UserGroupManager;
|
||||||
|
import org.activiti.spring.SpringProcessEngineConfiguration;
|
||||||
|
import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
|
||||||
|
import org.apache.ibatis.session.SqlSessionFactory;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class YudaoActivitiConfiguration {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public static class SqlSessionFactoryProcessEngineConfigurationConfigurer
|
||||||
|
implements ProcessEngineConfigurationConfigurer {
|
||||||
|
|
||||||
|
private final SqlSessionFactory sqlSessionFactory;
|
||||||
|
public SqlSessionFactoryProcessEngineConfigurationConfigurer(SqlSessionFactory sessionFactory) {
|
||||||
|
this.sqlSessionFactory = sessionFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void configure(SpringProcessEngineConfiguration springProcessEngineConfiguration) {
|
||||||
|
springProcessEngineConfiguration.setSqlSessionFactory(sqlSessionFactory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
package cn.iocoder.yudao.framework.activiti;
|
||||||
Loading…
Reference in New Issue