新增表保存一个项目的所有审批记录

master
pengqiang 2021-11-12 16:43:47 +08:00
parent 4ed32b4e2c
commit 9c11f95987
11 changed files with 212 additions and 48 deletions

View File

@ -9,21 +9,13 @@ public class ActConstant {
public static final String PROC_INS_ID="procInsId"; public static final String PROC_INS_ID="procInsId";
public static final String PROC_DEF_KEY="procDefKey";
/** /**
* *
*/ */
public static final int TASK_INDEX_FIRST_USER_TASK= 1; public static final int TASK_INDEX_FIRST_USER_TASK= 1;
/**
*
*/
public static final int TYPE_APPROVE= 1;
/**
*
*/
public static final int TYPE_ROLLBACK= 2;
/** /**
* *

View File

@ -0,0 +1,52 @@
package cn.palmte.work.model;
import lombok.Data;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
/**
*
*/
@Data
@Entity
@Table(name = "project_task_record")
public class ProjectTaskRecord {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "project_id")
private int projectId;
@Column(name = "proc_def_id")
private String procDefId;
@Column(name = "proc_ins_id")
private String procInsId;
@Column(name = "task_def_key")
private String taskDefKey;
@Column(name = "task_name")
private String taskName;
@Column(name = "task_status")
private int taskStatus;
@Column(name = "task_assignee_id")
private String taskAssigneeId;
@Column(name = "task_assignee_name")
private String taskAssigneeName;
@Column(name = "task_comment")
private String taskComment;
@Column(name = "create_time")
private Date createTime;
}

View File

@ -0,0 +1,8 @@
package cn.palmte.work.model;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProjectTaskRecordRepository extends JpaRepository<ProjectTaskRecord, Integer> {
}

View File

@ -1,9 +1,13 @@
package cn.palmte.work.service; package cn.palmte.work.service;
import cn.palmte.work.bean.ApproveStatusEnum;
import cn.palmte.work.config.activiti.ActConstant; import cn.palmte.work.config.activiti.ActConstant;
import cn.palmte.work.utils.ActUtil;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.*; import java.util.*;
@ -15,21 +19,29 @@ import java.util.*;
@Service @Service
public class ActCallbackScript { public class ActCallbackScript {
private static final Logger logger = LoggerFactory.getLogger(ActCallbackScript.class); private static final Logger logger = LoggerFactory.getLogger(ActCallbackScript.class);
@Autowired
private ActUtil actUtil;
@Autowired
private ProjectInstanceService projectInstanceService;
/**
*
*
* @param map
*/
public void updateApproveStatus(Map map) {
logger.info("--- updateApproveStatus--- : {} ", map);
//String startUserId = (String) map.get(ActConstant.START_PROCESS_USERID);
String procInsId = (String) map.get(ActConstant.PROC_INS_ID);
String procDefKey = (String) map.get(ActConstant.PROC_DEF_KEY);
logger.info(" updateApproveStatus procInsId:{}, procDefKey:{}", procInsId, procDefKey);
public void endScriptDemo(Map map) { int projectId = actUtil.getProjectId(procInsId);
logger.info("--- endScriptDemo--- : {} ", map); if (projectId > 0) {
String startUserId = (String)map.get(ActConstant.START_PROCESS_USERID); projectInstanceService.updateApproveStatus(projectId, ApproveStatusEnum.APPROVAL_PASSED, procDefKey);
String procInsId = (String)map.get(ActConstant.START_PROCESS_USERID);
logger.info(" startUserId:{}, procInsId:{}", startUserId, procInsId);
}
public void rollbackScriptDemo(Map map) {
logger.info("--- rollbackScriptDemo--- : {} ", map);
String startUserId = (String)map.get(ActConstant.START_PROCESS_USERID);
String procInsId = (String)map.get(ActConstant.START_PROCESS_USERID);
logger.info(" startUserId:{}, procInsId:{}", startUserId, procInsId);
} }
} }
}

View File

