ActTaskServiceImpl.java 12.1 KB
package com.trash.activiti.service.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import javax.validation.constraints.Null;

import com.trash.common.utils.StringUtils;
import org.activiti.api.runtime.shared.identity.UserGroupManager;
import org.activiti.api.runtime.shared.query.Pageable;
import org.activiti.api.runtime.shared.security.SecurityManager;
import org.activiti.api.task.model.Task;
import org.activiti.api.task.model.builders.TaskPayloadBuilder;
import org.activiti.bpmn.model.FormProperty;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricProcessInstanceQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.IdentityLink;
import org.apache.commons.collections4.map.HashedMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.Page;
import com.trash.activiti.domain.ActWorkflowFormData;
import com.trash.activiti.domain.dto.ActTaskDTO;
import com.trash.activiti.domain.dto.ActWorkflowFormDataDTO;
import com.trash.activiti.mapper.ActReDeploymentMapper;
import com.trash.activiti.service.IActTaskService;
import com.trash.activiti.service.IActWorkflowFormDataService;
import com.trash.activiti.service.myTaskService;
import com.trash.common.core.page.PageDomain;
import com.trash.common.utils.RemoteServerUtils;
import com.trash.common.utils.SecurityUtils;
import com.trash.common.utils.ServletUtils;
import com.trash.common.utils.spring.SpringUtils;

@Service
public class ActTaskServiceImpl implements IActTaskService {

	@Autowired
	private RepositoryService repositoryService;

	@Autowired
	private myTaskService taskRuntime;

	@Autowired
	private TaskService taskService;

	@Autowired
	private RuntimeService runtimeService;

	@Autowired
	private IActWorkflowFormDataService actWorkflowFormDataService;

	@Autowired
	private ActReDeploymentMapper actMapper;

	@Autowired
	SecurityManager securityManager;

	@Autowired
	UserGroupManager userGroupManager;

	HistoricProcessInstanceQuery processInstanceQuery;

	@Override
	public Page<ActTaskDTO> selectProcessDefinitionList(PageDomain pageDomain) {
		Page<ActTaskDTO> list = new Page<ActTaskDTO>();

		 if (ServletUtils.getParameter("role") != null) {
		 List<String> posts = new ArrayList<>();
		 posts.add(ServletUtils.getParameter("role"));
		 SecurityUtils.getLoginUser().getUser().setPostIds(posts);
		 }
		 if (ServletUtils.getParameter("dept") != null) {
		 List<String> roles = new ArrayList<>();
		 roles.add(ServletUtils.getParameter("dept"));
		 SecurityUtils.getLoginUser().getUser().setRoleIds(roles);
		 }
		 if (SecurityUtils.getLoginUser().getUser().getPostIds().size() == 0
		 || SecurityUtils.getLoginUser().getUser().getRoleIds().size() == 0) {
		 return list;
		 }

		org.activiti.api.runtime.shared.query.Page<Task> pageTasks = taskRuntime
				.tasks(Pageable.of((pageDomain.getPageNum() - 1) * pageDomain.getPageSize(), pageDomain.getPageSize()));

		List<Task> tasks = pageTasks.getContent();
		int totalItems = pageTasks.getTotalItems();
		list.setTotal(totalItems);
		if (totalItems != 0) {
			Set<String> processInstanceIdIds = tasks.parallelStream().map(t -> t.getProcessInstanceId())
					.collect(Collectors.toSet());

			List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery()
					.processInstanceIds(processInstanceIdIds).list();
			Set<String> idString = new HashSet<String>();
			for (ProcessInstance pi : processInstanceList) {
				idString.add(pi.getBusinessKey());
			}

			List<Map<String, String>> maps = actMapper.selectWorkByIds(idString);

			List<ActTaskDTO> actTaskDTOS = tasks.stream()
					.map(t -> new ActTaskDTO(t,
							processInstanceList.parallelStream()
									.filter(pi -> t.getProcessInstanceId().equals(pi.getId())).findAny().get(),
							maps.parallelStream().filter(pi -> t.getProcessInstanceId().equals(pi.get("instance_id")))
									.findAny().get()))
					.collect(Collectors.toList());

			list.addAll(actTaskDTOS);
		}
		return list;
	}

