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

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
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();

            List<ActTaskDTO> actTaskDTOS = tasks.stream().map(t -> new ActTaskDTO(t, processInstanceList.parallelStream().filter(pi -> t.getProcessInstanceId().equals(pi.getId())).findAny().get(),
                    getData(processInstanceList.parallelStream().filter(pi -> t.getProcessInstanceId().equals(pi.getId())).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();

            list.setTotal(processInstanceList.size());

            if (processInstanceList.size() > 0) {
                for (HistoricProcessInstance p : processInstanceList) {
                    ActTaskDTO actTaskDTOS = new ActTaskDTO(p, getHistoryData(p));

                    getCheckData(actTaskDTOS);

                    list.add(actTaskDTOS);
                }

            }
        }

        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());

            if (processInstanceList.size() > 0) {
                for (ProcessInstance p : processInstanceList) {
                    ActTaskDTO actTaskDTOS = new ActTaskDTO(p, getData(p));

                    getCheckData(actTaskDTOS);

                    list.add(actTaskDTOS);
                }

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

    public Map<String, String> getData(HistoricProcessInstance processInstance) {
        Map<String, String> map = actMapper.selectWorkById(processInstance.getBusinessKey());
        return map;
    }

    public Map<String, String> getHistoryData(HistoricProcessInstance processInstance) {
        Map<String, String> map = actMapper.selectHistoryWorkByPId(processInstance.getId());
        return map;

    }

    public Map<String, String> getData(ProcessInstance processInstance) {
        Map<String, String> map = actMapper.selectWorkById(processInstance.getBusinessKey());
        return map;
    }

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


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

		if(processInstance.getProcessDefinitionKey().equals("workflow_leave") || processInstance.getProcessDefinitionKey().equals("workflow_caseoffline") ||
				processInstance.getProcessDefinitionKey().equals("logistics") || processInstance.getProcessDefinitionKey().equals("conference")
				|| processInstance.getProcessDefinitionKey().equals("workflow_threestep") || processInstance.getProcessDefinitionKey().equals("workflow_casefile")
                || processInstance.getProcessDefinitionKey().equals("handleAffairs") || processInstance.getProcessDefinitionKey().equals("gongwenchuli")){
    			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().list();

		for(ProcessInstance proc:processes){
			if(type.equals(proc.getProcessDefinitionKey())){
				runtimeService.deleteProcessInstance(proc.getId(), "超时");
			}
		}

	}
}