@ -1,6 +1,7 @@
package cn.palmte.work.service; package cn.palmte.work.service;
import cn.palmte.work.config.activiti.ActConstant;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.DelegateTask;
@ -10,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -25,6 +27,9 @@ public class ActListenerService {
@Autowired @Autowired
private ActTaskDefService actTaskDefService; private ActTaskDefService actTaskDefService;
@Autowired
private ProjectInstanceService projectInstanceService;
/** /**
* *
* *
@ -37,8 +42,22 @@ public class ActListenerService {
String procDefId = delegateTask.getProcessDefinitionId(); String procDefId = delegateTask.getProcessDefinitionId();
String procInsId = delegateTask.getProcessInstanceId(); String procInsId = delegateTask.getProcessInstanceId();
String taskDefKey = delegateTask.getTaskDefinitionKey(); String taskDefKey = delegateTask.getTaskDefinitionKey();
Set<String> candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey); List<String> candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey);
logger.info("addCandidateUsers : {}", candidateUsers); logger.info("addCandidateUsers : {}", candidateUsers);
Object projectIdObj = delegateTask.getVariable(ActConstant.KEY_PROJECT_ID);
logger.info("projectIdObj : {}", projectIdObj);
if (candidateUsers != null && !candidateUsers.isEmpty() && projectIdObj != null) {
try {
int adminId = Integer.parseInt(candidateUsers.get(0));
projectInstanceService.updateApprover((Integer) projectIdObj, adminId);
} catch (Exception e) {
logger.error("", e);
}
}
delegateTask.addCandidateUsers(candidateUsers); delegateTask.addCandidateUsers(candidateUsers);
} }
@ -55,7 +74,7 @@ public class ActListenerService {
}*/ }*/
public Set<String> multipleInstanceTask(DelegateExecution delegateExecution) throws Exception { public List<String> multipleInstanceTask(DelegateExecution delegateExecution) throws Exception {
String procInsId = delegateExecution.getProcessInstanceId(); String procInsId = delegateExecution.getProcessInstanceId();
String procDefId = delegateExecution.getProcessDefinitionId(); String procDefId = delegateExecution.getProcessDefinitionId();
String taskDefKey = delegateExecution.getCurrentActivityId(); String taskDefKey = delegateExecution.getCurrentActivityId();

View File

@ -1,6 +1,7 @@
package cn.palmte.work.service; package cn.palmte.work.service;
import cn.palmte.work.bean.ApproveStatusEnum;
import cn.palmte.work.model.ActTaskDefRepository; import cn.palmte.work.model.ActTaskDefRepository;
import cn.palmte.work.pojo.ActProcIns; import cn.palmte.work.pojo.ActProcIns;
import cn.palmte.work.utils.ActUtil; import cn.palmte.work.utils.ActUtil;
@ -50,7 +51,7 @@ public class ActProcInsService {
Pagination pagination; Pagination pagination;
@Autowired @Autowired
private ActTaskDefService actTaskDefService; private ProjectTaskRecordService projectTaskRecordService;
@Autowired @Autowired
private HistoryService historyService; //历史管理(执行完的数据的管理) private HistoryService historyService; //历史管理(执行完的数据的管理)
@ -91,16 +92,18 @@ public class ActProcInsService {
String assignee = InterfaceUtil.getAdminId() + ""; String assignee = InterfaceUtil.getAdminId() + "";
task.setAssignee(assignee); task.setAssignee(assignee);
String taskId = task.getId(); String taskId = task.getId();
taskService.addComment(taskId, procInsId, "提交审批"); String comment = "提交" + processDefinition.getName();
taskService.addComment(taskId, procInsId, comment);
taskService.complete(taskId); taskService.complete(taskId);
actTaskDefRepository.updateHiTaskAssign(assignee, procInsId, taskId); actTaskDefRepository.updateHiTaskAssign(assignee, procInsId, taskId);
actTaskDefRepository.updateHiActAssign(assignee, procInsId, taskId); actTaskDefRepository.updateHiActAssign(assignee, procInsId, taskId);
projectTaskRecordService.saveTaskRecord(task, ApproveStatusEnum.APPROVAL_PENDING.getApproveStatus(), comment);
return processInstance.getId(); return processInstance.getId();
} }
/** /**
* *
* *

View File

@ -1,5 +1,6 @@
package cn.palmte.work.service; package cn.palmte.work.service;
import cn.palmte.work.bean.ApproveStatusEnum;
import cn.palmte.work.config.activiti.ActConstant; import cn.palmte.work.config.activiti.ActConstant;
import cn.palmte.work.model.*; import cn.palmte.work.model.*;
@ -25,9 +26,9 @@ import java.util.*;
public class ActTaskDefService { public class ActTaskDefService {
private static final Logger logger = LoggerFactory.getLogger(ActTaskDefService.class); private static final Logger logger = LoggerFactory.getLogger(ActTaskDefService.class);
@Autowired @Autowired
private RepositoryService repositoryService; //管理流程定义 与流程定义和部署对象相关的Service private ProjectTaskRecordService projectTaskRecordService;
@Autowired @Autowired
private ProcessEngine processEngine; //流程引擎对象 private RepositoryService repositoryService;
@Autowired @Autowired
private TaskService taskService; //任务管理 与正在执行的任务管理相关的Service private TaskService taskService; //任务管理 与正在执行的任务管理相关的Service
@Autowired @Autowired
@ -38,6 +39,8 @@ public class ActTaskDefService {
Pagination pagination; Pagination pagination;
@Autowired @Autowired
private ActUtil actUtil; private ActUtil actUtil;
@Autowired
private ProjectInstanceService projectInstanceService;
/** /**
@ -71,6 +74,9 @@ public class ActTaskDefService {
//会签处理 //会签处理
handleMulti(taskId, procInsId, type, userId, actTaskDef); handleMulti(taskId, procInsId, type, userId, actTaskDef);
} }
//保存审批记录
projectTaskRecordService.saveTaskRecord(currentTask, type, message);
} }
@ -107,7 +113,7 @@ public class ActTaskDefService {
Double instanceActiveCount = Double.parseDouble(ActUtil.filterNullToZero(taskService.getVariable(taskId, ActConstant.NUMBER_OF_ACTIVE_INSTANCES))); //活动的会签任务数 Double instanceActiveCount = Double.parseDouble(ActUtil.filterNullToZero(taskService.getVariable(taskId, ActConstant.NUMBER_OF_ACTIVE_INSTANCES))); //活动的会签任务数
Double instanceCompleteCount = Double.parseDouble(ActUtil.filterNullToZero(taskService.getVariable(taskId, ActConstant.NUMBER_OF_COMPLETED_INSTANCES))); //完成会签任务数*/ Double instanceCompleteCount = Double.parseDouble(ActUtil.filterNullToZero(taskService.getVariable(taskId, ActConstant.NUMBER_OF_COMPLETED_INSTANCES))); //完成会签任务数*/
if (ActConstant.TYPE_ROLLBACK == type) { if (ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == type) {
//一个人驳回 整个任务节点驳回 //一个人驳回 整个任务节点驳回
List<Task> taskList = taskService.createTaskQuery().processInstanceId(procInsId).list(); List<Task> taskList = taskService.createTaskQuery().processInstanceId(procInsId).list();
for (int i = 0; i < taskList.size(); i++) { for (int i = 0; i < taskList.size(); i++) {
@ -139,7 +145,7 @@ public class ActTaskDefService {
* @param actTaskDef * @param actTaskDef
*/ */
private void handleSinge(String taskId, String procInsId, int type, String userId, ActTaskDef actTaskDef) { private void handleSinge(String taskId, String procInsId, int type, String userId, ActTaskDef actTaskDef) {
if (ActConstant.TYPE_APPROVE == type) { if (ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus() == type) {
//审批通过 //审批通过
taskService.setAssignee(taskId, userId); taskService.setAssignee(taskId, userId);
taskService.complete(taskId); taskService.complete(taskId);
@ -147,12 +153,12 @@ public class ActTaskDefService {
//执行配置的审批通过脚本 //执行配置的审批通过脚本
int endScript = actTaskDef.getEndScript(); int endScript = actTaskDef.getEndScript();
if (endScript != 0) { if (endScript != 0) {
actUtil.invokeEventScript(endScript, procInsId); actUtil.invokeEventScript(endScript, procInsId, actTaskDef);
} else { } else {
logger.info("未配置审批通过脚本 task:{}", actTaskDef.getTaskName()); logger.info("未配置审批通过脚本 task:{}", actTaskDef.getTaskName());
} }
} else if (ActConstant.TYPE_ROLLBACK == type) { } else if (ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == type) {
//驳回 //驳回
String rollbackTaskKey = actTaskDef.getRollbackTaskKey(); String rollbackTaskKey = actTaskDef.getRollbackTaskKey();
actUtil.jumpToTargetTask(taskId, rollbackTaskKey); actUtil.jumpToTargetTask(taskId, rollbackTaskKey);
@ -160,10 +166,16 @@ public class ActTaskDefService {
//执行配置的驳回脚本 //执行配置的驳回脚本
int rollbackScript = actTaskDef.getRollbackScript(); int rollbackScript = actTaskDef.getRollbackScript();
if (rollbackScript != 0) { if (rollbackScript != 0) {
actUtil.invokeEventScript(rollbackScript, procInsId); actUtil.invokeEventScript(rollbackScript, procInsId, actTaskDef);
} else { } else {
logger.info("未配置驳回脚本 task:{}", actTaskDef.getTaskName()); logger.info("未配置驳回脚本 task:{}", actTaskDef.getTaskName());
} }
int projectId = actUtil.getProjectId(procInsId);
if (projectId > 0) {
projectInstanceService.updateApproveStatus(projectId, ApproveStatusEnum.APPROVAL_UNPASS, actTaskDef.getProcDefKey());
}
} }
} }
@ -264,24 +276,25 @@ public class ActTaskDefService {
* @param taskDefKey * @param taskDefKey
* @return * @return
*/ */
public Set<String> findCandidateUsers(String procDefId, String procInsId, String taskDefKey) { public List<String> findCandidateUsers(String procDefId, String procInsId, String taskDefKey) {
ActTaskDef taskDef = findFirstByProcDefIdAndTaskKey(procDefId, taskDefKey); ActTaskDef taskDef = findFirstByProcDefIdAndTaskKey(procDefId, taskDefKey);
if (taskDef.getTaskIndex() == ActConstant.TASK_INDEX_FIRST_USER_TASK) { if (taskDef.getTaskIndex() == ActConstant.TASK_INDEX_FIRST_USER_TASK) {
//任务驳回到发起节点 审批人设置为发起人 //任务驳回到发起节点 审批人设置为发起人
String startUserId = actUtil.getStartUserId(procInsId); String startUserId = actUtil.getStartUserId(procInsId);
Set<String> res = new HashSet<>(1); List<String> res = new ArrayList<>(1);
logger.info("findCandidateUsers-0-task:{}, startUserId:{}", taskDef.getTaskName(), startUserId); logger.info("findCandidateUsers-0-task:{}, startUserId:{}", taskDef.getTaskName(), startUserId);
res.add(startUserId); res.add(startUserId);
return res; return res;
} }
List<String> resList = new ArrayList<>(); //去重
Set<String> res = new HashSet<>();
//通过人员id查询 //通过人员id查询
List<String> candidateUserList = taskDef.getCandidateUserList(); List<String> candidateUserList = taskDef.getCandidateUserList();
logger.info("findCandidateUsers-1-task:{}, userList:{}", taskDef.getTaskName(), candidateUserList); logger.info("findCandidateUsers-1-task:{}, userList:{}", taskDef.getTaskName(), candidateUserList);
if (!candidateUserList.isEmpty()) { if (!candidateUserList.isEmpty()) {
resList.addAll(candidateUserList); res.addAll(candidateUserList);
} }
//通过角色id查询 //通过角色id查询
@ -290,13 +303,12 @@ public class ActTaskDefService {
List<String> list = accountService.getUserIsByRole(candidateRoleList); List<String> list = accountService.getUserIsByRole(candidateRoleList);
logger.info("findCandidateUsers-3-task:{}, userIdListByRole:{}", taskDef.getTaskName(), list); logger.info("findCandidateUsers-3-task:{}, userIdListByRole:{}", taskDef.getTaskName(), list);
if (!list.isEmpty()) { if (!list.isEmpty()) {
resList.addAll(list); res.addAll(list);
} }
//去重 List<String> resList = new ArrayList<>(res);
Set<String> res = new HashSet<>(resList); logger.info("findCandidateUsers-4-task:{}, resIds:{}", taskDef.getTaskName(), resList);
logger.info("findCandidateUsers-4-task:{}, resIds:{}", taskDef.getTaskName(), res); return resList;
return res;
} }

View File

@ -0,0 +1,56 @@
package cn.palmte.work.service;
import cn.palmte.work.model.ProjectTaskRecord;
import cn.palmte.work.model.ProjectTaskRecordRepository;
import cn.palmte.work.utils.ActUtil;
import cn.palmte.work.utils.InterfaceUtil;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
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.utils.Pagination;
import java.util.Date;
@Service
public class ProjectTaskRecordService {
private static final Logger logger = LoggerFactory.getLogger(ProjectTaskRecordService.class);
@Autowired
private ProjectTaskRecordRepository projectTaskRecordRepository;
@Autowired
Pagination pagination;
@Autowired
private ActUtil actUtil;
public void saveTaskRecord(Task task, int status, String comment) {
int projectId = actUtil.getProjectId(task.getProcessInstanceId());
if (projectId == 0) {
return;
}
task.getProcessDefinitionId();
ProjectTaskRecord record = new ProjectTaskRecord();
record.setProjectId(projectId);
record.setProcDefId(task.getProcessDefinitionId());
record.setProcInsId(task.getProcessInstanceId());
record.setTaskDefKey(task.getTaskDefinitionKey());
record.setTaskName(task.getName());
record.setTaskComment(comment);
record.setTaskStatus(status);
record.setTaskAssigneeId(InterfaceUtil.getAdminId() + "");
record.setTaskAssigneeName(InterfaceUtil.getAdmin().getRealName());
record.setCreateTime(new Date());
try {
projectTaskRecordRepository.save(record);
} catch (Exception e) {
logger.error("", e);
}
}
}

View File

@ -5,6 +5,7 @@ import cn.palmte.work.config.activiti.DeleteTaskCommand;
import cn.palmte.work.config.activiti.JumpCommand; import cn.palmte.work.config.activiti.JumpCommand;
import cn.palmte.work.model.ActScript; import cn.palmte.work.model.ActScript;
import cn.palmte.work.model.ActScriptRepository; import cn.palmte.work.model.ActScriptRepository;
import cn.palmte.work.model.ActTaskDef;
import cn.palmte.work.service.AccountService; import cn.palmte.work.service.AccountService;
import org.activiti.bpmn.model.BpmnModel; import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowNode; import org.activiti.bpmn.model.FlowNode;
@ -74,6 +75,14 @@ public class ActUtil {
return "0"; return "0";
} }
public int getProjectId(String procInsId) {
Record record = getVariable(ActConstant.KEY_PROJECT_ID, procInsId);
if (record != null) {
return Integer.valueOf(record.get("text"));
}
return 0;
}
/** /**
* *
@ -93,7 +102,7 @@ public class ActUtil {
* @param scriptId * @param scriptId
* @param procInsId * @param procInsId
*/ */
public void invokeEventScript(int scriptId, String procInsId) { public void invokeEventScript(int scriptId, String procInsId, ActTaskDef actTaskDef) {
ActScript actScript = actScriptRepository.findOne(scriptId); ActScript actScript = actScriptRepository.findOne(scriptId);
if (actScript == null) { if (actScript == null) {
logger.info("脚本配置错误"); logger.info("脚本配置错误");
@ -102,6 +111,7 @@ public class ActUtil {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put(ActConstant.PROC_INS_ID, procInsId); map.put(ActConstant.PROC_INS_ID, procInsId);
map.put(ActConstant.PROC_DEF_KEY, actTaskDef.getProcDefKey());
List<Record> variables = getVariables(procInsId); List<Record> variables = getVariables(procInsId);
for (Record variable : variables) { for (Record variable : variables) {
map.put(variable.getStr("name"), variable.get("text")); map.put(variable.getStr("name"), variable.get("text"));

View File

@ -46,14 +46,14 @@
<#if !list.endTime??> <#if !list.endTime??>
<button type="button" <button type="button"
class="am-btn am-btn-default am-btn-xs am-text-secondary" class="am-btn am-btn-default am-btn-xs am-text-secondary"
onclick="completeTask('${list.procInsId}', '${list.taskId}', 1)"> onclick="completeTask('${list.procInsId}', '${list.taskId}', 2)">
<span class="am-icon-pencil-square-o"></span> <span class="am-icon-pencil-square-o"></span>
审批通过 审批通过
</button> </button>
<button type="button" <button type="button"
class="am-btn am-btn-default am-btn-xs am-text-secondary" class="am-btn am-btn-default am-btn-xs am-text-secondary"
onclick="completeTask('${list.procInsId}', '${list.taskId}', 2)"> onclick="completeTask('${list.procInsId}', '${list.taskId}', 3)">
<span class="am-icon-pencil-square-o"></span> <span class="am-icon-pencil-square-o"></span>
驳回 驳回
</button> </button>

View File

@ -18,7 +18,7 @@
<tr class="am-text-nowrap"> <tr class="am-text-nowrap">
<th class="table-title">序号</th> <th class="table-title">序号</th>
<th class="table-title">任务名称</th> <th class="table-title">任务名称</th>
<th class="table-title">任务类型</th> <#--<th class="table-title">任务类型</th>-->
<th class="table-date">回退任务</th> <th class="table-date">回退任务</th>
<th class="table-set am-text-center">审批人</th> <th class="table-set am-text-center">审批人</th>
<th class="table-set am-text-center">审批角色</th> <th class="table-set am-text-center">审批角色</th>
@ -33,7 +33,7 @@
<tr> <tr>
<td>${list_index+1}</td> <td>${list_index+1}</td>
<td>${list.taskName!}</td> <td>${list.taskName!}</td>
<td> <#--<td>
<#if list.taskIndex != 1> <#if list.taskIndex != 1>
<#if list.taskType == 0> <#if list.taskType == 0>
或签 或签
@ -41,7 +41,7 @@
会签 会签
</#if> </#if>
</#if> </#if>
</td> </td>-->
<td> <td>
<#if list.taskIndex != 1> <#if list.taskIndex != 1>