From 12970e4a330818e2c8a8d054cf509da3210751e5 Mon Sep 17 00:00:00 2001 From: litao Date: Mon, 20 Feb 2023 09:16:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=86=E5=8F=B2=E5=B7=A5=E5=8D=95=E5=92=8C?= =?UTF-8?q?=E6=88=91=E7=9A=84=E5=BE=85=E5=8A=9E=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WorkOrderController.java | 54 +++++- .../operation/workorder/entity/WorkOrder.java | 7 + .../workorder/service/IWorkOrderService.java | 6 +- .../service/impl/WorkOrderServiceImpl.java | 181 +++++++++++++++--- .../system/user/feign/IUserClient.java | 5 + .../springblade/system/feign/SysClient.java | 4 +- .../system/user/feign/UserClient.java | 5 + 7 files changed, 234 insertions(+), 28 deletions(-) diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/controller/WorkOrderController.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/controller/WorkOrderController.java index 70e22b0..41633bd 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/controller/WorkOrderController.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/controller/WorkOrderController.java @@ -1,21 +1,35 @@ package org.springblade.plugin.operation.workorder.controller; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.AllArgsConstructor; import org.flowable.engine.history.HistoricProcessInstance; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; +import org.springblade.plugin.operation.task.entity.TaskInfo; +import org.springblade.plugin.operation.task.service.ITaskInfoService; import org.springblade.plugin.operation.workorder.entity.WorkOrder; import org.springblade.plugin.operation.workorder.service.IWorkOrderService; import org.springblade.plugin.workflow.process.model.WfProcess; +import org.springblade.system.entity.AuthClient; +import org.springblade.system.entity.Dept; +import org.springblade.system.feign.ISysClient; +import org.springblade.system.user.entity.User; +import org.springblade.system.user.feign.IUserClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** * 工单 + * * @Description * @Author lt * @Date 2023年2月17日09:46:45 @@ -28,13 +42,51 @@ import org.springframework.web.bind.annotation.RestController; public class WorkOrderController extends BladeController { private final IWorkOrderService workOrderService; + private final ITaskInfoService taskInfoService; + private final ISysClient sysClient; + private final IUserClient userClient; + + /** * 历史工单 */ @GetMapping("/historyWorkOrder") - public R> historyWorkOrder(WorkOrder workOrder, Query query) { + public R>> historyWorkOrder(WorkOrder workOrder, Query query) { return R.data(workOrderService.historyWorkOrder(workOrder, query)); } + /** + * 我的待办 + */ + @GetMapping("/myToDo") + public R> myToDo(WorkOrder workOrder, Query query) { + return R.data(workOrderService.myToDo(workOrder, query)); + } + + /** + * 条件数据 + */ + @GetMapping("/conditionalData") + public R> conditionalData() { + Map map = new HashMap<>(); + // 任务种类 + List taskInfos = taskInfoService.list(Wrappers.lambdaQuery() + .select(TaskInfo::getTaskTypeName, TaskInfo::getId)); + map.put("taskInfos", taskInfos); + + // 当前责任人 +// List users = userClient.listDeptUserByCurrentUser(AuthUtil.getDeptId()).getData(); + List users = userClient.allUser().getData(); + map.put("users", users); + + // 管理部门 + List depts = sysClient.getDepts().getData(); + map.put("depts", depts); + + + return R.data(map); + } + + } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/entity/WorkOrder.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/entity/WorkOrder.java index e946bcb..4491cda 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/entity/WorkOrder.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/entity/WorkOrder.java @@ -39,4 +39,11 @@ public class WorkOrder { // 期望完成时间 private String expectedCompletionTime; + + private String taskId; + + private String processInsId; + + private Date startTime; + } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/service/IWorkOrderService.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/service/IWorkOrderService.java index bcbf1ba..9520937 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/service/IWorkOrderService.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/service/IWorkOrderService.java @@ -7,6 +7,8 @@ import org.springblade.core.tool.api.R; import org.springblade.plugin.operation.workorder.entity.WorkOrder; import org.springblade.plugin.workflow.process.model.WfProcess; +import java.util.Map; + /** * @Description * @Author lt @@ -14,5 +16,7 @@ import org.springblade.plugin.workflow.process.model.WfProcess; */ public interface IWorkOrderService { - IPage historyWorkOrder(WorkOrder workOrder, Query query); + IPage> historyWorkOrder(WorkOrder workOrder, Query query); + + IPage myToDo(WorkOrder workOrder, Query query); } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/service/impl/WorkOrderServiceImpl.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/service/impl/WorkOrderServiceImpl.java index 703fa76..ecb55b9 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/service/impl/WorkOrderServiceImpl.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/operation/workorder/service/impl/WorkOrderServiceImpl.java @@ -1,6 +1,7 @@ package org.springblade.plugin.operation.workorder.service.impl; import com.alibaba.nacos.common.utils.CollectionUtils; +import com.alibaba.nacos.common.utils.StringUtils; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.AllArgsConstructor; @@ -8,16 +9,23 @@ import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.history.HistoricProcessInstanceQuery; +import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; +import org.flowable.variable.api.history.HistoricVariableInstance; import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.core.tool.utils.Func; import org.springblade.plugin.operation.workorder.entity.WorkOrder; import org.springblade.plugin.operation.workorder.service.IWorkOrderService; import org.springblade.plugin.workflow.core.utils.WfTaskUtil; -import org.springblade.plugin.workflow.process.model.WfProcess; +import org.springblade.system.user.feign.IUserClient; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.time.Duration; +import java.util.*; +import java.util.stream.Collectors; /** * @Description @@ -30,34 +38,45 @@ public class WorkOrderServiceImpl implements IWorkOrderService { private final TaskService taskService; private final HistoryService historyService; private final RuntimeService runtimeService; + private final IUserClient userClient; @Override - public IPage historyWorkOrder(WorkOrder workOrder, Query query) { - IPage page = new Page<>(); + public IPage> historyWorkOrder(WorkOrder workOrder, Query query) { + IPage> page = new Page<>(); + List list = historyService.createHistoricProcessInstanceQuery() - .orderByProcessInstanceDuration() + .orderByProcessInstanceStartTime() .desc() -// .processInstanceTenantId(WfTaskUtil.getTenantId()) - .listPage((query.getCurrent() - 1) * query.getSize(), (query.getCurrent() - 1) * query.getSize() + query.getSize()); + .processInstanceTenantId(WfTaskUtil.getTenantId()) + .listPage((query.getCurrent() - 1) * query.getSize(), query.getSize()); - List workOrders = new ArrayList<>(); + + List> workOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(list)) { for (HistoricProcessInstance historicProcessInstance : list) { - Map variables = historicProcessInstance.getProcessVariables(); - WorkOrder order = new WorkOrder(); - order.setTaskType(variables.get("$renwuzhonglei").toString()); - order.setTaskParent(variables.get("renwufulei").toString()); - order.setOperationModule(variables.get("xitongmokuaishujubiao").toString()); - order.setCurrentResponsiblePerson(""); - order.setDept(variables.get("$quanlibumen").toString()); - order.setCompany(variables.get("yunweigongsi").toString()); - order.setSponsor(variables.get("applyUser").toString()); - order.setApprovalStatus(variables.get("").toString()); - order.setCreateTime(historicProcessInstance.getStartTime()); - order.setEndTime(historicProcessInstance.getEndTime()); - order.setExpectedCompletionTime(variables.get("qiwangwanchengshijian").toString()); - workOrders.add(order); + Map varMap = new HashMap<>(); + List historicVars = historyService.createHistoricVariableInstanceQuery() + .processInstanceId(historicProcessInstance.getId()).list(); + historicVars.forEach(var -> + varMap.put(var.getVariableName(), var.getValue())); + + Task task = taskService.createTaskQuery().processInstanceId(historicProcessInstance.getId()).singleResult(); + if (task != null) { + if (task.getAssignee() != null) { + varMap.put("currentResponsiblePerson", userClient.userInfoById(Long.parseLong(task.getAssignee())).getData().getRealName()); + } else { + varMap.put("currentResponsiblePerson", "--"); + } + varMap.put("status", "进行中"); + } else { + varMap.put("currentResponsiblePerson", "--"); + varMap.put("status", "已完成"); + } + varMap.put("startTime", historicProcessInstance.getStartTime()); + varMap.put("endTime", historicProcessInstance.getEndTime()); + varMap.put("startUserId", userClient.userInfoById(Long.parseLong(historicProcessInstance.getStartUserId())).getData().getRealName()); + workOrders.add(varMap); } } @@ -65,7 +84,7 @@ public class WorkOrderServiceImpl implements IWorkOrderService { page.setRecords(workOrders); // 总条数 page.setTotal(historyService.createHistoricProcessInstanceQuery() -// .processInstanceTenantId(WfTaskUtil.getTenantId()) + .processInstanceTenantId(WfTaskUtil.getTenantId()) .orderByProcessInstanceDuration().desc().list().size()); // 当前页数 page.setCurrent(query.getCurrent()); @@ -73,4 +92,116 @@ public class WorkOrderServiceImpl implements IWorkOrderService { page.setSize(query.getSize()); return page; } + + @Override + public IPage myToDo(WorkOrder workOrder, Query query) { + IPage page = new Page<>(); + + String taskUser = WfTaskUtil.getTaskUser(); + String taskGroup = WfTaskUtil.getCandidateGroup(); + //当前获取登录人deptid + String deptId = AuthUtil.getDeptId(); + List nowUserDepts = Func.toLongList(deptId); + + + TaskQuery taskQuery = taskService.createTaskQuery() + .orderByTaskCreateTime() + .desc() + .taskTenantId(WfTaskUtil.getTenantId()) + .active(); +// taskQuery.taskCandidateOrAssigned(taskUser) +// .taskCandidateGroupIn(Func.toStrList(taskGroup)); + +// List listNeedDo = taskQuery.listPage((query.getCurrent() - 1) * query.getSize(), query.getSize()); + List listNeedDo = taskQuery.list(); + + List workOrders = new ArrayList<>(); + + for(Task task : listNeedDo){ + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult(); + WorkOrder order = new WorkOrder(); + String executionId = task.getExecutionId(); + System.out.println("executionid--" + executionId); + Map variables = runtimeService.getVariables(task.getExecutionId()); + + order.setTaskType(variables.get("renwuzhonglei").toString()); + order.setTaskParent(variables.get("renwufulei").toString()); + order.setOperationModule(variables.get("xitongmingchengshujuku").toString()); + order.setCurrentResponsiblePerson(task.getAssignee()); + order.setDept(variables.get("$guanlibumen").toString()); + order.setCompany(variables.get("yunweigongsi").toString()); + order.setSponsor(userClient.userInfoById(Long.parseLong(historicProcessInstance.getStartUserId())).getData().getRealName()); + order.setApprovalStatus("未完成"); + order.setCreateTime(historicProcessInstance.getStartTime()); + order.setEndTime(historicProcessInstance.getEndTime()); + order.setExpectedCompletionTime(variables.get("qiwangwanchengshijian").toString()); + order.setTaskId(task.getId()); + order.setProcessInsId(task.getProcessInstanceId()); + workOrders.add(order); + } + + // 任务父类 + if (StringUtils.isNotBlank(workOrder.getTaskType())) { + workOrders = workOrders.stream().filter(s -> s.getTaskParent().equals(workOrder.getTaskParent())).collect(Collectors.toList()); + } + + // 任务种类 + if (StringUtils.isNotBlank(workOrder.getTaskType())) { + workOrders = workOrders.stream().filter(s -> s.getTaskType().equals(workOrder.getTaskType())).collect(Collectors.toList()); + } + + // 当前责任人 + if (StringUtils.isNotBlank(workOrder.getTaskType())) { + workOrders = workOrders.stream().filter(s -> s.getCurrentResponsiblePerson().equals(workOrder.getCurrentResponsiblePerson())).collect(Collectors.toList()); + } + + // 管理部门 + if (StringUtils.isNotBlank(workOrder.getTaskType())) { + workOrders = workOrders.stream().filter(s -> s.getDept().equals(workOrder.getDept())).collect(Collectors.toList()); + } + + // 任务级别 + if (StringUtils.isNotBlank(workOrder.getTaskType())) { + workOrders = workOrders.stream().filter(s -> s.getTaskType().equals(workOrder.getTaskType())).collect(Collectors.toList()); + } + + // 审批状态 + if (StringUtils.isNotBlank(workOrder.getTaskType())) { + workOrders = workOrders.stream().filter(s -> s.getApprovalStatus().equals(workOrder.getApprovalStatus())).collect(Collectors.toList()); + } + + // 发起人 + if (StringUtils.isNotBlank(workOrder.getTaskType())) { + workOrders = workOrders.stream().filter(s -> s.getSponsor().equals(workOrder.getSponsor())).collect(Collectors.toList()); + } + + // 创建时间范围 + if (StringUtils.isNotBlank(workOrder.getTaskType())) { + workOrders = workOrders.stream().filter(s -> (s.getCreateTime().after(workOrder.getStartTime())) && (s.getCreateTime().before(workOrder.getEndTime()))).collect(Collectors.toList()); + } + + // 分页 + workOrders = workOrders.stream().skip((query.getCurrent() - 1) * query.getSize()).limit(query.getSize()).collect(Collectors.toList()); + + // 排序 + workOrders = workOrders.stream().sorted(Comparator.comparing(WorkOrder::getCreateTime).reversed()).collect(Collectors.toList()); + + // 数据 + page.setRecords(workOrders); + + // 总条数 + page.setTotal(taskService.createTaskQuery() + .orderByTaskCreateTime() + .desc() + .taskTenantId(WfTaskUtil.getTenantId()) + .active().count()); + + // 当前页数 + page.setCurrent(query.getCurrent()); + + // 当前条数 + page.setSize(query.getSize()); + return page; + } + } diff --git a/lab-service-api/lab-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java b/lab-service-api/lab-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java index 7d04ee7..9499561 100644 --- a/lab-service-api/lab-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java +++ b/lab-service-api/lab-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java @@ -37,6 +37,7 @@ public interface IUserClient { String SELECT_USER_LIST = API_PREFIX + "/user-list"; String SELECT_ID_BY_ROLEIDS = API_PREFIX + "/select-id-by-roleids"; String USER_INFO_BY_NAME = API_PREFIX + "/user-name"; + String ALL_USER = API_PREFIX + "/all-user"; /** @@ -49,6 +50,10 @@ public interface IUserClient { R userInfoById(@RequestParam("userId") Long userId); + @GetMapping(ALL_USER) + R> allUser(); + + /** * 根据账号获取用户信息 * diff --git a/lab-service/lab-system/src/main/java/org/springblade/system/feign/SysClient.java b/lab-service/lab-system/src/main/java/org/springblade/system/feign/SysClient.java index ba35ff3..8ce04e1 100644 --- a/lab-service/lab-system/src/main/java/org/springblade/system/feign/SysClient.java +++ b/lab-service/lab-system/src/main/java/org/springblade/system/feign/SysClient.java @@ -2,11 +2,13 @@ package org.springblade.system.feign; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.AllArgsConstructor; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springblade.system.entity.*; import org.springblade.system.service.*; +import org.springblade.system.user.entity.User; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; @@ -190,7 +192,7 @@ public class SysClient implements ISysClient { @Override public R> getDepts() { - return R.data(deptService.list()); + return R.data(deptService.list(Wrappers.lambdaQuery().select(Dept::getId,Dept::getDeptName))); } } diff --git a/lab-service/lab-user/src/main/java/org/springblade/system/user/feign/UserClient.java b/lab-service/lab-user/src/main/java/org/springblade/system/user/feign/UserClient.java index d20d277..18ab606 100644 --- a/lab-service/lab-user/src/main/java/org/springblade/system/user/feign/UserClient.java +++ b/lab-service/lab-user/src/main/java/org/springblade/system/user/feign/UserClient.java @@ -39,6 +39,11 @@ public class UserClient implements IUserClient { return R.data(service.getById(userId)); } + @Override + public R> allUser() { + return R.data(service.list(Wrappers.lambdaQuery().select(User::getRealName, User::getId))); + } + @Override @GetMapping(USER_INFO_BY_ACCOUNT) public R userByAccount(String tenantId, String account) {