Merge branch 'main' into frx
This commit is contained in:
commit
c96ee7ef7c
@ -32,6 +32,7 @@ public interface ErrorCodeConstants {
|
||||
ErrorCode OA_SECOND_NOT_EXISTS = new ErrorCode(1_009_001_108, "借调申请不存在");
|
||||
ErrorCode OA_IMPREST_NOT_EXISTS = new ErrorCode(1_009_001_109, "备用金申请不存在");
|
||||
ErrorCode OA_INCENTIVE_NOT_EXISTS = new ErrorCode(1_009_001_110, "奖惩申请不存在");
|
||||
ErrorCode OA_WORK_TASK_NOT_EXISTS = new ErrorCode(1_009_001_110, "工作任务不存在");
|
||||
|
||||
// ========== 流程模型 1-009-002-000 ==========
|
||||
ErrorCode MODEL_KEY_EXISTS = new ErrorCode(1_009_002_000, "已经存在流程标识为【{}】的流程");
|
||||
|
@ -19,8 +19,8 @@ public enum BpmTaskRuleScriptEnum {
|
||||
LEADER_X2(21L, "流程发起人的二级领导"),
|
||||
LEADER_X3(22L, "流程发起人的三级领导"),
|
||||
LEADER_X4(23L, "审批人的一级领导"),
|
||||
LEADER_X5(24L, "调岗部门领导");
|
||||
|
||||
LEADER_X5(24L, "调岗部门领导"),
|
||||
LEADER_X6(25L, "分配任务的责任人");
|
||||
|
||||
/**
|
||||
* 脚本编号
|
||||
|
@ -0,0 +1,73 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeaveCreateReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeavePageReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeaveRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert;
|
||||
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAWorkTaskConvert;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAWorkTaskService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.Valid;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
|
||||
/**
|
||||
* OA 任务分配 Controller
|
||||
*
|
||||
* @author 姚君
|
||||
|
||||
*/
|
||||
@Tag(name = "管理后台 - OA 任务分配")
|
||||
@RestController
|
||||
@RequestMapping("/bpm/oa/worktask")
|
||||
@Validated
|
||||
public class BpmOAWorkTaskController {
|
||||
|
||||
@Resource
|
||||
private BpmOAWorkTaskService workTaskService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建任务分配")
|
||||
public CommonResult<Long> createLeave(@Valid @RequestBody BpmOAWorkTaskReqVO createReqVO) {
|
||||
return success(workTaskService.createWorkTask(getLoginUserId(), createReqVO));
|
||||
}
|
||||
|
||||
@GetMapping("/get")
|
||||
@Operation(summary = "获得任务分配")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
public CommonResult<BpmOAWorkTaskRespVO> getLeave(@RequestParam("id") Long id) {
|
||||
BpmOAWorkTaskDO workTask = workTaskService.getWorkTask(id);
|
||||
return success(BpmOAWorkTaskConvert.INSTANCE.convert(workTask));
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "添加任务跟踪数据【全量传】")
|
||||
public CommonResult<Boolean> addTrackInfo(@RequestBody List<BpmOAWorkTaskRespVO.TrackInfo> trackInfos) {
|
||||
workTaskService.addTrackInfo(getLoginUserId(), trackInfos) ;
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@PostMapping("/update")
|
||||
@Operation(summary = "更新工作任务的状态和进度")
|
||||
public CommonResult<Boolean> updateWorkTask(@RequestBody BpmOAWorkTaskReqVO createReqVO) {
|
||||
workTaskService.updateWorkTask(getLoginUserId(), createReqVO) ;
|
||||
return success(true);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask;
|
||||
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
/**
|
||||
* 工作任务 创建 Request VO
|
||||
*
|
||||
* @author yj
|
||||
*/
|
||||
@Schema(description = "管理后台 - 工作任务分配 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode()
|
||||
@ToString(callSuper = true)
|
||||
public class BpmOAWorkTaskReqVO {
|
||||
|
||||
@Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "任务名称不能为空")
|
||||
private String taskName;
|
||||
|
||||
@Schema(description = "任务内容", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "任务内容不能为空")
|
||||
private String taskContent;
|
||||
|
||||
@Schema(description = "任务的开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "截止时间不能为空")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime startTime;
|
||||
|
||||
@Schema(description = "任务的截止时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "截止时间不能为空")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime endTime;
|
||||
|
||||
@Schema(description = "责任人ID", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "责任人不能为空")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "任务进度百分比", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private Long schedule ;
|
||||
|
||||
@Schema(description = "工作任务状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1:待启动,2:进行中,3.已完成,4.延期, 5.搁置")
|
||||
private Integer workTaskStatus ;
|
||||
|
||||
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private List<UploadUserFile> fileItems;
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOABaseRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.reimbursement.ReimbursementDTO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
@Schema(description = "管理后台 - 报销响应数据 Response VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class BpmOAWorkTaskRespVO extends BpmOABaseRespVO {
|
||||
|
||||
@Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "任务名称不能为空")
|
||||
private String taskName;
|
||||
|
||||
@Schema(description = "任务内容", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "任务内容不能为空")
|
||||
private String taskContent;
|
||||
|
||||
@Schema(description = "任务的开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "截止时间不能为空")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime startTime;
|
||||
|
||||
@Schema(description = "任务的截止时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "截止时间不能为空")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime endTime;
|
||||
|
||||
@Schema(description = "责任人名称", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "责任名称不能为空")
|
||||
private Long userName;
|
||||
|
||||
@Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "部门名称不能为空")
|
||||
private Long deptName;
|
||||
|
||||
@Schema(description = "任务进度百分比", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "任务进度百分比")
|
||||
private Long schedule ;
|
||||
|
||||
@Schema(description = "工作任务状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1:待启动,2:进行中,3.已完成,4.延期, 5.搁置")
|
||||
@NotNull(message = "工作任务状态")
|
||||
private Integer workTaskStatus ;
|
||||
|
||||
@Schema(description = "跟踪内容集合")
|
||||
private List<TrackInfo> trackInfos ;
|
||||
|
||||
@Schema(description = "任务跟踪信息")
|
||||
@Data
|
||||
public static class TrackInfo {
|
||||
|
||||
@Schema(description = "跟踪人", example = "126")
|
||||
private Long TrackUserId;
|
||||
|
||||
@Schema(description = "跟踪内容", example = "11111112122222")
|
||||
private String TrackContent;
|
||||
|
||||
@Schema(description = "跟踪内容提交时间", example = "2024-05-12 12:00:44")
|
||||
private LocalDateTime trackTime;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package cn.iocoder.yudao.module.bpm.convert.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 分配任务 Convert
|
||||
*
|
||||
* @author 芋艿
|
||||
*/
|
||||
@Mapper
|
||||
public interface BpmOAWorkTaskConvert {
|
||||
|
||||
BpmOAWorkTaskConvert INSTANCE = Mappers.getMapper(BpmOAWorkTaskConvert.class);
|
||||
|
||||
BpmOAWorkTaskDO convert(BpmOAWorkTaskReqVO bean);
|
||||
|
||||
BpmOAWorkTaskRespVO convert(BpmOAWorkTaskDO bean);
|
||||
|
||||
List<BpmOAWorkTaskRespVO> convertList(List<BpmOAWorkTaskDO> list);
|
||||
|
||||
PageResult<BpmOAWorkTaskRespVO> convertPage(PageResult<BpmOAWorkTaskDO> page);
|
||||
|
||||
}
|
@ -0,0 +1,99 @@
|
||||
package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
|
||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
|
||||
import lombok.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* OA 分配任务 DO
|
||||
*
|
||||
* @author 姚君
|
||||
|
||||
*/
|
||||
@TableName(value ="bpm_oa_work_task", autoResultMap = true)
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class BpmOAWorkTaskDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 工作任务表单主键
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 发起人
|
||||
*/
|
||||
private Long fromUserId;
|
||||
|
||||
/**
|
||||
* 接受人
|
||||
*/
|
||||
private Long receiverUserId;
|
||||
|
||||
/**
|
||||
* 任务名称
|
||||
*/
|
||||
private String taskName;
|
||||
/**
|
||||
* 任务内容
|
||||
*/
|
||||
private String taskContent;
|
||||
/**
|
||||
* 开始时间
|
||||
*/
|
||||
private LocalDateTime startTime;
|
||||
/**
|
||||
* 截止时间
|
||||
*/
|
||||
private LocalDateTime endTime;
|
||||
/**
|
||||
* 任务进度 百分比
|
||||
*/
|
||||
private Long schedule;
|
||||
/**
|
||||
* 任务的状态 任务自身的状态 1:待启动,2:进行中,3.已完成,4.延期, 5.搁置
|
||||
*/
|
||||
private Integer workTaskStatus ;
|
||||
|
||||
/**
|
||||
* 任务分配BPM流程的结果
|
||||
*
|
||||
* 枚举 {@link BpmProcessInstanceResultEnum}
|
||||
* 考虑到简单,所以直接复用了 BpmProcessInstanceResultEnum 枚举,也可以自己定义一个枚举哈
|
||||
*/
|
||||
private Integer result;
|
||||
|
||||
/**
|
||||
* 对应的流程编号
|
||||
*
|
||||
* 关联 ProcessInstance 的 id 属性
|
||||
*/
|
||||
private String processInstanceId;
|
||||
|
||||
/**
|
||||
* 附件基本信息
|
||||
*/
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private List<UploadUserFile> fileItems ;
|
||||
|
||||
/**
|
||||
* 任务跟踪信息
|
||||
*/
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private List<BpmOAWorkTaskRespVO.TrackInfo> trackInfos ;
|
||||
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package cn.iocoder.yudao.module.bpm.dal.mysql.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
/**
|
||||
* 分配任务 Mapper
|
||||
*
|
||||
* @author yj
|
||||
|
||||
*/
|
||||
@Mapper
|
||||
public interface BpmOAWorkTaskMapper extends BaseMapperX<BpmOAWorkTaskDO> {
|
||||
|
||||
default BpmOAWorkTaskDO selectByProcessInstanceId(String processInstanceId) {
|
||||
return selectOne(BpmOAWorkTaskDO::getProcessInstanceId, processInstanceId);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAWorkTaskMapper;
|
||||
import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum;
|
||||
import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.flowable.engine.runtime.ProcessInstance;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import static java.util.Collections.emptySet;
|
||||
|
||||
@Component
|
||||
public class BpmTaskWorkTaskReceiverUserScript implements BpmTaskAssignScript {
|
||||
|
||||
@Resource
|
||||
private BpmOAWorkTaskMapper bpmOAWorkTaskMapper;
|
||||
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private BpmProcessInstanceService bpmProcessInstanceService;
|
||||
|
||||
@Resource
|
||||
@Lazy // 解决循环依赖
|
||||
private BpmTaskService bpmTaskService ;
|
||||
@Override
|
||||
public Set<Long> calculateTaskCandidateUsers(DelegateExecution execution) {
|
||||
|
||||
// 获得发起人
|
||||
ProcessInstance processInstance = bpmProcessInstanceService.getProcessInstance(execution.getProcessInstanceId());
|
||||
List<BpmTaskRespVO> bpmTaskRespVOs = bpmTaskService.getTaskListByProcessInstanceId(processInstance.getProcessInstanceId());
|
||||
if (CollUtil.isEmpty(bpmTaskRespVOs)) {
|
||||
return emptySet();
|
||||
}
|
||||
|
||||
//根据流程实例ID 取到分配工作的流程表单
|
||||
BpmOAWorkTaskDO workTask = bpmOAWorkTaskMapper.selectByProcessInstanceId(processInstance.getProcessInstanceId());
|
||||
return SetUtils.asSet(workTask.getReceiverUserId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public BpmTaskRuleScriptEnum getEnum() {
|
||||
return BpmTaskRuleScriptEnum.LEADER_X6;
|
||||
}
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.oa;
|
||||
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeaveCreateReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeavePageReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 任务分配 Service 接口
|
||||
*
|
||||
* @author jason
|
||||
|
||||
*/
|
||||
public interface BpmOAWorkTaskService {
|
||||
|
||||
/**
|
||||
* 创建工作任务
|
||||
*
|
||||
* @param userId 用户编号
|
||||
* @param createReqVO 创建信息
|
||||
* @return 编号
|
||||
*/
|
||||
Long createWorkTask(Long userId, @Valid BpmOAWorkTaskReqVO createReqVO);
|
||||
|
||||
/**
|
||||
* 更新工作任务的状态
|
||||
*
|
||||
* @param id 编号
|
||||
* @param result 结果
|
||||
*/
|
||||
void updateWorkTaskResult(Long id, Integer result);
|
||||
|
||||
/**
|
||||
* 获得工作任务详情
|
||||
*
|
||||
* @param id 编号
|
||||
* @return 请假申请
|
||||
*/
|
||||
BpmOAWorkTaskDO getWorkTask(Long id);
|
||||
|
||||
/**
|
||||
* 更新 工作跟踪日志数据
|
||||
* 因为是所有数据是存储在一个字段,所以是全量更新
|
||||
* @param id
|
||||
* @param trackInfos
|
||||
*/
|
||||
void addTrackInfo(Long id, List<BpmOAWorkTaskRespVO.TrackInfo> trackInfos) ;
|
||||
|
||||
void updateWorkTask( Long id, BpmOAWorkTaskReqVO createReqVO) ;
|
||||
|
||||
}
|
@ -0,0 +1,102 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.oa;
|
||||
|
||||
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
|
||||
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
|
||||
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAWorkTaskConvert;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAWorkTaskMapper;
|
||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_WORK_TASK_NOT_EXISTS;
|
||||
|
||||
/**
|
||||
* OA 请假申请 Service 实现类
|
||||
*
|
||||
* @author jason
|
||||
|
||||
*/
|
||||
@Service
|
||||
@Validated
|
||||
public class BpmOAWorkTaskServiceImpl extends BpmOABaseService implements BpmOAWorkTaskService {
|
||||
|
||||
/**
|
||||
* OA 请假对应的流程定义 KEY
|
||||
*/
|
||||
public static final String PROCESS_KEY = "oa_work_task";
|
||||
|
||||
@Resource
|
||||
private BpmOAWorkTaskMapper workTaskMapper;
|
||||
|
||||
@Resource
|
||||
private BpmProcessInstanceApi processInstanceApi;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Long createWorkTask(Long userId, BpmOAWorkTaskReqVO createReqVO) {
|
||||
BpmOAWorkTaskDO workTask = BpmOAWorkTaskConvert.INSTANCE.convert(createReqVO)
|
||||
.setFromUserId(userId)
|
||||
.setWorkTaskStatus(1) //默认待启动状态
|
||||
.setReceiverUserId(createReqVO.getUserId())
|
||||
.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
|
||||
workTaskMapper.insert(workTask);
|
||||
|
||||
// 发起 BPM 流程
|
||||
Map<String, Object> processInstanceVariables = new HashMap<>();
|
||||
String processInstanceId = processInstanceApi.createProcessInstance(userId,
|
||||
new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
|
||||
.setVariables(processInstanceVariables).setBusinessKey(String.valueOf(workTask.getId()))).getCheckedData();
|
||||
|
||||
// 将工作流的编号,更新到 OA 请假单中
|
||||
workTaskMapper.updateById(new BpmOAWorkTaskDO().setId(workTask.getId()).setProcessInstanceId(processInstanceId));
|
||||
|
||||
List<UploadUserFile> fileItems = createReqVO.getFileItems() ;
|
||||
//这里的逻辑,如果fileItems不为空,且有数据,那么说明是上传了附件的,则需要更工作流文件表对应的实例Id
|
||||
if (fileItems != null && !fileItems.isEmpty()) {
|
||||
uploadBpmFileProcessInstanceId(processInstanceId,fileItems) ;
|
||||
}
|
||||
return workTask.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateWorkTaskResult(Long id, Integer result) {
|
||||
validateLeaveExists(id);
|
||||
//bpm流程设置成已完成,需要将任务自生的状态设置成已完成
|
||||
workTaskMapper.updateById(new BpmOAWorkTaskDO().setId(id).setResult(result).setWorkTaskStatus(3));
|
||||
}
|
||||
|
||||
private void validateLeaveExists(Long id) {
|
||||
if (workTaskMapper.selectById(id) == null) {
|
||||
throw exception(OA_WORK_TASK_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public BpmOAWorkTaskDO getWorkTask(Long id) {
|
||||
return workTaskMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addTrackInfo(Long id, List<BpmOAWorkTaskRespVO.TrackInfo> trackInfos) {
|
||||
validateLeaveExists(id);
|
||||
workTaskMapper.updateById(new BpmOAWorkTaskDO().setId(id).setTrackInfos(trackInfos));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateWorkTask(Long id, BpmOAWorkTaskReqVO createReqVO) {
|
||||
validateLeaveExists(id);
|
||||
//更新任务进度 和 任务状态
|
||||
workTaskMapper.updateById(new BpmOAWorkTaskDO().setId(id).setWorkTaskStatus(createReqVO.getWorkTaskStatus()).setSchedule(createReqVO.getSchedule()));
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.oa.listener;
|
||||
|
||||
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent;
|
||||
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventListener;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAWorkTaskService;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAWorkTaskServiceImpl;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* OA 分配工作 的结果的监听器实现类
|
||||
*
|
||||
* @author 姚君
|
||||
*/
|
||||
@Component
|
||||
public class BpmOAWorkTaskResultListener extends BpmProcessInstanceResultEventListener {
|
||||
|
||||
@Resource
|
||||
private BpmOAWorkTaskService workTaskService;
|
||||
|
||||
@Override
|
||||
protected String getProcessDefinitionKey() {
|
||||
|
||||
return BpmOAWorkTaskServiceImpl.PROCESS_KEY;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onEvent(BpmProcessInstanceResultEvent event) {
|
||||
workTaskService.updateWorkTaskResult(Long.parseLong(event.getBusinessKey()), event.getResult());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user