diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java index 6f7edc01..c60f3452 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java @@ -7,9 +7,9 @@ import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmPro import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Parameter; 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.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; @@ -18,8 +18,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; - import java.util.List; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -45,7 +45,10 @@ public class BpmProcessDefinitionController { // @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')") public CommonResult> getProcessDefinitionList( BpmProcessDefinitionListReqVO listReqVO) { - return success(bpmDefinitionService.getProcessDefinitionList(listReqVO)); + + List respVOS = bpmDefinitionService.getProcessDefinitionList(listReqVO); + respVOS = respVOS.stream().filter(data -> !data.getId().contains("oa_work_task")).collect(Collectors.toList()); + return success(respVOS); } @GetMapping ("/get-bpmn-xml") 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 index fef4e633..a1a9b2fd 100644 --- 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 @@ -2,17 +2,17 @@ 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.BpmOAWorkTaskPageReqVO; 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 cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -22,8 +22,6 @@ 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; @@ -42,6 +40,15 @@ public class BpmOAWorkTaskController { @Resource private BpmOAWorkTaskService workTaskService; + @Resource + private AdminUserApi userApi; + + @Resource + private DeptApi deptApi; + + @Resource + private BpmTaskService taskService; + @PostMapping("/create") @Operation(summary = "创建任务分配") public CommonResult createLeave(@Valid @RequestBody BpmOAWorkTaskReqVO createReqVO) { @@ -51,23 +58,64 @@ public class BpmOAWorkTaskController { @GetMapping("/get") @Operation(summary = "获得任务分配") @Parameter(name = "id", description = "编号", required = true, example = "1024") - public CommonResult getLeave(@RequestParam("id") Long id) { + public CommonResult getTask(@RequestParam("id") Long id) { + BpmOAWorkTaskDO workTask = workTaskService.getWorkTask(id); - return success(BpmOAWorkTaskConvert.INSTANCE.convert(workTask)); + //获得 责任人用户信息 + AdminUserRespDTO userRespDTO = userApi.getUser(workTask.getReceiverUserId()).getCheckedData(); + //获得 责任人部门信息 + DeptRespDTO deptRespDTO = deptApi.getDept(userRespDTO.getDeptId()).getCheckedData(); + + String taskId = null; + if (workTask.getWorkTaskStatus() != 3) { + + //获得TASK + taskId = taskService.getCurrentTaskIdByProcessInstanceId(workTask.getProcessInstanceId()); + } + + return success(BpmOAWorkTaskConvert.INSTANCE.convert(workTask, userRespDTO, deptRespDTO, taskId)); } - @PostMapping("/add") + @GetMapping("/getByProcessInstanceId") + @Operation(summary = "获得任务分配") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getTask(@RequestParam("id") String processInstanceId) { + + BpmOAWorkTaskDO workTask = workTaskService.getWorkTaskByProcessInstanceId(processInstanceId); + + return success(workTask); + } + + @PutMapping("/add") @Operation(summary = "添加任务跟踪数据【全量传】") - public CommonResult addTrackInfo(@RequestBody List trackInfos) { - workTaskService.addTrackInfo(getLoginUserId(), trackInfos) ; + public CommonResult addTrackInfo(@RequestBody BpmOAWorkTaskReqVO updateReqVO) { + + workTaskService.addTrackInfo(updateReqVO) ; return success(true); } @PostMapping("/update") @Operation(summary = "更新工作任务的状态和进度") public CommonResult updateWorkTask(@RequestBody BpmOAWorkTaskReqVO createReqVO) { - workTaskService.updateWorkTask(getLoginUserId(), createReqVO) ; + + workTaskService.updateWorkTask(createReqVO) ; return success(true); } + @GetMapping("/page") + @Operation(summary = "获得工作任务分页") + public CommonResult> getPage(@Valid BpmOAWorkTaskPageReqVO pageVO) { + + PageResult pageResult = workTaskService.getPage(getLoginUserId(), pageVO); + return success(pageResult); + } + + @GetMapping("/my-page") + @Operation(summary = "获得我的任务分页") + public CommonResult> getMyPage(@Valid BpmOAWorkTaskPageReqVO pageVO) { + + PageResult pageResult = workTaskService.getMyPage(getLoginUserId(), pageVO); + return success(pageResult); + } + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/worktask/BpmOAWorkTaskPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/worktask/BpmOAWorkTaskPageReqVO.java new file mode 100644 index 00000000..77a69f67 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/worktask/BpmOAWorkTaskPageReqVO.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +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 = "管理后台 - 任务分配分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmOAWorkTaskPageReqVO extends PageParam { + + @Schema(description = "发起人用户ID") + private Long fromUserId; + + @Schema(description = "用户ID") + private Long userId; + + @Schema(description = "部门编号") + private Long deptId; + + @Schema(description = "用户ID列表") + private List userIdList; + + @Schema(description = "状态") + private Integer workTaskStatus; + + @Schema(description = "任务名称") + private String taskName; + + @Schema(description = "是否查看我的任务分配标识 | 1:我的 2:全部") + private Integer isMyTask; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "申请时间") + private LocalDateTime[] createTime; +} 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 index 73eb14e5..06e6b059 100644 --- 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 @@ -3,17 +3,13 @@ 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 @@ -22,10 +18,11 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ */ @Schema(description = "管理后台 - 工作任务分配 Request VO") @Data -@EqualsAndHashCode() -@ToString(callSuper = true) public class BpmOAWorkTaskReqVO { + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long id; + @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "任务名称不能为空") private String taskName; @@ -34,15 +31,19 @@ public class BpmOAWorkTaskReqVO { @NotNull(message = "任务内容不能为空") private String taskContent; + @Schema(description = "任务级别", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "任务级别不能为空") + private Integer level; + @Schema(description = "任务的开始时间", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "截止时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime startTime; + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate startTime; @Schema(description = "任务的截止时间", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "截止时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime endTime; + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate endTime; @Schema(description = "责任人ID", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "责任人不能为空") @@ -54,6 +55,20 @@ public class BpmOAWorkTaskReqVO { @Schema(description = "工作任务状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1:待启动,2:进行中,3.已完成,4.延期, 5.搁置") private Integer workTaskStatus ; + @Schema(description = "搁置或延期原因") + private String reason; + + @Schema(description = "搁置后 任务开始日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate shelveStartTime; + + @Schema(description = "搁置后 任务结束日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate shelveEndTime; + @Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED) private List fileItems; + + @Schema(description = "跟踪内容集合") + private BpmOAWorkTaskTrackInfo trackInfos; } 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 index 9052b3e1..1f67e31a 100644 --- 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 @@ -1,7 +1,6 @@ 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; @@ -9,10 +8,11 @@ import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotNull; -import java.math.BigDecimal; +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; @Schema(description = "管理后台 - 报销响应数据 Response VO") @@ -29,23 +29,39 @@ public class BpmOAWorkTaskRespVO extends BpmOABaseRespVO { @NotNull(message = "任务内容不能为空") private String taskContent; + @Schema(description = "任务级别", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "任务级别不能为空") + private Integer level; + @Schema(description = "任务的开始时间", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "截止时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime startTime; + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate startTime; @Schema(description = "任务的截止时间", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "截止时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime endTime; + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate endTime; + + @Schema(description = "发起人用户ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "责任名称不能为空") + private Long fromUserId; + + @Schema(description = "发起人名称", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "责任名称不能为空") + private String fromUserName; + + @Schema(description = "责任人用户ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "责任名称不能为空") + private Long receiverUserId; @Schema(description = "责任人名称", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "责任名称不能为空") - private Long userName; + private String userName; - @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED) + @Schema(description = "责任人部门名称", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "部门名称不能为空") - private Long deptName; + private String deptName; @Schema(description = "任务进度百分比", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "任务进度百分比") @@ -55,22 +71,24 @@ public class BpmOAWorkTaskRespVO extends BpmOABaseRespVO { @NotNull(message = "工作任务状态") private Integer workTaskStatus ; + @Schema(description = "搁置或延期原因") + private String reason; + + @Schema(description = "搁置后 任务开始日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate shelveStartTime; + + @Schema(description = "搁置后 任务结束日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate shelveEndTime; + @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; - } + private List trackInfo; + @Schema(description = "更新时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime updateTime; + @Schema(description = "TaskId") + private String taskId; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/worktask/BpmOAWorkTaskTrackInfo.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/worktask/BpmOAWorkTaskTrackInfo.java new file mode 100644 index 00000000..40524f00 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/worktask/BpmOAWorkTaskTrackInfo.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 跟踪内容集合 VO") +@Data +public class BpmOAWorkTaskTrackInfo { + + @Schema(description = "跟踪内容", example = "11111112122222") + private String trackContent; + + @Schema(description = "跟踪内容提交时间", example = "2024-05-12 12:00:44") + private String trackTime; +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/message/BpmMessageConvert.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/message/BpmMessageConvert.java index 75ab751d..3c25aa9f 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/message/BpmMessageConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/message/BpmMessageConvert.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.bpm.convert.message; import cn.iocoder.yudao.framework.common.util.date.DateUtils; +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO; import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO; import cn.iocoder.yudao.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; import cn.iocoder.yudao.module.system.api.subscribe.dto.MsgData; @@ -37,7 +38,8 @@ public interface BpmMessageConvert { * @param miniProgramState 小程序的状态 * @return */ - default SubscribeMessageReqDTO convertApprovalResultNotification(String openId, String processInstanceName, String time, String result, String reason, String processInstanceId, + default SubscribeMessageReqDTO convertApprovalResultNotification(String openId, String processInstanceName, + String time, String result, String reason, String processInstanceId, String miniProgramState) { SubscribeMessageReqDTO message = new SubscribeMessageReqDTO(); message.setToUser(openId); @@ -91,7 +93,8 @@ public interface BpmMessageConvert { * @param miniProgramState 小程序的状态 * @return */ - default SubscribeMessageReqDTO convertProcessToDoReminder(String openId, String processInstanceName, String startUserNickname, String time, String schedule, String processInstanceId, String miniProgramState) { + default SubscribeMessageReqDTO convertProcessToDoReminder(String openId, String processInstanceName, + String startUserNickname, String time, String schedule, String processInstanceId, String miniProgramState) { SubscribeMessageReqDTO message = new SubscribeMessageReqDTO(); message.setToUser(openId); message.setTemplateId("3cP4btlFSSiZk65qVewN_WoT_bh0OfUkYzzTsADOrR4"); @@ -123,4 +126,56 @@ public interface BpmMessageConvert { message.setPage("pages/bpm/task/todo/examineApprove?id=" + processInstanceId); return message; } + + /** + * @param openId 微信小程序唯一id + * @param workTaskDO 任务对象 + * @param nickname 发布人姓名 + * @param miniProgramState 小程序的状态 + * @return + */ + default SubscribeMessageReqDTO convertWorkTask(String openId, String processInstanceName, BpmOAWorkTaskDO workTaskDO, + String nickname, String time, String miniProgramState, Boolean isFlag) { + + SubscribeMessageReqDTO message = new SubscribeMessageReqDTO(); + message.setToUser(openId); + message.setTemplateId("fH29xjNb8pe-7onQ-wE3QrBAC-y8aaC_oosYZKNMtzM"); + + //消息类型 + MsgData noticeType = new MsgData(); + noticeType.setName("phrase8"); + noticeType.setValue(processInstanceName); + message.addData(noticeType); + + //发送人 + MsgData publishMan = new MsgData(); + publishMan.setName("thing16"); + publishMan.setValue(nickname); + message.addData(publishMan); + + //发送时间 + MsgData createTime = new MsgData(); + createTime.setName("time3"); + createTime.setValue(time); + message.addData(createTime); + + //消息内容 + MsgData content = new MsgData(); + content.setName("thing2"); + if (isFlag) { + content.setValue("你分配的任务已完成!"); + }else { + content.setValue("你收到了一个新的任务!"); + } + message.addData(content); + + message.setMiniprogramState(miniProgramState); + if (isFlag) { + message.setPage("subPages/task/taskAssignment?userId=" + workTaskDO.getReceiverUserId()); + }else { + message.setPage("subPages/task/taskDispose?id=" + workTaskDO.getId()); + } + + return message; + } } 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 index c99a1193..415117eb 100644 --- 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 @@ -1,14 +1,14 @@ package cn.iocoder.yudao.module.bpm.convert.oa; -import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 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 cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; -import java.util.List; - /** * 分配任务 Convert * @@ -21,10 +21,14 @@ public interface BpmOAWorkTaskConvert { BpmOAWorkTaskDO convert(BpmOAWorkTaskReqVO bean); - BpmOAWorkTaskRespVO convert(BpmOAWorkTaskDO bean); + default BpmOAWorkTaskRespVO convert(BpmOAWorkTaskDO workTask, AdminUserRespDTO userRespDTO, DeptRespDTO deptRespDTO, String taskId) { - List convertList(List list); + BpmOAWorkTaskRespVO respVO = BeanUtils.toBean(workTask, BpmOAWorkTaskRespVO.class); - PageResult convertPage(PageResult page); + respVO.setUserName(userRespDTO.getNickname()); + respVO.setDeptName(deptRespDTO.getName()); + respVO.setTaskId(taskId); + return respVO; + } } 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 index 26cf94a0..c0f99ca6 100644 --- 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 @@ -1,7 +1,7 @@ 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.oa.vo.worktask.BpmOAWorkTaskTrackInfo; 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; @@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import lombok.*; -import java.time.LocalDateTime; +import java.time.LocalDate; import java.util.List; /** @@ -39,6 +39,11 @@ public class BpmOAWorkTaskDO extends BaseDO { */ private Long fromUserId; + /** + * 发起人部门编号 + */ + private Long fromDeptId; + /** * 接受人 */ @@ -52,22 +57,40 @@ public class BpmOAWorkTaskDO extends BaseDO { * 任务内容 */ private String taskContent; + /** + * 任务级别 + * 字典值 参考 bpm_oa_work_task_type + */ + private Integer level; /** * 开始时间 */ - private LocalDateTime startTime; + private LocalDate startTime; /** * 截止时间 */ - private LocalDateTime endTime; + private LocalDate endTime; /** * 任务进度 百分比 */ private Long schedule; /** * 任务的状态 任务自身的状态 1:待启动,2:进行中,3.已完成,4.延期, 5.搁置 + * 字典值 参考 bpm_oa_work_task_status */ private Integer workTaskStatus ; + /** + * 搁置或延期 原因 + */ + private String reason; + /** + * 搁置后 任务开始日期 + */ + private LocalDate shelveStartTime; + /** + * 搁置后 任务结束日期 + */ + private LocalDate shelveEndTime; /** * 任务分配BPM流程的结果 @@ -94,6 +117,6 @@ public class BpmOAWorkTaskDO extends BaseDO { * 任务跟踪信息 */ @TableField(typeHandler = JacksonTypeHandler.class) - private List trackInfos ; + private List trackInfo; } 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 index 8bd4f0e1..43c5dcb0 100644 --- 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 @@ -1,6 +1,9 @@ package cn.iocoder.yudao.module.bpm.dal.mysql.oa; +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskPageReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO; import org.apache.ibatis.annotations.Mapper; @@ -13,8 +16,31 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface BpmOAWorkTaskMapper extends BaseMapperX { - default BpmOAWorkTaskDO selectByProcessInstanceId(String processInstanceId) { - return selectOne(BpmOAWorkTaskDO::getProcessInstanceId, processInstanceId); + default PageResult selectPage(Long userId, BpmOAWorkTaskPageReqVO reqVO) { + + if (reqVO.getIsMyTask() == 2) { + userId = null; + } + + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(BpmOAWorkTaskDO::getFromUserId, reqVO.getFromUserId()) + .inIfPresent(BpmOAWorkTaskDO::getReceiverUserId, reqVO.getUserIdList()) + .eqIfPresent(BpmOAWorkTaskDO::getReceiverUserId, reqVO.getUserId()) + .likeIfPresent(BpmOAWorkTaskDO::getTaskName, reqVO.getTaskName()) + .eqIfPresent(BpmOAWorkTaskDO::getWorkTaskStatus, reqVO.getWorkTaskStatus()) + .betweenIfPresent(BpmOAWorkTaskDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(BpmOAWorkTaskDO::getFromUserId, userId) + .orderByDesc(BpmOAWorkTaskDO::getId)); } + default PageResult selectMyPage(Long userId, BpmOAWorkTaskPageReqVO reqVO) { + + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(BpmOAWorkTaskDO::getFromUserId, reqVO.getFromUserId()) + .likeIfPresent(BpmOAWorkTaskDO::getTaskName, reqVO.getTaskName()) + .eqIfPresent(BpmOAWorkTaskDO::getWorkTaskStatus, reqVO.getWorkTaskStatus()) + .betweenIfPresent(BpmOAWorkTaskDO::getCreateTime, reqVO.getCreateTime()) + .eq(BpmOAWorkTaskDO::getReceiverUserId, userId) + .orderByDesc(BpmOAWorkTaskDO::getId)); + } } 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 index 6b1d8191..dd78b43e 100644 --- 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 @@ -3,8 +3,6 @@ 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; @@ -15,17 +13,16 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import javax.servlet.http.HttpSession; import java.util.List; import java.util.Set; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static java.util.Collections.emptySet; @Component public class BpmTaskWorkTaskReceiverUserScript implements BpmTaskAssignScript { - @Resource - private BpmOAWorkTaskMapper bpmOAWorkTaskMapper; - @Resource @Lazy // 解决循环依赖 private BpmProcessInstanceService bpmProcessInstanceService; @@ -33,6 +30,10 @@ public class BpmTaskWorkTaskReceiverUserScript implements BpmTaskAssignScript { @Resource @Lazy // 解决循环依赖 private BpmTaskService bpmTaskService ; + + @Resource + private HttpSession session; + @Override public Set calculateTaskCandidateUsers(DelegateExecution execution) { @@ -43,9 +44,7 @@ public class BpmTaskWorkTaskReceiverUserScript implements BpmTaskAssignScript { return emptySet(); } - //根据流程实例ID 取到分配工作的流程表单 - BpmOAWorkTaskDO workTask = bpmOAWorkTaskMapper.selectByProcessInstanceId(processInstance.getProcessInstanceId()); - return SetUtils.asSet(workTask.getReceiverUserId()); + return SetUtils.asSet((Long) session.getAttribute(getLoginUserId().toString())); } @Override diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java index fd5a7ea3..4cfde474 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java @@ -2,15 +2,16 @@ package cn.iocoder.yudao.module.bpm.service.message; import cn.iocoder.yudao.framework.web.config.WebProperties; import cn.iocoder.yudao.module.bpm.convert.message.BpmMessageConvert; +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.module.bpm.enums.message.BpmMessageEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; +import cn.iocoder.yudao.module.bpm.service.oa.BpmOAWorkTaskService; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi; -import cn.iocoder.yudao.module.system.api.sms.SmsSendApi; import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; @@ -36,7 +37,7 @@ import java.util.regex.Pattern; public class BpmMessageServiceImpl implements BpmMessageService { @Resource - private SmsSendApi smsSendApi; + private AdminUserApi userApi; @Resource private NotifyMessageSendApi notifyMessageSendApi; @@ -51,6 +52,9 @@ public class BpmMessageServiceImpl implements BpmMessageService { @Lazy // 解决循环依赖 private BpmProcessInstanceService bpmProcessInstanceService; + @Resource + private BpmOAWorkTaskService workTaskService; + @Override public void sendMessageWhenProcessInstanceApprove(BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO) { //审批通过 @@ -67,14 +71,27 @@ public class BpmMessageServiceImpl implements BpmMessageService { //发送审批结果通知至微信 String openId = getUserOpenId(reqDTO.getStartUserId()); if (openId != null) { - subscribeMessageSendApi.sendApprovalResultNotification( - BpmMessageConvert.INSTANCE.convertApprovalResultNotification( - openId, reqDTO.getProcessInstanceName(), reqDTO.getCreateTime(), "通过", reqDTO.getReason(), - reqDTO.getProcessInstanceId(), - /** - * 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版 - */ - "formal")); + + // 获得任务分配数据 + BpmOAWorkTaskDO workTaskDO = workTaskService.getWorkTaskByProcessInstanceId(reqDTO.getProcessInstanceId()); + if (workTaskDO != null) { + + String nickName = userApi.getUser(workTaskDO.getReceiverUserId()).getCheckedData().getNickname(); + + subscribeMessageSendApi.sendWorkLogComment(BpmMessageConvert.INSTANCE.convertWorkTask( + openId, reqDTO.getProcessInstanceName(), workTaskDO, nickName, reqDTO.getCreateTime(), + "formal", true)); + }else { + + subscribeMessageSendApi.sendApprovalResultNotification( + BpmMessageConvert.INSTANCE.convertApprovalResultNotification( + openId, reqDTO.getProcessInstanceName(), reqDTO.getCreateTime(), "通过", reqDTO.getReason(), + reqDTO.getProcessInstanceId(), + /** + * 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版 + */ + "formal")); + } } //当流程全部审批通过 @@ -147,6 +164,7 @@ public class BpmMessageServiceImpl implements BpmMessageService { // templateParams.put("taskName", reqDTO.getTaskName()); templateParams.put("startUserNickname", reqDTO.getStartUserNickname()); templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId())); + //短信 // smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getAssigneeUserId(), // BpmMessageEnum.TASK_ASSIGNED.getSmsTemplateCode(), templateParams)); @@ -158,10 +176,21 @@ public class BpmMessageServiceImpl implements BpmMessageService { //发送OA流程待办提醒 String openId = getUserOpenId(assigneeUserId); //只有在微信小程序登陆过用户才会有openid if (openId != null) { - subscribeMessageSendApi.sendProcessToDoReminder(BpmMessageConvert.INSTANCE.convertProcessToDoReminder( - openId, reqDTO.getProcessInstanceName(), reqDTO.getStartUserNickname(), reqDTO.getCreateTime(), reqDTO.getSchedule(), - reqDTO.getProcessInstanceId(), - "formal")); + + // 获得任务分配数据 + BpmOAWorkTaskDO workTaskDO = workTaskService.getWorkTaskByProcessInstanceId(reqDTO.getProcessInstanceId()); + if (workTaskDO != null) { + + subscribeMessageSendApi.sendWorkLogComment(BpmMessageConvert.INSTANCE.convertWorkTask( + openId, reqDTO.getProcessInstanceName(), workTaskDO, reqDTO.getStartUserNickname(), reqDTO.getCreateTime(), + "formal", false)); + }else { + + subscribeMessageSendApi.sendProcessToDoReminder(BpmMessageConvert.INSTANCE.convertProcessToDoReminder( + openId, reqDTO.getProcessInstanceName(), reqDTO.getStartUserNickname(), reqDTO.getCreateTime(), reqDTO.getSchedule(), + reqDTO.getProcessInstanceId(), + "formal")); + } } } } 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 index dab1fcd3..33896bf2 100644 --- 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 @@ -2,15 +2,12 @@ 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.BpmOAWorkTaskPageReqVO; 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 接口 @@ -41,18 +38,41 @@ public interface BpmOAWorkTaskService { * 获得工作任务详情 * * @param id 编号 - * @return 请假申请 + * @return 任务分配 */ BpmOAWorkTaskDO getWorkTask(Long id); + /** + * 获得工作任务详情 + * + * @param processInstanceId 流程实例编号 + * @return 任务分配 + */ + BpmOAWorkTaskDO getWorkTaskByProcessInstanceId(String processInstanceId); + /** * 更新 工作跟踪日志数据 * 因为是所有数据是存储在一个字段,所以是全量更新 - * @param id - * @param trackInfos + * @param updateReqVO + * */ - void addTrackInfo(Long id, List trackInfos) ; + void addTrackInfo(BpmOAWorkTaskReqVO updateReqVO) ; - void updateWorkTask( Long id, BpmOAWorkTaskReqVO createReqVO) ; + void updateWorkTask(BpmOAWorkTaskReqVO createReqVO) ; + /** + * 获得 任务分配分页 + * @param loginUserId 用户编号 + * @param pageVO 分页条件 + * @return 任务分配分页 + */ + PageResult getPage(Long loginUserId, BpmOAWorkTaskPageReqVO pageVO); + + /** + * 获得 我的任务分页 + * @param loginUserId 用户编号 + * @param pageVO 分页条件 + * @return 任务分配分页 + */ + PageResult getMyPage(Long loginUserId, BpmOAWorkTaskPageReqVO pageVO); } 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 index 1e373239..8aff3509 100644 --- 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 @@ -1,24 +1,40 @@ package cn.iocoder.yudao.module.bpm.service.oa; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 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.BpmOAWorkTaskPageReqVO; 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.oa.vo.worktask.BpmOAWorkTaskTrackInfo; 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 cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import javax.servlet.http.HttpSession; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_WORK_TASK_NOT_EXISTS; /** @@ -42,11 +58,28 @@ public class BpmOAWorkTaskServiceImpl extends BpmOABaseService implements BpmOAW @Resource private BpmProcessInstanceApi processInstanceApi; + @Resource + private HttpSession session; + + @Resource + private AdminUserApi userApi; + + @Resource + private DeptApi deptApi; + @Override @Transactional(rollbackFor = Exception.class) public Long createWorkTask(Long userId, BpmOAWorkTaskReqVO createReqVO) { + + //设置 责任人Id + session.setAttribute(userId.toString(), createReqVO.getUserId()); + + // 获取当前登录用户得信息 + AdminUserRespDTO userRespDTO = userApi.getUser(userId).getCheckedData(); + BpmOAWorkTaskDO workTask = BpmOAWorkTaskConvert.INSTANCE.convert(createReqVO) .setFromUserId(userId) + .setFromDeptId(userRespDTO.getDeptId()) .setWorkTaskStatus(1) //默认待启动状态 .setReceiverUserId(createReqVO.getUserId()) .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); @@ -73,13 +106,17 @@ public class BpmOAWorkTaskServiceImpl extends BpmOABaseService implements BpmOAW public void updateWorkTaskResult(Long id, Integer result) { validateLeaveExists(id); //bpm流程设置成已完成,需要将任务自生的状态设置成已完成 - workTaskMapper.updateById(new BpmOAWorkTaskDO().setId(id).setResult(result).setWorkTaskStatus(3)); + workTaskMapper.updateById(new BpmOAWorkTaskDO().setId(id).setResult(result).setWorkTaskStatus(3).setSchedule(100L)); } - private void validateLeaveExists(Long id) { - if (workTaskMapper.selectById(id) == null) { + private BpmOAWorkTaskDO validateLeaveExists(Long id) { + + BpmOAWorkTaskDO taskDO = workTaskMapper.selectById(id); + if (taskDO == null) { throw exception(OA_WORK_TASK_NOT_EXISTS); } + + return taskDO; } @Override @@ -88,15 +125,91 @@ public class BpmOAWorkTaskServiceImpl extends BpmOABaseService implements BpmOAW } @Override - public void addTrackInfo(Long id, List trackInfos) { - validateLeaveExists(id); - workTaskMapper.updateById(new BpmOAWorkTaskDO().setId(id).setTrackInfos(trackInfos)); + public BpmOAWorkTaskDO getWorkTaskByProcessInstanceId(String processInstanceId) { + + return workTaskMapper.selectOne(BpmOAWorkTaskDO::getProcessInstanceId, processInstanceId); } @Override - public void updateWorkTask(Long id, BpmOAWorkTaskReqVO createReqVO) { - validateLeaveExists(id); + public void addTrackInfo(BpmOAWorkTaskReqVO updateReqVO) { + + //设置 跟踪任务创建时间 + BpmOAWorkTaskTrackInfo taskTrackInfo = updateReqVO.getTrackInfos(); + taskTrackInfo.setTrackTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + + BpmOAWorkTaskDO taskDO = validateLeaveExists(updateReqVO.getId()); + List info = taskDO.getTrackInfo(); + if (info == null) { + info = new ArrayList<>(); + } + info.add(taskTrackInfo); + + BpmOAWorkTaskDO updateDo = new BpmOAWorkTaskDO(); + updateDo.setId(updateReqVO.getId()); + updateDo.setTrackInfo(info); + workTaskMapper.updateById(updateDo); + } + + @Override + public void updateWorkTask(BpmOAWorkTaskReqVO createReqVO) { + BpmOAWorkTaskDO taskDO = validateLeaveExists(createReqVO.getId()); + + if (taskDO.getWorkTaskStatus() == 5 && createReqVO.getWorkTaskStatus() == 2) { + + Long daysDifference = ChronoUnit.DAYS.between(taskDO.getStartTime(), taskDO.getEndTime()); + createReqVO.setShelveStartTime(LocalDate.now()); + createReqVO.setShelveEndTime(LocalDate.now().plusDays(daysDifference)); + } + + taskDO = BeanUtils.toBean(createReqVO, BpmOAWorkTaskDO.class); + //更新任务进度 和 任务状态 - workTaskMapper.updateById(new BpmOAWorkTaskDO().setId(id).setWorkTaskStatus(createReqVO.getWorkTaskStatus()).setSchedule(createReqVO.getSchedule())); + workTaskMapper.updateById(taskDO); + } + + @Override + public PageResult getPage(Long loginUserId, BpmOAWorkTaskPageReqVO pageVO) { + + PageResult pageResult = workTaskMapper.selectPage(loginUserId, pageVO); + // 获得责任人 用户Id + List userIds = pageResult.getList().stream().map(BpmOAWorkTaskDO::getReceiverUserId).collect(Collectors.toList()); + // 获得责任人用户信息列表 + List userRespDTOS = userApi.getUserList(userIds).getCheckedData(); + Map userMap = convertMap(userRespDTOS, AdminUserRespDTO::getId); + + //获得部门信息map + Map deptMap = deptApi.getDeptMap(userRespDTOS.stream().map(AdminUserRespDTO::getDeptId).collect(Collectors.toSet())); + + //获得发起人用户信息列表 + List fromUserIds = pageResult.getList().stream().map(BpmOAWorkTaskDO::getFromUserId).collect(Collectors.toList()); + Map fromUserMap = userApi.getUserMap(fromUserIds); + + PageResult dataPage = BeanUtils.toBean(pageResult, BpmOAWorkTaskRespVO.class); + dataPage.getList().forEach(data -> { + + data.setFromUserName(fromUserMap.get(data.getFromUserId()).getNickname()); + data.setUserName(userMap.get(data.getReceiverUserId()).getNickname()); + data.setDeptName(deptMap.get(userMap.get(data.getReceiverUserId()).getDeptId()).getName()); + }); + + return dataPage; + } + + @Override + public PageResult getMyPage(Long loginUserId, BpmOAWorkTaskPageReqVO pageVO) { + + PageResult pageResult = workTaskMapper.selectMyPage(loginUserId, pageVO); + + //获得发起人用户信息列表 + List fromUserIds = pageResult.getList().stream().map(BpmOAWorkTaskDO::getFromUserId).collect(Collectors.toList()); + Map fromUserMap = userApi.getUserMap(fromUserIds); + + PageResult dataPage = BeanUtils.toBean(pageResult, BpmOAWorkTaskRespVO.class); + dataPage.getList().forEach(data -> { + + data.setFromUserName(fromUserMap.get(data.getFromUserId()).getNickname()); + }); + + return dataPage; } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java index c3b2daac..22f8c6f1 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java @@ -64,6 +64,14 @@ public interface BpmTaskService { */ List getTasksByProcessInstanceIds(List processInstanceIds); + /** + * 获得流程任务列表 + * + * @param processInstanceId 流程实例的编号 + * @return 流程任务列表 + */ + List getTasksByProcessInstanceId(String processInstanceId); + /** * 获得指令流程实例的流程任务列表,包括所有状态的 * diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 3e125832..eba70347 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -283,6 +283,12 @@ public class BpmTaskServiceImpl implements BpmTaskService { return taskService.createTaskQuery().processInstanceIdIn(processInstanceIds).list(); } + @Override + public List getTasksByProcessInstanceId(String processInstanceId) { + + return taskService.createTaskQuery().processInstanceId(processInstanceId).orderByTaskCreateTime().desc().list(); + } + @Override public List getTaskListByProcessInstanceId(String processInstanceId) { // 获得任务列表