	@Override
	public Page<ActTaskDTO> selectTaskEndHistoryDefinitionList(PageDomain pageDomain) {
		Page<ActTaskDTO> list = new Page<ActTaskDTO>();

		ProcessEngine pes = ProcessEngines.getDefaultProcessEngine();
		HistoryService historyService = pes.getHistoryService();

		String username = securityManager.getAuthenticatedUserId();

		List<String> collect = actMapper.selectCompleteWorkByUsername(username);

		if (collect.size() > 0) {
			Set<String> set = new HashSet(collect);

			List<HistoricProcessInstance> processInstanceList = historyService.createHistoricProcessInstanceQuery()
					.involvedUser(username).processInstanceIds(set).list();

			Set<String> idString = new HashSet<String>();
			for (HistoricProcessInstance pi : processInstanceList) {
				idString.add(pi.getId());
			}

			List<Map<String, String>> maps = actMapper.selectHistoryWorkByPIds(idString);

			list.setTotal(processInstanceList.size());

			if (processInstanceList.size() > 0) {
				for (HistoricProcessInstance p : processInstanceList) {
					ActTaskDTO actTaskDTOS = new ActTaskDTO(p, maps.parallelStream()
							.filter(pi -> p.getId().equals(pi.get("instance_id"))).findAny().get());

					getCheckData(actTaskDTOS);

					list.add(actTaskDTOS);
				}

			}
		}

		list.setPageNum(pageDomain.getPageNum());
		list.setPageSize(pageDomain.getPageSize());

		list.setTotal(list.size());

		return list;
	}

	@Override
	public Page<ActTaskDTO> selectRuntimeTaskHistoryDefinitionList(PageDomain pageDomain) {
		Page<ActTaskDTO> list = new Page<ActTaskDTO>();

		Set<String> collect = actMapper.selectUnCompleteWorkByUsername(securityManager.getAuthenticatedUserId());

		if (collect.size() > 0) {

			List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery()
					.processInstanceIds(collect).list();

			list.setTotal(processInstanceList.size());

			Set<String> idString = new HashSet<String>();
			for (ProcessInstance pi : processInstanceList) {
				idString.add(pi.getBusinessKey());
			}

			List<Map<String, String>> maps = actMapper.selectWorkByIds(idString);

			if (processInstanceList.size() > 0) {
				for (ProcessInstance p : processInstanceList) {
					ActTaskDTO actTaskDTOS = new ActTaskDTO(p, maps.parallelStream()
							.filter(pi -> p.getProcessInstanceId().equals(pi.get("instance_id"))).findAny().get());

					getCheckData(actTaskDTOS);

					list.add(actTaskDTOS);
				}

			}
		}

		list.setPageNum(pageDomain.getPageNum());
		list.setPageSize(pageDomain.getPageSize());

		list.setTotal(list.size());
		return list;
	}

	public void getCheckData(ActTaskDTO actTaskDTOS) {
		ActWorkflowFormData ActWorkflowFormData = new ActWorkflowFormData();
		ActWorkflowFormData.setBusinessKey(actTaskDTOS.getBusinessKey());
		ActWorkflowFormData.setCreateBy(securityManager.getAuthenticatedUserId());
		ActWorkflowFormData.setControlName("审批");

		actTaskDTOS.setCheckStatus(actWorkflowFormDataService.selectActWorkflowFormDataList(ActWorkflowFormData).get(0)
				.getControlValue().equals("通过") ? "0" : "1");
	}

	SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS");

