diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java index f983d7ce..986a7790 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java @@ -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, "已经存在流程标识为【{}】的流程"); diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java index 997f006d..251635ea 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java @@ -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, "分配任务的责任人"); /** * 脚本编号 diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAWorkTaskController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAWorkTaskController.java new file mode 100644 index 00000000..fef4e633 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAWorkTaskController.java @@ -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 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 getLeave(@RequestParam("id") Long id) { + BpmOAWorkTaskDO workTask = workTaskService.getWorkTask(id); + return success(BpmOAWorkTaskConvert.INSTANCE.convert(workTask)); + } + + @PostMapping("/add") + @Operation(summary = "添加任务跟踪数据【全量传】") + public CommonResult addTrackInfo(@RequestBody List trackInfos) { + workTaskService.addTrackInfo(getLoginUserId(), trackInfos) ; + return success(true); + } + + @PostMapping("/update") + @Operation(summary = "更新工作任务的状态和进度") + public CommonResult updateWorkTask(@RequestBody BpmOAWorkTaskReqVO createReqVO) { + workTaskService.updateWorkTask(getLoginUserId(), createReqVO) ; + return success(true); + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/worktask/BpmOAWorkTaskReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/worktask/BpmOAWorkTaskReqVO.java new file mode 100644 index 00000000..73eb14e5 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/worktask/BpmOAWorkTaskReqVO.java @@ -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 fileItems; +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/worktask/BpmOAWorkTaskRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/worktask/BpmOAWorkTaskRespVO.java new file mode 100644 index 00000000..9052b3e1 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/worktask/BpmOAWorkTaskRespVO.java @@ -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 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; + } + + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOAWorkTaskConvert.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOAWorkTaskConvert.java new file mode 100644 index 00000000..c99a1193 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOAWorkTaskConvert.java @@ -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 convertList(List list); + + PageResult convertPage(PageResult page); + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOAWorkTaskDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOAWorkTaskDO.java new file mode 100644 index 00000000..26cf94a0 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOAWorkTaskDO.java @@ -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 fileItems ; + + /** + * 任务跟踪信息 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List trackInfos ; + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOAWorkTaskMapper.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOAWorkTaskMapper.java new file mode 100644 index 00000000..8bd4f0e1 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOAWorkTaskMapper.java @@ -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 { + + default BpmOAWorkTaskDO selectByProcessInstanceId(String processInstanceId) { + return selectOne(BpmOAWorkTaskDO::getProcessInstanceId, processInstanceId); + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskWorkTaskReceiverUserScript.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskWorkTaskReceiverUserScript.java new file mode 100644 index 00000000..6b1d8191 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskWorkTaskReceiverUserScript.java @@ -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 calculateTaskCandidateUsers(DelegateExecution execution) { + + // 获得发起人 + ProcessInstance processInstance = bpmProcessInstanceService.getProcessInstance(execution.getProcessInstanceId()); + List 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; + } +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAWorkTaskService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAWorkTaskService.java new file mode 100644 index 00000000..dab1fcd3 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAWorkTaskService.java @@ -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 trackInfos) ; + + void updateWorkTask( Long id, BpmOAWorkTaskReqVO createReqVO) ; + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAWorkTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAWorkTaskServiceImpl.java new file mode 100644 index 00000000..1e373239 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAWorkTaskServiceImpl.java @@ -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 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 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 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())); + } +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOAWorkTaskResultListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOAWorkTaskResultListener.java new file mode 100644 index 00000000..d211c71e --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOAWorkTaskResultListener.java @@ -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()); + } +}