395 lines
15 KiB
Java
395 lines
15 KiB
Java
package cn.palmte.work.service;
|
|
|
|
import cn.palmte.work.bean.ApproveStatusEnum;
|
|
import cn.palmte.work.config.activiti.ActConstant;
|
|
|
|
import cn.palmte.work.model.*;
|
|
import cn.palmte.work.pojo.ActHisTask;
|
|
import cn.palmte.work.utils.ActUtil;
|
|
import cn.palmte.work.utils.InterfaceUtil;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import org.activiti.engine.*;
|
|
import org.activiti.engine.impl.identity.Authentication;
|
|
import org.activiti.engine.impl.persistence.entity.TaskEntity;
|
|
import org.activiti.engine.runtime.ProcessInstance;
|
|
import org.activiti.engine.task.Task;
|
|
import org.apache.commons.lang.StringUtils;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import top.jfunc.common.db.QueryHelper;
|
|
import top.jfunc.common.db.utils.Pagination;
|
|
|
|
import java.util.*;
|
|
|
|
|
|
@Service
|
|
public class ActTaskDefService {
|
|
private static final Logger logger = LoggerFactory.getLogger(ActTaskDefService.class);
|
|
@Autowired
|
|
private ProjectTaskRecordService projectTaskRecordService;
|
|
@Autowired
|
|
private HistoryService historyService;
|
|
@Autowired
|
|
private TaskService taskService; //任务管理 与正在执行的任务管理相关的Service
|
|
@Autowired
|
|
private ActTaskDefRepository actTaskDefRepository;
|
|
@Autowired
|
|
private AccountService accountService;
|
|
@Autowired
|
|
Pagination pagination;
|
|
@Autowired
|
|
private ActUtil actUtil;
|
|
@Autowired
|
|
private ProjectInstanceService projectInstanceService;
|
|
@Autowired
|
|
private RuntimeService runtimeService;
|
|
|
|
|
|
/**
|
|
* 审批任务
|
|
*
|
|
* @param json
|
|
*/
|
|
public void completeTask(JSONObject json) {
|
|
String taskId = json.getString("taskId");
|
|
String procInsId = json.getString("procInsId");
|
|
String message = json.getString("message");
|
|
int type = json.getInteger("type");
|
|
|
|
completeTask(taskId, procInsId, message, type);
|
|
}
|
|
|
|
private void completeTask(String taskId, String procInsId, String message, int type) {
|
|
String userId = InterfaceUtil.getAdminId() + "";
|
|
Authentication.setAuthenticatedUserId(userId);
|
|
taskService.addComment(taskId, procInsId, message);
|
|
|
|
Task currentTask = taskService.createTaskQuery().taskId(taskId).singleResult();
|
|
ActTaskDef actTaskDef = findFirstByProcDefIdAndTaskKey(currentTask.getProcessDefinitionId(), currentTask.getTaskDefinitionKey());
|
|
|
|
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(procInsId).singleResult();
|
|
taskService.setAssignee(taskId, userId);
|
|
if (ActConstant.TASK_TYPE_SINGE == actTaskDef.getTaskType()) {
|
|
handleSinge(processInstance, taskId, type, actTaskDef);
|
|
} else if (ActConstant.TASK_TYPE_MULTI == actTaskDef.getTaskType()) {
|
|
//多实列 会签处理
|
|
handleMulti(processInstance, taskId, type, actTaskDef);
|
|
}
|
|
|
|
if (actUtil.isProjectProcessIns(processInstance)) {
|
|
//保存审批记录
|
|
projectTaskRecordService.saveTaskRecord(Integer.parseInt(processInstance.getBusinessKey()),
|
|
currentTask, type, actTaskDef.getTaskIndex(), message);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 通过流程实列id完成任务
|
|
*
|
|
* @param procInsId
|
|
* @param type
|
|
* @param comment
|
|
*/
|
|
public void completeTaskByProcInsId(String procInsId, int type, String comment) {
|
|
int adminId = InterfaceUtil.getAdminId();
|
|
List<Task> taskList = taskService.createTaskQuery().processInstanceId(procInsId).list();
|
|
List<String> assignUserList;
|
|
for (Task task : taskList) {
|
|
assignUserList = actUtil.getAssignUserList(task.getId());
|
|
//if (assignUserList.contains(String.valueOf(adminId))) {
|
|
completeTask(task.getId(), procInsId, comment, type);
|
|
//}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 会签处理
|
|
*
|
|
* @param taskId
|
|
* @param processInstance
|
|
* @param type
|
|
* @param actTaskDef
|
|
*/
|
|
private void handleMulti(ProcessInstance processInstance, String taskId, int type, ActTaskDef actTaskDef) {
|
|
if (ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == type) {
|
|
//一个人驳回 整个任务节点驳回
|
|
List<Task> taskList = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
|
|
for (int i = 0; i < taskList.size(); i++) {
|
|
TaskEntity taskEntity = (TaskEntity) taskList.get(i);
|
|
if (!taskId.equals(taskEntity.getId())) {
|
|
/* taskEntity.setProcessInstanceId(null);
|
|
taskEntity.setExecutionId(null);
|
|
taskService.saveTask(taskEntity);*/
|
|
|
|
taskService.addComment(taskEntity.getId(), processInstance.getId(), "会签驳回,任务自动失效");
|
|
taskService.complete(taskEntity.getId());
|
|
//taskService.deleteTask(taskEntity.getId(), false); // 不删除历史记录
|
|
}
|
|
}
|
|
|
|
//驳回到配置的节点
|
|
actUtil.jumpToTargetTask(taskId, actTaskDef.getRollbackTaskKey());
|
|
return;
|
|
}
|
|
|
|
taskService.complete(taskId);
|
|
}
|
|
|
|
/**
|
|
* 或签处理
|
|
*
|
|
* @param taskId
|
|
* @param processInstance
|
|
* @param type
|
|
* @param actTaskDef
|
|
*/
|
|
private void handleSinge(ProcessInstance processInstance, String taskId, int type, ActTaskDef actTaskDef) {
|
|
String procDefKey = actTaskDef.getProcDefKey();
|
|
if (ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus() == type) {
|
|
//审批通过
|
|
taskService.complete(taskId);
|
|
|
|
//执行配置的审批通过脚本
|
|
int endScript = actTaskDef.getEndScript();
|
|
if (endScript != 0) {
|
|
actUtil.invokeEventScript(endScript, processInstance.getId(), actTaskDef);
|
|
} else {
|
|
logger.info("未配置审批通过脚本 task:{}", actTaskDef.getTaskName());
|
|
}
|
|
|
|
if (actUtil.isProjectProcessIns(procDefKey)) {
|
|
//最后一个任务完成后 更新项目状态为审批通过
|
|
updateProjectPassed(processInstance, actTaskDef, procDefKey);
|
|
}
|
|
|
|
} else if (ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == type) {
|
|
//驳回
|
|
String rollbackTaskKey = actTaskDef.getRollbackTaskKey();
|
|
actUtil.jumpToTargetTask(taskId, rollbackTaskKey);
|
|
|
|
//执行配置的驳回脚本
|
|
int rollbackScript = actTaskDef.getRollbackScript();
|
|
if (rollbackScript != 0) {
|
|
actUtil.invokeEventScript(rollbackScript, processInstance.getId(), actTaskDef);
|
|
} else {
|
|
logger.info("未配置驳回脚本 task:{}", actTaskDef.getTaskName());
|
|
}
|
|
|
|
//驳回后 更新项目状态为审批不通过
|
|
if (actUtil.isProjectProcessIns(procDefKey)) {
|
|
int projectId = Integer.parseInt(processInstance.getBusinessKey());
|
|
projectInstanceService.updateApproveStatus(projectId, procDefKey, ApproveStatusEnum.APPROVAL_UNPASS);
|
|
logger.info("updateProjectUnPassed projectId:{}, proDefKey:{}", projectId, procDefKey);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 最后一个任务完成后 更新项目状态为审批通过
|
|
*
|
|
* @param processInstance
|
|
* @param actTaskDef
|
|
* @param procDefKey
|
|
*/
|
|
private void updateProjectPassed(ProcessInstance processInstance, ActTaskDef actTaskDef, String procDefKey) {
|
|
int projectId = Integer.parseInt(processInstance.getBusinessKey());
|
|
if (ActConstant.PROCESS_DEFKEY_FINAL.equals(procDefKey)) {
|
|
if ("财务总监".equals(actTaskDef.getTaskName())) {
|
|
logger.info("updateProjectPassed1 projectId:{}, proDefKey:{}", projectId, procDefKey);
|
|
projectInstanceService.updateApproveStatus(projectId, procDefKey, ApproveStatusEnum.APPROVAL_PASSED);
|
|
}
|
|
} else {
|
|
if ("执行董事".equals(actTaskDef.getTaskName())) {
|
|
logger.info("updateProjectPassed2 projectId:{}, proDefKey:{}", projectId, procDefKey);
|
|
projectInstanceService.updateApproveStatus(projectId, procDefKey, ApproveStatusEnum.APPROVAL_PASSED);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* 审批过程任务查询
|
|
*
|
|
* @param procIncId
|
|
* @return
|
|
*/
|
|
public List<ActHisTask> hisTaskList(String procIncId) {
|
|
String select = "select ht.PROC_DEF_ID_ as procDefId, ht.PROC_INST_ID_ as procInsId, ht.EXECUTION_ID_ as executionId," +
|
|
" ht.ID_ as taskId, ht.NAME_ as taskName, " +
|
|
" ht.ASSIGNEE_ as assign, ht.START_TIME_ as startTime, ht.END_TIME_ as endTime, " +
|
|
"ht.DURATION_ as duration, ht.DELETE_REASON_ as deleteReason, hc.MESSAGE_ AS comments";
|
|
QueryHelper queryHelper = new QueryHelper(select, " ACT_HI_TASKINST ht " +
|
|
" LEFT JOIN ACT_HI_COMMENT hc on ht.ID_ = hc.TASK_ID_ and hc.type_='comment' ");
|
|
queryHelper.addCondition("ht.PROC_INST_ID_ =?", procIncId);
|
|
queryHelper.addOrderProperty("ht.start_time_", true);
|
|
List<ActHisTask> taskList = pagination.find(queryHelper.getSql(), ActHisTask.class);
|
|
for (ActHisTask actHisTask : taskList) {
|
|
setAssign(actHisTask);
|
|
|
|
//办理用时
|
|
String duration = actHisTask.getDuration();
|
|
if (StringUtils.isNotBlank(duration)) {
|
|
Long ztime = Long.parseLong(duration);
|
|
Long day = ztime / (1000 * 60 * 60 * 24);
|
|
Long hour = (ztime % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
|
|
Long minute = (ztime % (1000 * 60 * 60 * 24)) % (1000 * 60 * 60) / (1000 * 60);
|
|
Long second = (ztime % (1000 * 60 * 60 * 24)) % (1000 * 60 * 60) % (1000 * 60) / 1000;
|
|
actHisTask.setDuration(day + "天" + hour + "时" + minute + "分" + second + "秒");
|
|
} else {
|
|
actHisTask.setDuration("正在处理。。。");
|
|
}
|
|
|
|
if (StringUtils.isNotBlank(actHisTask.getDeleteReason())) {
|
|
actHisTask.setComments("【驳回】" + actHisTask.getComments());
|
|
}
|
|
}
|
|
|
|
return taskList;
|
|
}
|
|
|
|
|
|
/**
|
|
* 根据流程定义查询任务
|
|
*
|
|
* @param procDefId
|
|
* @return
|
|
*/
|
|
public List<ActTaskDef> findByProcDefId(String procDefId) {
|
|
List<ActTaskDef> list = actTaskDefRepository.findByProcDefId(procDefId);
|
|
for (ActTaskDef actTaskDef : list) {
|
|
candidatesHandle(actTaskDef);
|
|
}
|
|
return list;
|
|
}
|
|
|
|
|
|
/**
|
|
* 根据流程定义和任务key查询任务
|
|
*
|
|
* @param procDefId
|
|
* @param taskKey
|
|
* @return
|
|
*/
|
|
public ActTaskDef findFirstByProcDefIdAndTaskKey(String procDefId, String taskKey) {
|
|
ActTaskDef def = actTaskDefRepository.findFirstByProcDefIdAndTaskKey(procDefId, taskKey);
|
|
candidatesHandle(def);
|
|
return def;
|
|
}
|
|
|
|
|
|
/**
|
|
* 保存任务配置
|
|
*
|
|
* @param taskDef
|
|
*/
|
|
public void saveConfig(ActTaskDef taskDef) {
|
|
ActTaskDef one = actTaskDefRepository.findOne(taskDef.getId());
|
|
one.setCandidateUsers(taskDef.getCandidateUsers());
|
|
one.setCandidateRoles(taskDef.getCandidateRoles());
|
|
one.setRollbackTaskKey(taskDef.getRollbackTaskKey());
|
|
one.setEndScript(taskDef.getEndScript());
|
|
one.setRollbackScript(taskDef.getRollbackScript());
|
|
one.setLastUpdatedTime(new Date());
|
|
|
|
actTaskDefRepository.save(one);
|
|
logger.info("saveTaskConfig uerId:{}, config:{}", InterfaceUtil.getAdminId(), JSONObject.toJSONString(one));
|
|
}
|
|
|
|
|
|
/**
|
|
* 查找任务配置的审批人
|
|
*
|
|
* @param procDefId
|
|
* @param procInsId
|
|
* @param taskDefKey
|
|
* @return
|
|
*/
|
|
public List<String> findCandidateUsers(String procDefId, String procInsId, String taskDefKey) {
|
|
ActTaskDef taskDef = findFirstByProcDefIdAndTaskKey(procDefId, taskDefKey);
|
|
if (taskDef.getTaskIndex() == ActConstant.TASK_INDEX_FIRST_USER_TASK) {
|
|
//任务驳回到发起节点 审批人设置为发起人
|
|
String startUserId = actUtil.getStartUserId(procInsId);
|
|
List<String> res = new ArrayList<>(1);
|
|
logger.info("findCandidateUsers-0-task:{}, startUserId:{}", taskDef.getTaskName(), startUserId);
|
|
res.add(startUserId);
|
|
return res;
|
|
}
|
|
|
|
//去重
|
|
Set<String> res = new HashSet<>();
|
|
|
|
//通过人员id查询
|
|
List<String> candidateUserList = taskDef.getCandidateUserList();
|
|
logger.info("findCandidateUsers-1-task:{}, userList:{}", taskDef.getTaskName(), candidateUserList);
|
|
if (!candidateUserList.isEmpty()) {
|
|
res.addAll(candidateUserList);
|
|
}
|
|
|
|
//通过角色id查询
|
|
List<String> candidateRoleList = taskDef.getCandidateRoleList();
|
|
logger.info("findCandidateUsers-2-task:{}, roleList:{}", taskDef.getTaskName(), candidateRoleList);
|
|
List<String> list = accountService.getUserIsByRole(candidateRoleList);
|
|
logger.info("findCandidateUsers-3-task:{}, userIdListByRole:{}", taskDef.getTaskName(), list);
|
|
if (!list.isEmpty()) {
|
|
res.addAll(list);
|
|
}
|
|
|
|
List<String> resList = new ArrayList<>(res);
|
|
logger.info("findCandidateUsers-4-task:{}, resIds:{}", taskDef.getTaskName(), resList);
|
|
return resList;
|
|
}
|
|
|
|
|
|
/**
|
|
* 任务审批人列表从sring转成list
|
|
*
|
|
* @param actTaskDef
|
|
*/
|
|
private void candidatesHandle(ActTaskDef actTaskDef) {
|
|
String candidateUsers = actTaskDef.getCandidateUsers();
|
|
List<String> userIdList = new ArrayList<>();
|
|
if (StringUtils.isNotBlank(candidateUsers)) {
|
|
userIdList = Arrays.asList(candidateUsers.split("#"));
|
|
}
|
|
actTaskDef.setCandidateUserList(userIdList);
|
|
|
|
String candidateRoles = actTaskDef.getCandidateRoles();
|
|
List<String> roleIdList = new ArrayList<>();
|
|
if (StringUtils.isNotBlank(candidateRoles)) {
|
|
roleIdList = Arrays.asList(candidateRoles.split("#"));
|
|
}
|
|
actTaskDef.setCandidateRoleList(roleIdList);
|
|
}
|
|
|
|
|
|
/**
|
|
* 设置历史任务审批人
|
|
*
|
|
* @param actHisTask
|
|
*/
|
|
private void setAssign(ActHisTask actHisTask) {
|
|
if (StringUtils.isNotBlank(actHisTask.getAssign())) {
|
|
String userName = accountService.getNameById(Integer.parseInt(actHisTask.getAssign()));
|
|
actHisTask.setAssign(userName);
|
|
return;
|
|
}
|
|
|
|
Task task = taskService.createTaskQuery().taskId(actHisTask.getTaskId()).singleResult();
|
|
if (task == null) {
|
|
return;
|
|
}
|
|
|
|
if (StringUtils.isNotBlank(task.getAssignee())) {
|
|
actHisTask.setAssign(task.getAssignee());
|
|
return;
|
|
}
|
|
|
|
actHisTask.setAssign(actUtil.getAssigneeByIdentityLink(task.getId()));
|
|
}
|
|
|
|
|
|
}
|