	@Override
	public List<String> formDataShow(String taskID) {
		Task task = taskRuntime.task(taskID);
		/*
		 * ---------------------------------------------------------------------
		 * --------- FormProperty_0ueitp2--__!!类型--__!!名称--__!!是否参数--__!!默认值 例子:
		 * FormProperty_0lovri0--__!!string--__!!姓名--__!!f--__!!同意!!__--驳回
		 * FormProperty_1iu6onu--__!!int--__!!年龄--__!!s
		 *
		 * 默认值:无、字符常量、FormProperty_开头定义过的控件ID
		 * 是否参数:f为不是参数,s是字符,t是时间(不需要int,因为这里int等价于string)
		 * 注:类型是可以获取到的,但是为了统一配置原则,都配置到
		 */

		// 注意!!!!!!!!:表单Key必须要任务编号一模一样,因为参数需要任务key,但是无法获取,只能获取表单key“task.getFormKey()”当做任务key
		UserTask userTask = (UserTask) repositoryService.getBpmnModel(task.getProcessDefinitionId())
				.getFlowElement(task.getFormKey());

		if (userTask == null) {
			return null;
		}
		List<FormProperty> formProperties = userTask.getFormProperties();
		List<String> collect = formProperties.stream().map(fp -> fp.getId()).collect(Collectors.toList());

		return collect;
	}

	@Override
	public int formDataSave(String taskID, List<ActWorkflowFormDataDTO> awfs) throws ParseException {
		Task task = taskRuntime.task(taskID);

		ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
				.processInstanceId(task.getProcessInstanceId()).singleResult();

		Map<String, Object> str = processInstance.getProcessVariables();

		String desc = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult()
				.getDescription();
		// 办文办事功能:分管领导指定部门时,将部门code存入desc
		if (!StringUtils.isEmpty(awfs.get(0).getDeptCode())) {
			desc = awfs.get(0).getDeptCode();
		}

		Boolean hasVariables = false;// 没有任何参数
		HashMap<String, Object> variables = new HashMap<String, Object>();
		// 前端传来的字符串,拆分成每个控件
		List<ActWorkflowFormData> acwfds = new ArrayList<>();
		for (ActWorkflowFormDataDTO awf : awfs) {
			ActWorkflowFormData actWorkflowFormData = new ActWorkflowFormData(processInstance.getBusinessKey(), awf,
					task);
			acwfds.add(actWorkflowFormData);
			// 构建参数集合
			if (!"f".equals(awf.getControlIsParam())) {
				variables.put(awf.getControlId(), awf.getControlValue());
				hasVariables = true;
			}

			if (processInstance.getProcessDefinitionKey().equals("handleAffairs")
					&& awf.getControlId().equals("FormProperty_0aq22i0")) {
				variables.put("index", awf.getIndex());
			}
		} // for结束
		if (task.getAssignee() == null) {
			taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(task.getId()).build());
		}
		if (hasVariables) {
			// 带参数完成任务
			taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskID).withVariables(variables).build());
		} else {
			taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskID).build());
		}

		if (desc != null)
			updateThreesetpTask(processInstance, desc);

		// 写入数据库
		return actWorkflowFormDataService.insertActWorkflowFormDatas(acwfds);
	}

	private void updateThreesetpTask(ProcessInstance processInstance, String placeCode) {

		org.activiti.engine.task.Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId())
				.singleResult();

		if (task == null)
			return;

		task.setDescription(placeCode);

		List<IdentityLink> list = taskService.getIdentityLinksForTask(task.getId());

		if (list.size() == 1) {
			taskService.addCandidateUser(task.getId(), placeCode);
		}

		task.setDescription(placeCode);

		taskService.saveTask(task);

	}

	@Override
	public void deleteProcessById(String type) {
		runtimeService.deleteProcessInstance(type, "删除");
	}

	@Override
	public void endAllThreesteptask(String type) {

		List<ProcessInstance> processes = runtimeService.createProcessInstanceQuery().processDefinitionKey(type).list();

		for (ProcessInstance proc : processes) {
			if (type.equals(proc.getProcessDefinitionKey())) {
				try {

					String executionId = proc.getSuperExecutionId();
					Map<String, Object> map = proc.getProcessVariables();

					// runtimeService.removeVariable(executionId, variableName);

					runtimeService.deleteProcessInstance(proc.getId(), "超时");
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}

	}
}