Эх сурвалжийг харах

Merge remote-tracking branch 'origin/master'

liuyc 3 жил өмнө
parent
commit
015a387ecd
15 өөрчлөгдсөн 418 нэмэгдсэн , 91 устгасан
  1. 10 2
      blade-ops-api/blade-flow-api/src/main/java/org/springblade/flow/core/feign/NewFlowClient.java
  2. 3 3
      blade-ops/blade-flow/src/main/java/org/springblade/flow/business/controller/WorkController.java
  3. 12 4
      blade-ops/blade-flow/src/main/java/org/springblade/flow/business/feign/NewFlowClientImpl.java
  4. 5 3
      blade-ops/blade-flow/src/main/java/org/springblade/flow/business/service/FlowBusinessService.java
  5. 28 11
      blade-ops/blade-flow/src/main/java/org/springblade/flow/business/service/impl/FlowBusinessServiceImpl.java
  6. 6 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/Task.java
  7. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskApprovalVO.java
  8. 39 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskQueryVO.java
  9. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskVO.java
  10. 34 6
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ElementData.java
  11. 250 62
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  12. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskMapper.java
  13. 10 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskMapper.xml
  14. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskService.java
  15. 6 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

+ 10 - 2
blade-ops-api/blade-flow-api/src/main/java/org/springblade/flow/core/feign/NewFlowClient.java

