From 94bf47dc7878ddc6c5d16f42adf1512cb7eb9a38 Mon Sep 17 00:00:00 2001 From: yanhuiqing Date: Sun, 14 Dec 2025 00:51:22 +0800 Subject: [PATCH] APP端待办接口 --- urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderController.java | 31 ++++++++++++++++++++++++++++--- urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskApproveReqVO.java | 32 ++++++++++++++++++++++++++++++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskPageReqVO.java | 24 ++++++++++++++++++++++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskRespVO.java | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenWorkOrderPageReqVO.java | 2 +- urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/garden/AppGardenTaskConvert.java | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenService.java | 23 +++++++++++++++++++++-- urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 8 files changed, 407 insertions(+), 11 deletions(-) create mode 100644 urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskApproveReqVO.java create mode 100644 urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskPageReqVO.java create mode 100644 urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskRespVO.java create mode 100644 urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/garden/AppGardenTaskConvert.java diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderController.java index a07eb6d..75aeac6 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderController.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderController.java @@ -3,14 +3,17 @@ package com.zteits.urbanops.module.workorder.controller.app.garden; import com.zteits.urbanops.framework.common.pojo.CommonResult; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.framework.web.core.util.WebFrameworkUtils; +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO; +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskPageReqVO; +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; +import com.zteits.urbanops.module.bpm.service.task.BpmTaskService; import com.zteits.urbanops.module.garden.api.road.RoadApi; import com.zteits.urbanops.module.garden.api.road.dto.RoadReqDTO; import com.zteits.urbanops.module.garden.api.road.dto.RoadRespDTO; import com.zteits.urbanops.module.workorder.controller.admin.garden.vo.BpmGardenWorkOrderPageReqVO; import com.zteits.urbanops.module.workorder.controller.admin.garden.vo.BpmGardenWorkOrderRespVO; -import com.zteits.urbanops.module.workorder.controller.app.garden.vo.AppGardenWorkOrderPageReqVO; -import com.zteits.urbanops.module.workorder.controller.app.garden.vo.AppGardenWorkOrderReqVO; -import com.zteits.urbanops.module.workorder.controller.app.garden.vo.AppGardenWorkOrderRespVO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.*; import com.zteits.urbanops.module.workorder.dal.dataobject.garden.BpmGardenWorkOrderDO; import com.zteits.urbanops.module.workorder.service.garden.BpmGardenService; import io.swagger.v3.oas.annotations.Operation; @@ -79,4 +82,26 @@ public class AppGardenWorkOrderController { return success(roadApi.getRoadInfoBy(reqDTO)); } + @PutMapping("/approve") + @Operation(summary = "app - 审批通过任务") + //@PreAuthorize("@ss.hasPermission('bpm:garden-workorder:update')") + public CommonResult approveTask(@Valid @RequestBody AppGardenTaskApproveReqVO reqVO) { + gardenService.approveTask(reqVO); + return success(true); + } + + @GetMapping("donePage") + @Operation(summary = "app - 获取已办任务分页") + //@PreAuthorize("@ss.hasPermission('bpm:garden-workorder:query')") + public CommonResult> getTaskDonePage(@Valid AppGardenTaskPageReqVO pageVO) { + PageResult pageResult = gardenService.getTaskDonePage(pageVO); + return success(pageResult); + } + @GetMapping("todoPage") + @Operation(summary = "app - 获取待办任务分页") + //@PreAuthorize("@ss.hasPermission('bpm:garden-workorder:query')") + public CommonResult> getTaskTodoPage(@Valid AppGardenTaskPageReqVO pageVO) { + PageResult pageResult = gardenService.getTaskTodoPage(pageVO); + return success(pageResult); + } } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskApproveReqVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskApproveReqVO.java new file mode 100644 index 0000000..cc5d5b4 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskApproveReqVO.java @@ -0,0 +1,32 @@ +package com.zteits.urbanops.module.workorder.controller.app.garden.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * 类描述:园林APP端工单任务审批通过VO + * 创建人:yanhuiqing + * 创建时间:2025/12/13 21:33 + * 修改人:yanhuiqing + * 修改时间:2025/12/13 21:33 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Schema(description = "APP - 通过流程任务的 Request VO") +@Data +public class AppGardenTaskApproveReqVO { + + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotEmpty(message = "任务编号不能为空") + private String id; + + @Schema(description = "审批意见", example = "通过!") + private String reason; + +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskPageReqVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskPageReqVO.java new file mode 100644 index 0000000..6c1170c --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskPageReqVO.java @@ -0,0 +1,24 @@ +package com.zteits.urbanops.module.workorder.controller.app.garden.vo; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 类描述:园林APP端工作流任务请求VO + * 创建人:yanhuiqing + * 创建时间:2025/12/13 21:20 + * 修改人:yanhuiqing + * 修改时间:2025/12/13 21:20 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Schema(description = "APP - 流程任务的的分页 Request VO") // 待办、已办,都使用该分页 +@Data +public class AppGardenTaskPageReqVO extends PageParam { + + @Schema(description = "流程定义的标识", example = "quik_local_test") + private String processDefinitionKey; // 精准匹配 +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskRespVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskRespVO.java new file mode 100644 index 0000000..1042cd0 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenTaskRespVO.java @@ -0,0 +1,110 @@ +package com.zteits.urbanops.module.workorder.controller.app.garden.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.zteits.urbanops.framework.common.core.KeyValue; +import com.zteits.urbanops.module.bpm.controller.admin.base.user.UserSimpleBaseVO; +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +/** + * 类描述:园林APP端流程任务 Response VO + * 创建人:yanhuiqing + * 创建时间:2025/12/13 22:07 + * 修改人:yanhuiqing + * 修改时间:2025/12/13 22:07 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Schema(description = "APP - 流程任务 Response VO") +@Data +public class AppGardenTaskRespVO { + + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime endTime; + + @Schema(description = "持续时间", example = "1000") + private Long durationInMillis; + + @Schema(description = "任务状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Integer status; // 参见 BpmTaskStatusEnum 枚举 + + @Schema(description = "审批理由", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private String reason; + + @Schema(description = "任务负责人编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2048") + @JsonIgnore // 不返回,只是方便后续读取,赋值给 ownerUser + private Long owner; + /** + * 负责人的用户信息 + */ + private UserSimpleBaseVO ownerUser; + + @Schema(description = "任务分配人编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2048") + @JsonIgnore // 不返回,只是方便后续读取,赋值给 assigneeUser + private Long assignee; + /** + * 审核的用户信息 + */ + private UserSimpleBaseVO assigneeUser; + + @Schema(description = "任务定义的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "Activity_one") + private String taskDefinitionKey; + + @Schema(description = "所属流程实例编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8888") + private String processInstanceId; + + + @Schema(description = "提交的表单值", requiredMode = Schema.RequiredMode.REQUIRED) + private Map formVariables; + + @Schema(description = "节点类型", example = "10") + private Integer nodeType; // 参见 BpmSimpleModelNodeTypeEnum 枚举。 + + /** + * 所属流程实例 + */ + private BpmTaskRespVO.ProcessInstance processInstance; + + @Data + @Schema(description = "流程实例") + public static class ProcessInstance { + + @Schema(description = "流程实例编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String id; + + @Schema(description = "流程实例名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "全域") + private String name; + + @Schema(description = "提交时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") + private String processDefinitionId; + + @Schema(description = "流程摘要", example = "[]") + private List> summary; // 只有流程表单,才有摘要! + + /** + * 发起人的用户信息 + */ + private UserSimpleBaseVO startUser; + + } + + + + +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenWorkOrderPageReqVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenWorkOrderPageReqVO.java index 8a25a3e..81d86a4 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenWorkOrderPageReqVO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenWorkOrderPageReqVO.java @@ -12,7 +12,7 @@ import lombok.Data; * @description: TODO * @date 2025/12/9 20:21 */ -@Schema(description = "管理后台 - 工单信息分页 Request VO") +@Schema(description = "APP - 工单信息分页 Request VO") @Data public class AppGardenWorkOrderPageReqVO extends PageParam { diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/garden/AppGardenTaskConvert.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/garden/AppGardenTaskConvert.java new file mode 100644 index 0000000..aa2623f --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/garden/AppGardenTaskConvert.java @@ -0,0 +1,91 @@ +package com.zteits.urbanops.module.workorder.convert.garden; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.util.collection.CollectionUtils; +import com.zteits.urbanops.framework.common.util.date.DateUtils; +import com.zteits.urbanops.framework.common.util.number.NumberUtils; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.module.bpm.controller.admin.base.user.UserSimpleBaseVO; +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; +import com.zteits.urbanops.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; +import com.zteits.urbanops.module.bpm.framework.flowable.core.util.FlowableUtils; +import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; +import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.AppGardenTaskRespVO; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.task.api.Task; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; + +import static com.zteits.urbanops.framework.common.util.collection.MapUtils.findAndThen; + +/** + * 类描述:园林APP端任务信息转换 + * 创建人:yanhuiqing + * 创建时间:2025/12/13 22:41 + * 修改人:yanhuiqing + * 修改时间:2025/12/13 22:41 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Mapper +public interface AppGardenTaskConvert { + + AppGardenTaskConvert INSTANCE = Mappers.getMapper(AppGardenTaskConvert.class); + + default PageResult buildTodoTaskPage(PageResult pageResult, + Map processInstanceMap, + Map userMap, + Map processDefinitionInfoMap) { + return BeanUtils.toBean(pageResult, AppGardenTaskRespVO.class, taskVO -> { + ProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId()); + if (processInstance == null) { + return; + } + taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class)); + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); + taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); + taskVO.getProcessInstance().setCreateTime(DateUtils.of(processInstance.getStartTime())); + // 摘要 + taskVO.getProcessInstance().setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()), + processInstance.getProcessVariables())); + }); + } + + default PageResult buildTaskPage(PageResult pageResult, + Map processInstanceMap, + Map userMap, + Map deptMap, + Map processDefinitionInfoMap) { + List taskVOList = CollectionUtils.convertList(pageResult.getList(), task -> { + AppGardenTaskRespVO taskVO = BeanUtils.toBean(task, AppGardenTaskRespVO.class); + taskVO.setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task)); + // 用户信息 + AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee())); + if (assignUser != null) { + taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, UserSimpleBaseVO.class)); + findAndThen(deptMap, assignUser.getDeptId(), dept -> taskVO.getAssigneeUser().setDeptName(dept.getName())); + } + // 流程实例 + HistoricProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId()); + if (processInstance != null) { + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); + taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class)); + taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); + // 摘要 + taskVO.getProcessInstance().setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()), + processInstance.getProcessVariables())); + } + return taskVO; + }); + return new PageResult<>(taskVOList, pageResult.getTotal()); + } + +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenService.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenService.java index 2dadff4..f6477c2 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenService.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenService.java @@ -3,8 +3,7 @@ package com.zteits.urbanops.module.workorder.service.garden; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.module.workorder.controller.admin.garden.vo.BpmGardenWorkOrderCreateReqVO; import com.zteits.urbanops.module.workorder.controller.admin.garden.vo.BpmGardenWorkOrderPageReqVO; -import com.zteits.urbanops.module.workorder.controller.app.garden.vo.AppGardenWorkOrderPageReqVO; -import com.zteits.urbanops.module.workorder.controller.app.garden.vo.AppGardenWorkOrderReqVO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.*; import com.zteits.urbanops.module.workorder.dal.dataobject.garden.BpmGardenWorkOrderDO; import jakarta.validation.Valid; /** @@ -66,4 +65,24 @@ public interface BpmGardenService { * @return */ Long createWorkOrderQuick(@Valid AppGardenWorkOrderReqVO createReqVO); + + /** + * 审批通过 -app端 + * @param reqVO + */ + void approveTask(AppGardenTaskApproveReqVO reqVO); + + /** + * 已办列表 -app端 + * @param pageVO + * @return + */ + PageResult getTaskDonePage(AppGardenTaskPageReqVO pageVO); + + /** + * 待办列表 -app端 + * @param pageVO + * @return + */ + PageResult getTaskTodoPage(AppGardenTaskPageReqVO pageVO); } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java index 53591ff..0d85e67 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java @@ -1,5 +1,6 @@ package com.zteits.urbanops.module.workorder.service.garden; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.object.BeanUtils; @@ -7,16 +8,26 @@ import com.zteits.urbanops.framework.common.util.object.ObjectUtils; import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; import com.zteits.urbanops.module.bpm.api.task.BpmProcessInstanceApi; import com.zteits.urbanops.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO; +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskPageReqVO; +import com.zteits.urbanops.module.bpm.convert.task.BpmTaskConvert; +import com.zteits.urbanops.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; import com.zteits.urbanops.module.bpm.enums.task.BpmTaskStatusEnum; +import com.zteits.urbanops.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; +import com.zteits.urbanops.module.bpm.service.definition.BpmProcessDefinitionService; +import com.zteits.urbanops.module.bpm.service.task.BpmProcessInstanceService; +import com.zteits.urbanops.module.bpm.service.task.BpmTaskService; import com.zteits.urbanops.module.garden.api.road.RoadApi; import com.zteits.urbanops.module.garden.api.road.dto.RoadStreetRespDTO; +import com.zteits.urbanops.module.system.api.user.AdminUserApi; +import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; import com.zteits.urbanops.module.workorder.api.constant.BpmCommonConstant; import com.zteits.urbanops.module.workorder.api.workorder.WorkOrderApi; import com.zteits.urbanops.module.workorder.controller.admin.garden.vo.BpmGardenWorkOrderCreateReqVO; import com.zteits.urbanops.module.workorder.controller.admin.garden.vo.BpmGardenWorkOrderPageReqVO; import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.MainInfoPageReqVO; -import com.zteits.urbanops.module.workorder.controller.app.garden.vo.AppGardenWorkOrderPageReqVO; -import com.zteits.urbanops.module.workorder.controller.app.garden.vo.AppGardenWorkOrderReqVO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.*; +import com.zteits.urbanops.module.workorder.convert.garden.AppGardenTaskConvert; import com.zteits.urbanops.module.workorder.convert.garden.BpmGardenWorkOrderConverter; import com.zteits.urbanops.module.workorder.dal.dataobject.attachment.AttachmentDO; import com.zteits.urbanops.module.workorder.dal.dataobject.garden.BpmGardenWorkOrderDO; @@ -24,6 +35,11 @@ import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoDO; import com.zteits.urbanops.module.workorder.dal.mysql.attachment.AttachmentMapper; import com.zteits.urbanops.module.workorder.dal.mysql.maininfo.MainInfoMapper; import jakarta.annotation.Resource; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.task.api.Task; +import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -32,10 +48,11 @@ import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Arrays; -import java.util.stream.Collectors; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertSet; +import static com.zteits.urbanops.framework.web.core.util.WebFrameworkUtils.getLoginUserId; import static com.zteits.urbanops.module.workorder.enums.ErrorCodeConstants.MAIN_INFO_NOT_EXISTS; /** @@ -59,6 +76,20 @@ public class BpmGardenServiceImpl implements BpmGardenService{ @Resource private RoadApi roadApi; + @Resource + private BpmTaskService taskService; + + @Resource + private BpmProcessDefinitionService processDefinitionService; + + @Resource + private AdminUserApi adminUserApi; + + @Resource + private BpmProcessInstanceService processInstanceService; + + @Resource + private RuntimeService runtimeService; @Override @Transactional(rollbackFor = Exception.class) @@ -95,12 +126,21 @@ public class BpmGardenServiceImpl implements BpmGardenService{ processInstanceVariables.put("workOrder", workOrder); processInstanceVariables.put("imgList", imgList); processInstanceVariables.put("longRangeImgList", longRangeImgList); - processInstanceVariables.put("applyUserId", SecurityFrameworkUtils.getLoginUserId()); + processInstanceVariables.put("initiator", SecurityFrameworkUtils.getLoginUserId()); String processInstanceId = processInstanceApi.createProcessInstance(SecurityFrameworkUtils.getLoginUserId(), new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(BpmCommonConstant.COMMON_QUICK_PROCESS) + //new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey("quik_local_test") + .setVariables(processInstanceVariables).setBusinessKey(String.valueOf(workOrder.getId()))); + //Authentication.setAuthenticatedUserId(SecurityFrameworkUtils.getLoginUserId()+""); + // 启动流程(使用processDefinitionKey,自动使用最新版本) + /*ProcessInstance processInstance = runtimeService.startProcessInstanceByKey( + "quik_local_test", + processInstanceVariables + );*/ + //workOrderMapper.updateById(new MainInfoDO().setId(workOrder.getId()).setProcessInstanceId(processInstance.getProcessInstanceId())); // 将工作流的编号,更新到 工单中 workOrderMapper.updateById(new MainInfoDO().setId(workOrder.getId()).setProcessInstanceId(processInstanceId)); @@ -108,6 +148,61 @@ public class BpmGardenServiceImpl implements BpmGardenService{ return workOrder.getId(); } + /** + * 审批通过 + * @param reqVO + */ + @Override + public void approveTask(AppGardenTaskApproveReqVO reqVO) { + BpmTaskApproveReqVO targetVO = BeanUtils.toBean(reqVO,BpmTaskApproveReqVO.class); + Map variables = new HashMap<>(); + //审批通过 + variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS,BpmTaskStatusEnum.APPROVE.getStatus()); + targetVO.setVariables(variables); + //TODO 审批候选人需要赋值 + Map> nextAssignees = new HashMap<>(); + targetVO.setNextAssignees(nextAssignees); + taskService.approveTask(SecurityFrameworkUtils.getLoginUserId(),targetVO); + } + + @Override + public PageResult getTaskDonePage(AppGardenTaskPageReqVO pageVO) { + BpmTaskPageReqVO targetVO = BeanUtils.toBean(pageVO,BpmTaskPageReqVO.class); + PageResult pageResult = taskService.getTaskDonePage(SecurityFrameworkUtils.getLoginUserId(), targetVO); + if (CollUtil.isEmpty(pageResult.getList())) { + return PageResult.empty(); + } + + // 拼接数据 + Map processInstanceMap = processInstanceService.getHistoricProcessInstanceMap( + convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId)); + Map userMap = adminUserApi.getUserMap( + convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); + Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( + convertSet(pageResult.getList(), HistoricTaskInstance::getProcessDefinitionId)); + PageResult newRespVO = AppGardenTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, null, processDefinitionInfoMap); + return newRespVO; + } + + @Override + public PageResult getTaskTodoPage(AppGardenTaskPageReqVO pageVO) { + BpmTaskPageReqVO targetVO = BeanUtils.toBean(pageVO,BpmTaskPageReqVO.class); + PageResult pageResult = taskService.getTaskTodoPage(SecurityFrameworkUtils.getLoginUserId(), targetVO); + if (CollUtil.isEmpty(pageResult.getList())) { + return PageResult.empty(); + } + + // 拼接数据 + Map processInstanceMap = processInstanceService.getProcessInstanceMap( + convertSet(pageResult.getList(), Task::getProcessInstanceId)); + Map userMap = adminUserApi.getUserMap( + convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); + Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( + convertSet(pageResult.getList(), Task::getProcessDefinitionId)); + PageResult newRespVO = AppGardenTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap, processDefinitionInfoMap); + return newRespVO; + } + @Override @Transactional(rollbackFor = Exception.class) public Long createWorkOrder(AppGardenWorkOrderReqVO createRequestVo) { -- libgit2 0.21.4