|
@@ -1,40 +1,31 @@
|
|
|
-/*
|
|
|
- * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
|
|
|
- *
|
|
|
- * Redistribution and use in source and binary forms, with or without
|
|
|
- * modification, are permitted provided that the following conditions are met:
|
|
|
- *
|
|
|
- * Redistributions of source code must retain the above copyright notice,
|
|
|
- * this list of conditions and the following disclaimer.
|
|
|
- * Redistributions in binary form must reproduce the above copyright
|
|
|
- * notice, this list of conditions and the following disclaimer in the
|
|
|
- * documentation and/or other materials provided with the distribution.
|
|
|
- * Neither the name of the dreamlu.net developer nor the names of its
|
|
|
- * contributors may be used to endorse or promote products derived from
|
|
|
- * this software without specific prior written permission.
|
|
|
- * Author: Chill 庄骞 (smallchill@163.com)
|
|
|
- */
|
|
|
package org.springblade.business.controller;
|
|
|
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import io.swagger.annotations.Api;
|
|
|
+import io.swagger.annotations.ApiImplicitParam;
|
|
|
+import io.swagger.annotations.ApiImplicitParams;
|
|
|
import io.swagger.annotations.ApiOperation;
|
|
|
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
-
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
import org.springblade.business.entity.TaskParallel;
|
|
|
import org.springblade.business.service.ITaskParallelService;
|
|
|
import org.springblade.business.vo.TaskApprovalVO;
|
|
|
+import org.springblade.business.vo.TaskQueryVO;
|
|
|
+import org.springblade.common.utils.CommonUtil;
|
|
|
import org.springblade.core.mp.support.Condition;
|
|
|
import org.springblade.core.mp.support.Query;
|
|
|
+import org.springblade.core.secure.utils.AuthUtil;
|
|
|
import org.springblade.core.tool.api.R;
|
|
|
import org.springblade.flow.core.entity.BladeFlow;
|
|
|
import org.springblade.flow.core.feign.NewFlowClient;
|
|
|
+import org.springblade.system.entity.DictBiz;
|
|
|
+import org.springblade.system.feign.IDictBizClient;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
-import org.springframework.web.bind.annotation.RequestParam;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import org.springblade.business.entity.Task;
|
|
|
import org.springblade.business.vo.TaskVO;
|
|
@@ -42,7 +33,10 @@ import org.springblade.business.service.ITaskService;
|
|
|
import org.springblade.core.boot.ctrl.BladeController;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 任务审核主表 控制器
|
|
@@ -62,21 +56,145 @@ public class TaskController extends BladeController {
|
|
|
|
|
|
private final NewFlowClient newFlowClient;
|
|
|
|
|
|
+ private final IDictBizClient dictBizClient;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取发起
|
|
|
+ */
|
|
|
+ @GetMapping("/query-user-start-flow")
|
|
|
+ @ApiOperationSupport(order = 9)
|
|
|
+ @ApiOperation(value = "获取发起")
|
|
|
+ public R<IPage<TaskVO>> queryUserStartFlow(TaskQueryVO queryVO){
|
|
|
+ //获取发起,只需要查询主表
|
|
|
+ //先查询符合条件的流程
|
|
|
+ LambdaQueryWrapper<Task> wrapper = Wrappers.<Task>lambdaQuery().eq(Task::getProjectId, queryVO.getProjectId()).eq(Task::getReportUser, AuthUtil.getUserId().toString());
|
|
|
+ //设置查询参数
|
|
|
+ this.integrationMethod(wrapper, queryVO);
|
|
|
+ //获取主流程
|
|
|
+ List<Task> masterTaskList = this.taskService.list(wrapper);
|
|
|
+ if(masterTaskList != null && masterTaskList.size() > 0){
|
|
|
+ //获取集合
|
|
|
+ List<String> processInstanceIds = masterTaskList.stream().map(Task::getProcessInstanceId).distinct().collect(Collectors.toList());
|
|
|
+ //设置主表map,方便获取
|
|
|
+ Map<String, Task> masterTaskMap = new HashMap<>();
|
|
|
+ masterTaskList.forEach(task -> masterTaskMap.put(task.getProcessInstanceId(), task));
|
|
|
+
|
|
|
+ R<Object> rObject = this.newFlowClient.selectSendPage(queryVO.getCurrent(), queryVO.getSize(), String.join(",", processInstanceIds));
|
|
|
+ if(rObject.isSuccess()){
|
|
|
+ Query query = new Query();
|
|
|
+ query.setCurrent(queryVO.getCurrent());
|
|
|
+ query.setSize(queryVO.getSize());
|
|
|
+ //新建一个IPage的实例
|
|
|
+ IPage<BladeFlow> newData = Condition.getPage(query);
|
|
|
+ //使用实例获取具体的类型进行转换
|
|
|
+ IPage flowIPage = JSONObject.parseObject(JSONObject.toJSONString(rObject.getData()), newData.getClass());
|
|
|
+ //本质上这里获取到的集合属于List<JSONObject>,所以需要在这进行一次类型转换,将JSONObject转为BladeFlow
|
|
|
+ List<BladeFlow> result = JSONArray.parseArray(JSONObject.toJSONString(flowIPage.getRecords()), BladeFlow.class);
|
|
|
+
|
|
|
+ //最终结果集合
|
|
|
+ List<TaskVO> finalResult = new ArrayList<>();
|
|
|
+ result.forEach(flow -> {
|
|
|
+ //获取实体
|
|
|
+ Task task = masterTaskMap.get(flow.getProcessInstanceId());
|
|
|
+ //类型转换
|
|
|
+ TaskVO vo = new TaskVO();
|
|
|
+ BeanUtils.copyProperties(task, vo);
|
|
|
+ //设置关键信息
|
|
|
+ vo.setTypeValue(new Integer("1").equals(vo.getType()) ? "普通任务" : new Integer("2").equals(vo.getType()) ? "验收任务" : "移交任务");
|
|
|
+ vo.setTaskId(flow.getTaskId());
|
|
|
+ vo.setStatusValue(new Integer("1").equals(task.getStatus()) ? "待审批" : new Integer("2").equals(task.getStatus()) ? "已审批" : "已废除");
|
|
|
+ //查询分支流程信息
|
|
|
+ List<TaskParallel> linkList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()));
|
|
|
+ if(linkList != null && !linkList.isEmpty()){
|
|
|
+ linkList.forEach(link -> vo.setWaitingUserList(link.getTaskUserName(), new Integer("999").equals(link.getEVisaStatus()) ? 999 : new Integer("2").equals(link.getStatus()) ? 2 : 1));
|
|
|
+ }
|
|
|
+
|
|
|
+ finalResult.add(vo);
|
|
|
+ });
|
|
|
+
|
|
|
+ //最终分页数据
|
|
|
+ IPage<TaskVO> finalPage = Condition.getPage(query);
|
|
|
+ finalPage.setTotal(flowIPage.getTotal());
|
|
|
+ finalPage.setSize(query.getSize());
|
|
|
+ finalPage.setCurrent(query.getCurrent());
|
|
|
+ finalPage.setRecords(finalResult);
|
|
|
+
|
|
|
+ return R.data(finalPage);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return R.data(null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量审批
|
|
|
+ */
|
|
|
+ @PostMapping("/batch-complete-approval-task")
|
|
|
+ @ApiOperationSupport(order = 8)
|
|
|
+ @ApiOperation(value = "批量审批")
|
|
|
+ public R<Boolean> batchCompleteApprovalTask(@RequestBody TaskApprovalVO taskApprovalVO){
|
|
|
+ String taskIds = taskApprovalVO.getTaskIds();
|
|
|
+ if(StringUtils.isNotEmpty(taskIds)){
|
|
|
+ String[] taskIdArray = taskIds.split(",");
|
|
|
+ for(String taskId : taskIdArray){
|
|
|
+ TaskApprovalVO approvalVO = new TaskApprovalVO();
|
|
|
+ approvalVO.setTaskId(taskId);
|
|
|
+ approvalVO.setParallelProcessInstanceId(taskId);
|
|
|
+ approvalVO.setFlag("OK");
|
|
|
+ approvalVO.setComment("同意");
|
|
|
+
|
|
|
+ //批量审批
|
|
|
+ this.taskService.completeApprovalTask(approvalVO);
|
|
|
+ }
|
|
|
+ return R.data(true);
|
|
|
+ }
|
|
|
+ return R.data(true);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前合同段的上报批次
|
|
|
+ * @param projectId 项目ID
|
|
|
+ * @param contractId 合同段ID
|
|
|
+ */
|
|
|
+ @GetMapping("/query-batch-list")
|
|
|
+ @ApiOperationSupport(order = 7)
|
|
|
+ @ApiOperation(value = "获取当前合同段的上报批次")
|
|
|
+ @ApiImplicitParams({
|
|
|
+ @ApiImplicitParam(name = "projectId", value = "项目ID", required = true),
|
|
|
+ @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
|
|
|
+ })
|
|
|
+ public R<List<Task>> queryBatchList(String projectId, String contractId){
|
|
|
+ return R.data(this.taskService.queryBatchList(projectId, contractId));
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
- * 获取待办
|
|
|
+ * 获取任务类型或任务状态
|
|
|
+ */
|
|
|
+ @GetMapping("/query-task-type-status")
|
|
|
+ @ApiOperationSupport(order = 6)
|
|
|
+ @ApiOperation(value = "获取任务类型或任务状态")
|
|
|
+ public R<List<DictBiz>> queryTaskTypeOrStatus(String typeOrStatus){
|
|
|
+ return this.dictBizClient.getList(typeOrStatus, "notRoot");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取已办
|
|
|
*/
|
|
|
@GetMapping("/query-user-done-task-list")
|
|
|
@ApiOperationSupport(order = 5)
|
|
|
- @ApiOperation(value = "")
|
|
|
- public R<IPage<TaskVO>> queryUserDoneTaskList(@RequestParam Integer current, @RequestParam Integer size){
|
|
|
- //最终集合
|
|
|
- Query query = new Query();
|
|
|
- query.setCurrent(current);
|
|
|
- query.setSize(size);
|
|
|
+ @ApiOperation(value = "获取已办")
|
|
|
+ public R<IPage<TaskVO>> queryUserDoneTaskList(TaskQueryVO queryVO){
|
|
|
+ //设置获取参数
|
|
|
+ Map<String,Task> masterTaskMap = new HashMap<>();
|
|
|
+ Map<String,TaskParallel> parallelMap = new HashMap<>();
|
|
|
+ List<String> parallelProcessInstanceIds = new ArrayList<>();
|
|
|
+ //统合查询方法
|
|
|
+ this.integrationMethod(queryVO, masterTaskMap, parallelMap, parallelProcessInstanceIds, "2");
|
|
|
+
|
|
|
//获取已办(基于原生已办)
|
|
|
- R<Object> rObject = this.newFlowClient.selectDonePage(current, size);
|
|
|
+ R<Object> rObject = this.newFlowClient.selectDonePage(queryVO.getCurrent(), queryVO.getSize(), String.join(",", parallelProcessInstanceIds));
|
|
|
//处理参数
|
|
|
- return this.integrationMethod(rObject, query);
|
|
|
+ return this.integrationMethod(queryVO, rObject, masterTaskMap, parallelMap);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -96,22 +214,76 @@ public class TaskController extends BladeController {
|
|
|
@GetMapping("/user-to-do-task-list")
|
|
|
@ApiOperationSupport(order = 3)
|
|
|
@ApiOperation(value = "获取当前用户待办流程")
|
|
|
- public R<IPage<TaskVO>> todoUserApprovalTask(@RequestParam Integer current, @RequestParam Integer size){
|
|
|
-
|
|
|
- Query query = new Query();
|
|
|
- query.setCurrent(current);
|
|
|
- query.setSize(size);
|
|
|
+ public R<IPage<TaskVO>> todoUserApprovalTask(TaskQueryVO queryVO){
|
|
|
+ //设置获取参数
|
|
|
+ Map<String,Task> masterTaskMap = new HashMap<>();
|
|
|
+ Map<String,TaskParallel> parallelMap = new HashMap<>();
|
|
|
+ List<String> parallelProcessInstanceIds = new ArrayList<>();
|
|
|
+ //统合查询方法
|
|
|
+ this.integrationMethod(queryVO, masterTaskMap, parallelMap, parallelProcessInstanceIds, "1");
|
|
|
|
|
|
//获取待办(基于原生待办)
|
|
|
- R<Object> rObject = this.newFlowClient.selectTodoPage(current, size);
|
|
|
+ R<Object> rObject = this.newFlowClient.selectTodoPage(queryVO.getCurrent(), queryVO.getSize(), String.join(",", parallelProcessInstanceIds));
|
|
|
//处理参数
|
|
|
- return this.integrationMethod(rObject, query);
|
|
|
+ return this.integrationMethod(queryVO, rObject, masterTaskMap, parallelMap);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 统合查询方法
|
|
|
+ */
|
|
|
+ private void integrationMethod(TaskQueryVO queryVO, Map<String,Task> masterTaskMap, Map<String,TaskParallel> parallelMap, List<String> parallelProcessInstanceIds, String status){
|
|
|
+ //先查询符合条件的流程
|
|
|
+ LambdaQueryWrapper<Task> wrapper = Wrappers.<Task>lambdaQuery().eq(Task::getIsDeleted, 0).eq(Task::getProjectId, queryVO.getProjectId());
|
|
|
+ this.integrationMethod(wrapper, queryVO);
|
|
|
+
|
|
|
+ //符合条件的集合
|
|
|
+ List<Task> masterTaskList = this.taskService.list(wrapper);
|
|
|
+ //根据主表获取附表且当前用户的记录
|
|
|
+ List<String> processInstanceIds = new ArrayList<>();
|
|
|
+ masterTaskList.forEach(task -> {
|
|
|
+ masterTaskMap.put(task.getProcessInstanceId(), task);
|
|
|
+ processInstanceIds.add(task.getProcessInstanceId());
|
|
|
+ });
|
|
|
+
|
|
|
+ if(processInstanceIds.size() > 0){
|
|
|
+ List<TaskParallel> parallelTaskList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().in(TaskParallel::getProcessInstanceId, processInstanceIds).eq(TaskParallel::getTaskUser, AuthUtil.getUserId().toString()).eq(TaskParallel::getIsDeleted, 0).eq(TaskParallel::getStatus, status));
|
|
|
+ parallelTaskList.forEach(parallel -> {
|
|
|
+ parallelMap.put(parallel.getParallelProcessInstanceId(), parallel);
|
|
|
+ parallelProcessInstanceIds.add(parallel.getParallelProcessInstanceId());
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void integrationMethod(LambdaQueryWrapper<Task> wrapper, TaskQueryVO queryVO){
|
|
|
+ //任务类型
|
|
|
+ if(StringUtils.isNotEmpty(queryVO.getTaskType())){
|
|
|
+ wrapper.eq(Task::getType, queryVO.getTaskType());
|
|
|
+ }
|
|
|
+ //任务状态
|
|
|
+ if(StringUtils.isNotEmpty(queryVO.getTaskStatus())){
|
|
|
+ wrapper.eq(Task::getStatus, queryVO.getTaskStatus());
|
|
|
+ }
|
|
|
+ //合同段ID
|
|
|
+ if(StringUtils.isNotEmpty(queryVO.getContractId())){
|
|
|
+ wrapper.eq(Task::getContractId, queryVO.getContractId());
|
|
|
+ }
|
|
|
+ //开始结束时间
|
|
|
+ if(StringUtils.isNotEmpty(queryVO.getStartTime()) && StringUtils.isNotEmpty(queryVO.getEndTime())){
|
|
|
+ wrapper.between(Task::getStartTime, queryVO.getStartTime(), queryVO.getEndTime());
|
|
|
+ }
|
|
|
+ //关键字查询
|
|
|
+ if(StringUtils.isNotEmpty(queryVO.getQueryValue())){
|
|
|
+ wrapper.like(Task::getTaskName, queryVO.getQueryValue());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 统合处理方法
|
|
|
*/
|
|
|
- private R<IPage<TaskVO>> integrationMethod(R<Object> rObject, Query query){
|
|
|
+ private R<IPage<TaskVO>> integrationMethod(TaskQueryVO queryVO, R<Object> rObject, Map<String,Task> masterTaskMap, Map<String,TaskParallel> parallelMap){
|
|
|
+ Query query = new Query();
|
|
|
+ query.setCurrent(queryVO.getCurrent());
|
|
|
+ query.setSize(queryVO.getSize());
|
|
|
//最终集合
|
|
|
List<TaskVO> finalResult = new ArrayList<>();
|
|
|
if(rObject.isSuccess()){
|
|
@@ -122,38 +294,54 @@ public class TaskController extends BladeController {
|
|
|
//本质上这里获取到的集合属于List<JSONObject>,所以需要在这进行一次类型转换,将JSONObject转为BladeFlow
|
|
|
List<BladeFlow> result = JSONArray.parseArray(JSONObject.toJSONString(flowIPage.getRecords()), BladeFlow.class);
|
|
|
|
|
|
- //获取相关信息
|
|
|
- result.forEach(flow -> {
|
|
|
- TaskParallel taskParallel = this.taskParallelService.getOne(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getParallelProcessInstanceId, flow.getProcessInstanceId()).eq(TaskParallel::getIsDeleted, 0));
|
|
|
- if(taskParallel != null){
|
|
|
- //查询主表信息
|
|
|
- Task task = this.taskService.getOne(Wrappers.<Task>lambdaQuery().eq(Task::getProcessInstanceId, taskParallel.getProcessInstanceId()).eq(Task::getIsDeleted, 0));
|
|
|
- //复制数据
|
|
|
- TaskVO vo = new TaskVO();
|
|
|
- BeanUtils.copyProperties(task, vo);
|
|
|
- //设置关键信息
|
|
|
- vo.setTypeValue(new Integer("1").equals(vo.getType()) ? "普通任务" : new Integer("2").equals(vo.getType()) ? "验收任务" : "移交任务");
|
|
|
- vo.setParallelProcessInstanceId(flow.getProcessInstanceId());
|
|
|
- vo.setTaskId(flow.getTaskId());
|
|
|
- //获取主流程下所有相关的审批人
|
|
|
- List<TaskParallel> linkList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()).eq(TaskParallel::getIsDeleted, 0));
|
|
|
- if(linkList != null && linkList.size() > 0){
|
|
|
- linkList.forEach(link -> vo.setWaitingUserList(link.getTaskUserName(), new Integer("999").equals(link.getEVisaStatus()) ? 999 : new Integer("2").equals(link.getStatus()) ? 2 : 1));
|
|
|
+ if(result != null && result.size() > 0){
|
|
|
+ //获取相关信息
|
|
|
+ result.forEach(flow -> {
|
|
|
+ TaskParallel taskParallel = parallelMap.get(flow.getProcessInstanceId());
|
|
|
+ if(taskParallel != null){
|
|
|
+ //查询主表数据
|
|
|
+ Task task = masterTaskMap.get(taskParallel.getProcessInstanceId());
|
|
|
+
|
|
|
+ if(task != null){
|
|
|
+ //复制数据
|
|
|
+ TaskVO vo = new TaskVO();
|
|
|
+ BeanUtils.copyProperties(task, vo);
|
|
|
+ //设置关键信息
|
|
|
+ vo.setTypeValue(new Integer("1").equals(vo.getType()) ? "普通任务" : new Integer("2").equals(vo.getType()) ? "验收任务" : "移交任务");
|
|
|
+ vo.setParallelProcessInstanceId(flow.getProcessInstanceId());
|
|
|
+ vo.setTaskId(flow.getTaskId());
|
|
|
+ vo.setStatusValue(new Integer("1").equals(task.getStatus()) ? "待审批" : new Integer("2").equals(task.getStatus()) ? "已审批" : "已废除");
|
|
|
+ //获取主流程下所有相关的审批人
|
|
|
+ List<TaskParallel> linkList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()).eq(TaskParallel::getIsDeleted, 0));
|
|
|
+ if(linkList != null && linkList.size() > 0){
|
|
|
+ linkList.forEach(link -> vo.setWaitingUserList(link.getTaskUserName(), new Integer("999").equals(link.getEVisaStatus()) ? 999 : new Integer("2").equals(link.getStatus()) ? 2 : 1));
|
|
|
+ }
|
|
|
+
|
|
|
+ //设置最终集合
|
|
|
+ finalResult.add(vo);
|
|
|
+ }
|
|
|
}
|
|
|
+ });
|
|
|
|
|
|
- //设置最终集合
|
|
|
- finalResult.add(vo);
|
|
|
+ //result是一个总的集合,需要手动进行分组分页
|
|
|
+ List<List<TaskVO>> groupResult = CommonUtil.getBatchSize(finalResult, query.getSize());
|
|
|
+ //获取当前页数据
|
|
|
+ List<TaskVO> finalFlowList;
|
|
|
+ if(groupResult.size() > 0){
|
|
|
+ finalFlowList = groupResult.get(query.getCurrent() - 1);
|
|
|
+ } else {
|
|
|
+ finalFlowList = new ArrayList<>();
|
|
|
}
|
|
|
- });
|
|
|
|
|
|
- //最终分页数据
|
|
|
- IPage<TaskVO> finalPage = Condition.getPage(query);
|
|
|
- finalPage.setTotal(flowIPage.getTotal());
|
|
|
- finalPage.setSize(flowIPage.getSize());
|
|
|
- finalPage.setCurrent(flowIPage.getCurrent());
|
|
|
- finalPage.setRecords(finalResult);
|
|
|
+ //最终分页数据
|
|
|
+ IPage<TaskVO> finalPage = Condition.getPage(query);
|
|
|
+ finalPage.setTotal(flowIPage.getTotal());
|
|
|
+ finalPage.setSize(query.getSize());
|
|
|
+ finalPage.setCurrent(query.getCurrent());
|
|
|
+ finalPage.setRecords(finalFlowList);
|
|
|
|
|
|
- return R.data(finalPage);
|
|
|
+ return R.data(finalPage);
|
|
|
+ }
|
|
|
}
|
|
|
return R.data(null);
|
|
|
}
|