@@ -7,6 +7,7 @@ import org.springblade.flow.core.vo.FlowProcessVO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
@@ -23,12 +24,19 @@ public interface NewFlowClient {
     String COMPLETE_APPROVAL_TASK = API_PREFIX + "/complete-approval-task";
     String QUERY_TASK_ID = API_PREFIX + "/query-task-id";
     String DONE_LIST = API_PREFIX + "/done-list";
+    String SEND_LIST = API_PREFIX + "/send-list";
+
+    /**
+     * 获取已发起
+     */
+    @PostMapping(SEND_LIST)
+    R<Object> selectSendPage(@RequestParam Integer current, @RequestParam Integer size, @RequestParam String parallelProcessInstanceIds);
 
     /**
      * 获取待办
      */
     @PostMapping(DONE_LIST)
-    R<Object> selectDonePage(@RequestParam Integer current, @RequestParam Integer size);
+    R<Object> selectDonePage(@RequestParam Integer current, @RequestParam Integer size, @RequestParam String parallelProcessInstanceIds);
 
     /**
      * 根据业务ID获取流程ID
@@ -46,7 +54,7 @@ public interface NewFlowClient {
      * 流程待办列表
      */
     @GetMapping(TO_DO_LIST)
-    R<Object> selectTodoPage(@RequestParam Integer current, @RequestParam Integer size);
+    R<Object> selectTodoPage(@RequestParam Integer current, @RequestParam Integer size, @RequestParam String parallelProcessInstanceIds);
 
     /**
      * 查询可运行的模型

+ 3 - 3
blade-ops/blade-flow/src/main/java/org/springblade/flow/business/controller/WorkController.java

@@ -79,7 +79,7 @@ public class WorkController {
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "待办事务列表页", notes = "传入流程信息")
 	public R<IPage<BladeFlow>> todoList(@ApiParam("流程信息") BladeFlow bladeFlow, Query query) {
-		IPage<BladeFlow> pages = flowBusinessService.selectTodoPage(Condition.getPage(query), bladeFlow);
+		IPage<BladeFlow> pages = flowBusinessService.selectTodoPage(Condition.getPage(query), bladeFlow, null);
 		return R.data(pages);
 	}
 
@@ -90,7 +90,7 @@ public class WorkController {
 	@ApiOperationSupport(order = 4)
 	@ApiOperation(value = "已发事务列表页", notes = "传入流程信息")
 	public R<IPage<BladeFlow>> sendList(@ApiParam("流程信息") BladeFlow bladeFlow, Query query) {
-		IPage<BladeFlow> pages = flowBusinessService.selectSendPage(Condition.getPage(query), bladeFlow);
+		IPage<BladeFlow> pages = flowBusinessService.selectSendPage(Condition.getPage(query), bladeFlow, null);
 		return R.data(pages);
 	}
 
@@ -101,7 +101,7 @@ public class WorkController {
 	@ApiOperationSupport(order = 5)
 	@ApiOperation(value = "办结事务列表页", notes = "传入流程信息")
 	public R<IPage<BladeFlow>> doneList(@ApiParam("流程信息") BladeFlow bladeFlow, Query query) {
-		IPage<BladeFlow> pages = flowBusinessService.selectDonePage(Condition.getPage(query), bladeFlow);
+		IPage<BladeFlow> pages = flowBusinessService.selectDonePage(Condition.getPage(query), bladeFlow, null);
 		return R.data(pages);
 	}
 

+ 12 - 4
blade-ops/blade-flow/src/main/java/org/springblade/flow/business/feign/NewFlowClientImpl.java

@@ -33,11 +33,19 @@ public class NewFlowClientImpl implements NewFlowClient {
     private final TaskService taskService;
 
     @Override
-    public R<Object> selectDonePage(Integer current, Integer size) {
+    public R<Object> selectSendPage(Integer current, Integer size, String parallelProcessInstanceIds) {
         Query query = new Query();
         query.setCurrent(current);
         query.setSize(size);
-        return R.data(this.flowBusinessService.selectDonePage(Condition.getPage(query), new BladeFlow()));
+        return R.data(this.flowBusinessService.selectSendPage(Condition.getPage(query), new BladeFlow(), parallelProcessInstanceIds));
+    }
+
+    @Override
+    public R<Object> selectDonePage(Integer current, Integer size, String parallelProcessInstanceIds) {
+        Query query = new Query();
+        query.setCurrent(current);
+        query.setSize(size);
+        return R.data(this.flowBusinessService.selectDonePage(Condition.getPage(query), new BladeFlow(), parallelProcessInstanceIds));
     }
 
     @Override
@@ -63,11 +71,11 @@ public class NewFlowClientImpl implements NewFlowClient {
     }
 
     @Override
-    public R<Object> selectTodoPage(Integer current, Integer size) {
+    public R<Object> selectTodoPage(Integer current, Integer size, String parallelProcessInstanceIds) {
         Query query = new Query();
         query.setCurrent(current);
         query.setSize(size);
-        return R.data(this.flowBusinessService.selectTodoPage(Condition.getPage(query), new BladeFlow()));
+        return R.data(this.flowBusinessService.selectTodoPage(Condition.getPage(query), new BladeFlow(), parallelProcessInstanceIds));
     }
 
     @Override

+ 5 - 3
blade-ops/blade-flow/src/main/java/org/springblade/flow/business/service/FlowBusinessService.java

@@ -19,6 +19,8 @@ package org.springblade.flow.business.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.flow.core.entity.BladeFlow;
 
+import java.util.List;
+
 /**
  * 流程业务类
  *
@@ -42,7 +44,7 @@ public interface FlowBusinessService {
 	 * @param bladeFlow 流程类
 	 * @return
 	 */
-	IPage<BladeFlow> selectTodoPage(IPage<BladeFlow> page, BladeFlow bladeFlow);
+	IPage<BladeFlow> selectTodoPage(IPage<BladeFlow> page, BladeFlow bladeFlow, String parallelProcessInstanceIds);
 
 	/**
 	 * 流程已发列表
@@ -51,7 +53,7 @@ public interface FlowBusinessService {
 	 * @param bladeFlow 流程类
 	 * @return
 	 */
-	IPage<BladeFlow> selectSendPage(IPage<BladeFlow> page, BladeFlow bladeFlow);
+	IPage<BladeFlow> selectSendPage(IPage<BladeFlow> page, BladeFlow bladeFlow, String parallelProcessInstanceIds);
 
 	/**
 	 * 流程办结列表
@@ -60,7 +62,7 @@ public interface FlowBusinessService {
 	 * @param bladeFlow 流程类
 	 * @return
 	 */
-	IPage<BladeFlow> selectDonePage(IPage<BladeFlow> page, BladeFlow bladeFlow);
+	IPage<BladeFlow> selectDonePage(IPage<BladeFlow> page, BladeFlow bladeFlow, String parallelProcessInstanceIds);
 
 	/**
 	 * 完成任务

+ 28 - 11
blade-ops/blade-flow/src/main/java/org/springblade/flow/business/service/impl/FlowBusinessServiceImpl.java

@@ -17,6 +17,7 @@
 package org.springblade.flow.business.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import liquibase.util.StringUtils;
 import lombok.AllArgsConstructor;
 import org.flowable.engine.HistoryService;
 import org.flowable.engine.TaskService;
@@ -39,9 +40,7 @@ import org.springblade.flow.engine.entity.FlowProcess;
 import org.springblade.flow.engine.utils.FlowCache;
 import org.springframework.stereotype.Service;
 
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 流程业务实现类
@@ -88,13 +87,19 @@ public class FlowBusinessServiceImpl implements FlowBusinessService {
 	}
 
 	@Override
-	public IPage<BladeFlow> selectTodoPage(IPage<BladeFlow> page, BladeFlow bladeFlow) {
+	public IPage<BladeFlow> selectTodoPage(IPage<BladeFlow> page, BladeFlow bladeFlow, String parallelProcessInstanceIds) {
 		String taskUser = TaskUtil.getTaskUser();
 		List<BladeFlow> flowList = new LinkedList<>();
 
 		// 已签收的任务
-		TaskQuery todoQuery = taskService.createTaskQuery().taskAssignee(taskUser).active()
-			.includeProcessVariables().orderByTaskCreateTime().desc();
+		TaskQuery todoQuery;
+		if(StringUtils.isEmpty(parallelProcessInstanceIds)){
+			todoQuery = taskService.createTaskQuery().taskAssignee(taskUser).active()
+					.includeProcessVariables().orderByTaskCreateTime().desc();
+		} else {
+			todoQuery = taskService.createTaskQuery().taskAssignee(taskUser).active()
+					.includeProcessVariables().processInstanceIdIn(Arrays.asList(parallelProcessInstanceIds.split(",").clone())).orderByTaskCreateTime().desc();
+		}
 
 		// 构建列表数据
 		buildFlowTaskList(bladeFlow, flowList, todoQuery, FlowEngineConstant.STATUS_TODO);
@@ -111,11 +116,17 @@ public class FlowBusinessServiceImpl implements FlowBusinessService {
 	}
 
 	@Override
-	public IPage<BladeFlow> selectSendPage(IPage<BladeFlow> page, BladeFlow bladeFlow) {
+	public IPage<BladeFlow> selectSendPage(IPage<BladeFlow> page, BladeFlow bladeFlow, String parallelProcessInstanceIds) {
 		String taskUser = TaskUtil.getTaskUser();
 		List<BladeFlow> flowList = new LinkedList<>();
 
-		HistoricProcessInstanceQuery historyQuery = historyService.createHistoricProcessInstanceQuery().startedBy(taskUser).orderByProcessInstanceStartTime().desc();
+		HistoricProcessInstanceQuery historyQuery;
+		if(StringUtils.isEmpty(parallelProcessInstanceIds)){
+			historyQuery = historyService.createHistoricProcessInstanceQuery().startedBy(taskUser).orderByProcessInstanceStartTime().desc();
+		} else {
+			List<String> array = Arrays.asList(parallelProcessInstanceIds.split(","));
+			historyQuery = historyService.createHistoricProcessInstanceQuery().startedBy(taskUser).processInstanceIds(new HashSet<>(array)).orderByProcessInstanceStartTime().desc();
+		}
 
 		if (bladeFlow.getCategory() != null) {
 			historyQuery.processDefinitionCategory(bladeFlow.getCategory());
@@ -183,12 +194,18 @@ public class FlowBusinessServiceImpl implements FlowBusinessService {
 	}
 
 	@Override
-	public IPage<BladeFlow> selectDonePage(IPage<BladeFlow> page, BladeFlow bladeFlow) {
+	public IPage<BladeFlow> selectDonePage(IPage<BladeFlow> page, BladeFlow bladeFlow, String parallelProcessInstanceIds) {
 		String taskUser = TaskUtil.getTaskUser();
 		List<BladeFlow> flowList = new LinkedList<>();
 
-		HistoricTaskInstanceQuery doneQuery = historyService.createHistoricTaskInstanceQuery().taskAssignee(taskUser).finished()
-			.includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc();
+		HistoricTaskInstanceQuery doneQuery;
+		if(StringUtils.isEmpty(parallelProcessInstanceIds)){
+			doneQuery = historyService.createHistoricTaskInstanceQuery().taskAssignee(taskUser).finished()
+					.includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc();
+		} else {
+			doneQuery = historyService.createHistoricTaskInstanceQuery().taskAssignee(taskUser).finished()
+					.includeProcessVariables().processInstanceIdIn(Arrays.asList(parallelProcessInstanceIds.split(","))).orderByHistoricTaskInstanceEndTime().desc();
+		}
 
 		if (bladeFlow.getCategory() != null) {
 			doneQuery.processCategoryIn(Func.toStrList(bladeFlow.getCategory()));

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/Task.java

@@ -117,4 +117,10 @@ public class Task extends BaseEntity {
     @ApiModelProperty("类型,1普通任务,2验收任务,3移交任务")
     private Integer type;
 
+    @ApiModelProperty("项目ID")
+    private String projectId;
+
+    @ApiModelProperty("合同段ID")
+    private String contractId;
+
 }

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskApprovalVO.java

@@ -27,6 +27,9 @@ public class TaskApprovalVO {
     @ApiModelProperty("同意传OK(大写),废除可传非OK外任意字符或传空")
     private String flag;
 
+    @ApiModelProperty("批量审批")
+    private String taskIds;
+
     @ApiModelProperty("附件信息")
     private List<ApprovalFile> approvalFileList = new ArrayList<>();
 

+ 39 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskQueryVO.java

@@ -0,0 +1,39 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class TaskQueryVO {
+    
+    @ApiModelProperty("当前页")
+    private Integer current;
+
+    @ApiModelProperty("当前页条数")
+    private Integer size;
+
+    @ApiModelProperty("任务类型")
+    private String taskType;
+
+    @ApiModelProperty("任务状态")
+    private String taskStatus;
+
+    @ApiModelProperty("上报批次")
+    private String batch;
+
+    @ApiModelProperty("合同段ID")
+    private String contractId;
+
+    @ApiModelProperty("开始时间")
+    private String startTime;
+
+    @ApiModelProperty("结束时间")
+    private String endTime;
+
+    @ApiModelProperty("关键字查询")
+    private String queryValue;
+
+    @ApiModelProperty("项目ID")
+    private String projectId;
+
+}

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskVO.java

@@ -47,6 +47,9 @@ public class TaskVO extends Task {
 	@ApiModelProperty("环节任务ID")
 	private String taskId;
 
+	@ApiModelProperty("状态类型")
+	private String statusValue;
+
 	@ApiModelProperty("审批人集合")
 	List<WaitingUser> waitingUserList = new ArrayList<>();
 

+ 34 - 6
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ElementData.java

@@ -1,17 +1,13 @@
 package org.springblade.manager.dto;
 
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+
 
 /**
  * @author yangyj
  * @Date 2022/7/4 15:23
  * @description TODO
  */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
+
 public class ElementData {
     /**
      *  表的自然顺序,同一张表复制N次,index代表该数据在第几张
@@ -23,4 +19,36 @@ public class ElementData {
     Integer groupId;
     Object  value;
 
+    public Integer getIndex() {
+        return index;
+    }
+
+    public void setIndex(Integer index) {
+        this.index = index;
+    }
+
+    public Integer getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(Integer groupId) {
+        this.groupId = groupId;
+    }
+
+    public Object getValue() {
+        return value;
+    }
+
+    public void setValue(Object value) {
+        this.value = value;
+    }
+
+    public ElementData() {
+    }
+
+    public ElementData(Integer index, Integer groupId, Object value) {
+        this.index = index;
+        this.groupId = groupId;
+        this.value = value;
+    }
 }

+ 250 - 62
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -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);
 	}

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskMapper.java

@@ -16,9 +16,12 @@
  */
 package org.springblade.business.mapper;
 
+import org.apache.ibatis.annotations.Param;
 import org.springblade.business.entity.Task;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.List;
+
 /**
  * 任务审核主表 Mapper 接口
  *
@@ -27,4 +30,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface TaskMapper extends BaseMapper<Task> {
 
+    List<Task> queryBatchList(@Param("projectId") String projectId, @Param("contractId") String contractId);
+
 }

+ 10 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskMapper.xml

@@ -25,6 +25,16 @@
         <result column="report_user" property="reportUser"/>
         <result column="report_user_name" property="reportUserName"/>
         <result column="type" property="type"/>
+        <result column="project_id" property="projectId"/>
+        <result column="contract_id" property="contractId"/>
     </resultMap>
 
+    <select id="queryBatchList" resultMap="taskResultMap">
+        select batch from u_task where is_deleted = 0 and project_id = #{projectId}
+        <if test="contractId != null and contractId != ''">
+            and contract_id = #{contractId}
+        </if>
+        group by batch
+    </select>
+
 </mapper>

+ 4 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskService.java

@@ -21,6 +21,8 @@ import org.springblade.business.vo.TaskApprovalVO;
 import org.springblade.business.vo.TaskVO;
 import org.springblade.core.mp.base.BaseService;
 
+import java.util.List;
+
 /**
  * 任务审核主表 服务类
  *
@@ -29,6 +31,8 @@ import org.springblade.core.mp.base.BaseService;
  */
 public interface ITaskService extends BaseService<Task> {
 
+    List<Task> queryBatchList(String projectId, String contract);
+
     Boolean completeApprovalTask(TaskApprovalVO taskApprovalVO);
 
     Boolean startApproval(TaskVO vo);

+ 6 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -72,6 +72,11 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
     private final ITaskParallelService taskParallelService;
 
+    @Override
+    public List<Task> queryBatchList(String projectId, String contract) {
+        return this.baseMapper.queryBatchList(projectId, contract);
+    }
+
     @Override
     public Boolean completeApprovalTask(TaskApprovalVO taskApprovalVO) {
         //获取流程ID
@@ -244,6 +249,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             BeanUtils.copyProperties(vo, task);
             //这里发起的默认为普通流程
             task.setType(1);
+            task.setStatus(1);
             //保存附表信息
             this.taskParallelService.saveBatch(taskParallelArray);